Comment exécuter un terminal à l'intérieur de Vim?


306

Je suis habitué à Emacs, mais j'essaye Vim pour voir lequel je préfère.

Une chose que j'aime chez Emacs est la possibilité d'exécuter un terminal dans Emacs. Est-ce possible à l'intérieur de Vim? Je sais que vous pouvez exécuter des commandes depuis Vim, mais j'aimerais pouvoir exécuter un terminal à l'intérieur d'un onglet.



42
Est - :! <command>ce que vous cherchez?
takehin

48
Depuis Vim 8.0, il existe une :termcommande qui ouvre un nouveau terminal dans une nouvelle fenêtre fractionnée. Si cela ne fonctionne pas pour vous, vérifiez vim --version | grep -o .terminalsi cette fonctionnalité est disponible ( +terminal) ou indisponible ( -terminal).
Susam Pal

Réponses:


123

Je recommanderais certainement screenquelque chose comme ça. Vim est un éditeur de texte, pas un shell.

J'utiliserais Ctrl+ASpour diviser la fenêtre actuelle horizontalement, ou dans l'écran d'Ubuntu et d'autres versions corrigées, vous pouvez utiliser Ctrl+A|(pipe) pour diviser verticalement. Ensuite, utilisez Ctrl+ATab(ou de manière équivalente sur certains systèmes, Ctrl+ACtrl+Iqui peuvent être plus faciles à taper) pour basculer entre les fenêtres. Il existe d'autres commandes pour modifier la taille et la disposition des fenêtres.

Ou une utilisation moins avancée screenconsiste simplement à ouvrir plusieurs fenêtres en plein écran et à basculer entre elles. C'est ce que je fais normalement, je n'utilise la fonction d'écran partagé que de temps en temps.

La question du guide de survie de l'écran GNU contient un certain nombre de bons conseils si vous n'êtes pas familier avec son utilisation.


7
+1 Je viens tout juste de recevoir l'évangile à l'écran. Je me demande comment je vivais sans ça.
fusils

118
je préfère choisir tmux au lieu d'écran.
tomaszkubacki

81
Oui, bien sûr, on peut exécuter screen, ou tmux, ou terminator, ou ouvrir une autre fenêtre et alt-tab, ou même utiliser un commutateur KVM activé avec une pédale. Mais ce n'est pas le sujet - toutes ces solutions sacrifient l' intégration entre le terminal et le VIM, c'est pourquoi on se donnerait la peine de chercher des solutions dans cet espace. Je ne comprends pas comment cette réponse est même une réponse, encore moins une réponse supérieure ou acceptée. Je pense que je vais essayer Conque.
Stabledog

33
comment est-ce la meilleure réponse ??? vous devez annuler votre vote et voter contre la prochaine réponse, ce qui répond en fait à votre question. Utiliser screen ne lance pas de shell dans vim. C'est comme dire à quelqu'un de démarrer un autre shell. Et pour ceux qui continuent à jeter ":!" il a DÉJÀ DIT qu'il savait comment exécuter les commandes, ce qui n'est PAS ce qu'il a demandé ... sheesh. L'arrogance est si épaisse ici que vous pouvez la couper avec un couteau.
osirisgothra

6
Cette réponse devrait être mise à jour en raison de la nouvelle fenêtre de terminal de la
Alan Garrido

232

Périmé depuis août 2011

Découvrez Conque Shell (également sur GitHub ). Vous permet d'exécuter n'importe quel programme interactif dans vim, pas seulement un shell.


21
:ConqueTerm bash <CR>, vim <CR>, :ConqueTerm bash.... l'horreur récursive !!
keflavich

1
psihodelia semble avoir raison. Je viens de compiler vim avec --enable-pythoninterp (cygwin ne distribue pas vim avec + python) et après l'installation de ConqueTerm, je reçois une erreur de #set_buffer_settings. Je n'ai pas été en mesure de localiser où se trouve cette fonction, ni de savoir ce que signifie l'erreur. Le message comprend une déclaration sur un argument non valide "edit ++ enc = utf-8 bash \ - \ 2". Argh.
Nate Kennedy

47
Pour comprendre la récursivité, vous devez d'abord comprendre la récursivité.
Stabledog

19
@ Łukasz Niemier VIMCEPTION
Sebastián Grignoli

1
Il semblerait que cela ne soit plus supporté, quelqu'un a-t-il un remplaçant?
dykeag

204

