...无需为每种类型定义正则表达式匹配。 例如,匹配以下内容:
char *ch
char* ch
char **ch
char* ** *ch
char **
ch
在上面的示例中,我希望突出显示除 ch 之外的所有内容。 目前,我为每种类型单独指定一个正则表达式匹配:
syn match cType "char[*[:space:]\n]*[[:space:]\n][*[:space:]\n]*"
...但是这种方式我不得不自己修改所有语法文件。
答案 0 :(得分:1)
无法修改现有语法组以附加匹配文本,因此您必须覆盖或重新定义cType
定义。
如果您定义一个与cTypeAsterisks
/空白组合匹配的单独*
组(并指定contained
,以便它在错误的位置不匹配),则所有您需要做的是使用cType
扩充nextgroup=cTypeAsterisks skipwhite
定义。
这仍然意味着重复cType
中的所有syntax/c.vim
定义,尽管它可能通过元编程动态完成(即解析:syn list cType
输出,修改和重新执行它)。
您可以通过在正则表达式分支中指定所有类型来更轻松地覆盖cType
组/减少重复,如下所示:
syn match cType "\%(char\|int\|long\|short\|void\)[*[:space:]\n]*[[:space:]\n][*[:space:]\n]*"
虽然这不是100%正确,但您可以定义一个单独的cTypeAsterisks
组,并断言它在C类型的一般模式(例如\w\+\s*
)之后匹配。这也会错误地突出显示foo **
之类的内容,但它很容易,不需要重复。