Beibehaltungszeitstempel nach Änderung beibehalten

8

Ich möchte Dateien ändern, vimohne die Erstellungszeitstempel zu ändern .

Die Dokumente scheinen nichts über eine solche Möglichkeit zu erwähnen.

Ich möchte dies erreichen, ohne die Swap / Recovery-Funktion auszuschalten.

Eine Alternative wäre, die Zeit irgendwo zu speichern und sie dann beim Beenden zu überschreiben, denke ich.

1,61803
quelle
2
Auf welchem ​​Betriebssystem bist du? Einige Betriebssysteme speichern keine Erstellungszeiten, daher kann dies einen Unterschied machen.
Blm
Ich bin auf OS X 10.8.5.
1.61803

Antworten:

2

Satos Antwort wäre auf einem Standard-Unix-Derivat richtig, bei dem ctimeoft 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 ( GetFileInfodie 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 SaveFileCreateTimedenen GetFileInfo -ddie Erstellungszeit der Datei abgerufen und in der lokalen Puffervariablen gespeichert wird b:created. Nachdem eine Datei geschrieben wurde, RestoreFileCreateTimewird aufgerufen. Wenn b:createdvorhanden, wird es in einem systemBefehl SetFile -dzum 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!

blm
quelle
Wäre ein VIM-Skript ein Wrapper oder eine vimLaufzeitänderung mit diesen Tools, die ich übrigens installiert habe, um das Erstellungsdatum beizubehalten?
1.61803
Es wären einige Funktionen, die Sie in Ihre .vimrc einfügen. Ich beschloss, damit herumzuspielen und bekam tatsächlich etwas, das funktioniert! Ich werde meine Antwort bearbeiten, um das einzuschließen.
Blm
@ 1.61803 Ok, habe meine Antwort so bearbeitet, dass sie das Vimscript enthält, um die Zeit zu speichern und wiederherzustellen. Lassen Sie mich wissen, ob es für Sie funktioniert.
Blm
Ich habe es getestet, während ich vimdiffDateien von root und user erstellt habe. So weit, ist es gut. Sie sollten dies im Vim Tips-Wiki veröffentlichen . Das war eine großartige Antwort, danke.
1.61803
Übrigens, Ihr statBefehl ist für Linux, denke ich. In OS X 10.8.5 würden Sie verwenden stat -f %Sc.
1.61803
1

Was Sie möchten, kann unter UNIX nicht mit Standard-Userspace-Funktionen implementiert werden. Das ctimeeiner Datei wird vom Kernel automatisch aktualisiert, wenn sich die Datei inodeändert . Im Gegensatz zu atimeund mtimegibt es keine vom Benutzer zugängliche Funktion, um ctimeeinen beliebigen Wert festzulegen.

Sato Katsura
quelle
Könnte vim, anstatt Dateien auszutauschen, einfach cp test.swp test.txt?
1.61803
@ 1.61803, less test.swpsollte Ihre Frage beantworten.
Romainl