¿Cómo ejecuto una terminal dentro de Vim?


306

Estoy acostumbrado a Emacs, pero estoy probando a Vim para ver cuál me gusta más.

Una cosa que me gusta de Emacs es la capacidad de ejecutar un terminal dentro de Emacs. ¿Es esto posible dentro de Vim? Sé que puedes ejecutar comandos desde Vim, pero me gustaría poder ejecutar un terminal dentro de una pestaña.



42
¿ :! <command>Qué es lo que buscas?
takeshin

48
Desde Vim 8.0, hay un :termcomando que abre un nuevo terminal en una nueva ventana dividida. Si no funciona para usted, verifique vim --version | grep -o .terminalsi esta función está disponible ( +terminal) o no está disponible ( -terminal).
Susam Pal

Respuestas:


123

Definitivamente recomendaría screen para algo como esto. Vim es un editor de texto, no un shell.

Lo usaría Ctrl+ASpara dividir la ventana actual horizontalmente, o en la pantalla de Ubuntu y otras versiones parcheadas, puede usar Ctrl+A|(pipe) para dividir verticalmente. Luego, use Ctrl+ATab(o equivalente en algunos sistemas, Ctrl+ACtrl+Ique pueden ser más fáciles de escribir) para cambiar entre las ventanas. Hay otros comandos para cambiar el tamaño y la disposición de las ventanas.

O un uso menos avanzado de screenes simplemente abrir múltiples ventanas de pantalla completa y alternar entre ellas. Esto es lo que normalmente hago, solo uso la función de pantalla dividida ocasionalmente.

La pregunta de la Guía de supervivencia de pantalla de GNU tiene una serie de buenos consejos si no está familiarizado con su uso.


77
+1 Hace poco recibí el evangelio de la pantalla. Me pregunto cómo podría vivir sin él.
pistolas

118
Prefiero elegir tmux en lugar de pantalla.
tomaszkubacki

81
Sí, por supuesto, uno puede ejecutar screen, o tmux, o terminator, o abrir otra ventana y alt-tab, o incluso usar un interruptor KVM activado con un pedal. Pero ese no es el punto: todas esas soluciones sacrifican la integración entre el terminal y VIM, por lo que uno se molestaría en buscar soluciones en este espacio. No entiendo cómo esta respuesta es incluso una respuesta, y mucho menos la respuesta superior o aceptada. Creo que iré a probar Conque.
Stabledog

33
¿Cómo es esta la respuesta principal? debe desestimarlo y votar la siguiente respuesta, que realmente responde a su pregunta. El uso de la pantalla no ejecuta un shell dentro de vim. Eso es como decirle a alguien que comience otro shell. Y para aquellos que siguen tirando ":!" YA DIJO que sabía cómo ejecutar comandos, que NO es lo que pidió ... sheesh. La arrogancia es tan espesa aquí que puedes cortarla con un cuchillo.
osirisgothra

66
Esta respuesta debe actualizarse debido a la nueva ventana de terminal de la
Alan Garrido

232

Anticuado de agosto de 2011

Echa un vistazo a Conque Shell (también en GitHub ). Le permite ejecutar cualquier programa interactivo dentro de vim, no solo un shell.


21
:ConqueTerm bash <CR>, vim <CR>, :ConqueTerm bash.... el horror recursiva !!
keflavich

1
psihodelia parece tener razón. Acabo de compilar vim con --enable-pythoninterp (cygwin no distribuye vim con + python) y después de instalar ConqueTerm, recibo un error de #set_buffer_settings. No he podido localizar dónde vive esa función, ni tener una idea de lo que significa el error. El mensaje incluye una declaración sobre un argumento no válido "edit ++ enc = utf-8 bash \ - \ 2". Argh
Nate Kennedy

47
Para comprender la recursividad, primero debe comprender la recursividad.
Stabledog

19
@ Łukasz Niemier VIMCEPTION
Sebastián Grignoli

1
Parece que esto ya no es compatible, ¿alguien tiene una alternativa?
dykeag

204

