VIM语法: 条件函数着色

5
我正在定制标准的"c.vim"语法文件,以调整我的C代码的可视化效果。 我想区分“被调用函数”的颜色和“声明函数”的颜色。
示例:
int declared_function()
{
    int m;

    m = called_function();
    return (m)
}

我深入阅读了VIM文档、数百万个论坛和谷歌搜索结果,但是我尝试过的所有解决方案都不起作用。

简而言之,我做了以下几件事:

我以递归的方式定义了一个区域,以便考虑花括号内的所有代码:

syn region Body start="{" end="}" contains=Body

然后我通过VIM模式定义了一个通用的函数语法:

syn match cFunction "\<\h\w*\>\(\s\|\n\)*("me=e-1 contains=cType,cDelimiter,cDefine

我这样做是因为我认为可以在 .vimrc 文件中的“if else”条件中将两者结合起来...但是经过整整一天的失败测试后,我需要某个人的帮助,告诉我是否可能以及如何实现。

谢谢大家。

1个回答

1
你非常接近。首先,你不需要递归定义,但需要包含所有其他顶级 C 语法元素,以及你将为称为函数的特殊组定义的内容:
:syn region Body start="{" end="}" contains=TOP,cFunctionUse

实际上,忘掉刚才的话吧,默认的$VIMRUNTIME/syntax/c.vim已经定义了一个cBlock语法组。
然后,定义一个包含在cBlock组中的不同的语法组。
:syn match cFunctionUse "\<\h\w*\>\(\s\|\n\)*("me=e-1 contained containedin=cBlock contains=cType,cDelimiter,cDefine

最后,链接或定义一个不同的高亮组,使其看起来确实不同:
:hi link cFunctionUse Special

你可以将这些内容放到~/.vim/after/syntax/c.vim中,这样它们会自动添加到默认的C语法中。

谢谢你的帮助。但它仍然不起作用。我仍然有所有相同颜色的函数(但我学会了使用TOP)。 - user3154898
抱歉,我有额外的语法定义让我困惑了。实际上,解决方案更简单,因为已经有一个“cBlock”组,所以你根本不需要“Body”!请查看我的更新答案。 - Ingo Karkat
没错,它能正常工作,而且比我的解决方法更优雅(我保留了递归形式,并手动添加了所有需要的内容,从你的提示中获得灵感)。但是你的解决方案绝对更聪明:我明天会实现它。最终,在整理完整个语法文档之后,我发现vim比我想象的更强大。 - user3154898
最终,它不起作用。我认为问题就在于$VIMRUNTIME/syntax/c.vim中定义的cBlock。如果您尝试将其分配给不同的背景(如gtermbg=11),则会发现它无法正确地下划线所需下划线的内容。相反,如果我定义一个区域(例如Body),它将仅下划线函数体。 - user3154898
高亮显示的问题难道不是由于cBlock默认使用transparent定义吗?!正如你所看到的,这个任务并不简单;也许你应该重新考虑它是否真的值得这么做?! - Ingo Karkat

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