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

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

Une chose que j’aime chez Emacs, c’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.

Je recommanderais sans hésiter l’ screen pour quelque chose comme ça. Vim est un éditeur de texte, pas un shell.

Je voudrais utiliser Ctrl + A S pour diviser la fenêtre actuelle horizontalement, ou dans l’écran d’Ubuntu et d’autres versions corrigées, vous pouvez utiliser Ctrl + A | (pipe) à diviser verticalement. Ensuite, utilisez Ctrl + A Tab (ou de manière équivalente sur certains systèmes, Ctrl + A Ctrl + I qui peut être plus facile à 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 de l’ screen consiste simplement à ouvrir plusieurs fenêtres en plein écran et à basculer entre elles. C’est ce que je fais normalement, je n’utilise que la fonction d’écran partagé de temps en temps.

La question du Guide de survie à l’écran GNU comporte un certain nombre de bons conseils si vous ne connaissez pas son utilisation.

Dépassé depuis août 2011

Découvrez Conque Shell (également sur GitHub ). Vous permet d’exécuter n’importe quel programme interactif à l’intérieur de vim, pas seulement un shell.

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 saisir plusieurs commandes ou jouer dans un shell pendant un certain temps, vous pouvez toujours utiliser:

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

Une fois la commande ou le shell terminé, vous avez la possibilité d’appuyer sur Entrée pour revenir à la fenêtre de votre éditeur.

Vim est intentionnellement léger et ne permet pas de faire des choses de type non éditeur, tout comme exécuter un shell complet dans un volet / onglet Vim, mais comme mentionné ci-dessus, il existe des addons tiers tels que vim-shell qui vous permettent faire ce genre de chose.

Typiquement, si je veux basculer entre Vim et mon shell (Bash), il me suffit d’ appuyer sur CTRL + Z pour interrompre le processus Vim, jouer dans mon shell, puis taper «fg» quand je veux retourner à Vim – garder mon éditeur et ma coquille sympa et séparée.

La façon dont je contourner ce problème est de suspendre Vim avec Ctrl + Z , jouer dans le terminal, puis retourner à Vim avec la commande fg .

:sh puis ctrl+d pour revenir dans (bash)

Mise à jour :

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

noremap :sh

Si activé dans votre version de Vim, un terminal peut être démarré avec la commande :term .

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

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

En mode Terminal-Job , appuyez sur Ctrl-W N ou Ctrl-\ Ctrl-N basculer 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 sur i .

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

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. Exécuter simplement :term .

quittera le mode terme pour revenir au mode normal. Si vous êtes comme moi et que vous préférez encore échapper, quittez le mode terme, vous pouvez l’append à votre nvimrc:

 tnoremap   

Puis, appuyez deux fois sur ESC pour quitter le mode terminal en mode normal. Vous pouvez donc manipuler le tampon sur lequel la commande en cours d’écriture écrit.

Bien que nvim soit en plein développement au moment où je publie cette réponse, une autre façon de sortir du mode terminal peut être ajoutée. Comme Ctrl + \ Ctrl + n passe du mode normal à presque tous les modes, je ne pense pas que cette réponse sera erronée, mais sachez que si cela ne fonctionne pas, cette réponse pourrait être obsolète.

https://github.com/neovim/neovim

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 terminal multiplexeur comme un écran. La plupart des choses peuvent être faites dans les deux multiplexeurs, mais il est plus facile de configurer le système afaik tmux. De plus, tmux est actuellement plus développé que l’écran et il existe un écosystème assez important, comme des outils d’aide à la configuration, ecc.

Aussi pour vim, il y a 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 une petite division horizontale en dessous du panneau actuel.

Il peut également vous permettre d’exécuter à partir d’une invite si vous ne souhaitez pas exécuter la commande entière:

vp :VimuxPromptCommand

Comme il n’y en avait pas assez, il existe au moins 6 «plugins spécifiques à la plate-forme»:

  • vim-vroom : coureur pour rspec, concombre et test / unité; Support vimux via g:vroom_use_vimux
  • vimux-ruby-test : un ensemble de commandes pour exécuter facilement des tests Ruby
  • vimux-cucumber : lancez Cucumber Features via Vimux
  • vim-turbux : test Turbo Ruby avec tmux
  • vimux-pyutils : Un ensemble de fonctions pour vimux qui permettent d’exécuter des blocs de code dans ipython
  • test vimux-nose : tests de nez de course en vimux

Voici un beau “cas d’utilisation”: Tests à la demande avec Vimux et Turbux avec Spork et Guard

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

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

En plus d’être un émulateur de terminal, VimShell vous permet de naviguer dans les sorties du terminal en mode normal et visuel. Ainsi, si vous exécutez une commande, vous souhaitez copier et coller uniquement à l’aide du clavier … VimShell couvre ce problème.

Aucune des autres options mentionnées, y compris la commande: terminal dans NeoVim, ne le fait. Neovim’s: le terminal se rapproche, mais ne parvient pas au moins aux niveaux suivants le 18/02/2017:

  • Déplace le curseur à la fin du tampon, au lieu de le conserver au même endroit que VimShell. Énorme perte de temps.

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

  • Ne supporte pas l’affichage des numéros de ligne comme Vimshell.

Ne perdez pas de temps sur les autres options, y compris celles de Neovim: terminal. Aller avec VimShell.

Vous pourriez vouloir regarder la commande :sh (voir :help sh dans Vim).

Diverses commandes

Finalement, une commande native :terminal é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 lancer la commande de compilation:

  :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.

:term

Cette fonctionnalité a été récemment ajoutée dans Vim 8.1, mais elle a été publiée récemment, il est donc possible que vous deviez la mettre à jour pour pouvoir l’utiliser.

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

Je l’utilise maintenant, vous pouvez essayer. VimShell

Essayez vterm , qui est un shell trè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 quand même assez bon