Comment faire pour rediriger les ex sortie de la commande dans le tampon courant ou d'un fichier?
Comment puis-je rediriger ou de rediriger la sortie d'une commande ex dans ma mémoire tampon ou un fichier?
Par exemple, je veux lire le contenu de tous les registres de la mémoire tampon, ce qui en mode ex est indiqué à l'aide d' :registers
.
- vi.stackexchange.com/a/13881/10254 peut-être d'intérêt, en gros obtenir l'entrée, puis de lancer la commande, de capturer et mettre. Avec vimscript fonctions,
Capture(excmd)
PutAfterCapture(command)
GetInputCommandThenCaptureAndPut()
Vous devez vous connecter pour publier un commentaire.
La dernière commande est très utile, car il ya beaucoup d'options pour la redirection: pour les variables, de registres, comment faire pour ajouter, outre la corne d'abondance.
Je continue de trouver ça bizarre et ennuyeux que l'on utilise à la FIN de cette façon, mais depuis tout ce qui peut suivre
redir
doit commencer par un non-mot-de caractère, au moins, il n'est pas ambigu.PS autant que je sache (ce qui est assez présent dans ce cas) il n'y a pas moyen de le lire directement dans la mémoire tampon: vous devez le stocker dans un registre ou d'une variable de première. Consultez l'aide pour les différentes options de la façon de le faire.
PPS Si vous ne voulez pas pour ce faire à l'aide d'une variable peut-être de l'encapsuler dans une fonction et d'éviter de casser les registres ou des variables globales— vous aurez à convertir le multiligne chaîne qui est écrit sur la variable dans une liste. Par exemple
Sinon (si vous venez de le faire
append('.',var)
) vous vous retrouvez avec ^@'s (null) au lieu de retours à la ligne, puisque c'est ce que vimscript utilise pour représenter des retours à la ligne dans les variables de Chaîne de caractères.modifier: comme @Bill Odom mentionne, à l'aide de
:put =variable_you_redirected_to
est beaucoup plus facile que la complexité de laappend()
expression. Merci, Bill!PPP
J'ai écrit un extrait de à faire ce genre de choses plus commode. Il déclare une fonction
Redir(command, target)
et une commande deR
.La commande analyse de la dernière série des non-caractères d'espace comme une cible de redirection et le passe à la fonction, ce qui ne le passe-partout pour rediriger la sortie de la commande à la cible de redirection.
La commande est tout après
R
et avant le dernier espace.Par exemple
Il y a quelques limitations: par exemple, vous ne serez pas en mesure d'écrire dans un nom de fichier contient un espace. L'avantage de ceci est que vous n'avez pas de citer votre commande. Je l'ai posté sur gist.github.com et je vais essayer de le garder à jour si j'arrive à la fin de l'améliorer. Ou vous pouvez fourche vous-même</noeuphemism>!
De toute façon l'extrait est disponible ici. Il peut être déposé dans une .fichiers vimrc ou dans un fichier dans ~/.vim/plugins.
Exec
fonction de ici, une cartographie comme:inoremap <C-S-C> <C-R>=Exec("")<Left><Left>
cartes Ctrl+Maj+C (pour Commande) pour faciliter l'insertion de la sortie d'une commande comme:ls
au point en cours dans la mémoire tampon.@intuition est bonne; le
redir
commande est ce que vous voulez. Un one-liner comme cela insère la sortie de :registers
dans le tampon courant:Ce n'est pas quelque chose que vous aurez envie de taper très souvent, cependant, et ce n'est pas exactement se prêtent à une carte de clés. Je me suis fait assez souvent, donc j'ai écrit une fonction et une poignée de commandes pour le rendre plus facile. En bonus, je peux maintenant envoyer la sortie d'une commande vers une nouvelle fenêtre ou un nouvel onglet, aussi facilement que de l'insérer dans le tampon courant. Voici le code (avec quelques exemples de commande à la fin):
:put =var
.redir => m | silent map | redir END | put=m
:redir @a
redirige tous les messages à partir d'ici sur un registre nomméa
. Vous suivez avec votre commande dont la sortie que vous souhaitez capturer (:registers
dans votre cas).:redir END
extrémités de la redirection."ap
moyens,"a
utilise le registre nomméa
etp
met le contenu du registre sélectionné dans le tampon courant.Voir Capture ex sortie de la commande à Vim Conseils Wiki pour plus d'informations 🙂
Il n'est pas nécessaire d'utiliser une variable temporaire, tant que vous pouvez enregistrer le tampon courant et sont ok avec ajout de messages à la fin du fichier en cours.
À partir de la documentation de Vim:
http://vimdoc.sourceforge.net/htmldoc/various.html#:redir
Donc, pour ajouter les messages de
:registers
vers le bas du fichier en cours, faites ceci::write
le fichier de sorte que les changements ne sera pas perdu%
, le nom du fichier en cours.:registers
commande.END
de la rediriger vers le fichier.:edit
le fichier pour voir les nouveaux changements.Vous pouvez également force de tronquer le fichier actuel et de le remplacer avec les messages de sortie:
Mais ce n'est probablement pas ce que vous voulez faire.
En outre,
:h :redir
:par exemple
Malheureusement je n'ai pas de rep, donc je ne peux pas l'ajouter comme commentaire à "François Niu'.
La
execute()
fonction ressemble à la meilleure façon d'accomplir cette tâche, et il a été ajouté dans vim 8 .Répertoriées dans la nouvelle/fonctionnalités étendues sur vim de github. version8.txt