在Vim中转义Shell命令参数

时间:2018-11-25 16:22:32

标签: vim

我试图完全理解Vim中的以下命令:

:exe "grep -R " . shellescape(expand("<cWORD>")) . " ."<cr>

我使用了 expand 函数(强制将扩展为实际字符串 在它传递给shellescape之前)和 shellescape 命令本身(来自Vim帮助页面:Escape {string}用作shell命令参数)。

从帮助本身来看,我也不明白的是,在 shellescape 命令之前和之后使用一个点。

同样,两个点都位于前面,后面是空白。 如果我用:

:exe "grep -R "shellescape(expand("<cWORD>"))" ."<cr>

这是没有这些点的相同命令,我(显然)得到相同的结果。

有人可以详细解释吗?

谢谢

1 个答案:

答案 0 :(得分:1)

:help :execute已经说明了这一点。

:exe[cute] {expr1} ..语法可以看出,它带有多个参数。

  

多个参数串联在一起,中间有一个空格     之间。为避免多余的空间,请使用“。”     运算符将字符串连接成一个参数。

:help expr-.解释说,Vimscript中的字符串连接运算符为.(不同于许多其他语言中的+;在Vimscript中,该运算符仅用于添加数字或列表)。周围的空白是可选的,但通常会提供更好的可读性。

总而言之,如果您需要将字符串与空格连接起来,则可以使用.并在其中一个字符串中包含空格,也可以将单独的参数传递给:execute并让其添加空格隐式地或在同一个命令中混合使用这两种方法(此处应优先考虑可读性)。

相关问题