Wenn ich das von der Shell aus mache:
$ sleep 100
Ich kann es in den Hintergrund treten lassen, indem ich:
^Z
$ bg
Und dann benutze meine Shell weiter. Sie können den gleichen Effekt erzielen, indem Sie &
am Ende des Befehls ein hinzufügen , aber das vergesse ich oft.
In Vim mache ich oft:
:!sleep 100
Und auch hier vergesse ich oft, das hinzuzufügen &
. Kann ich diesen Prozess in den Hintergrund stellen und Vim wie in der Shell weiter verwenden?
external-command
unix
Martin Tournoij
quelle
quelle
&
jedes Mal zum Anhängen auffordern ::nnoremap :! :!&<Left>
... Aber manchmal möchten Sie das natürlich nicht&
und müssen <Del> drücken, um es zu entfernen.Antworten:
Da
<C-z>
wird Vim selbst angehalten, nicht nur der gestartete Shell-Befehl, der nicht funktioniert.Was ich tun würde, ist, den lang laufenden Befehl mit abzubrechen
<C-c>
und dann denselben Befehl im Hintergrund über neu zu starten(Der
:!!
Befehl ist praktisch, um den vorherigen externen Befehl hier abzurufen. Sie können auch den Ex-Befehlsverlauf über verwenden<Up>
.)quelle
Sie können den Befehl in ein Shell-Skript einfügen, das sich selbst als Hintergrund verwendet. Der Inhalt könnte zum Beispiel sein:
quelle
tmux
standardmäßig, aber das Problem ist, dass meine Vim-Sitzung (mit geöffneten Dateien und dergleichen) immer noch nutzlos ist. Ich könnte in einen anderen Bereich wechseln und dort mein Skript ausführen, aber das sind viel mehr Aktionen als:!gitk %
zum Beispiel ... Die Sache mit der Verwendung von Skripten ist, dass ich viele dieser Skripte für jeden möglichen Befehl vorab erstellen müsste. Vielleicht ist es keine schlechte Idee für einige der am häufigsten verwendeten Befehle (wiegitk
&mupdf
).Normalerweise haben Sie beim Starten eines Prozesses nur die Möglichkeit, ihn zu beenden ( Ctrl+ c) oder anzuhalten ( Ctrl+ z, aber einschließlich des übergeordneten Prozesses).
Je nach Prozesstyp und Betriebssystem können Sie jedoch einige Tricks ausprobieren:
Senden
SIGTSTP
oderSIGSTOP
stoppt den Prozess (dasselbe Signal, das von Ctrl+ gesendet wurde z) undSIGCONT
setzt den Prozess fort (setzt ihn fort). Das Testen mitsleep
funktioniert nicht, daher müssen Sie es mit einer bestimmten Software testen, wie es mit den Signalen umgeht. Z.BSenden
SIGHUP
an den Prozess. Standardmäßig beendet dieses Signal den Prozess. Wenn der Prozess jedoch das SIGHUP-Signal implementiert, sollte es sich von der Steuerung von tty lösen und im Hintergrund mit einer neuen Prozess-ID erneut ausgeführt werden (normalerweise wird es bei Dämonen verwendet). Leider gehen viele Anwendungen nicht richtig damit um und sterben einfach (einschließlichsleep
). Z.BAndere Lösungen könnten Tools wie
retty
(erneutes Anschließen an ein Pseudo-tty),detach
( Trennen eines Prozesses vom Terminal),nohup
( Trennen des Prozesses vom Terminal ) odergdb
(Anhängen an einen vorhandenen Prozess-p
und Schließen der Dateideskriptoren wie tty, ähnliches Beispiel) verwenden ).Weitere Informationen finden Sie unter: Job Control (Unix) - Implementierung bei Wikipedia.
Siehe auch:
man kill
oderman sigaction
.quelle
Hinweis : Diese Antwort scheint nur mit den Shells
tcsh
und zu funktionierenfish
. Ich habe auch versuchtbash
,dash
,mksh
, undzsh
, und es nicht dort arbeiten; Ich bin mir nicht sicher , warum, denn wenn wir die gleichen Aktionen aus diesen Schalen ohne Vim tun, es tut wie erwartet ... (:!
Befehle obwohl die Shell ausgeführt werden).Ich benutze zufällig
tcsh
, also funktioniert es für mich ...Sie können verwenden
:set shell=/bin/tcsh
, um Ihre Shell festzulegen; Dies ist jedoch global. Verwenden Sie es also nur, wenn Sie der Meinung sind, dass dies eine sehr wichtige Funktion ist :-)^Z
Senden Sie einSIGTSTP
Signal, Sie können dieses Signal mit sendenkill
und dann verwendenSIGCONT
, um den Vorgang fortzusetzen (fortzusetzen). Dadurch wird der Prozess von Vim getrennt.Da es schwierig ist, dies zu zeigen
sleep
(woher wissen Sie, dass die Ausführung fortgesetzt wurde?), Werde ichgitk
als Beispiel verwenden (aber jedes GUI-Programm wird dies tun):Zum Beispiel in Vim:
Und dann in einem anderen Terminal:
Sie können natürlich auch verwenden
killall
, oderpkill
; zum Beispiel:Sie müssen hierfür ein anderes Terminal öffnen, was nicht ideal ist, aber es ermöglicht Ihnen, sowohl Ihr Vim als auch Ihren externen Prozess weiter zu verwenden.
quelle