Conservar la marca de tiempo de creación después de la modificación


8

Quiero modificar archivos vimsin cambiar las marcas de tiempo de creación.

Los documentos no parecen mencionar nada sobre tal posibilidad.

Me gustaría lograr esto sin desactivar la función de intercambio / recuperación.

Supongo que una alternativa sería almacenar el tiempo en algún lugar y luego sobrescribirlo al salir.


2
¿En qué sistema operativo estás? Algunos sistemas operativos no almacenan los tiempos de creación, por lo que podría marcar la diferencia.
blm

Estoy en OS X 10.8.5.
1.61803

Respuestas:


2

La respuesta de Sato sería correcta en una derivada estándar de Unix, donde a ctimemenudo 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 ( GetFileInforequiere 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 SaveFileCreateTimeque se utilizan GetFileInfo -dpara 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, RestoreFileCreateTimese llama. Si b:createdexiste, se usa en un systemcomando SetFile -dpara 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!


¿Sería un script vim un contenedor o vimun tiempo de ejecución alternativo usando esas herramientas, que sí he instalado por cierto, para preservar la fecha de creación?
1.61803

Sería algunas funciones que pones en tu .vimrc. ¡Decidí jugar con él y realmente obtuve algo que funciona! Editaré mi respuesta para incluir eso.
blm

@ 1.61803 Ok, edité mi respuesta para incluir el vimscript para guardar y restaurar la hora. Avísame si te funciona.
blm

Lo probé mientras vimdiffusaba archivos propiedad de root y usuario. Hasta aquí todo bien. Debes publicar esto en la wiki de Vim Tips . Esa fue una gran respuesta, gracias.
1.61803

Por cierto, su statcomando es para Linux, supongo. En OS X 10.8.5 usarías stat -f %Sc.
1.61803


1

Lo que desea no es posible implementar en UNIX utilizando funciones de espacio de usuario estándar. El ctimenúcleo actualiza automáticamente el archivo cuando inodecambia el archivo . A diferencia de atimey mtime, no hay una función accesible para el usuario para establecer ctimeun valor arbitrario.


¿Podría vim, en lugar de intercambiar archivos, simplemente cp test.swp test.txt?
1.61803

@ 1.61803, less test.swpdebería responder a su pregunta.
romainl
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.