:!<command>
kann verwendet werden, um einen Befehl in der Shell auszuführen. Aber dies "übernimmt" mein Terminal und füllt es mit stdout
diesem speziellen Befehl.
Wie führe ich einen Befehl im Hintergrund aus, der mich nur bei einem Exit-Code ungleich Null benachrichtigt?
external-command
OrangeTux
quelle
quelle
Antworten:
:silent exec "!command"
Beachten Sie, dass Ihre vim-Sitzung weiterhin belegt ist, während Ihr Befehl ausgeführt wird. Dies liegt an der Synchronität von Vim. Sie können immer noch zu Ihrer Shell zurückkehren, indem Sie STRG + z drücken (um Vim in den Hintergrund zu verschieben) und dann Vim mit dem Befehl
fg
wie gewohnt fortsetzen.Um Dinge asynchron zu erledigen, werfen Sie einen Blick auf Tim Popes Plugin vim-dispatch oder das Projekt NeoVim, das native Unterstützung für die asynchrone Befehlsausführung bietet und das Sie mit dem Plugin NeoMake problemlos nutzen können. Die neueste Version von Vim unterstützt auch asynchrone Aufgaben.
Siehe : h: leise
quelle
:silent !ls
) ... Es funktioniert auch nicht Bei einem Exit-Code ungleich 0 ist die Ausgabe nicht korrekt ... Ich fürchte, es ist ein bisschen:silent
:silent exec "!ls"
noch:silent !ls
zeigen überhaupt keine Ausgabe auf meiner Version von Vim, 7.4 mit Patches 1-213.:silent !ls
: i.stack.imgur.com/1XvS6.png ... Ich muss drücken^L
, um es wieder zu beheben ...So führen Sie einen Befehl aus, ohne die Eingabe-Nachricht auszulösen:
Versuchen Sie folgendes einfaches Beispiel:
Drücken Sie dann Ctrl+ L(oder
:redraw!
), um den Bildschirm zu aktualisieren, wenn Sie zu Vim zurückkehren.Um eine Aktualisierung zu vermeiden, können Sie Ihren eigenen benutzerdefinierten Befehl definieren, z.
Jetzt können Sie mit dem neuen Vim-Befehl einen Shell-Befehl ausführen (Anmerkung: ohne ! Und mit Großbuchstaben S ):
Quelle: Vermeiden der Eingabeaufforderung "Drücken Sie die EINGABETASTE, um fortzufahren" auf der Vim Wikia-Site
quelle
:Silent ctags -R . > /dev/null &
im Hintergrund ausgeführt werden. Durch das Senden von stdout an / dev / null wird verhindert, dass die Ausgabe im vim-Puffer angezeigt wird.Eine schnelle und schmutzige Lösung (in reinem Vimscript)
Dies kann einen Prozess im Hintergrund starten:
Vim muss jedoch einen Weg finden, um herauszufinden, wann und wie der Prozess abgeschlossen ist. Verwenden wir also eine Markierungsdatei:
Jetzt können wir Vim bitten, von Zeit zu Zeit zu überprüfen, ob der Vorgang abgeschlossen ist:
Hey, es ist nicht schön, aber es funktioniert irgendwie!
Nachteile
Leider wird die obige automatische Bestätigung erst ausgelöst, wenn Sie den Cursor bewegen. Und wenn Sie mehr als einen Hintergrundprozess gleichzeitig ausführen möchten, müssen Sie diesen Dateien und dem Namen der autocmd-Gruppe eindeutige IDs hinzufügen.
Wenn Sie also mit einer zusätzlichen Abhängigkeit fertig werden, ist es möglicherweise besser, eine bewährte Lösung wie das in einer anderen Antwort erwähnte vim-dispatch-Plugin zu verwenden.
Ausgabe anzeigen
Wenn Sie die Ausgabe des Prozesses und nicht nur den Exit-Code sehen möchten , ersetzen Sie das
echo
obige Finale durch:Das würde das Vorschaufenster öffnen. So verwenden Sie stattdessen die Quickfix-Fehlerliste:
Mit der Quickfix-Liste können Sie leicht zu Fehlern navigieren, indem Sie verwenden
:cnext
.copen
Bewegt jedoch den Cursor in das Quickfix-Fenster, wenn es geöffnet wird, was wahrscheinlich überraschend / ärgerlich sein wird.(Eine Problemumgehung dafür wäre das Öffnen des QF-Fensters
:copen
beim ersten Starten des Prozesses, sodass Sie es am Ende nicht aufrufen müssen.)quelle
Ausführen eines Befehls im Hintergrund
Ich habe einen Befehl ausgeführt, der für eine Weile blockiert war, und die Ausgabe hat mich nicht wirklich interessiert. Dies kann behoben werden, indem der Prozess gestartet wird, der nicht mit dem Terminal / Emulator, sondern mit dem System verbunden ist, und alle Ausgaben nach / dev / null umgeleitet werden. Zum Beispiel:
Das
(...&)
läuft im Hintergrund und> /dev/null
leitet alle Ausgaben um/dev/null
(nichts).Die Klammer fängt die Ausgabe in einer Subshell (oder so ähnlich) ein, hat aber den Nebeneffekt, dass sie nicht an die aktuelle Shell angehängt wird (keine große Sache).
Ausführen eines Befehls im Hintergrund mit Zuordnung
Mir ist gerade klar geworden, dass Sie, wenn Sie es tatsächlich abbilden, so etwas tun können
Das obige Fenster zeigt nichts in der Befehlsleiste an und zeigt außerdem nichts im Terminal außerhalb von vim an. Es wird zugeordnet
<leader>
e, was \ estandardmäßig der Fall ist .Ausführen eines Befehls, Erfassen der Ausgabe und Anzeigen des Inhalts
(Ein weiterer Schnitt - und vielleicht der schönste). Dieser zeigt die Ausgabe eines Befehls an, wenn Sie dies auswählen:
IN EINEM NEUEN TAB:
INNERHALB EINES VERTIKALEN SPALTES:
INNERHALB EINES HORIZONTALEN GETEILTEN:
... mach was du willst
quelle
Wenn Ihnen der Exit-Code egal ist, können Sie wie folgt vorgehen:
quelle
v:shell_error
sagt Ihnen die VariableIch bin mir nicht sicher, ob dies Ihren Anforderungen entspricht (behandelt Hintergrundprozesse nicht wie in
foo &
- ich bin mir nicht sicher, ob dies mit "im Hintergrund" gemeint ist ), aber ein benutzerdefinierter Befehl kann wie folgt verwendet werden:Dann benutze als zB:
Wenn Sie die Fehlermeldung nicht brauchen / wollen,
system()
könnte ein einfaches ausreichen, dann überprüfen Sie siev:shell_error
und melden Sie sich zB beiecho Error!
.Aus der Hilfe v: shell_error :
quelle
foo &
..." . Aus dem gesamten Q-Text habe ich entweder oder interpretiert. Entweder " Als externes Kommando ausführen AKA Hintergrund" oder "Als externes Kommando ausführen _und_ als Hintergrundprozess" . Ich antwortete hauptsächlich auf der Grundlage des Titels von Q usw. - und fügte einen Kommentar zu „Nicht sicher…“ hinzu - und überließ es dem OP, zu klären, ob entweder oder.Vim 8 führte die Jobunterstützung ein. Man kann externe Befehle im Hintergrund ausführen, ohne auf Plugins angewiesen zu sein. So führen Sie beispielsweise einen Markdown-Server ( markserv ) am aktuellen Standort aus und blockieren keine vim-Sitzung:
Dadurch wird der markserv-Prozess als Unterprozess des aktuellen vim-Prozesses gestartet. Sie können dies mit bestätigen
pstree
.Siehe job_start
quelle
Ich benutze folgenden Code:
Jetzt können Sie Folgendes eingeben
Das sieht fast so aus, als wäre Vim ein
silent !
Kommando eingebaut , mit Ausnahme der HauptstadtS
. Es erlaubt sogar ein optionales!
, um es noch ähnlicher aussehen zu lassen. Der Aufruf vonsystem()
macht den Shell-Befehl wirklich leise: Es blinkt kein Bildschirm und es wird nicht neu gezeichnet.(Wenn Sie jemals einen Statuscode benötigen, können Sie die
v:shell_error
Variable überprüfen. Weitere Informationen finden Sie in der Hilfe.)quelle
Das AsyncRun- Plugin ermöglicht es Ihnen, Shell-Befehle im Hintergrund in Vim8 / NeoVim auszuführen und die Ausgabe im Quickfix-Fenster anzuzeigen.
Nur als
!
Befehlsersatz:Sie können die Ausgabe im Quickfix-Fenster auch vollständig ausblenden:
Wenn der Job beendet ist, werden Sie von AsyncRun über eine Option benachrichtigt
-post
:Das von definierte vim-Skript
-post
wird nach Beendigung des Jobs ausgeführt.quelle