comment utiliser un contenu variable comme argument pour la commande vim?

12

par exemple, supposons que je l'ai fait

:let foo=pattern

et maintenant je veux effectuer Ggrep pattermais utiliser une variable fooau lieu de la patterchaîne littérale .

:echo foo

sorties pattern, mais

:Ggrep foo

cherche juste foo

METTRE À JOUR:

construire une chaîne de commande puis exécuter: exécuter dessus n'est pas une solution, c'est un hack. Et cela rompt avec toutes les valeurs de variables non triviales.

Vitaly Kushner
la source
qu'est-ce que Ggrep(majuscule G?)?
akira
git grep du plugin vim 'fugutif'
Vitaly Kushner
l'exemple de commande est incorrect. il faut laisser foo = 'pattern'. Dire que: exécuter est un hack est totalement faux. Voilà la solution: vous voulez que vim évalue la commande avant de l'exécuter
albfan

Réponses:

2

Il ne s'agit pas de variable, mais peut-être que la commande abrégée vim peut aider. Essayez depuis la ligne de commande:

:abbreviate foo pattern

ensuite

:Ggrep foo<space>

Il complètera 'foo' à votre 'pattern'.

alexche8
la source
Essayez maintenant de courir echo foo. Opps echo patternqui n'est pas une variable. c'est un piratage et une erreur.
albfan
7

qu'en est-il de:

:execute ':grep ' . foo
akira
la source
comment puis-je correctement échapper au contenu de foo? il peut contenir des caractères spéciaux comme ", ', /, \, etc
Vitaly Kushner
1
@Vitaly Kushner: Voir ": help escape ()" et ": help fnameescape ()".
garyjohn
Je connais escape (), mais je ne sais pas quels personnages échapper
Vitaly Kushner
fnameescape () n'est pas bon, ce n'est pas un argument de nom de fichier, c'est une fonction arg à plugin. supposons que je: laisse foo = "aaa \" bbbb'cccc "
Vitaly Kushner
1
J'arrache mes cheveux aussi. Vous ne pouvez pas exécuter une commande comme let xyz = tabpagenr()alors tabnext xyz. Le langage de script de Vim est aussi imparfait que son environnement modal est impeccable.
puk
2

Si vous n'aimez pas la :exesolution, vous pouvez "lire" le contenu d'une variable dans la ligne de commande en utilisant le =registre d'expression. Par exemple, tapez :Ggreppuis appuyez sur Ctrl- rpuis tapez =fooet appuyez sur Enter. En supposant que la variable foocontienne "pattern", votre ligne de commande devrait maintenant ressembler à:

:Ggrep pattern

Cela a l'avantage que vous pouvez voir la commande réelle qui sera exécutée, et même la modifier avant d'appuyer Enterune deuxième fois.

Voir:

:help "=
Heptite
la source