逃逸";%&引用;在Vim中进行炮击时,因此它';它没有扩展到文件名吗?

逃逸";%&引用;在Vim中进行炮击时,因此它';它没有扩展到文件名吗?,vim,Vim,假设我将此vimscript设置为“/tmp/example.vim”: 如果我打开该文件并使用:so%运行它,输出将是 START; /tmp/example.vim END 因为“%”已扩展为缓冲区名称。我希望输出是 START; % END 我可以使用泛型的escape()方法来转义百分号。这项工作: let g:input = "START; % END" exec("! clear && echo " . escape(shellescape(g:input), "

假设我将此vimscript设置为“/tmp/example.vim”:

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

START; /tmp/example.vim END
因为“%”已扩展为缓冲区名称。我希望输出是

START; % END
我可以使用泛型的
escape()
方法来转义百分号。这项工作:

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

但这真的是最好的方法吗?我肯定还有更多的角色我应该逃避。是否有专门用于此目的的转义功能?还是一种更好的脱壳方式?

您需要正确地转义“%”。因此,它应该是:

let g:input = "START; \\% END"
这似乎可以做到:

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

应该注意的是,我并不真正关心输出;我将在更大的脚本中与
静默
一起使用。

用于
命令,您需要将可选的
{special}
参数传递给
shellescape()

{special}
参数存在且为非零时 数字或非空字符串(|非零参数|),然后是特殊 项目,如
%
#
前面将加上 反斜杠。此反斜杠将被|
::再次删除|
指挥部


我的真实脚本中的输入不是固定的。我可以使用
escape()
通常对每个“%”进行转义,但请看问题的结尾。如果您仍要丢弃回显文本,则可以使用
调用
@echristopherson是的,这只是为了查看示例脚本中的输出。
let g:input = "START; % END"
echo system("echo " . shellescape(g:input))
:exec("! clear && echo " . shellescape(g:input, 1))