如何定义支持两种结束条件的Vim语法区域?
实现Vim语法区域适配单行/多行宏定义的方案
可以实现,推荐两种实用思路:
思路一:拆分定义两个语法区域(清晰易维护)
分别针对单行、多行宏定义编写规则,再合并到同一语法组:
" 匹配多行宏定义:以MACRO NAME {开头,以闭合}结尾 syntax region MultiLineMacro start=/^MACRO\s\+\w\+\s*{$/ end=/^\s*}$/ " 匹配单行宏定义:以MACRO NAME开头,到当前行末尾结束 syntax region SingleLineMacro start=/^MACRO\s\+\w\+\s*/ end=/$/ " 将两个区域归为同一语法组,方便统一设置高亮 syntax cluster MacroGroup contains=SingleLineMacro,MultiLineMacro
思路二:正则条件分支实现单区域适配
利用Vim正则的条件断言,在end参数中根据首行是否包含{匹配不同结束符:
syntax region MacroDefinition \ start=/^MACRO\s\+\w\+\s*\(\{\)\?\ze\($\|\s*\)/ \ end=/\(\%(\1\)\@=\s*}\|\n\)/me=e-1 keepend
start部分捕获首行末尾是否存在{(存入捕获组\1)end部分通过分支判断:若捕获组\1存在(首行有{),则匹配闭合的};否则匹配换行符me=e-1确保结束符(换行或})不被纳入语法区域,keepend避免结束符被重复匹配
两种方案都能满足需求,拆分定义的方式更直观,后续维护修改也更简便。
内容的提问来源于stack exchange,提问作者Laser128er
相关产品推荐
相关产品推荐

