2010-07-14 25 views
143

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

+2

Guau, estaba tratando de aprender sobre vim de su pregunta (lo que hice) y descubrí que podía usar ';' en lugar de '&&' para separar los comandos de shell de Unix también! –

+8

@ebyrob Creo que es importante tener en cuenta que '&&' es 'boolean and' en comandos de shell, por lo que si tiene 'command1 && command2',' command2' solo se ejecutará si 'command1' se ejecuta correctamente. con ';' solo está especificando manualmente el final de esa línea y comenzando una nueva. Es lo mismo que escribir cada comando en una línea diferente en un script de shell. – Will

+0

... y comando1 || command2, command2 solo se ejecutará si falla el comando1. Eso es porque en la lógica de la computadora el || y & son bitwise, y aunque "&&" implica que se deben evaluar tanto command1 como command2, command2 NO necesita ser evaluado si command1 falla porque no importa qué devuelva cmd2, siempre fallará ya que el primero devolvió false (0), y 0 && 1 seguiría siendo cero. De forma similar, si command1 = true, no hay razón para el comando 2 en una evaluación OR porque en ese punto ya es verdadero (1), porque 1 || 0 es 1, y solo si es 0, necesitaría 0 || 1 (que todavía es 1) – osirisgothra

Respuesta

180

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

'|' se puede utilizar para separar comandos, lo que puede dar varios comandos en una sola línea de . Si quiere usar '|' en un argumento, preceda con '\'.

Ejemplo:

:echo "hello" | echo "goodbye"

Salida:

hello 
goodbye 

Nota: Usted puede encontrar que su ~/.vimrc no admite la asignación | o \|. En estos casos, intente usar <bar> en su lugar.

+6

¡Tenga cuidado con los pocos comandos que no funcionan con '|'! –

+23

Cuando quiera usar múltiples comandos en una declaración 'map' (y créame, lo hará), revise': help map_bar'. –

+7

Eso es verdad. Le hice esa misma pregunta sobre superusuario hace unos meses. Mi '.vimrc' no admite una barra escapada (' \ | ') para mapeos. Aprendí que tengo que escribir ''. – michaelmichael

19

El separador de comandos en vim es |.

11

Siempre he usado ^J para separar varios comandos pulsando Ctrl + v, Ctrl + j.

+0

Parece ser la única solución que realmente funciona. ¿A quién especifico esto si quiero usarlo en una cadena? – DerWeh

+0

No se puede usar '^ J' como separador de comando en una cadena porque está insertando el carácter NULL que termina la cadena. sin embargo, puede usar = "\ n". – tinmarino

+0

'exe" echo 'foo' \ n echo 'bar' "' – tinmarino

33

Puede definir una función que ejecute sus comandos.

function Func() 
    :command 
    :command2 
endfunction 

Y colóquelo en, por ejemplo, su vimrc. Ejecutar la función con

exec Func() 
+0

Solución limpia. Definitivamente sería útil para más de dos o solo comandos largos. – elimirks

+0

Muy útil también para la habilidad de entregar errores con try/catch. –

57

Ponga <CR> (retorno de carro/Enter) entre y después de los comandos. Por ejemplo:

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

no uso | porque:

  • Algunos comandos tienen problemas si utiliza | después de ellos

  • | no funciona constantemente en archivos de configuración, consulte :help map_bar

0

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

Pensamiento
0

esto podría ayudar a alguien tratando de hacer sustituciones en una cadena y una falla

de un comment

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

Usted puede utilizar el indicador e ignorar el error cuando no se encuentra la cadena.

Cuestiones relacionadas