
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 ~/bloxsom
como 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 touch
o 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
, stat
e touch
.
Responder4
Experimente esta bash
funçã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