No estoy seguro de qué es exactamente lo que está tratando de lograr (nunca he usado Emacs), pero puede ejecutar comandos en Vim escribiendo:

:! somecommand [ENTER]

Y si desea escribir varios comandos, o jugar en un shell por un tiempo, siempre puede usar:

:! bash (or your favourite shell) [ENTER]

Una vez que finalice el comando o el shell, se le dará la opción de presionar Enter para regresar a la ventana del editor

Vim es intencionalmente liviano y carece de la capacidad de hacer cosas de tipo no editorial, al igual que ejecutar un shell completo dentro de un panel / pestaña de Vim, pero como se mencionó anteriormente, hay complementos de terceros como vim-shell que le permiten para hacer ese tipo de cosas.

Por lo general, si quiero cambiar entre Vim y mi shell (Bash), solo presiono CTRL+ Zpara pausar el proceso de Vim, jugar en mi shell y luego escribir 'fg' cuando quiero volver a Vim, manteniendo mi editor y mi Concha agradable y separada.


17
Y si desea copiar la salida del comando al búfer actual:: r! dir
Cyber ​​Oliveira

66
Utilizo Emacs y Vim (y tengo mucha más experiencia con Vim). Pero he descubierto que a menudo es mejor y más fácil trabajar con dos vistas al mismo tiempo (una para ver lo que está editando y otra para trabajar dentro de un shell interactivo, por ejemplo, para probar el efecto de un cambio de configuración que tiene solo editado). También ayuda con mi cognición, retención y flujos de trabajo mental cuando las cosas importantes que necesito controlar de cerca no desaparecen de la pantalla (como lo que sucede cuando usas Ctrl-Z o: shell en Vim).
mvanle

Es una gran respuesta que me ahorrará mucho tiempo.
jerry_sjtu

¡Buena respuesta! Para complementarlo aún más, también agregaría lo :r! command [ENTER]mencionado en los comentarios.
Jeach

152

La forma de evitar esto es:

  • pausa Vim con Ctrl+ Z,
  • jugar en la terminal,
  • luego regrese exactamente a donde lo dejó con Vim simplemente escribiendo el comando fg.

14
:!bashes una mejor manera de hacer eso
0atman

Creo que quiere una especie de funcionalidad de soñador
Adam Miller

10
@Oatman ¿Por qué es :!bashmejor que Ctrl+z? (Solo me pregunto)
Sebastián Grignoli

2
@ SebastiánGrignoli porque con Ctrl+Z, por ejemplo, puede moverse a otra carpeta, lsluego git status, etc. Ctrl+Zes una "pausa", puede "reanudar" con fg. Pero con:! Bash, como sé hasta ahora, solo puede ejecutar un solo comando a la vez, o incluso si puede ejecutar más de un comando a la vez, todavía no es conveniente. En general, 'Ctrl + Z' es mucho mejor
Leo

+1 porque esto funciona en casi cualquier entorno. Trabajando en un sistema externo que no puedo personalizar, y a través de un shell PuTTY barato, esto funciona muy bien.
t3sture

121

Si está habilitado en su versión de Vim, se puede iniciar un terminal con :term comando.

Se agregó soporte de ventana de terminal a Vim 8. Es una característica opcional que se puede habilitar al compilar Vim con la característica de terminal +. Si su versión de Vim tiene soporte de terminal,:echo has('terminal') generará "1".

Entrar :termte colocará en Terminal-Job , donde puede usar el terminal como se esperaba.

Dentro del modo Terminal-Job , presionar Ctrl-W No Ctrl-\ Ctrl-Ncambia el modo a Terminal-Normal , lo que permite mover el cursor y ejecutar comandos de manera similar al modo Normal de Vim . Para volver al modo Terminal-Job , presionei .

Otras respuestas mencionan una funcionalidad similar en Neovim.


55
+1 para isaber cómo volver a cambiar al modo cmd de Terminal después de cambiar del modo de exploración ctrl-wN. Esta es una característica excelente incluso en tmux y también funciona en Windows.
radke

