Nach dem interaktiven Rebasen mit Git stelle ich häufig fest, dass eine in Vim geöffnete Datei im Dateisystem geändert wurde. Wenn ich die Datei mit :w
oder schreiben möchte :w!
, erhalte ich die Eingabeaufforderung WARNING: The file has been changed since reading it!!!
/ Do you really want to write to it (y/n)?
.
Ich halte diese Warnung für vernünftig genug; es wäre ein fragwürdiges Verhalten, eine Datei im Dateisystem stillschweigend zu überschreiben, die aus einem beliebigen Grund geändert wurde. In Fällen wie diesem, in denen ich weiß, warum die Datei berührt wurde, stelle ich jedoch häufig fest, dass ich das Schreiben erzwingen möchte, anstatt zu prüfen, ob eine Eingabeaufforderung vorhanden ist oder nicht. Ich hatte Situationen, in denen ich die Eingabeaufforderung nicht bemerkt habe und sofort weggeklickt habe, was zu inkonsistenten Builds und gelegentlich zu Datenverlust führte.
Wie werde ich die Bestätigungsaufforderung los, entweder dauerhaft oder (vorzugsweise) mit einem erweiterten Befehl analog zu w!
?
Wenn ich das bei Google suche, erhalte ich eine Reihe von Treffern zum erzwungenen Schreiben einer schreibgeschützten Datei mit w!
, kann aber scheinbar nichts zum erzwungenen Schreiben einer geänderten Datei finden.
Antwort1
Der folgende Befehl funktioniert für den aktuellen Puffer (ich kenne keine Lösung für mehrere Puffer):
:w !sudo tee %
Das Zeichen %
steht für den aktuellen Dateinamen. Der sudo
Befehl ermöglicht das Überschreiben schreibgeschützt geöffneter Dateien.
:w!!
Um einen Befehl zu definieren , der das oben genannte ausführt, fügen Sie Folgendes hinzu .vimrc
:
cmap w!! w !sudo tee > /dev/null %
Der > /dev/null
Teil eliminiert die Standardausgabe, tee
die hier nicht verwendet wird.
Weitere Informationen finden Sie im Beitrag Wie funktioniert der Vim-Trick „Schreiben mit sudo“?