Je ne sais pas exactement ce que vous essayez de réaliser (je n'ai jamais utilisé Emacs), mais vous pouvez exécuter des commandes dans Vim en tapant:

:! somecommand [ENTER]

Et si vous voulez taper plusieurs commandes, ou jouer dans un shell pendant un moment, vous pouvez toujours utiliser:

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

Une fois la commande ou le shell terminé, vous aurez la possibilité d'appuyer sur Enterpour revenir à la fenêtre de votre éditeur

Vim est intentionnellement léger et n'a pas la capacité de faire des choses de type non éditorial, tout comme l'exécution d'un shell à part entière dans un volet / onglet Vim, mais comme mentionné ci-dessus, il existe des addons tiers tels que vim-shell qui vous permettent de faire ce genre de chose.

En général, si je veux basculer entre Vim et mon shell (Bash), je tape simplement CTRL+ Zpour mettre le processus Vim en pause, jouer dans mon shell, puis taper 'fg' lorsque je veux revenir à Vim - garder mon éditeur et mon coquille agréable et séparée.


17
Et si vous souhaitez copier la sortie de la commande dans le tampon courant:: r! dir
Cyber ​​Oliveira

6
J'utilise Emacs et Vim (et j'ai beaucoup plus d'expérience avec Vim). Mais j'ai constaté qu'il est souvent plus agréable et plus facile de travailler avec deux vues en même temps (une pour voir ce que vous modifiez et une autre pour travailler dans un shell interactif - par exemple pour tester l'effet d'un changement de configuration que vous avez vient d'être édité). Cela aide également à ma cognition, à ma rétention et à mes flux de travail mentaux lorsque des choses importantes que je dois surveiller de près ne disparaissent pas de l'écran (comme ce qui se passe lorsque vous utilisez Ctrl-Z ou: shell dans Vim).
mvanle

C'est une excellente réponse qui me fera gagner beaucoup de temps.
jerry_sjtu

Bonne réponse! Pour le complimenter encore plus, j'ajouterais également ce qui est :r! command [ENTER]mentionné dans les commentaires.
Jeach

152

La façon dont je contourne cela est:

  • pause Vim avec Ctrl+ Z,
  • jouer dans le terminal,
  • puis revenez exactement à l'endroit où vous êtes parti avec Vim en tapant simplement la commande fg.

14
:!bashest une meilleure façon de le faire
0atman

Je pense qu'il veut une sorte de fonctionnalité de dreampie
Adam Miller

10
@Oatman Pourquoi est-ce :!bashplus agréable que Ctrl+z? (Je me demandais juste)
Sebastián Grignoli

2
@ SebastiánGrignoli parce qu'avec Ctrl+Z, par exemple, vous pouvez vous déplacer vers un autre dossier, puis lsalors git status, etc. Ctrl+Zest une "pause", vous pouvez "reprendre" avec fg. Mais avec:! Bash, comme je le sais jusqu'à présent, vous ne pouvez exécuter qu'une seule commande à la fois, ou même si vous pouvez exécuter plus d'une commande à la fois, ce n'est toujours pas pratique. Donc, dans l'ensemble, «Ctrl + Z» est beaucoup mieux
Leo

+1 car cela fonctionne dans à peu près n'importe quel environnement. Travailler sur un système étranger que je ne peux pas personnaliser, et grâce à un shell PuTTY bon marché, cela fonctionne très bien.
t3sture

121

S'il est activé dans votre version de Vim, un terminal peut être démarré avec la :termcommande.

La prise en charge de la fenêtre de terminal a été ajoutée à Vim 8. Il s'agit d'une fonctionnalité facultative qui peut être activée lors de la compilation de Vim avec la fonctionnalité de terminal +. Si votre version de Vim prend en charge les terminaux,:echo has('terminal') affichera "1".

Entrer :termvous placera dans Terminal-Job mode , où vous pourrez utiliser le terminal comme prévu.

En mode Terminal-Job , appuyez sur Ctrl-W Nou Ctrl-\ Ctrl-Nbascule le mode sur Terminal-Normal , ce qui permet de déplacer le curseur et d'exécuter les commandes de la même manière que le mode Normal de Vim . Pour revenir au mode Terminal-Job , appuyez suri .

D'autres réponses mentionnent des fonctionnalités similaires dans Neovim.


5
+1 pour savoir comment revenir en mode Terminal cmd iaprès avoir basculé du mode de navigation ctrl-wN. C'est une fonctionnalité qui tue même sur tmux et fonctionne également sur Windows.
radke

