我该如何教vim识别额外的C语言类型以进行语法高亮?

8

语法高亮在处理标准类型时表现极佳,例如intuint32_tfloat等。然而,我希望教会vim在我的代码中使用typedef定义的其他类型,比如:

typedef double float64_t;

如何使vim对float64_t使用与标准类型相同的高亮显示?最好使用本地文件的解决方案(例如在我的~/.vimrc.vim目录中)。不需要自动解析typedef名称,我愿意根据需要添加typedef名称。

3个回答

4

以下是一种添加名称的方法。

对于Windows,创建(根据需要替换vimfiles

~\vimfiles\after\syntax\c.vim

并添加定义新的语法高亮项目的行。 例如(来自我的cpp.vim),

" add nullptr as a keyword for highlighting
syn keyword Constant nullptr

要确定您要添加到哪个组,请打开一个 c 文件并输入 :syntax,然后您可以查看现有的语法组。


如果你只是想选择颜色,:hl 可能比 :syntax 更容易让你的眼睛解析。 - user2987828
按照惯例,语法组应以文件类型名称起始,例如 cTypecConstant - Ingo Karkat
好的评论。只是想补充一下,在我的 vim 构建中,:hl 不是默认命令,我必须使用 :highlight - A.E. Drew
在我的特定情况下,对于typedef名称,命令是syntax keyword Type float64_t - Jens

4

我发现我们可以使用match命令来匹配一组由模式描述的typedef名称:

match Type /\w*_t/

该功能将突出显示所有以 _t 结尾的 typedef 名称(但是无论在何处都会突出显示,即使在注释和字符串文字内部也是如此)。


这个解决方案还可以突出显示标识符名称的一部分。例如,如果我写了 my_test_function,那么 my_t 部分将被突出显示。你有没有对此的修复方法?编辑:/\w*_t\s/ 似乎可以解决问题。 - sunmat
@sunmat 是的,这就像我在括号中所说的那样发生了。如果您附加\s,当出现制表符或结束行时,它将无法工作。您可能需要相应调整您的模式。 - Jens
\<\> 可以用于锚定一个模式在单词的开头和结尾。 - DevSolar

1

你可以使用 负向先行断言 来只匹配那些以 _t 结尾的标识符(而不是那些包含类似 foo_table 这样部分带有 _t 的标识符)。

将其放置在 ~/.vim/after/syntax/c.vim 中:

syn match cType "\h\w*_t\w\@!"

\h(单词开头)与[A-Za-z_]相同,即它将匹配C语言中可以作为标识符开头的任何字符。\w*(单词)与[0-9A-Za-z_]*相同,即它将匹配C语言中可以继续标识符的任何字符。_t将精确匹配这两个字符。\w\@!是负向先行断言:只要\w不匹配,它就会匹配,即只要_t后面不跟字母数字字符或下划线,它就会匹配。

注意:这与\h\w*_t\W略有不同,后者将匹配一个foobar_t类型,后面跟着除[0-9A-Za-z_]之外的其他字符,这意味着它不会在行末或文件末尾匹配。该模式还将匹配并突出显示关键字后面的字符,这绝对不是您想要的。


刚查了一下,发现自己已经有答案了。唉! - Miles Rout

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接