因当时在看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",最后至少有 "[,\);=\>\<\-+\|\&\.\[\]]" 中的一个字符来匹配。
成员变量主要是 前面是"->" 或 "." 后面接着字母或下划线开头以及字母或下划线或数字结尾的单词。
函数主要靠字母或下划线开头以及字母或下划线或数字结尾的单词加上左括号来匹配,只是注意左括号前面可能有0-n个空白字符"\s"。
宏区分了宏函数与一般的宏变量;
由大写字母开始,字母或下划线或数字结尾的单词,接着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
默认的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
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
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版本目录,将以上内容加入该文件保存即可。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)