Wie funktioniert `: w! Sudo tee%`?

27

Wenn Sie eine Datei öffnen, für die Sie keine Berechtigung zum Schreiben in vim haben, und dann entscheiden, dass Sie sie ändern müssen, können Sie Ihre Änderungen schreiben, ohne vim zu beenden, indem Sie Folgendes tun: :w !sudo tee %
Ich verstehe nicht, wie dies funktionieren kann. Können Sie das bitte zerlegen?
Ich verstehe das :wTeil, es schreibt den aktuellen Puffer auf die Festplatte, vorausgesetzt, es ist bereits ein Dateiname zugeordnet, oder?
Ich verstehe auch die !, die den sudo teeBefehl ausführt und %den aktuellen Pufferinhalt darstellt, oder?
Aber verstehe immer noch nicht, wie das funktioniert.

Ali
quelle

Antworten:

30

Die :w !cmdStrukturmittel „ schreiben die aktuellen Puffer verrohrt durch Befehl“. So können Sie es zum Beispiel tun :w !catund es leitet den Puffer durch cat.

Jetzt %ist der Dateiname mit dem Puffer verknüpft

So :w !sudo tee %wird der Inhalt des Puffers durchgeleitet sudo tee FILENAME. Dadurch wird der Inhalt des Puffers effektiv in die Datei geschrieben.

Stephen Harris
quelle
2

Nicht ganz richtig!

!commandFührt den Befehl als Filterbefehl aus , von dem Text abgerufen stdin, etwas getan und an ausgegeben wird stdout.

Mit whaben Sie den Dateiinhalt auf stdinvon verschoben sudo tee %. %ist ein spezielles Register in vim, das den Namen der aktuellen Datei enthält.

Also hast du sudo tee FILENAME, was tee stdin- Dateiinhalt - zur aktuellen Datei pusht.

cuonglm
quelle
2
:!commandist ein Filter (vgl. :h !), während dies :w !commandnicht der Fall ist, wird er nur commandmit der aktuellen Datei ausgeführt wie stdin(vgl. :h :w_c). Übrigens: :w !sed /./dÄndert den Inhalt des aktuellen Puffers nicht. Aber das Rezept ist in der Tat nicht ganz richtig aus einem anderen Grunde, %muss entwertet werden: :exec 'w !sudo tee ' . shellescape(expand('%', 1)). Der ursprüngliche Befehl funktioniert beispielsweise nicht mit Dateinamen mit Leerzeichen.
Satō Katsura