如何在Vim命令中转义%和#字符?

| 我正在使用带有https0ѭ标志的Ack(https://github.com/mileszs/ack.vim)在Vim中搜索项目。我注意到,无论何时我搜索带有
%
#
字符的字符串,搜索都与我期望的不匹配。我做了一些研究,发现这是因为Vim会在命令中扩展这些字符(
%
是当前文件,
#
到其他文件,不确定是什么)。 考虑到这些符号在代码中经常出现,这在执行搜索时是非常令人讨厌的行为。有没有一种方法,最好是自动进行转义,以使搜索按预期进行?我当前的映射是:
nnoremap <leader>al :Ack --literal<space>
。 例 假设我在某个地方的CSS文件中有一个选择器
#body
,我想找到它。这些是我尝试过的事情(一直没有奏效):
:Ack --literal #body
:Ack --literal \\#body
:Ack --literal \"#body\"
:Ack --literal \"\\#body\"
有什么想法为什么转义在这里无法像往常一样起作用,或者这甚至是在寻找什么?我还没有这些例子匹配任何东西。 解 我通过对字符进行两次转义来使其工作。例如,
:Ack --literal \"\\\\#body\"
将在结果窗口的状态栏中显示
:ack -H --nocolor --nogroup --column --literal \"#body\"
,并显示预期结果。引号似乎也是必需的。     
已邀请:
您只需在它们前面加上反斜杠即可
:!echo %
输出当前缓冲区的文件名
:!echo \\%
打印一个单独的\'%\'字符     
显然,您必须多次退出,如ack.vim问题所述:
:Ack \\\\\\#foo
    
这是ack.vim中的一个错误,当您执行do13时,甚至不调用ack程序 但是,我用
`strace -f -o-e trace=process gvim | tee /tmp/log`
而且看来doing15ѭ(请注意多余的引号)确实可以按预期工作:
[pid  3833] execve(\"/usr/bin/ack\", [\"ack\", \"-H\", \"--nocolor\", \"--nogroup\", \"--literal\", \"#body\"], [/* 25 vars */] <unfinished ...>
我还没有真正测试过...     
我对@sehe的答案还有一个补充:当您执行
!...
system(\'...\')
vim时,vim不会自行处理
...
,而是像这样调用shell:
{shell} {shellcmdflag} {shellxquote}...{shellxquote}
。对于ack调用,它将类似于
[\"/bin/bash\", \"-c\", \"ack -H --nocolor --nogroup --literal #body\"]
,因此bash会忽略
--literal
之后的所有内容,因为
#
是注释字符。对于
\'#body\'
,它不会这样做,因为带引号的字符串中没有注释。     

要回复问题请先登录注册