1
¿Es posible dividir verticalmente usando :term?
Vitaly Zdanevich

1
¡súper! Genial que el terminal esté integrado para que no tengamos problemas con más complementos. Actualizado a vim 8 vía brew install vim --override-system-viy :termfunciona perfectamente. ¡Gracias por compartir!
LeOn - Han Li

18
@VitalyZdanevich, :vertical :termse dividirá verticalmente con el terminal en la ventana izquierda. :vertical :botright :termse dividirá verticalmente con el terminal en la ventana derecha. Alternativamente, puede diseñar ventanas manualmente y luego usar :term ++curwinpara abrir una terminal en la ventana activa.
Daniel S.

esc ctrl-w w le permite cambiar entre ventanas
user1869582

87

:shluego ctrl+dvolver (bash)

Actualización :

Puede asignar ctrl+den vim para ejecutar :sh, lo que le permite alternar entre bash y vim rápidamente.

noremap <C-d> :sh<cr>


1
Creo ctrl+zy fgson un poco más rápidos, dado que no tienes que escribir :shen ese caso.
Alex

@Alex no, no tienes que escribir :shsi haces el mapa. Después noremap, puede simplemente Ctrl+Dde vim a sh, y dado que ^Des EOF, que termina el sh, por lo que volvería a vim. La única tecla puede alternar entre shy vim.
no1xsyzy

42

La nueva característica principal de Vim 8.1 es el soporte para ejecutar un terminal en una ventana de Vim.

:term abrirá la terminal en otra ventana dentro de Vim.


2
esto funciona perfectamente, gracias! su respuesta está mucho más en el espíritu de la pregunta original
subelsky

Hola, ¿sabes cómo salir de este modo?
user3289737

2
como en la terminal normal, se exitcerrará desde la terminal y luego se usará :qpara cerrar la ventana
Yossarian42

2
@ user3289737 Alternativamente, puede presionar Ctrl + W dos veces seguidas para alternar entre ventanas. Esto no es específico para las ventanas de terminal, pero funciona igual de bien.
flarn2006

39

Finalmente, :terminalse agregó un comando nativo a vim en 2017.

Aquí hay un extracto del archivo Léame del terminal :

Esta característica es para ejecutar un emulador de terminal en una ventana de Vim. Se puede iniciar un trabajo conectado al emulador de terminal. Por ejemplo, para ejecutar un shell:

 :term bash

O para ejecutar el comando de compilación:

 :term make myprogram

El trabajo se ejecuta de forma asíncrona desde Vim, la ventana se actualizará para mostrar la salida del trabajo, también mientras se edita en otra ventana.


El terminal se ejecuta en un búfer en la misma pestaña. por lo tanto, si está acostumbrado a usar varios archivos en vim, puede enfrentar algunas dificultades. el cambio de búferes eventualmente llegará a la terminal desde donde es un punto de no retorno, debe matar la terminal. siempre y cuando sea consciente de esto, debería estar bien. Espero que los desarrolladores vengan con una solución para esto.
ArunMKumar

1
@ArunMKumar Use [Ctrl + W] para "escapar" de la terminal, y luego haga :bnlo de siempre. No es necesario matar la terminal y no es un punto de no retorno :)
fjardon

Gracias, amigo, lo extrañé por completo. He asignado un mapa de teclas : bn a una tecla y dejó de funcionar, está funcionando de nuevo. Fue mi mal.
ArunMKumar

2017? ¿Te refieres a 2018?
flarn2006

1
@ flarn2006, con respecto a 2017 versus 2018, Vim 8.1 se anunció en vim.org el 18 de mayo de 2018, con "soporte para ejecutar un terminal en una ventana de Vim" como su "nueva característica principal". La función estuvo disponible por primera vez antes, el 7 de julio de 2017, en el parche 8.0.0693. github.com/vim/vim/commit/…
Daniel S.

32

Esta pregunta es bastante antigua, pero para aquellos que la encuentren, hay una nueva solución posible: Neovim contiene un emulador de terminal de primera clase completo, que hace exactamente lo que ConqueTerm intentó hacer. Simplemente corre :term <your command here>.

