vim 设置变量、结构体成员及函数名不同颜色显示(c语言)

本人的vim界面示例(xshell的终端):

因当时在看tlv320aic3x的codec驱动源码,便以此文件为例进行截图,勉强实现以下几个功能:(靠vim正则表达式进行匹配高亮,非语法解析,不是很准确)目前未考虑c++的文件

1.变量类型与变量名区别开不同颜色显示

(变量类型不同颜色高亮且加粗显示,目前只做到了带struct关键字的变量类型) 但强制类型转换里的"*" 与变量类型颜色保持一致,这与变量定义或声明时的变量类型有点不同;

变量类型名与变量名区别开匹配是挺难的(毕竟只是表达式,没有逻辑判断,总是存在缺陷);

目前匹配变量类型名主要靠 "struct" 或 "enum" 或 "union" 

开始,接着0-n个空格符 "s",再接着字母或下划线开头以及字母或下划线或数字结尾的单词,然后是由空格符 "s"加 "*"组成的,0-n个空格符 "s"加上0-n个 "*"再加上0-n个空格符 "s"的 0-n次组合,最后是0-n个的回车换行符来匹配,有个较大的缺陷,就是不能匹配已由typedef定义的变量类型的类型名;匹配变量名则是 0-n个 "*" 和空格符 "s"  开始,接着0-n个空格符 "s",再接着字母或下划线开头以及字母或下划线或数字结尾的单词,然后0-n个空格符 "s",最后至少有

"[,);:=><-+|&.[]]"

中的一个字符来匹配。

2."->"的方式以及"."的方式区别开不同颜色显示其成员名

成员变量主要是 前面是"->" 或 "." 后面接着字母或下划线开头以及字母或下划线或数字结尾的单词。

3.函数名不同颜色显示

函数主要靠字母或下划线开头以及字母或下划线或数字结尾的单词加上左括号来匹配,只是注意左括号前面可能有0-n个空白字符"s"。

4.宏定义不同颜色显示

 宏区分了宏函数与一般的宏变量;

由大写字母开始,字母或下划线或数字结尾的单词,接着0-n个空格符 "s",再接着

"[a-zA-Z0-9_,);:"'=><-+|&.[]]"

中的一个字符或者这两个字符 "(->)" ,最后是0-n个空格符 "s" 以及0-n个回车换行符 "n" 来匹配;

由于仅仅是vim正则表达式进行匹配(仅仅以大写字母开始,便匹配其为宏),因此当宏定义时,未使用大写字母开头,便会出现以下情况,将其误匹配为变量名:

匹配及高亮规则(c.vim)

全部内容如下:

其中,为了让c默认的类型关键字cType与自定义的cStruct颜色保持一致,特将默认的类型关键字cType的颜色重新定义为与自定义的cStruct颜色相同,且需要将原定义的cStructure注释掉;

"syn keyword    cStructure  struct union enum typedef

默认的cDefine与自定义的cMacro也是特将其颜色保持一致;

cterm 为终端字体样式,目前已知可以设置两种值(none-正常,bold-加粗);

ctermfg 为终端的前景色,

vim开启256色后,可以使用1-255指定其颜色,也可#eeeeee的方式指定颜色,颜色值(256色)可参考 https://blog.csdn.net/ZGY_121/article/details/78634568 vim正则表达式可参考 https://blog.csdn.net/iteye_9166/article/details/82584426

"find and comment out
"syn keyword    cStructure  struct union enum typedefsyn match cFunctions    "<[a-zA-Z_][a-zA-Z0-9_]*>s*("me=e-1
syn match cStruct       "(struct|union|enum|typedef){1}s+<[a-zA-Z_][a-zA-Z0-9_]*>(s***s*)*[);]?s*n*"me=e-1 contains=cVar
syn match cVar          "(s***s*)*&?s*<[a-zA-Z_][a-zA-Z0-9_]*>s*[,);:=><-+|&.[]]"me=e-1 contains=cStruct,cStatement,cMacro,cType
syn match cStrMbrP      "-><[a-zA-Z_][a-z_A-Z0-9]*>" contains=cStruct
syn match cStrMbrM      ".<[a-zA-Z_][a-z_A-Z0-9]*>" contains=cStruct
syn match cMacro        "s*<[A-Z][a-zA-Z0-9_]*>s*[a-zA-Z0-9_,);:"'=><-+|&.[]]|(->)?s*n*"me=e-1 contains=cStructhi cFunctions   gui=none cterm=bold ctermfg=214
hi cStruct      gui=none cterm=bold ctermfg=45
hi cVar         gui=none cterm=none ctermfg=96
hi cStrMbrP     gui=none cterm=none ctermfg=196
hi cStrMbrM     gui=none cterm=none ctermfg=201
hi cMacro       gui=none cterm=none ctermfg=159hi cType        gui=none cterm=bold ctermfg=45
hi cDefine      gui=none cterm=none ctermfg=159

c.vim文件实际截图:

文件位于/usr/share/vim/vim80/syntax/c.vim,其中vim80为vim版本目录,将以上内容加入该文件保存即可。

Published by

风君子

独自遨游何稽首 揭天掀地慰生平