我目前在vim中为无关的空格创建了一个模式:
autocmd InsertEnter * syn clear EOLWS | syn match EOLWS excludenl /\s\+\%#\@!$/
autocmd InsertLeave,BufReadPost * syn clear EOLWS | syn match EOLWS excludenl /\s\+$/
我也在使用Indent Guides插件设置模式IndentGuidesOdd
和IndentGuidesEven
。我想要的是用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
答案 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 /\&