¿Puedo emitir un shell interactivo en la ventana de Vim?


16

Sé que puedo :!o :r!ejecutar un comando externo y, opcionalmente, insertar su salida en el texto. Incluso puedo actuar :!shy generaré un caparazón que vivirá hasta que salga, pero mientras el caparazón está activo, Vim está "dormido" e inaccesible. Debo abandonar el caparazón y generar uno nuevo si quiero volver a Vim por un momento, lo que no es muy útil.

Puedo acceder a Shell en el extremo opuesto, suspendiendo Vim con ^Zy gestionando el trabajo de Vim a través de bg, fgy jobs. Esto tiene más sentido pero es muy engorroso a largo plazo. Puedo usarlo Screensi está disponible (a menudo no lo está), o abrir varias ventanas de mi administrador de ventanas (y ssh para apuntar al host de cada una de ellas en secuencia, para tener tanto vim como shell en el host remoto, volviendo a ser engorroso).

Sería mejor si Vim me permitiera abrir una sesión de shell y mantenerla, por ejemplo, en una de sus ventanas (internas), o si me permitiera cambiar a ella y volver. ¿Es posible algo así?


1
Básicamente, ¿quieres abrir un shell en un :split, mientras retienes el archivo en la otra ventana? ... Esto me parece un trabajo para tmux o screen ...
Martin Tournoij

1
@Carpetsmoker: a menudo no tengo control sobre lo que está instalado en el sistema remoto, y la mayoría de las veces ninguno de los dos lo está, mientras que Vim siempre está ahí.
SF.

Considere cambiar a Neovim. Ahora tiene un emulador de terminal incorporado que funciona bastante bien y se puede abrir en un búfer vim.
Zach

Respuestas:


16

Hay un par de complementos vim que permiten esto. Yo uso Conque ( Github ).

Después de ponerlo en su directorio de complementos todo lo que tiene que hacer es:

:ConqueTermSplit bash

Y tendrá un shell bash interactivo en vim. Luego puede usar sus gestos vim regulares para hacer cualquier otra cosa que desee hacer en la ventana.

También el otro complemento es vimshell .


1
¿No hay forma de hacer algo así sin un complemento?
SF.

3
@SF See :help shell-window. (Respuesta corta: no.)
muru

3

Con VIM, creo que los complementos que existen para hacer esto no son tan buenos, aunque IMO vimshell es lo más cercano. Sin embargo, debe comprender que es un problema de 2 partes.

  1. VIM no fue diseñado para poder hacer cosas como esta, especialmente engorroso es poder ejecutar cualquier tarea de ejecución prolongada y hablar con él de forma asincrónica sin bloquear VIM. En este caso, no es solo el shell en sí, sino también otras tareas que puede ejecutar dentro del proceso del shell.
  2. La filosofía modal de VIM no juega tan bien con la forma en que interactuamos con un shell. En un shell, solo la línea actual es editable, aunque puede desplazarse y ver el texto anterior de su historial con el shell, no puede editarlo. Esto no encaja en absoluto con la filosofía de VIM, si presionaras ESC y volvieras al modo normal, sería bastante difícil no permitir que un usuario regrese y edite partes del historial anterior.

En mi opinión, hay 2 enfoques que funcionan mucho mejor en este sentido.

  1. Usando TMUX / Screen y ventanas de terminal multiplex para tener tanto el vim como el shell. De esa manera, los dos están perfectamente separados y, sin embargo, puede ver ambos con muy poco esfuerzo y los dos pueden trabajar al máximo de su potencial sin entrar en conflicto con el flujo del otro.
  2. Usando complementos como tpope / vim-dispatch y similares , puede iniciar fácilmente uno de los comandos de shell y hacer que se ejecuten de forma asincrónica en segundo plano en un shell de terminal real y retire los resultados en vim una vez que esté completo. Esto también le proporciona el mismo nivel de aislamiento entre los dos y, por lo tanto, los dos pueden volver a trabajar de la mejor manera posible sin pisar los pies del otro.

Debo agregar que existe una buena probabilidad de que NeoVIM pueda provocar un cambio en este aspecto, ya que uno de sus objetivos principales es poder ejecutar trabajos de forma asincrónica. Pero hasta entonces, esto es lo mejor que podemos obtener en mi opinión.


3

En :help shell-windowpodemos leer sobre la ejecución de comandos de shell en una ventana:

Ha habido preguntas sobre la posibilidad de ejecutar un shell en una ventana dentro de Vim.

La respuesta: ¡no puedes!

Incluir esto agregaría mucho código a Vim, que es una buena razón para no hacerlo. Después de todo, Vim es un editor , no se supone que realice tareas que no sean de edición. Sin embargo, para obtener algo como esto, puede intentar dividir la pantalla de su terminal o la ventana de visualización con el programa " splitvt ".

Una alternativa es el comando " ventana ", que se encuentra en los sistemas BSD Unix, que admite múltiples ventanas superpuestas. O el programa " pantalla ".

Sin embargo, hay pocas soluciones que puede usar:

  • uso screenque está especialmente diseñado para ese tipo de cosas, por ejemplo:

    • Ctrl+ a, Spara dividir la ventana actual horizontalmente
    • Ctrl+ a, Tabpara cambiar entre ventanas
    • Ctrl+ a, Xpara eliminar la región actual
    • Ctrl+ a, Qpara eliminar todas las regiones menos una

    Ver más en: Guía de supervivencia de pantalla GNU en stackoverflow SE

    O: División de pantalla GNU , Referencia rápida de pantalla para más detalles.

  • VIM-Shell : un parche de terceros

    El VIM-shell es una extensión para VIM que presenta ventanas divididas, y este parche hace posible iniciar shells en esas ventanas. Solo está disponible para sistemas POSIX

  • vterm : emulador de terminal dentro de vim.

    El objetivo de vterm es proporcionar un clon de terminal unix dentro de vim que funcione de inmediato sin ninguna dependencia.

  • Vimux : interactúa fácilmente con tmux desde vim.

    Inspirado por tslime.vim , un complemento que te permite enviar información a tmux, vimux es hacer que interactuar con tmux desde vim sea fácil.

  • otro ya mencionado: Conque

Relacionado: ¿Cómo ejecutar una terminal dentro de vim? en stackoverflow


¿Cómo deshacerse de la división? : - /
0xc0de

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.