Puis-je émettre un shell interactif dans la fenêtre Vim?

16

Je sais que je peux :!ou :r!exécuter une commande externe et éventuellement insérer sa sortie dans le texte. Je peux même jouer :!shet je vais engendrer un shell qui vivra jusqu'à ce que je le quitte - mais tant que le shell est actif, Vim est «endormi» et inaccessible. Je dois quitter le shell et en générer un nouveau si je veux retourner à Vim pendant un moment - pas très utile.

Je peux accéder au shell à l'extrémité opposée, en suspendant Vim avec ^Zet gérer le travail Vim via bg, fget jobs. Cela a plus de sens mais est très lourd à long terme. Je peux utiliser Screens'il est disponible (ce n'est souvent pas le cas), ou ouvrir plusieurs fenêtres de mon gestionnaire de fenêtres (et ssh pour cibler l'hôte de chacune d'entre elles en séquence, pour avoir à la fois vim et shell sur l'hôte distant, encombrant à nouveau.)

Ce serait bien si Vim me permettait d'ouvrir une session shell et de la garder, disons, dans l'une de ses fenêtres (internes), ou de me permettre d'y basculer et vice versa. Est-ce que quelque chose comme ça est possible?

SF.
la source
1
Donc, fondamentalement, vous souhaitez ouvrir un shell dans un :split, tout en conservant le fichier dans l'autre fenêtre? ... Cela ressemble à un travail pour tmux ou écran pour moi ...
Martin Tournoij
1
@Carpetsmoker: Je n'ai souvent aucun contrôle sur ce qui est installé sur le système distant, et le plus souvent aucun des deux ne l'est, alors que Vim est toujours là.
SF.
Pensez à passer à Neovim. Il a maintenant un émulateur de terminal intégré qui fonctionne assez bien et peut être ouvert dans un tampon vim.
Zach

Réponses:

16

Il existe quelques plugins vim qui permettent cela. J'utilise Conque ( Github ).

Après l'avoir placé dans votre répertoire de plugins, il vous suffit de:

:ConqueTermSplit bash

Et vous aurez un shell bash interactif dans vim. Vous pouvez ensuite utiliser vos gestes vim habituels pour faire tout ce que vous voudrez peut-être faire dans la fenêtre.

De plus, l'autre plugin est vimshell .

Bambu
la source
1
Pas moyen de faire quelque chose comme ça sans plugin?
SF.
3
@SF Voir :help shell-window. (Réponse courte: non.)
muru
3

Avec VIM, je pense que les plugins qui sont là pour le faire ne sont pas si bons que ça, bien que le vimshell IMO soit le plus proche. Cependant, vous devez comprendre que c'est un problème en 2 parties.

  1. VIM n'a pas été conçu pour pouvoir faire des choses comme ça, en particulier la lourdeur est de pouvoir exécuter n'importe quelle tâche de longue durée et de lui parler de manière asynchrone sans bloquer VIM. Dans ce cas, ce n'est pas seulement le shell lui-même, mais aussi d'autres tâches que vous pourriez exécuter dans le processus shell.
  2. La philosophie modale de VIM ne fonctionne pas très bien avec la façon dont nous interagissons avec un shell. Dans un shell, seule la ligne actuelle est modifiable, bien que vous puissiez faire défiler et voir le texte plus ancien de votre historique avec shell, vous ne pouvez pas le modifier. Cela ne correspond pas du tout à la philosophie du VIM, si vous deviez appuyer sur ESC et revenir en mode normal, il deviendrait assez difficile d'interdire à un utilisateur de revenir en arrière et de modifier des parties de l'historique ci-dessus.

À mon avis, il existe 2 approches qui fonctionnent beaucoup mieux à cet égard.

  1. Utilisation de TMUX / Screen et de fenêtres de terminal multiplex pour avoir à la fois le vim et le shell. De cette façon, les deux sont parfaitement séparés et pourtant vous pouvez voir les deux avec très peu d'effort et les deux peuvent travailler au mieux de leur potentiel sans entrer en conflit avec le flux de l'autre.
  2. En utilisant des plugins comme tpope / vim-dispatch et autres, vous pouvez facilement lancer des commandes one off shell et les exécuter de manière asynchrone en arrière-plan dans un shell de terminal réel et récupérer les résultats dans vim une fois qu'il est terminé. Cela vous offre également le même niveau d'isolement entre les deux et, par conséquent, les deux peuvent à nouveau travailler au mieux de leurs capacités sans marcher les uns sur les autres.

Je dois ajouter qu'il est fort probable que NeoVIM puisse entraîner un changement dans cet aspect, car l'un de ses principaux objectifs est de pouvoir exécuter des tâches de manière asynchrone. Mais jusque-là, c'est le meilleur que nous puissions obtenir à mon avis.

Dhruva Sagar
la source
3

Dans :help shell-windownous pouvons lire sur l'exécution de commandes shell dans une fenêtre:

Il y a eu des questions sur la possibilité d'exécuter un shell dans une fenêtre à l'intérieur de Vim.

La réponse: vous ne pouvez pas!

Inclure cela ajouterait beaucoup de code à Vim, ce qui est une bonne raison de ne pas le faire. Après tout, Vim est un éditeur , il n'est pas censé effectuer des tâches non d'édition. Cependant, pour obtenir quelque chose comme ça, vous pouvez essayer de diviser votre écran de terminal ou votre fenêtre d'affichage avec le programme " splitvt ".

Une alternative est la commande " window ", trouvée sur les systèmes BSD Unix, qui prend en charge plusieurs fenêtres superposées. Ou le programme " écran ".

Cependant, il existe peu de solutions que vous pouvez utiliser:

  • une utilisation screenspécialement conçue pour ce genre de choses, par exemple:

    • Ctrl+ a, Spour diviser la fenêtre courante horizontalement
    • Ctrl+ a, Tabpour basculer entre les fenêtres
    • Ctrl+ a, Xpour supprimer la région actuelle
    • Ctrl+ a, Qpour supprimer toutes les régions sauf une

    Voir plus sur: GNU Screen Survival Guide at stackoverflow SE

    Ou: GNU Screen Splitting , écran Quick Reference pour plus de détails.

  • VIM-Shell - un patch tiers

    Le shell VIM est une extension pour VIM qui dispose de fenêtres divisées, et ce patch permet de démarrer des shells dans ces fenêtres. Il est uniquement disponible pour les systèmes POSIX

  • vterm - Émulateur de terminal dans vim.

    Le but de vterm est de fournir un clone de terminal Unix à l'intérieur de vim qui fonctionne dès la sortie de la boîte sans aucune dépendance.

  • Vimux - interagissez facilement avec tmux de vim.

    Inspiré par tslime.vim , un plugin qui vous permet d'envoyer des entrées à tmux, vimux permet de faire interagir avec tmux à partir de vim sans effort.

  • autre déjà mentionné: Conque

Connexe: Comment exécuter un terminal à l'intérieur de vim? à stackoverflow

Kenorb
la source
Comment se débarrasser de la scission ?? : - /
0xc0de
Voir:
Découpage d'