在vim中,我常常想与哪些需要转义挑剔字符的字符串搜索。 有没有一种方法,我可以在更短的或fgrep一样关闭所有特殊字符的含义,有点像正则表达式关闭模式?
我处理特别是毛茸茸的字符串; 这里有一个例子:
((N/N)/(N/N))/N
由于没有逃脱任何字符做vim的搜索将是一个重大的节省时间。
\ V在Vim的帮助与一些元字符,而不是批判/或\。
谢谢大家! 最后,我已将此添加到我的.vimrc:
command! -nargs=1 S let @/ = escape('<args>', '\')
nmap <Leader>S :execute(":S " . input('Regex-off: /'))<CR>
看你的具体的例子,大概要做到这一点(因为符\ v不会在这里帮助)是使用最简单的方法?
而不是/
:那么,你会不会有逃避/
S:
?((N/N)/(N/N))/N
这将向后搜索,而不是前锋,但你总是可以做“N”,而不是“N”到第一次去后向前搜索。 或者你也可以按/
后面向上光标键自动躲避斜杠。
然而,没有什么可以很容易地做一下转义反斜线。 我想你可以这样做:
:let @/ = escape(pattern, '\')
然后用n
进行搜索,但它可能不是很容易。 我能想出是最好的:
:command! -nargs=1 S let @/ = escape('<args>', '\')
然后做:
:S (N)/(N+1)\(N)
n
根据您所搜索的确切字符串时, \V
前缀可能会做的伎俩。
参见:help \V
:
after: \v \m \M \V matches ~
'magic' 'nomagic'
$ $ $ \$ matches end-of-line
. . \. \. matches any character
* * \* \* any number of the previous atom
() \(\) \(\) \(\) grouping into an atom
| \| \| \| separating alternatives
\a \a \a \a alphabetic character
\\ \\ \\ \\ literal backslash
\. \. . . literal dot
\{ { { { literal '{'
a a a a literal 'a'
所以,如果我有一个字符串hello.*$world
,我可以使用命令/\V.*$
找到刚才.*$
-应该需要转义字符串的唯一部分是一个反斜杠,但你仍然可以做分组等,通过转义特殊符号。
您可以使用“避免”正斜杠的另一个命令是:
:g #\V((N/N)/(N/N))/N#
的:g
命令是一个全球性的搜索,指出:
:[range]g[lobal]/{pattern}/[cmd]
Execute the Ex command [cmd] (default ":p") on the
lines within [range] where {pattern} matches.
Instead of the '/' which surrounds the {pattern}, you can use any other
single byte character, but not an alphanumeric character, '\', '"' or '|'.
This is useful if you want to include a '/' in the search pattern or
replacement string.
所以,在这里我使用了#
,您可以使用?
, @
,或任何其它字符满足上述条件。 与美中不足:g
命令是,它预计在结束的命令,因此,如果您还没有最后一个字符后尾随空格,不履行你所期望的搜索。 再次,即使你使用\V
,你还是要逃避反斜杠。
如果仍然不削减对你来说, 这Nabble后有一个建议,即需要一个字符串嵌入反斜杠等特殊字符的Vim,并声称要进行搜索没有问题; 但是,它需要创造一个Vim的功能,这可能会或可能不会在您的环境好。
也许是这样的:
nmap <Leader>s :execute '/\V' . escape(input('/'), '\\/')<CR>
它会给你一个/
提示和行为,否则像内置的搜索,但它不会做搜索,因为你型或其他类似的东西。