如何让ctags识别C++中using声明定义的别名类型?
让ctags识别C++模板类型别名MakeReference的解决方案
当然可以搞定!在做C++模板元编程的时候,这种using定义的类型别名无法生成独立标签的问题确实挺闹心的——毕竟Vim的g<C-]是咱们快速跳转符号的核心工具。下面给你一步步解决的方法:
1. 先确保用对了ctags版本
首先推荐你换成Universal Ctags,它是经典Exuberant Ctags的升级版,对C++11及以后的特性(包括模板类型别名)支持得好太多。很多系统默认的ctags版本偏老,可能压根不识别using的别名定义,先把基础工具更新到位。
2. 自定义ctags的解析规则
在你的项目根目录创建一个.ctags配置文件,添加以下内容:
--langdef=C++ --langmap=C++:.cpp.h.hpp.cc.cxx --regex-C++=/^template\s*<.*>\s*using\s*(\w+)\s*=/\1/t,type alias/
这个正则表达式的作用是:专门匹配模板化的using类型别名定义,把MakeReference这类名称提取出来,标记为type alias类型的标签。
如果你还在坚持用Exuberant Ctags,也可以试试类似的正则规则,但注意它对复杂模板语法的支持可能有局限,还是优先换Universal Ctags更省心。
3. 生成带别名标签的tags文件
运行ctags的时候,记得加载你的配置文件,比如在项目根目录执行:
ctags -R --options=.ctags .
这样生成的tags文件里,就会出现MakeReference的独立条目了。
4. 验证效果
你可以直接打开生成的tags文件,搜索MakeReference,应该能看到类似这样的条目:
MakeReference your_template_file.hpp /^template< class T > using MakeReference = typename MakeReferenceImpl< T >::type;$/;" t
这里的t表示这是一个类型标签,Vim的g<C-]就能正常识别并跳转到这个别名的定义处了。
如果你的Vim还装了代码补全或导航类的插件(比如YouCompleteMe、Tagbar),只要它们依赖的是你生成的这个tags文件,也能正确识别MakeReference作为类型别名。
内容的提问来源于stack exchange,提问作者Wil
相关产品推荐
相关产品推荐

