Geänderten Zeitstempel nach der Bearbeitung beibehalten

Geänderten Zeitstempel nach der Bearbeitung beibehalten

Für Dateien in einem bestimmten Ordner möchte ich, dass vim den „geänderten“ Zeitstempel überhaupt nicht berührt.

Der Hintergrund ist, dass ichBloxsomfür das Bloggen, das reine Textdateien ~/bloxsomals Quelle aller Artikel verwendet. Das Artikeldatum (und damit die Reihenfolge des Erscheinens) basiert auf dem Änderungsdatum der Textdatei. Ich möchte nicht, dass Artikel so angezeigt werden, als ob sieneuimmer wenn ich nur einen Tippfehler korrigiere. (Das tue ichviele von ihnen... :D)

Bisher ändert vim den Zeitstempel und der Originalstempel geht für immer verloren. Das ist in Ordnung und ich möchte es für die meisten Dateien im System so beibehalten. Aber für die Blogdateien möchte ich das nicht – ich kann touchdie Datei immer noch abrufen, wenn ich sie brauche.

Irgendwelche Ideen, wie man Vim zu diesem Verhalten bringen kann?

Antwort1

Ich glaube nicht, dass Vim diese Funktion hat. Eine Alternative besteht darin, eine Kopie zu ändern und den Zeitstempel entsprechend festzulegen, z. B.:

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

Oder noch besser:

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

Antwort2

Wenn Sie etwas Spaß haben möchten:

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

Ersetzen Sie den Pfad durch Ihren tatsächlichen Dateipfad.

Antwort3

Ich habe eine tolle Lösung gefunden auf diese Webseite, das eine Vim-Funktion zum Speichern der aktuellen Datei unter Beibehaltung der vorhandenen Änderungszeit erstellt und diese Funktion an die F4Funktionstaste bindet:

Ich habe jedoch festgestellt, dass die ursprüngliche Funktion einen kleinen Fehler enthält, der die folgende Warnung auslöst, wenn F4sie zweimal auf dieselbe Datei angewendet wird, da vim durcheinander gerät, wenn sich die Änderungszeit ändert:

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

Dies lässt sich zum Glück leicht beheben: Ich habe der Originalfunktion einen „Bearbeiten“-Befehl hinzugefügt, um die Datei nach der Wiederherstellung des Zeitstempels neu zu laden, sodass vim weiß, welchen Änderungszeitpunkt die Datei voraussichtlich haben wird.

Hier ist die geänderte Vim-Funktion mit diesem Bugfix, die hinzugefügt werden kann zu ~/.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>

Notiz:Diese Funktion basiert auf GNU-Versionen von date, statund touch.

Antwort4

Probieren Sie diese bashFunktion (basierend aufShâu Shắcs Antwort)

vi-preserve-time () {
    for file in "$@"; do
        local mtime=$(stat -c %y "$file")
        vi "$file"
        touch -d "$mtime" "$file"
    done
}

Jetzt können wir die Datei bearbeiten und die Änderungszeit damit beibehalten.

vi-preserve-time file1.txt file2.txt

verwandte Informationen