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

时间:2011-04-14 20:22:07

标签: vim macvim ack

我正在使用带有--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"并显示预期结果。引号似乎也是必需的。

4 个答案:

答案 0 :(得分:10)

你只需用反斜杠作为前缀

:!echo %

输出当前缓冲区的文件名

:!echo \%

打印一个单独的'%'字符

答案 1 :(得分:4)

显然你必须像an ack.vim issue中提到的那样多次逃避:

:Ack \\\#foo

答案 2 :(得分:2)

这是ack.vim中的一个错误,当你执行:Ack --literal \#body

时,甚至不会调用ack程序

但是,我用了

`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'执行此操作,因为在引用的字符串中不可能有任何注释。