我正在尝试或多或少地为Python复制if0
语法高亮显示Vim中的C类文件,其中#if 0
和#endif
包围的代码显示为灰色(突出显示为{ {1}})。
我想用Comment
或if 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
之前的空格。
答案 0 :(得分:0)
答案在于:help syn-priority
。
- 当多个匹配或区域项目在同一位置开始时,最后定义的项目具有优先权。
- 关键字优先于匹配和区域项目。
- 从较早位置开始的项目优先于在以后位置开始的项目。
醇>
在示例的第三行中,关键字优先于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