14

我正在使用带有标志的 Ack ( https://github.com/mileszs/ack.vim )--literal来搜索 Vim 中的项目。我注意到,每当我搜索带有%or#字符的字符串时,搜索结果与我期望的不匹配。我做了一些研究,发现这是因为 Vim 会在命令中扩展这些字符(%是当前文件还是其他文件#,不确定是什么)。

考虑到这些符号在代码中经常出现,这在执行搜索时是非常烦人的行为。有没有办法逃避它们,最好是自动的,以便搜索按预期工作?我当前的映射是:nnoremap <leader>al :Ack --literal<space>.

例子

假设我#body在某处的 CSS 文件中有一个选择器,我想找到它。这些是我尝试过的东西(没有奏效):

:Ack --literal #body
:Ack --literal \#body
:Ack --literal "#body"
:Ack --literal "\#body"

任何想法为什么转义在这里不能像往常一样工作,或者这甚至在寻找什么?我没有让这些例子匹配任何东西

解决方案

我已经通过双重转义字符来实现它。例如,:Ack --literal "\\#body"将显示:ack -H --nocolor --nogroup --column --literal "#body"在结果窗口的状态行中并调出预期的结果。引号似乎也是必需的。

4

4 回答 4

11

您只需在它们前面加上反斜杠

:!echo %

输出当前缓冲区的文件名

:!echo \%

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

于 2011-04-14T22:18:27.267 回答
5

显然,您必须多次转义,如ack.vim 问题中所述:

:Ack \\\#foo
于 2014-04-07T22:36:33.023 回答
4

我对@sehe 的回答有一个补充:当你这样做时!...system('...')vim 不会自行处理...,而是调用 shell,如下所示{shell} {shellcmdflag} {shellxquote}...{shellxquote}:对于 ack 调用,这将类似于["/bin/bash", "-c", "ack -H --nocolor --nogroup --literal #body"],因此 bash 将忽略之后的所有内容,--literal因为#它是一个注释字符。它不会这样做,'#body'因为在带引号的字符串中不可能有注释。

于 2011-04-15T19:48:49.587 回答
3

这是 ack.vim 中的一个错误,不知何故,当你这样做时,甚至没有调用 ack 程序: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 ...>

我真的没有测试过...

于 2011-04-15T07:04:48.790 回答