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

Pregunta:

Quiero modificar archivos con vim sin cambiar las marcas de tiempo de creación.

Los documentos no parecen mencionar nada sobre esa posibilidad.

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

Una alternativa sería almacenar la hora en algún lugar y luego sobrescribirla al salir, supongo.

Respuesta:

La respuesta de Sato sería correcta en un derivado estándar de Unix, donde ctime menudo se confunde con el tiempo de creación, pero en realidad es el tiempo de cambio de inodo, y "preservarlo" 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 por el estilo, todo de los cuales actualizan ctime .

Puede ver el tiempo de creación haciendo un Obtener información en un archivo en el Finder o GetFileInfo <file> desde una línea de comando ( GetFileInfo requiere que las herramientas de desarrollo estén instaladas). La hora se puede modificar usando SetFile -d <datetime> <file> (también requiere herramientas de desarrollador).

Así que parece razonable (para mí, no sé sobre Bram :-)) pedirle a vim que mantenga el tiempo de creación en Mac OS X, copiando el tiempo de creación del archivo original al nuevo archivo, pero claramente no lo hace. '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 póster es "Actualmente no es posible". Debido a que Mac OS X (con herramientas de desarrollador) permite obtener y configurar el tiempo de creación desde la línea de comandos, es posible crear un script vim que lo haga, aunque (actualmente) está más allá de mis capacidades de scripting vim.

Editar

¡Decidí jugar con la escritura de algo y realmente lo hice funcionar!

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 editarlo en un búfer, no para cosas como :read ) y después de que se escriba. La primera llama a SaveFileCreateTime que usa GetFileInfo -d para obtener el tiempo de creación del archivo y almacenarlo en la variable local b:created . Después de escribir un archivo, se llama a RestoreFileCreateTime . Si b:created existe, se usa en un comando del system para usar SetFile -d para establecer la hora.

He aquí 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 lo muestra la stat ) ha cambiado, pero el tiempo de creación del archivo (como lo muestra GetFileInfo ) no lo ha hecho. ¡É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 guión real, ¡así que siéntete libre de señalar todos los horribles errores que he cometido!

Leave a Comment

Your email address will not be published.

Scroll to Top

istanbul avukat

-

web tasarım