Ouvrez la sortie d'une commande shell dans un volet divisé

23

Considérez tout langage de programmation interprété.

Je peux exécuter le script actuellement ouvert en utilisant ! interpreter %et utiliser la touche de retour pour revenir à vim une fois l'exécution terminée.

Est-il possible de ne pas remplacer la fenêtre actuelle par la sortie de la commande shell exécutée, mais d'ouvrir la sortie dans un nouveau volet divisé à la place? Je voudrais toujours voir mon code source pendant l'exécution de mon script.

J'ai essayé :split ! interpreter %, mais ça n'a pas marché.

Y a-t-il un moyen? J'utilise vim 7.3.

muffel
la source

Réponses:

29

Avec :!, la commande externe est exécutée dans un shell et la sortie éphémère n'est pas capturée dans Vim; vous voyez simplement ce qui est imprimé sur le terminal, puis le contrôle revient à Vim une fois la commande externe terminée.

Pour conserver la sortie, vous devez la lire dans un tampon Vim . Pour cela, il y a la :read!commande. Pour ouvrir un nouveau zéro tampon, combiner avec :new:

:new | 0read ! <command>

Si vous voulez passer le nom de fichier du tampon actuel ( %) à la commande externe, vous devez utiliser :execute, de sorte qu'il soit déjà évalué dans le tampon actuel:

:execute 'new | 0read ! interpreter' expand('%')

Ou, vous utilisez le fait qu'avec un nouveau tampon, le précédent devient l' autre , et utilisez à la #place de %:

:new | 0read ! interpreter #

Débarrassez-vous du tampon de travail avec :bdelete!.

Si vous voulez voir la sortie de manière asynchrone pendant son exécution, vous avez besoin d'un multiplexeur externe ou d'un plugin, comme mentionné dans la réponse @chaos.

Ingo Karkat
la source
La commande ": execute ..." ci-dessus fonctionne pour moi, mais lorsque j'essaye de la lier à la frappe F9, en utilisant cette entrée .vimrc [nnoremap <buffer> <F9>: execute 'new | 0read! / Usr / bin / env python3 'expand ('% ')], j'obtiens l'erreur suivante: [/ bin / bash: -c: ligne 0: EOF inattendu lors de la recherche de la correspondance ``' expand ('%' )]. J'ai essayé plusieurs séquences d'échappement, mais je suppose que ce n'est pas la bonne. = :). Des idées? Je vous remercie.
NYCeyes du
2

Pour autant que je sache, vous ne pouvez pas faire cela en vim. Mais utilisez un multiplexeur de terminal comme screencelui-là. Avant d'ouvrir un vim, démarrez le multiplexeur:

screen

Appuyez ensuite sur ctrl- a Spour l'horizontale et ctrl- a |pour un écran renversé vertical.

Ouvrez maintenant un fichier dans l' vimun des écrans fractionnés. Et passez à l'autre écran en utilisant ctrl- a tab. Notez que, dans le deuxième écran, vous devez d'abord ouvrir un nouvel écran ( ctrl- a c) avant de pouvoir l'utiliser.

Dans l'écran avec vim, vous pouvez modifier le fichier et dans l'autre écran, vous pouvez l'exécuter et voir les messages et le code en permanence.

Voici une référence rapide pour screen.

le chaos
la source
Alternativement, vous pouvez utiliser le tmuxmultiplexeur et le vim-dispatchplugin pour automatiser le fractionnement et le saut entre les volets.
taketwo