Mehrere Befehle in derselben Zeile

187

Ich habe versucht, etwas zu finden, mit dem ich in Vim mehrere Befehle in derselben Zeile ausführen kann, ähnlich wie bei der Verwendung von Semikolons zum Trennen von Befehlen in * nix-Systemen oder &in Windows. Gibt es eine Möglichkeit, dies zu tun?

Bub Bradlee
quelle
2
Wow, ich habe versucht, aus Ihrer Frage (die ich gemacht habe) etwas über vim zu lernen und herausgefunden, dass ich auch Unix-Shell-Befehle verwenden kann, ;anstatt sie &&zu trennen!
8
@ebyrob Ich halte es für wichtig zu beachten, dass &&es in Shell-Befehlen 'boolean and' ist. Wenn Sie dies getan haben command1 && command2, command2wird es nur ausgeführt, wenn es command1erfolgreich ausgeführt wird. mit ;Sie nur manuell das Ende der Zeile spezifiziert und eine neue zu starten. Es ist dasselbe wie jeden Befehl in eine andere Zeile in einem Shell-Skript zu schreiben.
Wird
... und Befehl1 || Befehl2, Befehl2 wird nur ausgeführt, wenn Befehl1 fehlschlägt. Das liegt daran, dass in der Computerlogik das || und && sind bitweise und obwohl "&&" impliziert, dass sowohl Befehl1 als auch Befehl2 ausgewertet werden sollen, muss Befehl2 NICHT ausgewertet werden, wenn Befehl1 fehlschlägt, da unabhängig davon, was cmd2 zurückgibt, er immer fehlschlägt, da der erste false zurückgibt ( 0) und 0 && 1 wären immer noch Null. Ähnlich wie bei Befehl1 = wahr gibt es keinen Grund für Befehl 2 in einer ODER-Auswertung, da es zu diesem Zeitpunkt bereits wahr ist (1), weil 1 || 0 1 ist und nur wenn es ist 0, würde 0 || 1 benötigen (was immer noch 1 ist)
osirisgothra
@osirisgothra, das als Kurzschluss / Kurzschlussbewertung bekannt ist.
sprechender

Antworten:

241

Über eine Leiste |können Sie dies tun. Von:help :bar

'|'kann zum Trennen von Befehlen verwendet werden, sodass Sie mehrere Befehle in einer Zeile eingeben können. Wenn Sie '|'ein Argument verwenden möchten , gehen Sie ihm voran '\'.

Beispiel:

:echo "hello" | echo "goodbye"

Ausgabe:

hello
goodbye

NB: Möglicherweise stellen Sie fest, dass Ihr ~/.vimrcMapping nicht unterstützt |, oder \|. Versuchen Sie in diesen Fällen <bar>stattdessen,.

michaelmichael
quelle
8
Achten Sie auf die wenigen Befehle, mit denen Sie nicht arbeiten können |!
zu viel PHP
31
Wenn Sie feststellen, dass Sie mehrere Befehle in einer mapAnweisung verwenden möchten (und glauben Sie mir, Sie werden es tun), lesen Sie :help map_bar.
Bill Odom
8
Das ist richtig. Genau diese Frage habe ich vor einigen Monaten im Superuser gestellt. My .vimrcunterstützt keine maskierte Leiste ( \|) für Zuordnungen. Ich habe gelernt, dass ich tatsächlich tippen muss <bar>.
Michaelmichael
Danke für die funktionierende Lösung! :help barzeigt allerdings motion.txt und nichts über mehrere Befehle.
GeekQ
1
@geekQ sollte sein:help <bar>
Sri Kadimisetty
90

Setzen Sie <CR>(Carriage Return / Enter) zwischen und nach Befehlen. Beispielsweise:

map <F5> :w<CR>:!make && ./run<CR>

Nicht verwenden, |weil:

  • Einige Befehle haben Probleme, wenn Sie |sie verwenden

  • | funktioniert in Konfigurationsdateien nicht konsistent, siehe :help map_bar

Babken Vardanyan
quelle
42

Sie können eine Funktion definieren, die Ihre Befehle ausführt.

function Func()
     :command
     :command2 
endfunction

Und platzieren Sie dies zum Beispiel in Ihrem vimrc. Führen Sie die Funktion mit aus

exec Func()
Jonatan
quelle
1
Saubere Lösung. Wäre auf jeden Fall praktisch für mehr als zwei oder nur lange Befehle.
Elimirks
1
Sehr nützlich auch für die Fähigkeit, Fehler mit try / catch zu übergeben.
Immanuel Weihnachten
2
Es ist konventioneller zu benutzen, :call Func()weil es :execute Func()etwas mehr bedeutet. Dies bedeutet, den Rückgabewert der Funktion als Befehl auszuführen. Die hier beschriebene Funktion hat normalerweise keinen Befehl, der mit beginnt :return, daher ist ihr Rückgabewert die Zahl Null. Wenn Sie dies als Befehl ausführen, bewegt sich der Cursor in die erste Zeile des aktuellen Puffers, was nicht immer das ist, was Sie sich vorgestellt haben.
Minopret
26

Der Befehl seperator in vim ist |.

Daenyth
quelle
16

Ich habe immer ^Jmehrere Befehle durch Drücken von Ctrl+ v, Ctrl+ getrennt j.

eruciform
quelle
Dies scheint die einzige Lösung zu sein, die tatsächlich funktioniert. Wen gebe ich an, wenn ich es in einer Zeichenfolge verwenden möchte?
DerWeh
Sie können nicht ^Jals Befehlstrennzeichen in einer Zeichenfolge verwenden, da das Zeichen NULL eingefügt wird, das die Zeichenfolge beendet. Sie können jedoch <CR> = "\ n" verwenden.
Tinmarino
exe "echo 'foo' \n echo 'bar'"
Tinmarino
exe "echo 'foo'" . nr2char(0x0a) . "echo 'bar'"
Tinmarino
map aa :echo 'foo' <C-V><C-J> echo 'bar'<CR>
Tinmarino
11

Dachte, dies könnte jemandem helfen, der versucht, Substitutionen in einer Kette vorzunehmen, und einer schlägt fehl

aus einem Kommentar

% s/word/newword/ge | % s/word2/newword2/ge

Sie können das eFlag verwenden, um den Fehler zu ignorieren, wenn die Zeichenfolge nicht gefunden wird.

Jerinaw
quelle
2

Sie können eine neue Datei erstellen und Ihre Befehle darauf schreiben. Dies :so %bedeutet dann die aktuelle Quelldatei.

Lied
quelle