Bash-Befehle in vi


33

Ist es möglich, einen bash-Befehl in vi einzugeben und die stdout zu erhalten?

Ich finde es oft mühsam, vi zu schließen und wieder zu öffnen, nur weil ich etwas in der Shell nachschlagen möchte.

Antworten:


45

Ja, zB wenn Sie dies möchten ls, versuchen Sie:

:!ls

Verwenden Sie, um eine Shell zu erzeugen

:shell


genial, wie könnte ich ohne das leben?
Harfe

3
Tatsächlich vergesse ich oft, vi als root auszuführen, wenn ich etwas bearbeite. Dieser Befehl hat mir mehr Zeit erspart, als ich mich erinnern kann. :w !sudo tee %
Mark D

1
Ich wünschte, es gäbe eine Möglichkeit, dies in Gnu zu tunnano
ixtmixilix

1
Und wie kehren Sie nach der Verwendung von: shell zum Editor zurück?
VaTo

@VaTo: Um zurückzukehren, können Sie
Folgendes eingeben

12

Ich neige dazu ctrl+z, vi zu schlafen, auszuführen, was ich in der Shell brauche, und dann fgvi wieder aufzunehmen. Nicht gerade eine Antwort auf Ihre Frage, aber ich finde es eine sehr schnelle Art zu arbeiten.

Wenn Sie vergessen, dass vi im Hintergrund geöffnet ist (dies kann vorkommen, wenn Sie beschäftigt sind), werden Sie beim Versuch, sich von der Shell abzumelden ctrl+d, gewarnt, dass Hintergrundjobs ausgeführt werden, und Sie können sie entweder schließen. oder drücken Sie erneut Strg + d, um sich abzumelden. Wenn Sie versuchen, dieselbe Datei zweimal erneut zu öffnen, wird eine Wiederherstellungswarnung angezeigt, sodass Sie azum Abbrechen auf drücken und fg ausführen können, um zu vi zurückzukehren.


1
Dies kann zu Problemen führen, wenn Sie in der Befehlszeile verwickelt sind und vergessen, dass Sie vim im Hintergrund haben.
Eliot Ball

1
Ja, es ist möglich, ich habe es selbst gemacht. Für mich lohnt es sich, Shell-Konstanz zu haben. Ich werde meine Antwort aktualisieren, um Ihren Kommentar zu berücksichtigen
Rqomey

1
Ich denke, Sie wären besser dran mit Gnu-Bildschirm.
user606723

1
Ich benutze tmux selbst ... aber aus Gründen der Geschwindigkeit und wenn ich mich auf einem Server ohne tmux oder Bildschirm anmelde, ist es praktisch
Rqomey

11

Da Sie "get the stdout" erwähnt haben, beachten Sie, dass Sie dies tun können

:r! command

und die Ausgabe des Befehls wird der Datei hinzugefügt, oder

:<range>!command

den Inhalt des Bereichs durch den Befehl filtern zu lassen [zB :1,$!wc]


:%!commandsieht ziemlich nützlich aus
Eliot Ball

Ich benutze dies oft zum Sortieren von Zeilen [zB :.,+20 !sort]
Walter A

5

Meine bevorzugte Sprache ist

!!command

Das ist die Abkürzung für

:.!command

Dadurch wird die aktuelle Zeile durch den Befehl geleitet und die Ausgabe in die Datei eingefügt. Der häufigste Fall für mich ist, den Befehl mit vi zu bearbeiten und auszuführen:

!!sh

Oder

!<motion>command

wie zum Beispiel

!apsh

um den gesamten aktuellen Absatz durch die Shell zu führen.


2
Beachten !}Sie, dass Sie am Anfang des Absatzes positioniert sein müssen, versuchen Sie es !ap. (Ich weiß nicht, ob dies in jedem vi oder nur vim ist)
Random832

4

Mit Doppelpunkt und Ausrufezeichen können Sie jeden Befehl im Shell-Pfad und in den Shell-Skripten ausführen. Beachten Sie, dass der Befehl unter dem Benutzer ausgeführt wird, der das Programm vi / vim ausführt, und unter Verwendung seiner Umgebung.

:!<command>

Da vi die Umgebung verwendet, die beim Ausführen aktiv war, wird derselbe Pfad verwendet, der auch im übergeordneten Befehl angegeben war. Denken Sie daran, dass einige Shells einen Cache der Programme im Pfad behalten und vi möglicherweise nicht mit diesem Cache funktioniert (abhängig von der verwendeten Shell und ihrer Version), sodass Sie möglicherweise die falsche Binärdatei ausführen, falls Sie mehr haben als eine Binärdatei mit dem gleichen Namen.


4

Sie können die Ausgabe eines :!ls -lhBefehls anzeigen, indem Sie beispielsweise im Befehlsmodus eingeben .

Wenn Sie die Ausgabe des Befehls in die zu bearbeitende Datei einfügen möchten, fügen Sie einfach eine hinzu r. Zum Beispiel :r!which perl.


1

Verwenden !ist natürlich die richtige Antwort, aber wenn Sie häufig hin und her wechseln, kann auch etwas wie screen oder tmux hilfreich sein.


0

Ich habe dies in meinem .vimrc. Vor einiger Zeit auf Stack Overflow gefunden:

" Executes the current line in a bash shell; syntactically similar to slimv's ,d feature
:nmap ,,d Y:!<C-R>"<C-H><CR>

0

Ich würde und werde dies in Linux leicht umgehen, indem ich zwei Terminal-Befehlszeilenfenster öffne, in denen vi ausgeführt wird und das andere zur gleichen Zeit für andere Arbeiten verfügbar ist.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.