我正在使用带有--literal
标志的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"
并显示预期结果。引号似乎也是必需的。
答案 0 :(得分:10)
你只需用反斜杠作为前缀
:!echo %
输出当前缓冲区的文件名
:!echo \%
打印一个单独的'%'字符
答案 1 :(得分:4)
显然你必须像an ack.vim issue中提到的那样多次逃避:
:Ack \\\#foo
答案 2 :(得分:2)
这是ack.vim中的一个错误,当你执行:Ack --literal \#body
但是,我用了
`strace -f -o-e trace=process gvim | tee /tmp/log`
似乎做:Ack --literal '\#body'
(注意额外的引号) 按预期工作:
[pid 3833] execve("/usr/bin/ack", ["ack", "-H", "--nocolor", "--nogroup", "--literal", "#body"], [/* 25 vars */] <unfinished ...>
我还没有真正测试过它......
答案 3 :(得分:2)
我对@ sehe的回答有一个补充:当你执行!...
或system('...')
时,vim本身不处理...
,而是调用shell,如下所示:{shell} {shellcmdflag} {shellxquote}...{shellxquote}
。对于ack调用,这将类似于["/bin/bash", "-c", "ack -H --nocolor --nogroup --literal #body"]
,因此bash会忽略--literal
之后的所有内容,因为#
是注释字符。它不会对'#body'
执行此操作,因为在引用的字符串中不可能有任何注释。