Vários comandos na mesma linha

187

Eu tenho tentado encontrar algo que me permita executar vários comandos na mesma linha no Vim, semelhante ao ponto e vírgula para separar comandos nos sistemas * nix ou &no Windows. Existe uma maneira de fazer isso?

Bub Bradlee
fonte
2
Uau, eu estava tentando aprender sobre o vim com sua pergunta (o que fiz) e descobri que eu poderia usar em ;vez de &&separar também os comandos do shell do Unix!
8
@ebyrob Eu sinto que é importante notar que &&é 'booleano' e 'nos comandos do shell; portanto, se você tiver command1 && command2, command2só será executado se command1executado com êxito. com ;você apenas especificando manualmente o final dessa linha e iniciando uma nova. É o mesmo que escrever cada comando em uma linha diferente em um script de shell.
Will
... e command1 || command2, command2 será executado apenas se command1 falhar. Isso porque na lógica do computador o || e && são bit a bit, e mesmo que "&&" implique que ambos os comandos1 E command2 devam ser avaliados, o comando2 NÃO precisa ser avaliado se o comando1 falhar porque, independentemente do cmd2, ele sempre falhará, pois o primeiro retornou falso ( 0) e 0 && 1 ainda seriam zero. Da mesma forma, se command1 = true, não há razão para o comando 2 em uma avaliação OR, porque nesse momento já é verdadeiro (1), porque 1 || 0 é 1 e somente se for 0, precisaria 0 || 1 (que ainda é 1)
osirisgothra
@osirisgothra, conhecida como avaliação de curto-circuito / curto-circuito.
speakingcode

Respostas:

241

Uma barra |permitirá que você faça isso. De:help :bar

'|'pode ser usado para separar comandos, para que você possa dar vários comandos em uma linha. Se você deseja usar '|'um argumento, preceda-o com '\'.

Exemplo:

:echo "hello" | echo "goodbye"

Resultado:

hello
goodbye

NB: Você pode achar que o seu ~/.vimrcnão suporta mapeamento |, ou \|. Nesses casos, tente usar <bar>.

michaelmichael
fonte
8
Apenas observe os comandos que não funcionam |!
Php demais)
31
Quando você quiser usar vários comandos em uma mapdeclaração (e acredite, você o fará), confira :help map_bar.
Bill Odom
8
Isso é verdade. Eu fiz essa mesma pergunta sobre superusuário alguns meses atrás. Meu .vimrcnão suporta uma barra de escape ( \|) para mapeamentos. Eu aprendi que tenho que realmente digitar <bar>.
22410 Michael michaelmichael
Obrigado pela solução de trabalho! :help barmostra motion.txt e nada sobre vários comandos.
geekQ
1
@geekQ deveria ser:help <bar>
Sri Kadimisetty 20/01
90

Coloque <CR>(retorno / entrada de carro) entre e depois dos comandos. Por exemplo:

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

Não use |porque:

  • Alguns comandos têm problemas se você os usar |depois deles.

  • | não funciona de maneira consistente nos arquivos de configuração, consulte :help map_bar

Babken Vardanyan
fonte
42

Você pode definir uma função que executa seus comandos.

function Func()
     :command
     :command2 
endfunction

E coloque isso, por exemplo, no seu vimrc. Execute a função com

exec Func()
Jonatan
fonte
1
Solução limpa. Definitivamente seria útil para mais de dois ou apenas comandos longos.
precisa saber é
1
Muito útil também pela capacidade de entregar erros com try / catch.
Immanuel Weihnachten
2
É mais convencional de usar :call Func()porque :execute Func()significa algo mais. Significa executar o valor de retorno da função como um comando. A função descrita aqui normalmente não terá um comando que comece com :return, portanto, seu valor de retorno será o número zero. Executar isso como um comando moverá o cursor para a primeira linha do buffer atual, o que nem sempre é o que você tinha em mente.
Minopret # 18/18
26

O comando seperator no vim é |.

Daenyth
fonte
16

Eu sempre usei ^Jpara separar vários comandos pressionando Ctrl+ v, Ctrl+ j.

eruciforme
fonte
Esta parece ser a única solução que realmente funciona. Quem eu especifico isso se eu quiser usá-lo em uma string?
DerWeh
Você não pode usar ^Jcomo separador de comandos em uma sequência porque está inserindo o caractere NULL que termina a sequência. no entanto, você pode usar <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
11

Pensei que isso poderia ajudar alguém tentando fazer substituições em uma cadeia e uma falha

de um comentário

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

Você pode usar o esinalizador para ignorar o erro quando a cadeia não for encontrada.

Jerinaw
fonte
2

Você pode criar um novo arquivo e escrever seus comandos nele. Então :so %, o que significa arquivo atual de origem.

Canção
fonte