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 typedef


syn 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=cStruct
 
hi 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=159
 
hi 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版本目录,将以上内容加入该文件保存即可。

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值