Múltiples comandos en la misma línea.

188

He estado tratando de encontrar algo que me permita ejecutar múltiples comandos en la misma línea en Vim, similar al uso de punto y coma para separar los comandos en los sistemas * nix o &en Windows. ¿Hay alguna forma de hacer esto?

Bub Bradlee
fuente
2
¡Wow, estaba tratando de aprender sobre vim a partir de su pregunta (que hice) y descubrí que podía usar en ;lugar de &&separar los comandos de shell de Unix también!
8
@ebyrob Creo que es importante tener en cuenta que &&es 'booleano y' en los comandos de shell, por lo que si lo tiene command1 && command2, command2solo se ejecutará si se command1ejecuta con éxito. con ;solo especificas manualmente el final de esa línea y comienzas una nueva. Es lo mismo que escribir cada comando en una línea diferente en un script de shell.
Será el
... y comando1 || command2, command2 solo se ejecutará si command1 falla. Eso es porque en la lógica de la computadora el || y && son bit a bit, y aunque "&&" implica que tanto el comando1 como el comando2 deben ser evaluados, el comando2 NO necesita ser evaluado si el comando1 falla porque no importa qué cmd2 devuelva, siempre fallará ya que el primero devuelve falso ( 0), y 0 && 1 seguiría siendo cero. De manera similar, si command1 = true, no hay razón para el comando 2 en una evaluación OR porque en ese punto ya es cierto (1), porque 1 || 0 es 1, y solo si es 0, necesitaría 0 || 1 (que todavía es 1)
osirisgothra
@osirisgothra que se conoce como evaluación de cortocircuito / cortocircuito.
speakingcode

Respuestas:

241

Una barra |te permitirá hacer esto. De:help :bar

'|'se puede usar para separar comandos, por lo que puede dar múltiples comandos en una línea. Si desea usar '|'en un argumento, preceda con '\'.

Ejemplo:

:echo "hello" | echo "goodbye"

Salida:

hello
goodbye

NB: es posible que ~/.vimrcno admita mapeo |, o \|. En estos casos, intente usar en su <bar>lugar.

michaelmichael
fuente
8
¡Solo ten cuidado con los pocos comandos que no funcionan |!
demasiado php
31
Cuando desees utilizar varios comandos en una mapdeclaración (y créeme, lo harás), échale un vistazo :help map_bar.
Bill Odom
9
Es verdad. Hice esa misma pregunta sobre superusuario hace unos meses. Mi .vimrcno admite una barra de escape ( \|) para las asignaciones. Aprendí que realmente tengo que escribir <bar>.
michaelmichael
¡Gracias por la solución de trabajo! :help barmuestra motion.txt y nada sobre múltiples comandos.
geekQ
1
@geekQ debería ser:help <bar>
Sri Kadimisetty
92

Poner <CR>(Carriage Return / Enter) entre y después de los comandos. Por ejemplo:

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

No lo uses |porque:

  • Algunos comandos tienen problemas si los usas |después

  • | no funciona de manera consistente en los archivos de configuración, vea :help map_bar

Babken Vardanyan
fuente
42

Podría definir una función que ejecute sus comandos.

function Func()
     :command
     :command2 
endfunction

Y coloque esto en, por ejemplo, su vimrc. Ejecute la función con

exec Func()
Jonatán
fuente
1
Solución limpia Definitivamente sería útil para más de dos o solo comandos largos.
Elimirks
1
Muy útil también para la capacidad de entregar errores con try / catch.
Immanuel Weihnachten
2
Es más convencional de usar :call Func()porque :execute Func()significa algo más. Significa realizar el valor de retorno de la función como un comando. La función descrita aquí generalmente no tendrá un comando que comience :return, por lo que su valor de retorno será el número cero. Ejecutar eso como un comando moverá el cursor a la primera línea del búfer actual, que no siempre es lo que tenía en mente.
minopret
26

El separador de comandos en vim es |.

Daenyth
fuente
16

Siempre he usado ^Jpara separar múltiples comandos presionando Ctrl+ v, Ctrl+ j.

eruciforme
fuente
Esta parece ser la única solución que realmente funciona. ¿A quién especifico esto si quiero usarlo en una cadena?
DerWeh
No puede usar ^Jcomo separador de comandos en una cadena porque está insertando el carácter NULL que termina la cadena. sin embargo, puede 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
12

Pensé que esto podría ayudar a alguien que intenta hacer sustituciones en una cadena y uno falla

de un comentario

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

Puede usar la ebandera para ignorar el error cuando no se encuentra la cadena.

Jerinaw
fuente
2

Puede crear un nuevo archivo y escribir sus comandos en él. Entonces :so %, lo que significa el archivo actual de origen.

Canción
fuente