<C-\><C-n>saldrá del modo de término a modo normal. Si eres como yo y prefieres que escape aún salga del modo de término, puedes agregar esto a tu nvimrc:

tnoremap <ESC><ESC> <C-\><C-N>

Y luego presionar ESC dos veces saldrá del modo terminal al modo normal, para que pueda manipular el búfer en el que está escribiendo el comando que aún se está ejecutando.

Sin embargo, tenga en cuenta que, dado que nvim está en desarrollo en el momento en que publico esta respuesta, se puede agregar otra forma de salir del modo terminal. Como Ctrl+\Ctrl+ncambia al modo normal desde casi cualquier modo, no espero que esta respuesta sea incorrecta, pero tenga en cuenta que si no funciona, esta respuesta podría estar desactualizada.

https://github.com/neovim/neovim


29

:term

Sin embargo, esta característica se agregó recientemente en Vim 8.1, que a partir de esta publicación se lanzó recientemente, por lo que es posible que deba actualizar para poder usarla.


Fue agregado antes de vim 8.1. Es solo la gran característica principal que vim 8.0.001 no tenía. Es por eso que se anuncia como una novedad vim 8.1. Vea la respuesta de Daniel de octubre de 2017 y la de fjardon en abril de 2018. -> github.com/vim/vim/blob/master/runtime/doc/version8.txt#L18814
Luc Hermitte

17

Sé que no estoy respondiendo directamente la pregunta, pero creo que es un buen enfoque. Nadie ha mencionado tmux (o al menos no como una respuesta independiente). Tmux es un terminal multiplexor como pantalla. La mayoría de las cosas se pueden hacer en ambos multiplexores, pero afaik tmux es más fácil de configurar. También tmux en este momento se está desarrollando más activamente que la pantalla y hay un ecosistema bastante grande a su alrededor, como herramientas que ayudan a la configuración, etc.

También para vim, hay otro complemento: ViMUX , que ayuda mucho en la interacción entre ambas herramientas. Puedes llamar a comandos con:

:call VimuxRunCommand("ls")

Ese comando crea una pequeña división horizontal debajo del panel actual en el que está vim.

También puede permitirte ejecutar desde un indicador en caso de que no quieras ejecutar todo el comando:

<Leader>vp :VimuxPromptCommand<CR>

Como no era suficiente, hay al menos 6 'complementos específicos de plataforma':

  • vim-vroom : corredor para rspec, pepino y prueba / unidad; soporte de vimux a través deg:vroom_use_vimux
  • vimux-ruby-test : un conjunto de comandos para ejecutar fácilmente pruebas de ruby
  • vimux-cucumber : ejecuta funciones de pepino a través de Vimux
  • vim-turbux : pruebas de Turbo Ruby con tmux
  • vimux-pyutils : un conjunto de funciones para vimux que permiten ejecutar bloques de código en ipython
  • vimux-nose-test : ejecuta pruebas de nariz en vimux

Aquí hay un buen "caso de uso": pruebas bajo demanda usando Vimux y Turbux con Spork and Guard


¿Te importaría explicar por qué fue rechazado? (además de ser una respuesta de hace 6 años)
Pablo Olmos de Aguilera C.

13

Alguien ya sugirió https://github.com/Shougo/vimshell.vim , pero no mencionaron por qué. En consecuencia, cuando salí de esta pregunta, perdí mucho tiempo probando las otras opciones (mucho más altas).

Shougo / vimshell es la respuesta. Este es el por qué:

Además de ser un emulador de terminal, VimShell le permite navegar a través de la salida del terminal en modo normal y visual. Por lo tanto, si un comando que ejecuta da como resultado una salida que le gustaría copiar y pegar usando solo el teclado ... VimShell cubre esto.

