Preservar o carimbo de data/hora modificado após a edição

Preservar o carimbo de data/hora modificado após a edição

Para arquivos dentro de uma pasta específica, gostaria que o vim nunca tocasse no carimbo de data/hora "modificado".

O pano de fundo é que eu usoBloxsompara blogs, que usa arquivos de texto simples ~/bloxsomcomo fonte de todos os artigos. A data do artigo (e, portanto, a ordem de aparição) é baseada na data de modificação do arquivo de texto. Eu não quero que o artigo apareça como se fossenovosempre que eu apenas corrijo um erro de digitação. (Eu façogrande quantidade deles... :D)

Até agora, o vim altera o carimbo de data e hora e o carimbo original é perdido para sempre. Tudo bem e quero mantê-lo assim para a maioria dos arquivos do sistema. Mas não quero isso para os arquivos do blog - sempre posso usar toucho arquivo, se precisar.

Alguma idéia de como ajustar o vim para esse comportamento?

Responder1

Não acho que o vim tenha esse recurso. Uma alternativa é modificar uma cópia e definir o carimbo de data/hora apropriadamente, por exemplo:

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

Ou melhor ainda:

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

Responder2

Se você precisa se divertir:

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

Substitua path pelo caminho real do arquivo

Responder3

Encontrei uma ótima solução em esta página da web, que cria uma função vim para salvar o arquivo atual enquanto preserva o horário de modificação existente e vincula esta função à F4tecla de função:

No entanto, descobri que a função original contém um pequeno bug, acionando o seguinte aviso se F4for usada duas vezes no mesmo arquivo, porque o vim fica confuso quando o horário de modificação muda:

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

Felizmente, isso é fácil de corrigir: adicionei um comando "editar" à função original para recarregar o arquivo após restaurar o carimbo de data e hora, para que o vim saiba qual hora de modificação esperar que o arquivo tenha.

Aqui está a função vim modificada com esta correção de bug, que pode ser adicionada 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>

Observação:Esta função depende das versões GNU de date, state touch.

Responder4

Experimente esta bashfunção (com base emA resposta 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
}

Agora podemos editar o arquivo e preservar o tempo modificado usando este

vi-preserve-time file1.txt file2.txt

informação relacionada