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


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

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.


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


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>

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.