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:
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
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.
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 :
Réponses:
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
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
la source
:r!echo
sans altérer le tampon.Voici ce que je fais. Il est fait allusion dans les commentaires dans les réponses ci-dessus.
Exemple 1 : recherchez tous les fichiers texte dans
/tmp
Exemple 2 : vous modifiez le fichier foo.txt et vous souhaitez exécuter
ls -la foo.txt
et obtenir la sortie dans un tampon: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
crée une scission horizontale, utilisez:vnew
si vous voulez une scission verticale à la place et:tabnew
pour un nouvel onglet.la source
%
pour le tampon suivant mais E499.travaille pour moi.
la source
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()
:ou stockez le nom du tampon actuel pour plus tard :
la source