A resposta de Sato estaria correta em uma derivada padrão do Unix, onde ctime
muitas vezes é confundida com o tempo de criação, mas na verdade é o tempo de mudança do inode, e "preservar" isso realmente não faz sentido. No entanto, perguntei qual sistema operacional o pôster está usando porque o Mac OS X mantém um horário de criação separado, que é uma data e hora reais da criação, e não é atualizado modificando o arquivo no local ou alterando o modo do arquivo ou algo assim, tudo dos quais são atualizados ctime
.
Você pode ver a hora da criação executando o Get Info em um arquivo no Finder ou GetFileInfo <file>
em uma linha de comando ( GetFileInfo
requer a instalação das ferramentas do desenvolvedor). O horário pode ser modificado usando SetFile -d <datetime> <file>
(também exigindo ferramentas de desenvolvedor).
Portanto, parece razoável (para mim, não sei sobre Bram :-)) pedir ao vim para manter o tempo de criação no Mac OS X, copiando o tempo de criação do arquivo original para o novo arquivo, mas claramente não e, olhando as fontes do vim, não vejo em nenhum lugar onde isso acontece. Infelizmente, parece que a resposta para a pergunta do pôster é "Atualmente não é possível". Como o Mac OS X (com ferramentas de desenvolvedor) permite obter e definir o tempo de criação na linha de comando, pode ser possível montar um script vim que faça isso, embora isso esteja atualmente atualmente além das minhas habilidades de script do vim.
Editar
Eu decidi brincar com algo de script e realmente o fiz funcionar!
Adicione o seguinte ao seu .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
Isso define comandos automáticos para serem executados antes de um arquivo ser lido (para edição em um buffer, não para coisas do tipo :read
) e depois que ele é gravado. As primeiras chamadas SaveFileCreateTime
usadas GetFileInfo -d
para obter o tempo de criação do arquivo e armazená-lo na variável local do buffer b:created
. Depois que um arquivo é gravado, RestoreFileCreateTime
é chamado. Se b:created
existir, é usado em um system
comando SetFile -d
para definir o horário.
Aqui está um exemplo:
$ 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
Você pode ver que o tempo de mudança do inode (como exibido por stat
) mudou, mas o tempo de criação do arquivo (como exibido por GetFileInfo
) não. Sucesso!
Como observado acima, isso requer que as ferramentas do desenvolvedor sejam instaladas para obter GetFileInfo e SetFile. Além disso, este é o meu primeiro script real, então fique à vontade para apontar todos os erros hediondos que cometi!