Conservar la marca de tiempo modificada después de la edición

Conservar la marca de tiempo modificada después de la edición

Para los archivos dentro de una carpeta específica, me gustaría que vim nunca toque la marca de tiempo "modificada".

El fondo es el que usoBloxsompara blogs, que utiliza archivos de texto sin formato ~/bloxsomcomo fuente de todos los artículos. La fecha del artículo (y por lo tanto el orden de aparición) se basa en la fecha de modificación del archivo de texto. No quiero que el artículo aparezca como si fueranuevocada vez que soluciono un error tipográfico. (Sílotes de ellos... :D)

Hasta ahora, vim cambia la marca de tiempo y la marca original se pierde para siempre. Esto está bien y quiero mantenerlo así para la mayoría de los archivos del sistema. Pero no quiero eso para los archivos del blog; siempre puedo obtener touchel archivo si lo necesito.

¿Alguna idea sobre cómo modificar vim para que adopte este comportamiento?

Respuesta1

No creo que vim tenga esta característica. Una alternativa es modificar una copia y establecer la marca de tiempo apropiadamente, por ejemplo:

cp -p post temp
vim temp
touch -r post temp
cp -p temp post

O mejor:

touch -r post timestamp
vim post
touch -r timestamp post

Respuesta2

Si necesitas divertirte un poco:

file=path; mtime=$(stat -c %y "$file"); vi "$file"; touch -d "$mtime" "$file"

Reemplace la ruta con la ruta real de su archivo

Respuesta3

Encontré una gran solución en esta pagina web, que crea una función vim para guardar el archivo actual conservando el tiempo de modificación existente y vincula esta función a la F4tecla de función:

Sin embargo, descubrí que la función original contiene un error menor, que activa la siguiente advertencia si F4se usa dos veces en el mismo archivo, porque vim se confunde cuando cambia la hora de modificación:

WARNING: The file has been changed since reading it!!!
Do you really want to write to it (y/n)?

Afortunadamente, esto es fácil de solucionar: agregué un comando "editar" a la función original para recargar el archivo después de restaurar la marca de tiempo, de modo que vim sepa qué tiempo de modificación esperar que tenga el archivo.

Aquí está la función vim modificada con esta corrección de errores, que se puede agregar a ~/.vimrc:

function! WriteSmall()
    let mtime = system("stat -c %.Y ".shellescape(expand('%:p')))
    write
    call system("touch --date='@".mtime."' ".shellescape(expand('%:p')))
    edit
endfunction
map <F4> :call WriteSmall()<CR>

Nota:Esta función se basa en las versiones GNU de date, staty touch.

Respuesta4

Pruebe esta bashfunción (basada enLa respuesta de Shâu Shắc)

vi-preserve-time () {
    for file in "$@"; do
        local mtime=$(stat -c %y "$file")
        vi "$file"
        touch -d "$mtime" "$file"
    done
}

Ahora podemos editar el archivo y conservar el tiempo modificado usando esto

vi-preserve-time file1.txt file2.txt

información relacionada