0 配置跳转到 C 函数声明位置的方法?

比如光标在 cairo_create 上,直接跳转到 /usr/local/include/cairo/cairo.h 中的声明位置:

cairo_public cairo_t *
cairo_create (cairo_surface_t *target);

一般目的是看函数参数和返回。有没有不需要手动生成 Tag 的办法?

试试ccls

1 个赞

零配置基本不可能跳转。

但是如果你能够补全,那么可以通过设置company-frontends,把company-echo-metadata-frontend给加进去,会在下方echo area显示这个函数的签名。

补全的话,因为lsp-mode里默认的是clangd,如果你有clangd并且有使用lsp-mode的话,可以直接开箱即用。或者可以使用ccls,当前lsp-find-definition效果ccls是最好的,更有独家的 call hierarchy 扩展!

1 个赞

不确定,打开当前使用到的头文件,一个个搜索应该可行吧?编译器肯定知道如何解析 .h 文件,不过不知道怎么用。

我昨天试过,能到达目的,但是

  • 感觉太重量级了(Heavy),而且我就需要一个跳转功能
  • 需要配置个 compile_commands.json
  • 必须分成一个一个项目(或者目录)
  • clangd 依赖 LLVM,安装 LLVM 需要 1 GB

dumb-jump 应该可以

dumb-jump不行的。它不是语义级别的跳转,对于非当前project下符号的跳转非常不准确。就拿一个cmake下载的catch2依赖,catch2不在默认的include path里,无法跳转至catch2里的符号。

对于想正确处理这种情况,还是得要分析compile_commands.json文件的,dumb-jump它没有做,想做必定依赖libclang

那可以试试ccls,但是ccls也依赖llvm :rofl:。 再不济,回归rtags/irony也还是可以的

0配置跳转只能用dumb-jump,毕竟RG搜索也是跳转,手动加一些头文件目录应该就可以

1 个赞

自动生成 Tag 可能是个思路,我先了解看看 [e,g,c]tags 是怎么个用法。

分析预处理的结果可行

1 个赞

很久没写C程序了。。。

记得projectile就有一个自动打tag的功能(我还记得当时打的是GTAG),打好之后你的项目底下会出现几个GTAG文件,projectile会自动识别这些文件,然后就支持跳转到定义了。

现在最靠谱的应该是ctags,好像陈斌也用。

[c,e,g]tags 三个我都试了下,发现结果都不全,比如找不到 cairo_create

// cairo.h 有:
cairo_public cairo_t *
cairo_create (cairo_surface_t *target);

考虑到它们三个肯定不是用真正的 C 语言 Parser,这应该不奇怪。

还找到基于 libclang 生成 Tag 的,都是 Server + Client 模型,我没试过(要自己编译,也要配置)

零配置基本是不可能的,不引入额外插件的话你需要ctags命令行生成TAGS。xref的命令进行代码导航(导航前需要设置变量tags-table-list).

C的语法很简单,特殊语法可以在~/.ctags加regular expression搞定

建议使用counsel-etags ( GitHub - redguardtoo/counsel-etags: Fast, energy-saving, and powerful code navigation solution ), 一个插件同时完成代码导航和自动生成更新TAGS的功能,对手动配置的要求是最少的了。

推荐免费中文Emacs精品教程 - 知乎 在文末我给出了ctags相关插件的介绍,细节都由我的插件处理了,所以你不用关心Ctags的两个实现Exuberant Ctags和Universal Ctags的细微区别

如果说是0外部配置的话,用CEDET的semantics也可以跳转,本质还是抓tags