1
Est-il possible de diviser verticalement en utilisant :term?
Vitaly Zdanevich

1
super! Super que le terminal soit intégré pour que nous n'ayons pas de problèmes avec plus de plugins. Mise à niveau vers vim 8 via brew install vim --override-system-viet :termfonctionne parfaitement. Merci d'avoir partagé!
LeOn - Han Li

18
@VitalyZdanevich, :vertical :termse divisera verticalement avec le terminal dans la fenêtre de gauche. :vertical :botright :termsera divisé verticalement avec le terminal dans la fenêtre de droite. Vous pouvez également mettre en page manuellement les fenêtres, puis utiliser :term ++curwinpour ouvrir un terminal dans la fenêtre active.
Daniel S.

esc ctrl-w w vous permet de basculer entre les fenêtres
user1869582

87

:shpuis ctrl+dpour rentrer (bash)

Mise à jour :

Vous pouvez mapper ctrl+ddans vim pour exécuter :sh, ce qui vous permet de basculer rapidement entre bash et vim.

noremap <C-d> :sh<cr>


1
Je pense ctrl+zet fgsont légèrement plus rapides, étant donné que vous n'avez pas à taper :shdans ce cas.
Alex

@Alex non, vous n'avez pas à taper :shsi vous faites la carte. Après noremap, vous pouvez simplement Ctrl+Dpasser de vim à sh, et puisque ^Dc'est EOF, qui termine le sh, vous reviendrez donc à vim. La seule touche peut basculer entre shet vim.
no1xsyzy

42

La principale nouvelle fonctionnalité de Vim 8.1 est la prise en charge de l'exécution d'un terminal dans une fenêtre Vim.

:term ouvrira le terminal dans une autre fenêtre à l'intérieur de Vim.


2
cela fonctionne parfaitement, merci! votre réponse est beaucoup plus dans l'esprit de la question d'origine
subelsky

Salut, savez-vous comment quitter ce mode?
user3289737

2
comme dans le terminal normal, exitquittera le terminal, puis utilisera :qpour fermer la fenêtre
Yossarian42

2
@ user3289737 Alternativement, vous pouvez appuyer deux fois de suite sur Ctrl + W pour basculer entre les fenêtres. Ce n'est pas spécifique aux fenêtres de terminal, mais cela fonctionne tout aussi bien.
flarn2006

39

Finalement, un natif :terminal commande été ajoutée à vim en 2017.

Voici un extrait du : readme du terminal :

Cette fonctionnalité permet d'exécuter un émulateur de terminal dans une fenêtre Vim. Un travail peut être démarré connecté à l'émulateur de terminal. Par exemple, pour exécuter un shell:

 :term bash

Ou pour exécuter la commande build:

 :term make myprogram

Le travail s'exécute de manière asynchrone à partir de Vim, la fenêtre sera mise à jour pour afficher la sortie du travail, également lors de l'édition dans une autre fenêtre.


Le terminal s'exécute dans un tampon dans le même onglet. donc si vous avez l'habitude d'utiliser plusieurs fichiers dans vim, vous pouvez rencontrer des difficultés. la commutation des tampons finira par arriver au terminal d'où il s'agit d'un point de non-retour, vous devez tuer le terminal. tant que vous en êtes conscient, ça devrait aller. espérons que les développeurs viennent avec une solution de contournement pour cela.
ArunMKumar

1
@ArunMKumar Utilisez [Ctrl + W] pour "s'échapper" du terminal, puis faites :bncomme d'habitude. Pas besoin de tuer le terminal et ce n'est pas un point de non retour :)
fjardon

Merci, mon pote, tu l'as totalement raté J'ai mappé la clé : bn à une clé et elle a cessé de fonctionner, elle fonctionne à nouveau. C'était ma mauvaise.
ArunMKumar

2017? Tu veux dire 2018?
flarn2006

1
@ flarn2006, concernant 2017 par rapport à 2018, Vim 8.1 a été annoncé sur vim.org le 18 mai 2018, avec "prise en charge de l'exécution d'un terminal dans une fenêtre Vim" répertoriée comme sa "principale nouvelle fonctionnalité". La fonctionnalité était disponible pour la première fois plus tôt, le 7 juillet 2017, dans le patch 8.0.0693. github.com/vim/vim/commit/…
Daniel S.

32

