web-dev-qa-db-fra.com

Comment exécuter un terminal dans Vim?

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

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

276
Evan

Je recommanderais certainement screen pour quelque chose comme ceci. Vim est un éditeur de texte, pas un shell.

J'utiliserais Ctrl+AS pour scinder la fenêtre actuelle horizontalement, ou sur l'écran d'Ubuntu et d'autres versions corrigées, vous pouvez utiliser Ctrl+A|(pipe) à diviser verticalement. Puis utiliser Ctrl+ATab (ou équivalent sur certains systèmes, Ctrl+ACtrl+I qui peut être plus facile à taper) pour basculer entre les fenêtres. Il existe d'autres commandes permettant de modifier la taille et la disposition des fenêtres.

Ou une utilisation moins avancée de screen consiste simplement à ouvrir plusieurs fenêtres en plein écran et à basculer entre elles. C’est ce que je fais normalement, j’utilise rarement la fonction d’écran divisé.

La question Guide de survie de l'écran GN contient un certain nombre de conseils utiles si vous n'êtes pas familier avec son utilisation.

114
Greg Hewgill

périmé d'août 2011

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

231
Kyle Simek

Je ne sais pas exactement ce que vous essayez d'atteindre (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 Shell terminée, vous aurez la possibilité d’appuyer sur Enter pour 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-éditeur, tout comme exécuter un shell complet dans un panneau/onglet de Vim, mais comme mentionné ci-dessus, des additifs tiers, tels que vim-Shell, vous permettent faire ce genre de chose.

En règle générale, si je souhaite basculer entre Vim et mon shell (Bash), je frappe simplement CTRL+Z pour mettre en pause le processus Vim, jouez dans mon Shell, puis tapez 'fg' lorsque je veux revenir à Vim - garder mon éditeur et mon Shell Nice et les séparer.

194
David Claridge

La façon dont je contourne ceci est:

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

:sh puis ctrl+d pour revenir (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 <C-d> :sh<cr>

82
tester

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 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é + terminal. Si votre version de Vim est compatible avec 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 pour passer en mode Terminal-Normal, ce qui permet de déplacer le curseur et les commandes à être exécuté de manière similaire au mode Normal de Vim. Pour revenir au mode Terminal-Job, appuyez sur i.

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

77
Daniel S.

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

<C-\><C-n> quittera le mode terme en mode normal. Si vous êtes comme moi et que vous préférez sortir du mode terme, vous pouvez ajouter ceci à votre nvimrc:

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

Ensuite, appuyez deux fois sur la touche ESC pour revenir au mode terminal, vous permettant ainsi de manipuler le tampon sur lequel la commande en cours d'exécution écrit.

N'oubliez pas cependant que nvim est en pleine phase de développement au moment où je publie cette réponse, un autre moyen de sortir du mode terminal peut être ajouté. Comme Ctrl+\Ctrl+n passe en mode normal à partir de presque tous les modes , je ne m'attends pas à ce que cette réponse devienne fausse, mais sachez que si cela ne fonctionne pas, cette réponse pourrait être obsolète.

https://github.com/neovim/neovim

30
lahwran

Finalement, une commande native :terminal a été ajoutée à vim en 2017.

Voici un extrait du : terminal readme:

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 de construction:

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

28
fjardon

:term

Cependant, cette fonctionnalité a été ajoutée récemment dans Vim 8.1. Cette publication a récemment été publiée. Vous devrez peut-être effectuer une mise à jour pour pouvoir l'utiliser.

22
flarn2006

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 multiplexeur terminal comme un écran. La plupart des choses peuvent être faites dans les deux multiplexeurs, mais après tout, c'est plus facile à configurer. De plus, tmux est actuellement développé plus activement que screen et il est entouré d’un assez grand écosystème, comme des outils facilitant 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 volet actuel de vim.

Il peut également vous permettre de lancer une invite si vous ne souhaitez pas exécuter la commande complète:

<Leader>vp :VimuxPromptCommand<CR>

Comme ce n’était pas assez, il y a au moins 6 'plugins spécifiques à une plateforme':

  • vim-vroom : coureur pour rspec, concombre et test/unité; Prise en charge de vimux via g:vroom_use_vimux
  • vimux-Ruby-test : un ensemble de commandes permettant d'exécuter facilement Ruby tests
  • vimux-cucumber : lancez les fonctions de concombre via Vimux
  • vim-turbux : Turbo Ruby tester avec tmux
  • vimux-pyutils : Un ensemble de fonctions pour vimux permettant d'exécuter des blocs de code dans ipython
  • vimux-nose-test : Exécuter des tests de nez dans vimux

Voici un "cas d'utilisation" de Nice: 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 me suis éloigné 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 à travers les sorties du terminal en mode normal et visuel. Ainsi, si une commande que vous exécutez génère une sortie que vous souhaitez copier et coller à l'aide du clavier uniquement ... VimShell couvre ce problème.

Aucune des autres options mentionnées, y compris la commande: terminal de NeoVim, ne le fait. Neovim's: le terminal se rapproche, mais manque au moins des moyens suivants à partir du 18/02/2017:

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

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

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

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

13
user3751385

Vous voudrez peut-être jeter un coup d'œil à la commande :sh (voir :help sh dans Vim).

Commandes diverses

9
Eric Schwabe
7
Amber

La principale nouveauté 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 de Vim.

6
Yossarian42

Le seul moyen que je connaisse consiste à utiliser vim-Shell , un correctif tiers.

4
romandas

Je l'utilise maintenant, vous pouvez essayer. VimShell

3
Gatspy

Essayez vterm , qui est un shell à peu près complet dans vim. Il est un peu buggé avec son historique et ses fonctions claires, et est toujours en développement, mais c'est quand même assez bon

2
Christopher Dumas