Satos Antwort wäre auf einem Standard-Unix-Derivat richtig, bei dem ctime
oft mit der Erstellungszeit verwechselt wird, aber tatsächlich die Inode-Änderungszeit ist und das "Beibehalten" nicht wirklich Sinn macht. Ich habe jedoch gefragt, welches Betriebssystem das Poster verwendet, da Mac OS X eine separate Erstellungszeit verwaltet, die ein tatsächliches Erstellungsdatum und eine tatsächliche Erstellungszeit darstellt und nicht durch Ändern der vorhandenen Datei oder Ändern des Dateimodus oder Ähnlichem aktualisiert wird davon aktualisieren ctime
.
Sie können die Erstellungszeit anzeigen, indem Sie eine Info für eine Datei im Finder oder GetFileInfo <file>
über eine Befehlszeile abrufen ( GetFileInfo
die Entwicklertools müssen installiert sein). Die Zeit kann mit geändert werden SetFile -d <datetime> <file>
(erfordert auch Entwicklertools).
Es erscheint also vernünftig (ich weiß nichts über Bram :-)), vim zu bitten, die Erstellungszeit unter Mac OS X beizubehalten, indem die Erstellungszeit von der Originaldatei in die neue Datei kopiert wird, aber dies ist eindeutig nicht der Fall Wenn ich durch die Vim-Quellen schaue, sehe ich nirgendwo, wo es so ist. Leider scheint die Antwort auf die Frage des Posters "Es ist derzeit nicht möglich" zu sein. Da Mac OS X (mit Entwicklertools) das Abrufen und Festlegen der Erstellungszeit über die Befehlszeile ermöglicht, kann möglicherweise ein VIM-Skript zusammengestellt werden, das dies tut, obwohl dies (derzeit) über meine VIM-Skriptfähigkeiten hinausgeht.
Bearbeiten
Ich beschloss, mit Skripten herumzuspielen und brachte sie tatsächlich zum Laufen!
Fügen Sie Ihrer .vimrc Folgendes hinzu:
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
Dadurch werden automatische Befehle so eingestellt, dass sie ausgeführt werden, bevor eine Datei gelesen wird (zum Bearbeiten in einem Puffer, nicht für Dinge wie :read
) und nachdem sie geschrieben wurde. Die ersten Aufrufe, mit SaveFileCreateTime
denen GetFileInfo -d
die Erstellungszeit der Datei abgerufen und in der lokalen Puffervariablen gespeichert wird b:created
. Nachdem eine Datei geschrieben wurde, RestoreFileCreateTime
wird aufgerufen. Wenn b:created
vorhanden, wird es in einem system
Befehl SetFile -d
zum Einstellen der Uhrzeit verwendet.
Hier ist ein Beispiel:
$ 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
Sie können sehen, dass sich die Inode-Änderungszeit (wie von angezeigt stat
) geändert hat, die Erstellungszeit für Dateien (wie von angezeigt GetFileInfo
) jedoch nicht. Erfolg!
Wie oben erwähnt, müssen hierfür die Entwicklertools installiert sein, um GetFileInfo und SetFile abzurufen. Dies ist auch mein erstes richtiges Skript. Sie können also auf all die abscheulichen Fehler hinweisen, die ich gemacht habe!