有没有办法告诉vim突出显示任何类型之前的星号?

时间:2014-05-06 04:39:13

标签: vim

...无需为每种类型定义正则表达式匹配。 例如,匹配以下内容:

char *ch
char* ch 
char **ch 
char*  ** *ch 
char **
ch

在上面的示例中,我希望突出显示除 ch 之外的所有内容。 目前,我为每种类型单独指定一个正则表达式匹配:

syn match cType "char[*[:space:]\n]*[[:space:]\n][*[:space:]\n]*"

...但是这种方式我不得不自己修改所有语法文件。

1 个答案:

答案 0 :(得分:1)

无法修改现有语法组以附加匹配文本,因此您必须覆盖或重新定义cType定义。

接近1

如果您定义一个与cTypeAsterisks /空白组合匹配的单独*组(并指定contained,以便它在错误的位置不匹配),则所有您需要做的是使用cType扩充nextgroup=cTypeAsterisks skipwhite定义。

这仍然意味着重复cType中的所有syntax/c.vim定义,尽管它可能通过元编程动态完成(即解析:syn list cType输出,修改和重新执行它)。

接近2

您可以通过在正则表达式分支中指定所有类型来更轻松地覆盖cType组/减少重复,如下所示:

syn match cType "\%(char\|int\|long\|short\|void\)[*[:space:]\n]*[[:space:]\n][*[:space:]\n]*"

接近3

虽然这不是100%正确,但您可以定义一个单独的cTypeAsterisks组,并断言它在C类型的一般模式(例如\w\+\s*)之后匹配。这也会错误地突出显示foo **之类的内容,但它很容易,不需要重复。