[英]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.