在vim中定义命令时如何保留反斜杠?

时间:2018-03-23 10:57:10

标签: search vim escaping

我尝试根据博客条目定义临时搜索功能,以便与ag一起使用。目前,代码是:

set grepprg=ag\ --nogroup\ --nocolour\ --vimgrep
command! -nargs=+ -complete=file -bar MyAg silent! grep! <args>|cwindow|redraw!
nnoremap <leader>a :MyAg<SPACE>

这个工作正常,直到我需要搜索双引号,其中需要转义。请考虑以下示例:

:set grepprg=ag\ --nogroup\ --nocolour\ --vimgrep
:grep --php \".*jQuery.*\"

此代码工作正常。相反,给定上述MyAg vim命令定义,请考虑以下搜索:

:MyAg  --php \".*jQuery.*\"

导致以下调用:

:ag --vimgrep --php ".*jQuery.*"

反斜杠已经消失了,并且随之而来的是搜索点。

如何定义上面的MyAg以保留转义? (或者更确切地说,是为了防止vim自己处理反斜杠并将其传递过来,不受影响。)

<q-args>在整个表达式中添加了一对单引号,如下所示:

:ag '--vimgrep --php ".*jQuery.*"'
    ^                            ^

这显然是无效的命令。

PS我有兴趣完成这项工作,并且了解vim-ackvim-ag

1 个答案:

答案 0 :(得分:1)

吞咽反斜杠似乎是由-bar命令修饰符引起的。比较:

:command! -nargs=+ -complete=file -bar MyAg echo '<args>'
:MyAg \"foo\"
"foo"

使用:

:command! -nargs=+ -complete=file MyAg echo '<args>'
:MyAg \"foo\"
\"foo\"

这不能与<q-args>一起解决。 我无法在:help中找到明确的声明,但我想这与使用-bar的事实有关,Vim必须解析|命令的余数分隔符,这意味着逃逸发挥作用。

您尝试支持命令链接是值得称赞的,但在这种情况下,最好放弃命令链接。无论如何,它会导致正则表达式分支出现问题(grepfoo\|bar)。