Vim: eine schreibgeschützte Datei speichern

Heute habe ich, nachdem ich eine ganze Weile an der Apache-Konfiguration (/etc/httpd/httpd.conf)
gearbeitet hatte, gemerkt, dass ich als normaler Benutzer angemeldet war und die Datei gar nicht
speichern konnte (E212: Can't open file for writing).
Eine gängige Lösung ist, eine Kopie in irgendein Verzeichnis zu speichern und die Originaldatei dann
mit sudo mv durch die Kopie zu ersetzen. Ich wusste aber, dass es einfacher geht, weil mir das
früher schon mehrfach passiert ist.
Ich hatte den Befehl vergessen, ihn aber wiedergefunden — und halte ihn hier für später fest.
Du rufst einfach sudo tee direkt aus Vim auf: :w !sudo tee %
Vim weist dann (W12) darauf hin, dass die Datei geändert wurde und neu geladen werden muss. Drücke
L zum Neuladen.
Warum funktioniert das?
Aus Vims :help und man tee:
:w[rite] {file}⇒ Schreibt den gesamten Puffer nach {file}.!{cmd}⇒ Führt {cmd} in der Shell aus.tee [FILE]⇒ Liest von der Standardeingabe und schreibt nach FILE (oder stdout).%⇒ Verweis auf die aktuelle Datei
Wir schieben den Puffer also wie durch eine Pipe an die Eingabe von sudo tee %, das ihn — als
Superuser — in die aktuelle Datei schreibt.
Ein paar Alternativen, die ich auf commandlinefu gefunden habe:
:%!sudo tee %:w !sudo tee > /dev/null %command W :execute ':silent w !sudo tee % > /dev/null' | :edit!:w !pfexec tee %
Neovim
(Abschnitt ergänzt im März 2024)
Der obige Tipp funktioniert in Neovim nicht (siehe https://github.com/neovim/neovim/issues/1716).
Zum Glück gibt es Plugins, die das lösen. Ich benutze Suda: https://github.com/lambdalisue/suda.vim.
Es ergänzt die Befehle :SudaWrite und :SudaRead, um Dateien zu schreiben und zu lesen, für die
erhöhte Rechte nötig sind.
Links

Ich bin ein brasilianischer Computeringenieur mit Wohnsitz in Deutschland und begeistere mich für Technik, Wissenschaft, Fotografie und Sprachen.
Ich programmiere seit etwa zwei Jahrzehnten und habe dabei alles von mobilen Apps und Webentwicklung bis hin zu Machine Learning erkundet. Derzeit fokussiere ich mich auf Cloud‑SRE und Data Engineering.
Ich engagiere mich ehrenamtlich in den Open‑Source- und Python‑Communities, helfe bei der Organisation der PyCon DE und PyData Berlin, betreue als Mentor und trage mit Code und Übersetzungen bei.
In meinem Blog teile ich Linux‑Tipps, Einrichtungsanleitungen und persönliche Notizen, die ich als spätere Referenz geschrieben habe. Ich hoffe, dass sie auch anderen nützlich sind. Die Inhalte sind in mehreren Sprachen verfügbar.
Schau dir meine Galerie an, um einige meiner Fotografien zu sehen.
Abseits der Tastatur findest du mich auf Konzerten, beim Klarinettenspiel, Radfahren, Tauchen oder beim Erkunden neuer Orte, Kulturen und Küchen.
Ich freue mich immer über den Austausch! 🙂