Piping buffer vers une commande externe dans Vim

92

Je suis une sorte de novice de Vim. Je voudrais envoyer le contenu du tampon actuel à stdin de la commande externe (disons mail). Mon objectif final est de définir un raccourci pour envoyer rapidement des e-mails à partir du tampon Vim actuel. Je suppose que cela devrait être un truc trivial, mais je n'ai pas trouvé de moyen d'envoyer du tampon Vim à une commande externe. Merci d'avance.

Yasar
la source
Questions connexes pour fournir le texte sélectionné en tant que STDINcommandes shell: Pipe to shell et recevoir la sortie sur la ligne d'information et Remplacement du texte original sélectionné par la sortie
user1129682

Réponses:

130

Vous pouvez utiliser :w !cmdpour écrire le tampon actuel dans le stdin d'une commande externe. De :help :w_c:

: [plage] w [rite] [++ opt]! {cmd}

Exécuter {cmd}avec des [range]lignes comme entrée standard (notez l'espace devant le '!'). {cmd}est exécuté comme avec ":!{cmd}", any '!'est remplacé par la commande précédente |:!|.

Une commande associée :%!cmdfait la même chose et remplace ensuite le tampon actuel par la sortie de la commande. Ainsi :%!sortinvoquerait la commande de tri externe pour trier le tampon actuel en place.

John Kugelman
la source
6
Ceci est utile pour formater json comme: :'<,'>!python -mjson.toolou:%!python -mjson.tool
TrinitronX
1
Pour le formatage, utilisez :%!gofmtsans le dernier %, car cela l'amènerait à utiliser la version enregistrée (qui peut différer du tampon actuel)
Thomasrutter
Y a-t-il un moyen pour cela de remplacer le tampon actuel par la sortie de commande uniquement en cas de succès? Si la commande renvoie une valeur différente de zéro, ne remplacez pas le tampon?
thomasrutter
@thomasrutter si le tampon est remplacé par un message d'erreur au lieu de la sortie prévue, vous pouvez simplement appuyer sur upour annuler
törzsmókus