
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 ~/bloxsom
als 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 touch
die 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
, stat
und touch
.
Antwort4
Probieren Sie diese bash
Funktion (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