比如光标在 cairo_create
上,直接跳转到 /usr/local/include/cairo/cairo.h 中的声明位置:
cairo_public cairo_t *
cairo_create (cairo_surface_t *target);
一般目的是看函数参数和返回。有没有不需要手动生成 Tag 的办法?
比如光标在 cairo_create
上,直接跳转到 /usr/local/include/cairo/cairo.h 中的声明位置:
cairo_public cairo_t *
cairo_create (cairo_surface_t *target);
一般目的是看函数参数和返回。有没有不需要手动生成 Tag 的办法?
试试ccls
零配置基本不可能跳转。
但是如果你能够补全,那么可以通过设置company-frontends
,把company-echo-metadata-frontend
给加进去,会在下方echo area
显示这个函数的签名。
补全的话,因为lsp-mode
里默认的是clangd
,如果你有clangd
并且有使用lsp-mode
的话,可以直接开箱即用。或者可以使用ccls
,当前lsp-find-definition
效果ccls
是最好的,更有独家的 call hierarchy 扩展!
不确定,打开当前使用到的头文件,一个个搜索应该可行吧?编译器肯定知道如何解析 .h
文件,不过不知道怎么用。
我昨天试过,能到达目的,但是
dumb-jump 应该可以
dumb-jump
不行的。它不是语义级别的跳转,对于非当前project
下符号的跳转非常不准确。就拿一个cmake
下载的catch2
依赖,catch2
不在默认的include path
里,无法跳转至catch2
里的符号。
对于想正确处理这种情况,还是得要分析compile_commands.json
文件的,dumb-jump
它没有做,想做必定依赖libclang
。
那可以试试ccls
,但是ccls
也依赖llvm
。
再不济,回归rtags
/irony
也还是可以的
0配置跳转只能用dumb-jump,毕竟RG搜索也是跳转,手动加一些头文件目录应该就可以
自动生成 Tag 可能是个思路,我先了解看看 [e,g,c]tags 是怎么个用法。
分析预处理的结果可行
很久没写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