可以在Vim中组合多个高亮组吗?

时间:2014-02-05 06:05:06

标签: regex vim

我目前在vim中为无关的空格创建了一个模式:

autocmd InsertEnter * syn clear EOLWS | syn match EOLWS excludenl /\s\+\%#\@!$/
autocmd InsertLeave,BufReadPost * syn clear EOLWS | syn match EOLWS excludenl /\s\+$/

我也在使用Indent Guides插件设置模式IndentGuidesOddIndentGuidesEven。我想要的是用EOLWS来区分模式的方法。例如:hi EOLWS & IndentGuidesOdd ctermbg=darkred这样只会突出显示与这两种模式相匹配的内容。

有没有办法实现这个目标?

编辑:

好的,基于benjifisher的回答,我尝试了以下命令。以下正则表达式的基本思想是,当我进入插入模式时,我希望它匹配除当前行之外的所有行。我正在尝试突出显示额外的空格,但不要在当前行上突出显示任何空格。

autocmd InsertEnter * exe 'match ExtraWhitespace ' . '/\(\%<' . line(".") .  '\(\s\+\%#\@<!$\)\|\(\t\+\)\)\&\(\%>' . line(".") . '\(\s\+\%#\@<!$\)\|\(\t\+\)\)/'

但它失败并出现以下错误:

Error detected while processing InsertEnter Auto commands for "*":
E867: (NFA) Unknown operator '\%('
Press ENTER or type command to continue
Error detected while processing InsertEnter Auto commands for "*":
E475: Invalid argument: \(\%<57\(\s\+\%#\@<!$\)\|\(\t\+\)\)\&\(\%>57\(\s\+\%#\@<!$\)\|\(\t\+\)\)
Press ENTER or type command to continue

以下是我作为插件的最终解决方案: https://github.com/ntpeters/vim-better-whitespace

1 个答案:

答案 0 :(得分:2)

使用:syntax命令定义语法组,使用:highlight命令指定如何显示语法组。 (简短形式为:sy:hi,但几乎每个人都花费额外的字符以提高可读性并使用:syn。)

正如@Conner在评论中所说,你必须定义一个新的组,例如

:syn match EOLWSIndentGuidesOdd ...
:hi EOLWSIndentGuidesOdd ctermbg=darkred

您无法组合高亮显示组,例如 :syn match EOLWSIndentGuidesOdd EOLWS & IndentGuidesOdd ,但您应该可以使用\&组合模式,如

:syn match EOLWSIndentGuidesOdd <pattern1>\&<pattern2>

(如果它们包含多个分支,您可能必须将模式包含在\(...\)中。)这会变得足够复杂,我会将:syntax命令包装在函数中,然后

:autocmd InsertEnter * call EOLWS('on')

或者,您可以定义语法组一次,只需通过自动命令更改突出显示组。

:help :syntax
:help :highlight
:help /\(
:help /\%(
:help /\&