Cette question est assez ancienne, mais pour ceux qui la trouvent, il existe une nouvelle solution possible: Neovim contient un émulateur de terminal de première classe à part entière, qui fait exactement ce que ConqueTerm a essayé de faire. Courez simplement :term <your command here>.

<C-\><C-n>quittera le mode terme pour revenir au mode normal. Si vous êtes comme moi et que vous préférez que escape quitte le mode term, vous pouvez l'ajouter à votre nvimrc:

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

Et puis, appuyer deux fois sur ESC quittera le mode terminal en mode normal, vous pourrez donc manipuler le tampon dans lequel la commande en cours d'exécution écrit.

Cependant, gardez à l'esprit que nvim est en cours de développement au moment où je publie cette réponse, une autre façon de quitter le mode terminal peut être ajoutée. Comme Ctrl+\Ctrl+npasse en mode normal à partir de presque tous les modes, je ne m'attends pas à ce que cette réponse devienne incorrecte, mais sachez que si cela ne fonctionne pas, cette réponse pourrait être obsolète.

https://github.com/neovim/neovim


29

:term

Cependant, cette fonctionnalité a été récemment ajoutée dans Vim 8.1, qui, à partir de cette publication, vient d'être publiée récemment, vous devrez donc peut-être la mettre à jour pour l'utiliser.


Il a été ajouté avant vim 8.1. C'est juste la principale grande fonctionnalité que vim 8.0.001 n'avait pas. C'est pourquoi il est annoncé comme une nouveauté vim 8.1. Voir la réponse de Daniel d'octobre 2017 et celle de fjardon en avril 2018. -> github.com/vim/vim/blob/master/runtime/doc/version8.txt#L18814
Luc Hermitte

17

Je sais que je ne réponds pas directement à la question, mais je pense que c'est une bonne approche. Personne n'a mentionné tmux (ou du moins pas comme réponse autonome). Tmux est un écran de type multiplexeur terminal. La plupart des trucs peuvent être créés dans les deux multiplexeurs, mais afaik tmux, il est plus facile à configurer. En outre, tmux est actuellement plus activement développé que screen et il y a un assez grand écosystème autour de lui, comme des outils qui aident à la configuration, etc.

Aussi pour vim, il existe un autre plugin: ViMUX , qui aide beaucoup dans l'interaction entre les deux outils. Vous pouvez appeler des commandes avec:

:call VimuxRunCommand("ls")

Cette commande crée un petit fractionnement horizontal sous le volet actuel de vim.

Il peut également vous permettre d'exécuter à partir d'une invite au cas où vous ne voudriez pas exécuter la commande entière:

<Leader>vp :VimuxPromptCommand<CR>

Comme cela n'était pas suffisant, il existe au moins 6 'plugins spécifiques à la plateforme':

  • vim-vroom : coureur pour rspec, concombre et test / unit; support vimux viag:vroom_use_vimux
  • vimux-ruby-test : un ensemble de commandes pour exécuter facilement des tests ruby
  • vimux-cucumber : exécuter les fonctionnalités de Cucumber via Vimux
  • vim-turbux : Test de Turbo Ruby avec tmux
  • vimux-pyutils : un ensemble de fonctions pour vimux qui permettent d'exécuter des blocs de code dans ipython
  • vimux-nose-test : exécuter des tests de nez dans vimux

Voici un joli "cas d'utilisation": Tests à la demande avec Vimux et Turbux avec Spork et Guard


Voulez-vous expliquer pourquoi il a été rejeté? (en plus d'être une réponse d'il y a 6 ans)
Pablo Olmos de Aguilera C.

13

Quelqu'un a déjà suggéré https://github.com/Shougo/vimshell.vim , mais il n'a pas expliqué pourquoi. Par conséquent, lorsque je suis sorti de cette question, j'ai perdu beaucoup de temps à essayer les autres options (bien mieux classées).

Shougo / vimshell est la réponse. Voici pourquoi:

En plus d'être un émulateur de terminal, VimShell vous permet de naviguer à travers la sortie du terminal en mode normal et visuel. Ainsi, si une commande que vous exécutez donne une sortie que vous souhaitez copier et coller à l'aide du clavier uniquement ... VimShell couvre cela.

Aucune des autres options mentionnées, y compris la commande: terminal dans NeoVim ne le fait. Neovim's: le terminal se rapproche, mais ne fonctionne pas au moins de la manière suivante au 18/02/2017:

  • Déplace le curseur à la fin du tampon, au lieu de le garder au dernier endroit comme le fait VimShell. Énorme perte de temps.

  • Ne supporte pas de modifiable = 1voir une discussion à ce sujet sur Github , donc les plugins utiles comme vim-easymotion ne peuvent pas être utilisés.

  • Ne prend pas en charge l'affichage des numéros de ligne comme le fait Vimshell.

