在Vim中,如何搜索WORD边界?

时间:2019-04-04 18:03:56

标签: regex vim

我喜欢Vim如何区分wordsWORDs,但是regexp语法似乎缺少这种区别。我可以使用\<\>原子来搜索单词边界(宽度为零)。但是,如果我想搜索WORD边界怎么办?似乎一个单词应该有一个ordinary atom,但没有。

这是我能想到的最好的,相当于\<,但要用WORD而不是单词:

\(\(\s\)\@<=\|^\)

它匹配 后面有零宽度的空白字符行首。它似乎可以满足我的要求,但对于我想经常重复使用的东西来说却是一个怪物。

我还有一个非常简单但也不太通用的版本,该版本使用\zs而不是零宽度的后缀。此选项仅在比赛开始时才起作用(即,您不能在要比赛的事物中间使用它):

\(^\|\s\)\zs

有没有办法为此定义自己的原子?还是以某种方式使其更方便使用?在这种情况下,还有其他更好的成语吗?

1 个答案:

答案 0 :(得分:1)

首先,根据您的需求,可能有一种更简单的方法。 \<\>依赖于iskeyword设置,因此,如果您想要更改它们以始终对WORDS操作,则只需修改该设置即可。但是,如果您想同时使用两者,那将是行不通的。

这是我想出的最短的东西:

" \< for WORD
\S\@<!

" \> for WORD
\S\@!

说明:

  • \S\@<!

    \S的意思是“非空白字符”,\@<!的意思是“如果前面的原子与后面的原子不匹配,则宽度为零的匹配。”

  • \S\@!

    \S\@!后面不能有非空格字符。

使用这些先行/后退方式会更优雅,因为您无需特殊情况下的行首/行尾。

  

有没有办法为此定义自己的原子?

不幸的是,我不知道。也许您最好的选择是:

cnoreabbrev <something> \S\@<!
cnoreabbrev <something> \S\@!

值得注意的是,这些将匹配空行,而\<\>将不匹配。这就是您要换一个较短的正则表达式的原因。