9

假设我有这个 vimscript 作为“/tmp/example.vim”:

let g:input = "START; % END"
exec("! clear && echo " . shellescape(g:input))

如果我打开该文件并运行它:so %,输出将是

START; /tmp/example.vim END

因为“%”被扩展为缓冲区名称。我希望输出是

START; % END

我可以特别使用通用escape()方法来转义百分号。这有效:

let g:input = "START; % END"
exec("! clear && echo " . escape(shellescape(g:input), "%"))

但这真的是最好的方法吗?我敢肯定还有更多我应该逃脱的角色。为此目的是否有特定的转义功能?还是更好的出击方式?

4

3 回答 3

10

要与:!命令一起使用,您需要将可选{special}参数传递给shellescape()

{special}参数存在并且它是一个非零数字或非空字符串 (|non-zero-arg|) 时,那么特殊项目(如!, %,#和)<cword>前面会加上一个反斜杠。这个反斜杠将被 | 再次删除。:!| 命令。

:exec("! clear && echo " . shellescape(g:input, 1))
于 2013-03-14T07:54:03.180 回答
4

您需要正确转义“%”。所以应该是:

let g:input = "START; \\% END"
于 2013-03-13T19:42:42.927 回答
0

这似乎做到了:

let g:input = "START; % END"
echo system("echo " . shellescape(g:input))

应该注意的是,我并不真正关心输出。我将silent在更大的脚本中使用它。

于 2013-03-13T19:42:58.563 回答