在vim精确字符串匹配? (如“正则表达式断”在更短的模式)。(Exact string mat

2019-07-22 00:34发布

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>

Answer 1:

看你的具体的例子,大概要做到这一点(因为符\ 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


Answer 2:

根据您所搜索的确切字符串时, \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的功能,这可能会或可能不会在您的环境好。



Answer 3:

也许是这样的:

nmap <Leader>s :execute '/\V' . escape(input('/'), '\\/')<CR>

它会给你一个/提示和行为,否则像内置的搜索,但它不会做搜索,因为你型或其他类似的东西。



文章来源: Exact string match in vim? (Like 'regex-off' mode in less.)