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?
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>.
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
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.
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
;
vez de&&
separar também os comandos do shell do Unix!&&
é 'booleano' e 'nos comandos do shell; portanto, se você tivercommand1 && command2
,command2
só será executado secommand1
executado 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.Respostas:
Uma barra
|
permitirá que você faça isso. De:help :bar
Exemplo:
:echo "hello" | echo "goodbye"
Resultado:
NB: Você pode achar que o seu
~/.vimrc
não suporta mapeamento|
, ou\|
. Nesses casos, tente usar<bar>
.fonte
|
!map
declaração (e acredite, você o fará), confira:help map_bar
..vimrc
não suporta uma barra de escape (\|
) para mapeamentos. Eu aprendi que tenho que realmente digitar<bar>
.:help bar
mostra motion.txt e nada sobre vários comandos.:help <bar>
Coloque
<CR>
(retorno / entrada de carro) entre e depois dos comandos. Por exemplo: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
fonte
Você pode definir uma função que executa seus comandos.
E coloque isso, por exemplo, no seu vimrc. Execute a função com
fonte
: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.O comando seperator no vim é
|
.fonte
Eu sempre usei
^J
para separar vários comandos pressionando Ctrl+ v, Ctrl+ j.fonte
^J
como 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".exe "echo 'foo' \n echo 'bar'"
exe "echo 'foo'" . nr2char(0x0a) . "echo 'bar'"
map aa :echo 'foo' <C-V><C-J> echo 'bar'<CR>
Pensei que isso poderia ajudar alguém tentando fazer substituições em uma cadeia e uma falha
de um comentário
Você pode usar o
e
sinalizador para ignorar o erro quando a cadeia não for encontrada.fonte
Você pode criar um novo arquivo e escrever seus comandos nele. Então
:so %
, o que significa arquivo atual de origem.fonte