Wiele poleceń w tej samej linii

188

Próbowałem znaleźć coś, co pozwoli mi uruchomić wiele poleceń w tym samym wierszu w Vimie, podobnie jak używanie średników do oddzielania poleceń w systemach * nix lub &Windows. Czy jest na to sposób?

Bub Bradlee
źródło
2
Wow, próbowałem dowiedzieć się o vimie z twojego pytania (co zrobiłem) i odkryłem, że mogę użyć ;zamiast &&rozdzielić polecenia powłoki Uniksa!
8
@ebyrob Uważam, że ważne jest, aby pamiętać, że &&jest to „boolean” i „w poleceniach powłoki”, więc jeśli tak command1 && command2, command2to wykona się tylko po command1pomyślnym wykonaniu. ze ;jesteś po prostu ręcznie określający koniec tej linii i rozpoczęcie nowego. To tak samo, jak pisanie każdego polecenia w innym wierszu w skrypcie powłoki.
Czy
... i polecenie 1 || polecenie2, polecenie2 zostanie wykonane tylko wtedy, gdy polecenie 1 nie powiedzie się. To dlatego, że w logice komputerowej || a && są bitowe, i chociaż „&&” implikuje, że zarówno polecenie1 ORAZ polecenie2 mają być ewaluowane, polecenie2 NIE musi być oceniane, jeśli polecenie1 zawiedzie, bez względu na to, jakie polecenie cmd2 zwróci, zawsze zawiedzie, ponieważ pierwsze zwróciło fałsz ( 0), a 0 i& 1 nadal będą wynosić zero. Podobnie, jeśli polecenie1 = prawda, nie ma powodu dla polecenia 2 w ocenie OR, ponieważ w tym momencie jest to już prawda (1), ponieważ 1 || 0 to 1 i tylko jeśli jest to 0, potrzebowałoby 0 || 1 (co wciąż jest 1)
osirisgothra
@osirisgothra, która jest znana jako zwarcie / ocena zwarcia.
mówiący

Odpowiedzi:

241

Pasek |pozwoli ci to zrobić. Z:help :bar

'|'można użyć do oddzielenia poleceń, dzięki czemu można wydać wiele poleceń w jednym wierszu. Jeśli chcesz użyć '|'argumentu, poprzedz go '\'.

Przykład:

:echo "hello" | echo "goodbye"

Wynik:

hello
goodbye

Uwaga: może się okazać, że ~/.vimrcnie obsługuje mapowania |, lub \|. W takich przypadkach spróbuj użyć <bar>zamiast tego.

michaelmichael
źródło
8
Uważaj tylko na kilka poleceń, które nie działają |!
za dużo php
31
Jeśli zauważysz, że chcesz użyć wielu poleceń w mapinstrukcji (i uwierz mi, to zrobisz), sprawdź :help map_bar.
Bill Odom
9
To prawda. Kilka miesięcy temu zadałem to pytanie superużytkownikowi. My .vimrcnie obsługuje znaku Esc ( \|) dla mapowań. Nauczyłem się, że muszę pisać <bar>.
michaelmichael
Dzięki za działające rozwiązanie! :help barpokazuje jednak motion.txt i nic o wielu poleceniach.
geekQ
1
@geekQ powinien być:help <bar>
Sri Kadimisetty
92

Wstaw <CR>(Carriage Return / Enter) pomiędzy poleceniami i po nich. Na przykład:

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

Nie używaj, |ponieważ:

  • Niektóre polecenia mają problemy, jeśli używasz |ich po nich

  • | nie działa konsekwentnie w plikach konfiguracyjnych, patrz :help map_bar

Babken Vardanyan
źródło
42

Możesz zdefiniować funkcję, która wykonuje twoje polecenia.

function Func()
     :command
     :command2 
endfunction

I umieść to na przykład w swoim vimrc. Uruchom funkcję za pomocą

exec Func()
Jonatan
źródło
1
Czyste rozwiązanie. Na pewno przydałby się w przypadku więcej niż dwóch lub tylko długich poleceń.
elimirks
1
Bardzo przydatne również ze względu na możliwość ręcznego podawania błędów przy try / catch.
Immanuel Weihnachten
2
Jest bardziej konwencjonalny, :call Func()ponieważ :execute Func()oznacza coś więcej. Oznacza to wykonanie wartości zwracanej funkcji jako polecenia. Opisana tutaj funkcja zwykle nie ma polecenia, które zaczyna się od :return, więc jego wartością zwrotną będzie liczba zero. Wykonanie tego polecenia spowoduje przeniesienie kursora do pierwszego wiersza bieżącego bufora, co nie zawsze jest tym, o czym myślisz.
minopret
26

Separator poleceń w vimie to |.

Daenyth
źródło
16

Zawsze ^Jrozdzielałem wiele poleceń, naciskając Ctrl+ v, Ctrl+ j.

eruciform
źródło
To wydaje się być jedynym rozwiązaniem, które faktycznie działa. Kogo mam podać, jeśli chcę użyć tego ciągu?
DerWeh
Nie można użyć ^Jjako separatora poleceń w ciągu, ponieważ wstawia on znak NULL kończący ciąg. możesz jednak użyć <CR> = "\ n".
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,
12

Pomyślałem, że może to pomóc komuś, kto próbuje dokonać podstawień w łańcuchu, a jedno się nie powiedzie

z komentarza

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

Możesz użyć eflagi, aby zignorować błąd, gdy ciąg nie zostanie znaleziony.

Jerinaw
źródło
2

Możesz utworzyć nowy plik i napisać na nim swoje polecenia. Następnie :so %, co oznacza źródłowy plik bieżący.

Piosenka
źródło