La respuesta de Sato sería correcta en una derivada estándar de Unix, donde a ctime
menudo se confunde con el tiempo de creación pero en realidad es el tiempo de cambio de inodo, y "preservar" realmente no tiene sentido. Sin embargo, pregunté qué sistema operativo está usando el póster porque Mac OS X mantiene una hora de creación separada que es una fecha y hora de creación real, y no se actualiza modificando el archivo en su lugar o cambiando el modo del archivo o algo así, todo de los cuales se actualizan ctime
.
Puede ver el tiempo de creación haciendo una Obtener información en un archivo en el Finder o GetFileInfo <file>
desde una línea de comandos ( GetFileInfo
requiere la instalación de las herramientas del desarrollador). El tiempo se puede modificar usando SetFile -d <datetime> <file>
(también requiere herramientas de desarrollador).
Entonces, parece razonable (para mí, no sé acerca de Bram :-)) pedir vim para mantener el tiempo de creación en Mac OS X, copiando el tiempo de creación del archivo original en el nuevo archivo, pero claramente no 't, y mirando a través de las fuentes vim, no veo ningún lugar donde lo haga. Entonces, desafortunadamente, parece que la respuesta a la pregunta del afiche es "Actualmente no es posible". Debido a que Mac OS X (con herramientas de desarrollo) permite obtener y configurar el tiempo de creación desde la línea de comandos, es posible armar un script vim que lo haga, aunque eso (actualmente) está más allá de mis capacidades de creación de scripts vim.
Editar
¡Decidí jugar con algo de scripting y realmente lo conseguí!
Agregue lo siguiente a su .vimrc:
autocmd BufReadPre * call SaveFileCreateTime()
autocmd BufWritePost * call RestoreFileCreateTime()
function! SaveFileCreateTime()
let l:path = expand('%:p')
if l:path != ''
let b:created = system("GetFileInfo -d " . shellescape(bufname("%")))
endif
endfunction
function! RestoreFileCreateTime()
if exists('b:created')
execute system(
\ 'SetFile -d ' .
\ shellescape(b:created) .
\ ' ' .
\ shellescape(bufname("%")))
endif
endfunction
Eso establece que los comandos automáticos se ejecuten antes de que se lea un archivo (para editar en un búfer, no para cosas como :read
) y después de que se escriba. Las primeras llamadas SaveFileCreateTime
que se utilizan GetFileInfo -d
para obtener el tiempo de creación del archivo y almacenarlo en la variable local del búfer b:created
. Después de que se escribe un archivo, RestoreFileCreateTime
se llama. Si b:created
existe, se usa en un system
comando SetFile -d
para establecer la hora.
Aquí hay un ejemplo:
$ echo hello >file.txt
$ stat -c%z file.txt;GetFileInfo -d file.txt
2015-11-07 11:44:04.000000000 -0800
11/07/2015 11:44:04
$ vim file.txt
a earth<esc>:wq
$ cat file.txt
hello earth
$ stat -c%z file.txt;GetFileInfo -d file.txt
2015-11-07 11:44:24.000000000 -0800
11/07/2015 11:44:04
Puede ver que el tiempo de cambio de inodo (como se muestra por stat
) ha cambiado, pero el tiempo de creación del archivo (como se muestra por GetFileInfo
) no. ¡Éxito!
Como se señaló anteriormente, esto requiere que las herramientas de desarrollador estén instaladas para obtener GetFileInfo y SetFile. Además, este es mi primer script real, ¡así que siéntete libre de señalar todos los horribles errores que he cometido!