基于 OpenGrok 实现 Emacs 中代码符号查找跳转
背景
一直比较忙,太久没写点东西了,今天介绍下之前做的一个 Emacs 脚本。在公司里主要用 C++ 作为生产语言,平时用 Mac 电脑工作,但是代码开发都是在远端服务器上。公司代码异常庞大,思考不逊色 Linux 内核代码量,并且源代码级别依赖的项目更是几十个。作为 Spacemacs 老用户平时都是用它做主力生产工具,尽管源代码在远端服务器上,我仍然用本地 Mac 上带 GUI 的 Spacemacs 开发,通过 Oxfs 可以非常容易的将服务器上文件系统挂到本地进行开发,不卡顿。
开发过程中为了更好的代码跳转体验,尝试过暴力 grep,到 ripgrep,然后是 cscope,也折腾过 cquery,以及 ccls,在我这种远端开发模式下都不好用,要么是查找不精确,要么是太慢,要么是难以捕捉出 clang 编译数据库,公司用的 Scons 版本太老,也不好升级。最好是能够几个命令就能搞定才是我想要的。
opengrok
一有空就会去搜罗一番,看看是否大家有更好方案,一直未果。偶然机会发现了 opengrok,看了项目主页做的同类工具对比,真是厉害啊。
提供了函数定义,引用查找,全文检索,文件查找,甚至 Web UI,直接通过浏览器浏览源代码,并随意跳转。这方便程度非常高啊。上个图给大家感受下。
一开始我用 opengrok 浏览一些陌生代码,写代码时候用它查找一些依赖的函数定义,查看参数等,还是比较方便。时间久了以后还是觉得麻烦,要是在 Spacemacs 里直接快捷键跳转该多好。有了这个想法首先要调研下别人是否做了类似事情。Google 几轮下来,还是有人做了 Emacs 对 opengrok 适配,能用的基本上只有 eopengrok.el,该项目在 Emacs 中封装了 opengrok 命令行,实现我想要的功能。
有个致命的问题,我编辑的代码在远端开发机上,opengrok 必须得部署在开发机上,我本地调用开发机上 opengrok 命令麻烦,要写转换脚本,解决两端目录还不一致等问题。再加上opengrok 基于 java开发,开发机上各种环境都比较老旧,且不好动,真是麻烦。
opengrok-restful
未果后,发现了 opengrok 提供了 restful api,突然想到我 Emacs 直接走 restful api 与 opengrok 交互岂不美哉,我本地查找符号,查找定义时,只是和开发机做一次 http 交互,这可太清晰简单明了。
说干就干,暴力开发了一段时间后,基本上成型可用,项目提交代码到 github 上了,希望感兴趣的童鞋也来尝试使用鸭~
目前基本实现了各个项目之间项目查找符号定义,引用,文件查找等,个人平时使用感觉还行,上个图看下。