Es scheint verschiedene Ansätze zu geben, abhängig von Ihrem aktuellen Problem:
- Schreibgeschützt von vi. Wenn Ihre Datei
:set readonly
enthält du kannst- Verwenden Sie
:w!
um das Schreiben zu erzwingen, oder - Ausgabe
:set noreadonly
und dann einfach den normalen:w
verwenden
- Verwenden Sie
- Eine Erlaubnis Problem (sudo ):Sie können nicht schreiben, aber Sie haben sudo-Rechte.
- Problem:
:w !sudo tee %
. Dadurch wird der Puffer intee
geschrieben , ein Befehl, der pipe empfängt Informationen und kann in Dateien schreiben. Und da tee mit sudo-Kräften ausgeführt wird, kann tee die Datei ändern.
- Problem:
- Eine Erlaubnis Problem (kein sudo ):Sie haben keine Rechte zum Schreiben der Datei und Sie haben keinen Administratorzugriff.
- Verwenden Sie
:w! ~/tempfile.ext
um Ihre Änderungen in eine temporäre Datei zu schreiben und dann Maßnahmen zu ergreifen, um die temporäre Datei in das Verzeichnis zu verschieben (senden Sie die temporäre Datei an den Eigentümer/Administrator des Verzeichnisses).
- Verwenden Sie
Hier können Sie mehr darüber lesen:
- Von StackOverflow
- Von Geekyboy
- Von Data Agaric
Verknüpfung
Wie so oft ist Problem Nr. 2 (Erlaubnis Problem, mit sudo ), können Sie zu Ihrem /etc/vim/vimrc
(oder ~/.vimrc
) das folgende Kürzel:
cnoremap w!! execute 'silent! write !sudo tee % >/dev/null' <bar> edit!
Dann können Sie einfach :w!!
eingeben mit sudo speichern Kräfte. Ich werde es hier nicht erklären, aber die obigen Referenzen decken viele Abkürzungen ab.
Ich kann mir zwei Möglichkeiten vorstellen, dies zu tun.
Bei der ersten Methode wird davon ausgegangen, dass Sie der Eigentümer der Datei sind, die Datei jedoch schreibgeschützt ist.
Verwenden Sie einfach das Ausrufezeichen-Suffix von vi für den Schreibbefehl (:w!), um das Überschreiben Ihrer eigenen READONLY-Datei zu erzwingen. Dies setzt natürlich voraus, dass Sie die Berechtigung zum Schreiben und Ausführen im aktuellen Ordner haben.
:w!
bewirkt, dass vi die ursprüngliche READONLY-Datei überschreibt.
Bei der zweiten Möglichkeit wird davon ausgegangen, dass jemand anderes die Datei besitzt und Sie Ihre Änderungen an dieser Datei speichern möchten.
Eine Möglichkeit, dies zu erreichen, besteht darin, die an der Originaldatei vorgenommenen Änderungen als ed-Skript innerhalb von vi zu speichern. Dieses ed-Skript kann zu einem späteren Zeitpunkt außerhalb von vi mit dem ed-Zeileneditor auf die Originaldatei (oder andere ähnliche Dateien) angewendet werden.
Eine Möglichkeit, die aktuelle Bearbeitungssitzung als Ed-Skript zu speichern, besteht darin, den ursprünglichen Dateinamen und den bearbeiteten vi-Puffer als Standardeingabe an das Diff-Dienstprogramm mit dem Befehlszeilenschalter --ed zu übergeben, d.h. Unterschiede als Ed-Skript anzuzeigen.
Gehen Sie also von einem bearbeiteten vi-Puffer aus und führen Sie Folgendes aus
:.,$!diff --ed [original_file] -
Dadurch werden alle Zeilen im aktuellen Puffer (.,$!) durch das von Diff generierte ed-Skript (diff --ed [original_file] -) ersetzt, das zum Konvertieren der Originaldatei in den Inhalt des aktuellen Puffers erforderlich ist. Wir möchten dieses ed-Skript dann an einem sicheren Ort speichern und das Skript auf eine Version der Originaldatei anwenden, in die wir schreiben können. Speichern Sie das Skript also an einem beschreibbaren Ort, beispielsweise in Ihrem Anmeldeordner:
:w ~/my_ed_script
Beenden Sie nun vi und verwenden Sie dieses ed-Skript, um die bearbeitete Datei zu erhalten, die überhaupt nicht gespeichert werden konnte. So erreichen Sie dies über die Bash-Befehlszeileneingabeaufforderung „$“:
$ (cat ~/my_ed_script && echo 'w') | ed - writable_copy_of_original_file
Was diese Befehlssequenz in Worten ausführt, ist, das von uns generierte Skript mit diff zu verketten und den ed-Write-Befehl „w“ an die Standardeingabe von ed zurückzugeben. Ed wendet dieses Skript dann auf die beschreibbare Kopie der Originaldatei an und schreibt diese geänderten Pufferänderungen zurück in die Datei.
Das ist also eine Möglichkeit, mit vi, diff und ed. in vi ausgeführte Arbeiten in einer Datei zu speichern, die ursprünglich jemand anderem gehört hatte.