Vim语法区域模式中的关键字

时间:2016-06-19 07:27:12

标签: vim vim-syntax-highlighting

我正在尝试或多或少地为Python复制if0语法高亮显示Vim中的C类文件,其中#if 0#endif包围的代码显示为灰色(突出显示为{ {1}})。 我想用Commentif 0:开头的Python代码块,而不是预处理程序指令。

受到this question的启发,我提出了以下几乎可行的代码:

if False:

这导致以下

syn region pyIfFalse start=/^\(\s*\)if \%(0\+\|False\):\n\+\z(\1\s\+\)\S/ skip=/^\%(\z1\S\|^$\)/ end=/^\z1\@!.*/me=s-1
hi def link pyIfFalse Comment

如果我将所有 if 0: # grayed out (there is a space at the beginning) pass if 0: # not grayed out pass 替换为if(在示例和模式中),则两个块都将显示为灰色,这意味着问题必须与关键字ef一致。

关注this question,可以将if重新定义为if,但不会在常规文本中突出显示,因此它似乎不是一个令人满意的解决方案。

令我非常惊讶的是,突出显示适用于第一个块但不适用于第二个块,唯一的区别是keyword contained之前的空格。

1 个答案:

答案 0 :(得分:0)

答案在于:help syn-priority

  
      
  1. 当多个匹配或区域项目在同一位置开始时,最后定义的项目具有优先权。
  2.   
  3. 关键字优先于匹配和区域项目。
  4.   
  5. 从较早位置开始的项目优先于在以后位置开始的项目。
  6.   

在示例的第三行中,关键字优先于Region(2。),但在第一行中,Region具有优先级,因为它较早开始(3.)。

由于缺少更好的替代方法,解决方法是将if的突出显示降级为在区域(1)之前定义的匹配。

syn clear pythonConditional
syn keyword pythonConditional elif else
syn match pythonIf /\<if\>/
syn region pyIfFalse start=/^\(\s*\)if \%(0\+\|False\):\n\+\z(\1\s\+\)\S/ skip=/^\%(\z1\S\|^$\)/ end=/^\z1\@!.*/me=s-1
hi def link pythonConditional  Conditional
hi def link pythonIf  Conditional
hi def link pyIfFalse Comment