Ninguna de las otras opciones mencionadas, incluido el comando: terminal en NeoVim, hace esto. Neovim: el terminal se acerca, pero se queda corto al menos de las siguientes maneras a partir del 18/02/2017:

  • Mueve el cursor al final del búfer, en lugar de al final, manteniéndolo en el mismo lugar como lo hace VimShell. Enorme pérdida de tiempo.

  • No admite modifiable = 1ver una discusión sobre esto en Github , por lo que no se pueden usar complementos útiles como vim-easymotion.

  • No admite la visualización de números de línea como lo hace Vimshell.

No pierda el tiempo con las otras opciones, incluida la de Neovim: terminal. Ve con VimShell.


1
NeoVim le permite navegar y copiar desde la salida del terminal en modo normal / visual. Hago esto todo el tiempo. Usando NVIM 0.1.6-dev
Alice Heaton

Gracias, intentaré VimShell. Sin embargo, me he tomado la libertad de eliminar una declaración incorrecta de la respuesta. Como señaló @Alice, NeoVim's :terminalpuede hacer absolutamente lo mismo.
Konrad Rudolph

:terminalno puede hacer lo mismo que :VimShellen términos de navegación y edición, y de manera fundamental. Ver explicación editar arriba.
user3751385


8

2
NO TENGAS EL CONSEJO DE splitvt: manipula los códigos de control de color y los hace vimcompletamente inutilizables.
nuevo123456

12
"No" es una mala respuesta. Una mejor respuesta es "Por defecto, no". Técnicamente, se puede hacer, y tal vez necesite escribir un nuevo código fuente y compilarlo usted mismo, o escribir un complemento. ¿Es fácil? Quizás no, pero se puede hacer. Simplemente decir No es más como decir "no, no lo haré".
trusktr

2
@AnishRamaswamy Todavía no es posible ejecutar un shell dentro de un búfer vim usando stock vim (a diferencia de emacs). Esa es la pregunta del OP.
Ámbar

1
@Amber, Sí, eso estaría bien, excepto que el OP no mencionó el uso del stock vim.
Anish Ramaswamy

3
Alguien debería editar esta respuesta para decir que no puede hacerlo con stock vim.
still_dreaming_1

4

Lo único que sé es mediante el uso de vim-shell , un parche de terceros.


Para ser pedante, vim-shell es un parche, no un 'complemento' (que para mí, al menos, implica que es un script). No lo he probado personalmente, pero la página vim-shell en el wiki de Vim desafortunadamente sugiere que no se compilará con Vim 7.1+.
Yewge

Cambiado para apaciguar al pedante. :) (Tuve que escribir algo con más de 15 caracteres. 'Reparado' no era lo suficientemente largo)
romandas

Shougo / vimshell ( github.com/Shougo/vimshell.vim ) parece funcionar bastante bien. Requiere construir una biblioteca dinámica, pero es bastante simple (cd <vim> / vimproc; make)
Wayne Walker


2

Pruebe vterm , que es un shell bastante completo dentro de vim. Es un poco defectuoso con su historial y funciones claras, y todavía está en desarrollo, pero aún es bastante bueno


2

Suponiendo que su versión de vim admite el +termcomando primero, configure el shell para que vim lo use en un comando (por ejemplo set=/usr/bin/zsh) y luego ejecute el comando +term(es decir bo 15vs +term). Puede que tenga que hacer algunas maniobras adicionales de sus ventanas (es decir, eliminar una y rotar), pero tendrá su terminal.


0

Reconozco que no estoy respondiendo estrictamente a su pregunta, pero lo que me ha funcionado mejor cuando uso Vim and Terminals en la misma ventana es Tmux (que es una especie de "ejecución en segundo plano" similar a la pantalla, aunque esto uno funciona mejor con divisiones y pestañas).

Esta publicación lo ayudará a comprender cómo funcionan juntos: 'Tmux y Vim, incluso mejor juntos' .

De esta manera podemos convertir Vim en un poderoso IDE


0

Divida la pantalla y ejecute el comando term ++curwinpara ejecutar el terminal dentro del búfer Vim. El siguiente comando hace ambas cosas y funcionó para mí:

:bo 10sp | term ++curwin
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.