如何使用可变内容作为vim命令的参数?


12

例如,假设我做了

:let foo=pattern

现在我想执行,Ggrep patter但是使用变量foo而不是文字patter字符串。

:echo foo

输出pattern,但是

:Ggrep foo

只是寻找foo

更新:

构建一个命令字符串,然后在其上运行:execute不是解决方案,这是一个hack。并且它会与任何非平凡的变量值分开。


什么是Ggrep(大写G?)?
akira

来自“ fugutive” vim插件的git grep
Vitaly Kushner,

示例命令错误。应该让foo ='pattern'。说:execute是一个hack是完全错误的。那就是解决方案:您希望vim在执行命令之前先评估命令
albfan

Answers:


2

它与变量无关,但vim缩写命令可能会有所帮助。从命令行尝试:

:abbreviate foo pattern

然后

:Ggrep foo<space>

它将完成“ foo”到您的“模式”。


现在尝试运行echo foo。Opps echo pattern这不是变量。这是一个hack和误导。
albfan

7

关于什么:

:execute ':grep ' . foo

如何正确地逃避foo的内容?它可能包含特殊字符,例如“,',/,\等
Vitaly Kushner,

1
@Vitaly Kushner:请参见“:help escape()”和“:help fnameescape()”。
garyjohn

我知道escape(),但不确定要逃脱哪些字符
Vitaly Kushner

fnameescape()不好,它不是文件名参数,它是插件函数的arg。假设我:let foo =“ aaa \” bbbb'cccc“
维塔利·库什纳

1
我也为此扯头发。您不能像let xyz = tabpagenr()then 那样发出命令tabnext xyz。Vim的脚本语言存在缺陷,而其模态环境则完美无缺。
2012年

2

如果您不喜欢该:exe解决方案,则可以使用=表达式寄存器将变量的内容“读取”到命令行中。例如,键入:Ggrep然后按Ctrl- r,然后键入=foo并按Enter。假设变量foo包含“模式”,您的命令行现在应如下所示:

:Ggrep pattern

这样做的好处是您可以看到将要运行的实际命令,甚至可以在Enter第二次按下之前对其进行修改。

看到:

:help "=
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.