Ich öffne ein Terminal und dann Vim. Dann arbeite ich an meinem Quellcode, aber leider klicke ich auf die Schaltfläche zum Schließen der Terminal-Titelleiste und meine Arbeit geht verloren. Ist es möglich, Vim so zu konfigurieren, dass es mir sagt, wenn ich versuche, das Terminal zu schließen, ohne meine Arbeit zu speichern?
Vielen Dank!
Antworten:
Es gibt keine Möglichkeit
vim
, im Voraus zu wissen, dass der Großelternprozess (das Terminal) beendet wird. Daher wird auch dieser Prozess normalerweise durch das Beenden der übergeordneten Prozesse beendet.Bei den meisten Standard-Setups
vim
wird jedoch eine.swp
Datei erstellt, die nach der aktuellen Datei benannt ist, die bearbeitet wird. zum BeispielMyPrecious.java.swp
. Diese Datei sollte einen Schnappschuss der Datei enthalten,MyPrecious.java
kurz bevor dervim
Prozess beendet wurde. Sofern Sievim
diese.swp
Dateien nicht speziell in einem anderen Verzeichnis abgelegt haben, sollten sie sich im selben Verzeichnis wie die bearbeitete Datei befinden, und Sie können Ihre Bearbeitungsarbeit problemlos wiederherstellen.Beachten Sie, dass einige dieser Dateien mit einem Punkt beginnen,
.
sodass sie nicht sichtbar sind, es sei denn, Siels -a
listen die Dateien in einem Verzeichnis auf.quelle
.swp
Dateiname mit a beginnt,.
sodass er standardmäßig "unsichtbar" ist.Mit Blick auf das Problem aus einem anderen Blickwinkel,
screen
odertmux
können Sie Ihre Schale halten , unabhängig von Ihrem Terminal gehen. Wenn Sie das Terminal schließen, können Sie ein neues öffnen und die Verbindung zur ursprünglichen Shell wiederherstellen. Vim läuft noch.quelle
.zlogin
so dass es immer gestartet wird, wenn ich mich bei einer Shell anmelde . Seitdem habe ich nie ein Fenster verloren.if
nimmt nur Rückgabewerte - Sie müssen nicht Ihren Kreisverkehr ausstellen,tmux
gefolgt von einer Überprüfung$?
, nur überprüfentmux
.vim
hat keine Kontrolle darüber, wie die GUI Ihres Terminals funktioniertWM_DELETE_WINDOW
. Suchen Sie stattdessen in Ihrem Terminal nach einer Einstellung, die steuert, wie sich das Terminal verhält, wenn Sie zum Schließen aufgefordert werden, wenn es eine Shell mit untergeordneten Elementen hat.quelle
Es gibt eine Möglichkeit für Vim zu wissen, dass das Terminal geschlossen wurde: das
SIGHUP
Signal.Wenn Sie ein Terminal schließen, wird das
SIGHUP
Signal an den Steuerungsprozess gesendet , der normalerweise Ihre Shell ist. Ihre Shell sollte dann beendet werden, wodurch Vim dasSIGHUP
Signal gesendet wird . Standardmäßig werden Prozesse einfach beendet, wenn sie dasSIGHUP
Signal empfangen .Ich bin nicht mit Vim vertraut, aber vielleicht kann es so konfiguriert werden, dass alle Arbeiten gespeichert werden, bevor es beendet wird, wenn ein
SIGHUP
Signal empfangen wird. Wenn nicht, können Sie möglicherweise eine Shelltrap
aktivierenSIGHUP
, möglicherweise in Kombination mit dem Ausführen von Vim mitnohup
, um einen speziellen Befehl auszuführen, der dazu führt, dass Vim beim Schließen des Terminals eleganter beendet wird.quelle
Wie andere gesagt haben, kann vim nicht auf ein solches Ereignis reagieren. Sie können jedoch eine dieser Problemumgehungen in Betracht ziehen:
gvim
anstelle vonvim
, das auch über die Befehlszeile aufgerufen werden kann. Ein Alias kann bei der Anpassung an den Switch hilfreich sein (unter der Annahme einer Bash-kompatiblen Shell) :alias vim=gvim
. Die Angabe von gvim als bevorzugter Editor könnte ebenfalls hilfreich sein :export EDITOR=gvim
. Dies funktioniert jedoch nur auf einem lokalen Computer.tmux
oderscreen
) wurde bereits erwähnt.quelle
Dies kam zu mir, nachdem ich die Frage in einem anderen Forum gestellt hatte. AskUbuntu: vim.desktop - Änderungen, die beim Beenden des Terminals verloren gingen, und viele experimentelle
*.desktop
Dateien, die zeigen, dass es möglichgnome-terminal
wäre,vim
ohne Vorwarnung getötet zu werden, selbst wenn es in einer Shell ausgeführt würde und selbst wenn es dort wäre waren andere Befehle davor oder danach fürbash
odergnome-terminal
zum Ausführen.Eine "interaktive" Shell (
bash -i
) klang sicher, die GNOME-Warnung beim Schließen des Fensters aufzurufen, basierend auf der wörtlichen Warnmeldung:Das Hinzufügen der
-i
Option zu bash, wie sie aus der*.desktop
Datei ausgeführt wird, hat GNOME jedoch darangnome-terminal
gehindert, in meinen Tests ein Fenster zu öffnen (mit Ubuntu 16.04 - 3.18.3). Also habe ich stattdessen versucht, die interaktive Shell über ein Wrapper-Skript aufzurufen, und das war eine vollständige Lösung:/usr/local/bin/vim-gnome-wrap
... dann bearbeiten
/usr/share/applications/vim.desktop
oder in eine neue*.desktop
Datei kopieren , mit folgenden Änderungen:Dies gibt beim Schließen des Fensters eine Warnung aus, ob der
vim
Puffer nicht gespeicherte Änderungen aufweist oder nicht, und funktioniert mit mehreren Dateien. Besonderer Dank geht an @muru unten für den Vorschlag einer$@
Syntax, die Argumente genau beibehält (Leerzeichen und Metazeichen).quelle
bash -ic 'vim "$@"' vim "$@"
. Das sollte mit Dateinamen mit Leerzeichen usw. gut genug umgehen. (Der zweitevim
ist nur$0
für den Befehl, es kann alles sein.)