vim + ctags + cscope c++跳转工具

跳转工具

Ctrl + ] 智能跳转

生成tags文件

到项目根目录

  1. 先执行ctags --format=2 --excmd=number --languages=c++,c --c++-kinds=+px --fields=+iaKz --extra=+f --c-kinds=+l --c++-kinds=+l -R ./,生成排序好的tags文件,可以使用二分法,根据tag名字找到对应得tag信息(–c-kinds=+l 表示加上局部变量)
  2. 再执行ctags -f tags2 --format=2 --excmd=number --languages=c++,c --c++-kinds=+px --fields=+iaKz --extra=+f --file-scope=yes --sort=no --append=no -R ./,生成根据文件名排序的tag文件
  3. 读取tags2,分析每一个tag,若kind是function,class,struct,union多加一个tag:end,表明这个tag结束点
  4. 读取分析tags2,将每个文件路径tag开始的偏置保存到tags2.file中,格式为
./test/test1.cpp 120
./test/test2.cpp 359
  1. 读取tags2,获取所有typedef,并保存到tags2.typeref
  2. 执行cscope -Rbkq,生成cscope相关文件

查找tag

  1. 先在tags中查找到所有名字相同的tag,若只有一个,则直接跳转
  2. 若ctags查找到多个,若没打开智能跳转,则让用户选择,若打开了,则按如下规则跳转
    • 可能出现的重复tag的情况:
      • 函数原型和函数实现,tag相同
      • 不同类,有相同的成员函数名
      • 不同类或结构体,有相同成员变量
      • 不同的namespace,有相同的函数/类/结构体等 (namespace暂时不考虑)
      • 类的类名和构造函数一样
    • 获取当前行的curTag,针对不同情况,分别处理
      • 若curTag == findWord,若tag就两个,就互调;若多个,则看下有没有class/struct属性,过滤后,如果就两个,则互跳,若多个再弹窗用户选
      • 若curTag != findWord,但是在class/function的end之前,若是curTag是变量或者xxx
      • 。。。
  3. 若ctags没有找到,则使用cscope查找,若只有一个,则直接跳转,若找到多个,则让用户选
  4. 若cscope也没有,则报找不到

你可能感兴趣的:(vim)