Più comandi sulla stessa riga


188

Ho cercato di trovare qualcosa che mi consentisse di eseguire più comandi sulla stessa riga in Vim, come usare i punti e virgola per separare i comandi nei sistemi * nix o &in Windows. C'è un modo per fare questo?


2
Wow, stavo provando a conoscere vim dalla tua domanda (cosa che ho fatto) e ho scoperto che avrei potuto usare ;invece di &&separare anche i comandi della shell Unix!

8
@ebyrob Sento che è importante notare che &&è "booleano" nei comandi della shell, quindi se hai command1 && command2, command2verrà eseguito solo se command1eseguito correttamente. con ;stai semplicemente specificando manualmente la fine di quella linea e iniziando una nuova. È lo stesso che scrivere ogni comando su una riga diversa in uno script di shell.
Sarà il

... e comando1 || command2, command2 verrà eseguito solo se command1 ha esito negativo. Questo perché nella logica del computer il || e && sono bit a bit, e anche se "&&" implica che sia command1 AND command2 devono essere evacuati, command2 NON deve essere valutato se command1 fallisce perché, indipendentemente da ciò che restituisce cmd2, fallirà sempre poiché il primo ha restituito false ( 0) e 0 && 1 sarebbero comunque zero. Analogamente, se command1 = true, non esiste alcun motivo per il comando 2 in una valutazione OR poiché a quel punto è già vero (1), perché 1 || 0 è 1 e solo se è 0, avrebbe bisogno di 0 || 1 (che è ancora 1)
osirisgothra,

@osirisgothra, noto come valutazione di corto circuito / corto circuito.
speakingcode

Risposte:


241

Una barra |ti permetterà di farlo. A partire dal:help :bar

'|'può essere usato per separare i comandi, in modo da poter dare più comandi in una riga. Se si desidera utilizzare '|'in un argomento, precederlo con '\'.

Esempio:

:echo "hello" | echo "goodbye"

Produzione:

hello
goodbye

NB: Potresti scoprire che il tuo ~/.vimrcnon supporta il mapping |o \|. In questi casi, prova <bar>invece a utilizzare .


8
Fai attenzione ai pochi comandi che non funzionano |!
troppo php,

31
Quando ti ritrovi a voler usare più comandi in mapun'istruzione (e credimi, lo farai), dai un'occhiata :help map_bar.
Bill Odom,

9
È vero. Ho fatto quella stessa domanda sul superutente qualche mese fa. My .vimrcnon supporta una barra di escape ( \|) per i mapping. Ho imparato che devo davvero scrivere <bar>.
michaelmichael,

Grazie per la soluzione funzionante! :help barmostra motion.txt e nulla su più comandi.
geekQ,

1
@geekQ dovrebbe essere:help <bar>
Sri Kadimisetty il

92

Inserire <CR>(Ritorno / Invio carrello) tra e dopo i comandi. Per esempio:

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

Non usare |perché:

  • Alcuni comandi hanno problemi se li usi |dopo

  • | non funziona in modo coerente nei file di configurazione, vedere :help map_bar


42

È possibile definire una funzione che esegue i comandi.

function Func()
     :command
     :command2 
endfunction

E posizionalo, ad esempio, nel tuo vimrc. Esegui la funzione con

exec Func()

1
Soluzione pulita. Sarebbe sicuramente utile per più di due o solo comandi lunghi.
elimirks,

1
Molto utile anche per la capacità di gestire errori con try / catch.
Immanuel Weihnachten,

2
È più convenzionale da usare :call Func()perché :execute Func()significa qualcosa di più. Significa eseguire il valore restituito della funzione come comando. La funzione qui descritta di solito non avrà un comando che inizia con :return, quindi il suo valore di ritorno sarà il numero zero. Eseguendolo come comando sposterai il cursore sulla prima riga del buffer corrente, che non è sempre quello che avevi in ​​mente.
minopret,


16

Ho sempre usato ^Jper separare più comandi premendo Ctrl+ v, Ctrl+ j.


Questa sembra essere l'unica soluzione che funziona davvero. Chi posso specificare questo se voglio usarlo in una stringa?
DerWeh,

Non è possibile utilizzare ^Jcome separatore di comandi in una stringa perché sta inserendo il carattere NULL che termina la stringa. tuttavia è possibile utilizzare <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

Pensato che questo potrebbe aiutare qualcuno che cerca di fare sostituzioni in una catena e si fallisce

da un commento

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

È possibile utilizzare il eflag per ignorare l'errore quando la stringa non viene trovata.


2

Puoi creare un nuovo file e scrivere i tuoi comandi su di esso. Quindi :so %, il che significa che il file corrente di origine.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.