VIM C/C++函数名,宏定义和变量的高亮

VIM C/C++函数名,宏定义和变量的高亮


之前写qt的时候用过一段时间的Qtcreator,后来自己用vim写程序的时候才发现vim本身对于函数,用户自定义的结构,变量,还有宏定义是没有高亮的。网上百度了一下好像也没有相关的插件 。

(后来才知道有taghighlight这个插件orz)

于是打算自己写一个能够实现上述高亮的东西。使用了ctags+python 正则表达匹配+vim的高亮文件 ,成果如下。

VIM C/C++函数名,宏定义和变量的高亮_第1张图片

上图有些glfw的tag还没加进去因此还是原来的普通颜色。

ctags 生成的tag文件似乎并不会记录用户自己定义的局部变量,但是全局变量会记录。因此这个方案应该只能够高亮全局的变量。

实现的思路很简单,vim没有支持变量名和函数的高亮根本原因是vim自身没有对c++语法的检测,它的高亮靠的是syntax文件夹下面.vim脚本,如果你打开里面的cpp.vim查看的话,就会发现vim只对cpp的一些关键字和不涉及到语法的部分进行一些正则匹配。我们编辑cpp文件的时候vim匹配到上面的某一个规则便对其进行相应的高亮操作。

那么我们要对自己写的变量进行高亮,最简单的方法就是利用vim的脚本语言。比如我想对c语言的printf 和puts进行高亮只需要在普通模式下输入

:syn keyword CPrintf printf puts

:hl CPrintf ctermfg=1

你就会发现当前文件所有的printf都被高亮成了终端的第一种颜色。如果用的是Gvim 需要把ctermfg 改成gui=Cyan 。这里Cyan指的是蓝色,也可以改成其他的颜色,详情可以:help color。

第一行命令指定printf和puts为可以进行高亮操作的关键字,第二行指定高亮的颜色。

如果我们把ctags文件中记录的所有函数,定义和变量使用某种方法提取出来然后将其作为关键自动生成上述命令的.vim脚本文件然后让vim执行就可以将tag文件记录了的函数,定义和变量进行高亮了。当然这种做法的缺点很明显:首先就算是指定vim自动更新tags和脚本这个效率也不太高,可能也会占用不少内存。其次无法摆脱ctags的限制,有些地方可能会进行错误的高亮操作。然而不试试也不知道效果怎么样,因此我还是写了一个简单的python代码。

# -*- coding: UTF-8 -*-
# match.py
import re
import sys

if len(sys.argv) <2:
    print("at least two args")
    exit(-1)

f = open(sys.argv[1],'r')
define_dict = dict()
v_dict = dict()
func_dict = dict()

for line in f:
    obj = re.match(r'(\S*)\s+(.*)\s+(/\^)?(.*);"\s+([p|d|f|v])\s+(.*)?',line)#匹配tag
    if obj:
        print('tagName: '+obj.group(1))
        print('tagPath: '+obj.group(2))
        print('tagdefine: '+obj.group(4))
        print('tagType: '+obj.group(5)+'\n\n')
        if obj.group(5) == 'v':
            v_dict[obj.group(1)]=obj.group(5)
        elif obj.group(5) == 'd' :
            define_dict[obj.group(1)]=obj.group(5)
        else :
            func_dict[obj.group(1)]=obj.group(5)
f.close()

test = open('/home/kevin/.vim/syntax/'+sys.argv[2],'w+')        
test.write('syn keyword mDefine ') #keyword 后面的名字可以自由使用
for key in define_dict: # 不同文件中相同的名字后面的高亮会覆盖前面的高亮
    test.write(key+' ')#因此可以在生成的不同文件中采用不一样的名字来实现不同的高亮效果
test.write('\n')
test.write('syn keyword mVariable ')
for key in v_dict:
    test.write(key+' ')
test.write('\n')
test.write('syn keyword mFunction ')
for key in func_dict:
    test.write(key+' ')
test.write('\n')
test.write('hi mVariable ctermfg=1\n')# 1,2,3 指定终端的3种颜色
test.write('hi mDefine ctermfg=2\n')# gvim需要改成 guifg={颜色}
test.write('hi mFunction ctermfg=3\n')# 详情可以:help syntax
test.close()
本人是python新手,轻拍。

大致就是读取tags文件,然后利用正则匹配得到tag的名字和类型,生成.vim高亮文件。 代码接受两个参数,第一个指定要读取的ctags文件的路径,第二个指定要保存到syntax文件夹的文件名。生成ctags需要用

ctags -R –c++-kinds=+p –fields=+iaS –extra=+q

默认的ctags -R 中是不区分函数和宏定义的,因此如果想用不同的颜色高亮函数和宏就需要上面的参数了。

本人使用的是linux系统,因此为了高亮opengl的函数,在/usr/include/GL 文件夹下用ctags命令生成了tags文件。然后使用python代码

python match.py /usr/include/GL/tags gl.vim

生成了gl.vim这个高亮文件。接下来vim test.cpp 打开一个cpp文件,然后使用

:so ~/.vim/syntax/gl.vim

载入生成的高亮脚本。接下来应该就能看到效果了。

甚至可以针对不同的库来进行不同的高亮:)

VIM C/C++函数名,宏定义和变量的高亮_第2张图片

这里可以看到glfw 库的函数和gl库的函数使用了不同的颜色。只是根据两个tags文件生成两个脚本文件然后按顺序载入而已。

如果不想每次都手动生成载入,可以在.vimrc配置文件中自行加入相关的映射和自动化操作。

效果感觉还可以,也没感受到什么卡顿。可能opgl的库还是太小的原因吧= =

你可能感兴趣的:(vim配置)