Angenommen, ich habe einen X11-Server, der hängt, sodass ich die Arbeit aus der XTerm Vim-Sitzung, die der X11-Server steuert, nicht speichern kann. (Nicht GVim, nur reguläres Vim-in-XTerm.)
Gibt es eine Möglichkeit, wie ich (von einem anderen Terminal aus) den laufenden Vim-Prozess anweisen kann, "alles zu speichern und zu beenden" von der Befehlszeile aus? Durch Senden eines Signals oder auf andere Weise?
Ich kenne Vim-Auslagerungsdateien und weiß, dass ich Vim einfach töten und mich vom Auslagerungsvorgang erholen kann. Ich frage, ob es einen "saubereren" Weg gibt.
Antworten:
Nachdem ich vor kurzem auf dieses Problem gestoßen war (über einen anderen Weg: Vim läuft auf einem Remote-Server und ich hatte den Bildschirm vergessen), entschied ich mich, nach einem Weg zu suchen.
Die erste Idee war, die von Vim verwendeten Dateideskriptoren nachzuschlagen und zu versuchen, darauf zu schreiben. Vims FDS zeigen auf das Psedoterminal, das vom Terminal-Emulator geöffnet wurde.
Meine ersten Versuche scheiterten jedoch:
Der
^[
und^M
wurden erhalten von CtrlVEscund CtrlVEnterverbunden.Sie alle führten dazu, dass die Zeichen auf dem Terminal angezeigt wurden (ich habe dies lokal getestet, bevor ich es auf die Remote-Sitzung angewendet habe). Ich googelte herum und fand diesen SO-Beitrag , in dem Python zum Schreiben auf das Pseudoterminal-Gerät verwendet wurde:
Und das Ausprobieren auf einer interaktiven Python-Shell hat funktioniert:
Getan!
quelle
Sie können Befehle extern an vim senden, wenn Sie ... ausführen.
Vim-Server
Zum Beispiel:
veranlasst vim, einen Server mit dem Namen "vim" zu starten. Wenn Sie es zweimal aufrufen, wird der neue Server "vim1", dreimal "vim2" usw. genannt. Möglicherweise möchten Sie einen Alias für diesen Befehl erstellen.
Anhand des Fenstertitels können Sie erkennen, welchen Server eine bestimmte Instanz benannt hat. Wenn du siehst:
Der Servername ist "VIM3" ("vim3" bezieht sich auf dieselbe Instanz). Beachten Sie Folgendes, wenn Sie Folgendes sehen:
Das bedeutet nicht unbedingt, dass es einen Server namens "VIM" hat. Sie können sicherstellen, dass der Server vorhanden ist, indem Sie die Servernamen wie folgt auflisten:
Dennoch stellt sich die Frage speziell nur für "VIM". Wenn Sie "GVIM" oder einen anderen Namen mit einer angehängten Nummer sehen, bedeutet dies, dass es sich um einen Server handelt.
Wie benutze ich den Client?
Nun können Sie auf Ihre Frage alle speichern und eine bestimmte vim-Instanz beenden, indem Sie Folgendes ausführen:
Wir verwenden die Escape-Taste, um in den normalen Modus zurückzukehren, falls Sie sich im Einfüge- oder Befehlsmodus befinden. Sie können auch etwas anderes tun
:wqa
, aber das scheint mir am besten geeignet zu sein, da die Auslagerungsdateien der Puffer, die nicht gespeichert werden konnten, erhalten bleiben (weil sie neu sind und keinen Dateinamen usw. haben).Wenn Sie dies für alle Instanzen wie hier tun möchten, können Sie die Serverliste wie folgt durchlaufen:
Wenn es Ihnen aus irgendeinem Grund nicht gefällt
--remote-send
, können Sie stattdessen Folgendes verwenden,--remote-expr
was den Vorteil hat, dass der Client das Ergebnis oder den Fehler ausgibt, den er möglicherweise verursacht hat:Beachten Sie, dass für die Verwendung der Serverfunktionalität von Vim Vim mit dieser
+clientserver
Option erstellt wurde.quelle
Installieren Sie den
reptyr
Befehl mit dem Paketmanager des Systems, z.Verwenden Sie dann den
reptyr
Befehl, um das ferne tty wie folgt auf das lokale (neue) tty umzustellen:Wo
PID
ist die Prozess-ID aus derps
Befehlsausgabe?Bei dem Fehler:
Ändern Sie den "ptrace scope" auf 0:
Sobald die vim-Sitzung von der alten auf die neue Sitzung umgestellt wurde, speichern und beenden Sie sie wie gewohnt. Beachten Sie, dass Sie möglicherweise drücken müssen Enter, um die Konsole zu aktualisieren.
quelle
Was ist, wenn du Vim anmutig tötest?
kill -s 15 -p [PID for Vim]
kill -s (signal) 15 heißt SIGTERM und teilt diesem Prozess mit, dass er sich ordnungsgemäß herunterfahren soll.
Um die PID (Process ID) von Vim zu erhalten, verwenden Sie:
ps ax | grep vim
quelle