Ne perdez pas de temps sur les autres options, dont Neovim's: terminal. Allez avec VimShell.


1
NeoVim vous permet de naviguer et de copier à partir de la sortie du terminal en mode normal / visuel. Je le fais tout le temps. Utilisation de NVIM 0.1.6-dev
Alice Heaton

Merci, je vais essayer VimShell. J'ai toutefois pris la liberté de supprimer une déclaration incorrecte de la réponse. Comme l'a souligné @Alice, NeoVim :terminalpeut absolument faire de même.
Konrad Rudolph

:terminalne peut pas faire la même chose :VimShellen termes de navigation et d'édition, et de manière fondamentale. Voir l'explication ci-dessus.
user3751385

9

Vous voudrez peut-être jeter un œil à la :shcommande (voir :help shdans Vim).

Commandes diverses


N'utilisez donc pas zsh avec vim. set shell=/bin/shfera en sorte que vim utilise un shell plus silencieux pour ses commandes.
Ross Presser

8

2
NE PRENEZ PAS L'AVIS DE splitvt- il modifie les codes de contrôle des couleurs et rend vimtout à fait inutilisable.
new123456

12
"Non" est une mauvaise réponse. Une meilleure réponse est «Par défaut, non». Techniquement, cela peut être fait, et peut-être devez-vous écrire un nouveau code source et le compiler vous-même, ou écrire un plugin. Est-ce facile? Peut-être pas, mais cela peut être fait. Dire simplement non revient plus à dire «non, je ne le ferai pas».
trusktr

2
@AnishRamaswamy Il n'est toujours pas possible d'exécuter un shell dans un tampon vim en utilisant stock vim (contrairement à emacs). Telle était la question du PO.
Amber

1
@Amber, oui, ce serait bien, sauf que l'OP ne mentionnait pas l'utilisation du stock vim.
Anish Ramaswamy

3
Quelqu'un devrait simplement modifier cette réponse pour dire que vous ne pouvez pas le faire avec stock vim.
still_dreaming_1

4

La seule façon que je sache est d'utiliser vim-shell , un patch tiers.


Pour être pédant, vim-shell est un patch, pas un «add-on» (ce qui pour moi, au moins, implique que c'est un script). Je ne l'ai pas essayé personnellement, mais la page shell vim sur le wiki Vim suggère malheureusement qu'elle ne se compilera pas avec Vim 7.1+.
Yewge

Changé pour apaiser le pédant. :) (J'ai dû taper quelque chose de plus de 15 caractères. 'Fixe' n'était pas assez long)
romandas

Shougo / vimshell ( github.com/Shougo/vimshell.vim ) semble plutôt bien fonctionner. Cela nécessite de construire une bibliothèque dynamique, mais c'est assez simple (cd <vim> / vimproc; make)
Wayne Walker


2

Essayez vterm , qui est un shell à peu près complet à l'intérieur de vim. Il est légèrement bogué avec son histoire et ses fonctions claires, et toujours en développement, mais il est toujours assez bon


2

En supposant que votre version de vim prend en charge la +termcommande en premier, définissez shell pour que vim l'utilise dans une seule commande (par exemple set=/usr/bin/zsh), puis exécutez la commande +term(par exemple bo 15vs +term). vous devrez peut-être faire des manœuvres supplémentaires de vos fenêtres (c'est-à-dire en supprimer une et la faire pivoter), mais vous aurez votre terminal.


0

Je reconnais que je ne réponds pas strictement à votre question, mais ce qui a mieux fonctionné pour moi lorsque j'utilise Vim et Terminals dans la même fenêtre est Tmux (qui est une sorte de "exécuter dans le logiciel d'arrière-plan" comme, similaire à l'écran, bien que cela on fonctionne mieux avec les splits et les tabulations).

Ce billet vous aidera à comprendre comment ils fonctionnent ensemble: «Tmux et Vim - encore mieux ensemble» .

De cette façon, nous pouvons convertir Vim en un puissant IDE


0

Divisez l'écran et exécutez la commande term ++curwinpour exécuter le terminal à l'intérieur du tampon Vim. La commande suivante fait les deux et a fonctionné pour moi:

:bo 10sp | term ++curwin
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.