Transférer la sortie de la commande shell (!) Dans un nouveau tampon dans Vim

35

Comment canaliser la sortie d'une commande shell dans un nouveau tampon dans Vim? Les éléments suivants ne fonctionneraient évidemment pas, mais vous pouvez voir où je veux en venir:

:!echo % | :newtab
Richie Marquez
la source
1
stackoverflow.com/questions/3826003/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Réponses:

27

Vous ne pouvez pas diriger la sortie d'une commande shell dans une commande qui crée un nouveau tampon, mais vous pouvez créer un nouveau tampon et lire la sortie d'une commande shell dans ce tampon avec une entrée sur la ligne de commande de Vim. Une version de travail de votre exemple serait

:tabnew | r !echo <c-r>=bufname("#")<cr>

Notez que le symbole de tuyau dans ce cas est un séparateur entre les commandes Vim ex, pas le tuyau du shell. Voir également

:help :tabnew
:help :r!
:help :bar
garyjohn
la source
C'est presque exactement ce dont j'ai besoin, juste l'inverse afin que je puisse accéder au nom de fichier du tampon actuel. Remarque: mise à jour de la question pour, espérons-le, clarifier le résultat final souhaité.
Richie Marquez
@Richard Marquez: j'ai mis à jour cette réponse. le nouvel onglet est maintenant ouvert avec le "vieux" nom de fichier, vous pouvez donc appeler
akira
Mais pas :r!echosans altérer le tampon.
Luc Hermitte
2
@garyjohn, akira: merci pour l'aide. La partie "<cr> = ..." a fait des erreurs de débordement de Vim, mais j'ai pu le faire fonctionner avec ": tabnew | r! Echo #".
Richie Marquez
1
Il peut également être utile de noter que si vous souhaitez associer cela à une clé de votre .vimrc, vous devrez remplacer le | caractère avec <bar>.
Richie Marquez
16

Voici ce que je fais. Il est fait allusion dans les commentaires dans les réponses ci-dessus.

:new | r ! <cmd>
:new | r ! <cmd> #   (# is replaced with filename)

Exemple 1 : recherchez tous les fichiers texte dans/tmp

:new | r ! find /tmp -name '*.txt'

Exemple 2 : vous modifiez le fichier foo.txt et vous souhaitez exécuter ls -la foo.txtet obtenir la sortie dans un tampon:

:new | r ! ls -la #

Le #est remplacé par le nom de fichier du tampon d'origine que vous modifiez. Ceci est particulièrement utile pour les commandes de contrôle de source ad hoc, par exemple

:new | r ! hg annotate -un #

:newcrée une scission horizontale, utilisez :vnewsi vous voulez une scission verticale à la place et :tabnewpour un nouvel onglet.

surpenser
la source
Pouvez - vous répondre à cette question ici aussi? il s'agit d'essayer d'utiliser le tampon actuel avec %pour le tampon suivant mais E499.
hhh
4
:tabnew | enew | r ! <your shell cmd>

travaille pour moi.

justrajdeep
la source
2

Si vous avez vraiment besoin de stocker le résultat dans un nouveau tampon, mais que vous avez besoin des informations de l'ancien tampon actuel, vous pouvez soit utiliser system():

:let res = system('echo '.expand('%'))
:tabnew
:put=res

ou stockez le nom du tampon actuel pour plus tard :

:let bn = expand('%')
:tabnew | :r!echo <c-r>=bn<cr>
Luc Hermitte
la source
voir l'autre réponse, vous pouvez le faire sans stocker le nom dans une variable. mais bonne réponse quand même.
akira
Effectivement. Je n'étais pas sûr que '#' donnera le résultat attendu dans ce cas - comme je n'utilise jamais d'onglets
Luc Hermitte