Comandos bash dentro de vi

33

¿Es posible escribir un comando bash dentro de vi y obtener el stdout?

A menudo me resulta tedioso cerrar y volver a abrir vi solo porque quiero buscar algo en el shell.

arpa
fuente

Respuestas:

45

Sí, por ejemplo, si quieres hacerlo ls, prueba:

:!ls

Para generar una concha, use

:shell

margarita
fuente
increíble, ¿cómo podría vivir sin esto?
arpa
3
De hecho, algo que a menudo hago es olvidar ejecutar vi como root cuando edito algo. Este comando me ha salvado de largas reescrituras más veces de las que puedo recordar. :w !sudo tee %
Mark D
1
Me gustaría que hubiera alguna manera de hacer esto en GNUnano
ixtmixilix
1
y luego, ¿cómo vuelves al editor después de usar: shell?
VaTo
@VaTo: Para volver, puede escribir: salir
Raman Kathpalia
12

Tiendo a ctrl+zdormir vi, ejecutar lo que necesito en el shell y luego fgreanudar vi. No es exactamente una respuesta a su pregunta, pero me parece una forma muy rápida de trabajar.

Si olvida que tiene vi abierto en segundo plano (esto puede suceder cuando está ocupado), cuando intente cerrar la sesión del shell utilizando, ctrl+dse le advertirá que tiene trabajos en segundo plano en ejecución, y puede cerrarlos, o presione ctrl + d nuevamente para cerrar sesión. Además, si intenta volver a abrir el mismo archivo dos veces, recibirá una advertencia de recuperación, por lo que puede presionar apara abortar y ejecutar fg para volver a vi.

Rqomey
fuente
1
Esto puede volverse pegajoso si queda atrapado en lo que está haciendo en la línea de comando y olvida que tiene un fondo de vim.
Eliot Ball
1
Sí, es posible, lo he hecho yo mismo. Para mí, vale la pena tener constancia de shell. Actualizaré mi respuesta para tener en cuenta su comentario
Rqomey
1
Creo que sería mejor usar la pantalla GNU.
user606723
1
Yo mismo uso tmux ... pero por velocidad, y si
inicié
11

Como mencionó "get the stdout", tenga en cuenta que puede hacer

:r! command

y la salida del comando se agregará al archivo, o

:<range>!command

para filtrar el contenido del rango a través del comando [por ejemplo :1,$!wc]

Aleatorio832
fuente
:%!commandse ve muy útil
Eliot Ball
Lo uso a menudo para ordenar líneas [por ejemplo :.,+20 !sort]
Walter A
5

Mi idioma preferido es

!!command

que es la abreviatura de

:.!command

que canaliza la línea actual a través del comando e inserta la salida en el archivo. El caso más común para mí es editar el comando con vi y ejecutar:

!!sh

O

!<motion>command

como (por ejemplo)

!apsh

para ejecutar todo el párrafo actual a través del shell.

Liudvikas Bukys
fuente
2
Tenga en !}cuenta que debe posicionarse al comienzo del párrafo, intente !ap. (No sé si esto está en cada vi o solo vim)
Random832
4

Al utilizar dos puntos y un signo de exclamación, puede ejecutar cualquier comando en la ruta del shell y los scripts del shell, tenga en cuenta que el comando se ejecuta bajo el usuario que ejecuta el programa vi / vim y que utiliza su entorno.

:!<command>

Dado que vi usa el entorno que estaba vigente cuando se ejecutó, usa la misma ruta que estaba en el comando principal. Tenga en cuenta que algunos shells mantienen un caché de los programas en la ruta, y es posible que vi no funcione con este caché (dependiendo del shell que use y su versión), por lo que puede terminar ejecutando el binario incorrecto en caso de que tenga más de un binario con el mismo nombre.

Didi Kohen
fuente
4

Puede ver el resultado de un comando escribiendo, por ejemplo, :!ls -lhen modo comando.

Si desea insertar la salida del comando en el archivo que está editando, simplemente agregue un r. Por ejemplo, :r!which perl.

Eliot Ball
fuente
1

!Obviamente, el uso es la respuesta correcta, pero si cambia de un lado a otro con frecuencia, algo como screen o tmux también podría ser útil.

Ryan A.
fuente
0

Tengo esto en mi .vimrc. Encontrado en Stack Overflow hace un tiempo:

" Executes the current line in a bash shell; syntactically similar to slimv's ,d feature
:nmap ,,d Y:!<C-R>"<C-H><CR>
Clayton Stanley
fuente
0

Lo haría, y lo haría, fácilmente en Linux abriendo dos ventanas de línea de comando de terminal, ejecutando vi en una y la otra disponible para otro trabajo al mismo tiempo.

Harry Weston
fuente