【问题标题】:Is clang able to replace Exuberant Ctags?clang 能代替 Exuberant Ctags 吗?
【发布时间】:2015-01-13 17:16:03
【问题描述】:
要调查新的文件,我习惯于使用适当的选项运行ctags,问题是显然这个程序不支持C ++ 11,我只是在我发现的发展之前用完了这个项目几年前就结束了。

现在我需要一个用于 C++11 及更高版本的等效工具,我记得 clang 单独能够输出任何给定文件的 AST,所以我想知道前端是否具有可比较的类似功能和我以前用ctags 做的一样。

例如,这是您可以在 C++ 模式下使用 ctags 轻松列出的实体

ctags --list-kinds=c++
c  classes
d  macro definitions
e  enumerators (values inside an enumeration)
f  function definitions
g  enumeration names
l  local variables [off]
m  class, struct, and union members
n  namespaces
p  function prototypes [off]
s  structure names
t  typedefs
u  union names
v  variable definitions
x  external and forward variable declarations [off]

clang 是否能够执行类似的任务?

【问题讨论】:

  • exuberant ctags 不支持你需要的 C++11 哪些特性?虽然有一段时间没有发布 ctags,但开发/支持仍在进行中 - the offical SourceForge tree 的最新更改仅在一周前。
  • @ChrisDodd 我试图在一个大部分模板化的源文件中列出一些函数和类,但它什么也没显示。官方网站上的最后一次更新是从 2009 年开始。根据您的评论,我检查了ctags --version,并且我的构建基于 svn 主干,所以我一定做错了什么,可能它不支持模板?我不确定这里可能有什么问题。
  • 2016 年更新: 还有另一个项目 universal-ctags 说要继续在 github 上开发 exuberant-ctags。在这个问题的背景下,请特别参阅新的c/c++ parser

标签: c++ c++11 clang llvm exuberant-ctags


【解决方案1】:

看看rtags 工具。它使用 clang 重新编译您的整个项目。 之后,您可以使用它来浏览源。唯一的问题是 AST 是在预处理器运行后构建的,因此被禁用的代码 宏不可用于导航。

项目维护一组 elisp 绑定,允许您从 emacs 控制RTags。要在 vim 中集成,请参阅 lyutsShane Harper 提供的第三方项目。

【讨论】:

  • 仅限 Linux/OSX。
【解决方案2】:

llvm/clang 项目不包含从 ast 生成标记文件的工具。但是,github上有几个项目使用clang来做这件事,可以通过:https://github.com/search?utf8=%E2%9C%93&q=clang+tags

以下两个项目获得了一些关注(星星、问题、拉取请求)

很遗憾,最近没有提交,但是,作者仍然对提出的问题作出回应。

免责声明我知道不鼓励仅提供链接的答案。当我有时间测试项目并查看它们与 Exuberant-ctagsUniversal-ctags 的比较时,我会扩展这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多