在shell中出现时在Vim中转义"%",所以它没有扩展到文件名?

Hen*_*k N 7 vim

假设我将此vimscript设为"/tmp/example.vim":

let g:input = "START; % END"
exec("! clear && echo " . shellescape(g:input))
Run Code Online (Sandbox Code Playgroud)

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

START; /tmp/example.vim END
Run Code Online (Sandbox Code Playgroud)

因为"%"扩展为缓冲区名称.我想要输出

START; % END
Run Code Online (Sandbox Code Playgroud)

我可以使用泛型escape()方法来逃避百分号.这有效:

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

但这真的是最好的方式吗?我敢肯定我应该逃避更多的角色.为此目的是否有特定的逃逸功能?还是一个更好的方式来掏出来?

Ing*_*kat 6

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

{special}参数存在,这是一个非零数值或者是非空的字符串(|非零ARG |),则特殊项目如!,%,#<cword>将由反斜杠.这个反斜杠将被|删除 :!| 命令.

:exec("! clear && echo " . shellescape(g:input, 1))
Run Code Online (Sandbox Code Playgroud)


小智 5

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

let g:input = "START; \\% END"
Run Code Online (Sandbox Code Playgroud)