繁体   English   中英

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

[英]How can I escape the % and # characters in a Vim command?

我正在使用Ack( https://github.com/mileszs/ack.vim )和--literal标志来搜索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中的一个错误,当你这么做时,甚至不会调用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 ...>

我还没有真正测试过它......

我对@ sehe的答案有一个补充:当你这样做时!...或者system('...') vim本身不处理...但是调用shell,就像这样: {shell} {shellcmdflag} {shellxquote}...{shellxquote} 对于ack调用,这将类似于["/bin/bash", "-c", "ack -H --nocolor --nogroup --literal #body"] ,因此bash将忽略--literal之后的所有内容,因为#是评论字符。 对于'#body'它不会这样做,因为在引用的字符串中没有可能的注释。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM