1. 程式人生 > >用 OpenGrok 在 Emacs 中跳轉瀏覽程式碼

用 OpenGrok 在 Emacs 中跳轉瀏覽程式碼

## 背景 一直比較忙,太久沒寫點東西了,今天介紹下之前做的一個 Emacs 指令碼。在公司裡主要用 C++ 作為生產語言,平時用 Mac 電腦工作,但是程式碼開發都是在遠端伺服器上。公司程式碼異常龐大,思考不遜色 Linux 核心程式碼量,並且原始碼級別依賴的專案更是幾十個。作為 Spacemacs 老使用者平時都是用它做主力生產工具,儘管原始碼在遠端伺服器上,我仍然用本地 Mac 上帶 GUI 的 Spacemacs 開發,通過 [Oxfs](https://github.com/oxfs/oxfs) 可以非常容易的將伺服器上檔案系統掛到本地進行開發,不卡頓。 開發過程中為了更好的程式碼跳轉體驗,嘗試過暴力 grep,到 ripgrep,然後是 cscope,也折騰過 cquery,以及 ccls,在我這種遠端開發模式下都不好用,要麼是查詢不精確,要麼是太慢,要麼是難以捕捉出 clang 編譯資料庫,公司用的 Scons 版本太老,也不好升級。最好是能夠幾個命令就能搞定才是我想要的。 ## opengrok 一有空就會去搜羅一番,看看是否大家有更好方案,一直未果。偶然機會發現了 [opengrok](https://github.com/oracle/opengrok),看了專案主頁做的[同類工具對比](https://github.com/oracle/opengrok/wiki/Comparison-with-Similar-Tools),真是厲害啊。 提供了函式定義,引用查詢,全文檢索,檔案查詢,甚至 Web UI,直接通過瀏覽器瀏覽原始碼,並隨意跳轉。這方便程度非常高啊。上個圖給大家感受下。 --- ![](https://img2020.cnblogs.com/blog/778689/202101/778689-20210123192434634-1332434436.gif) --- 一開始我用 opengrok 瀏覽一些陌生程式碼,寫程式碼時候用它查詢一些依賴的函式定義,檢視引數等,還是比較方便。時間久了以後還是覺得麻煩,要是在 Spacemacs 裡直接快捷鍵跳轉該多好。有了這個想法首先要調研下別人是否做了類似事情。Google 幾輪下來,還是有人做了 Emacs 對 opengrok 適配,能用的基本上只有 [eopengrok.el](https://github.com/youngker/eopengrok.el ),該專案在 Emacs 中封裝了 opengrok 命令列,實現我想要的功能。 有個致命的問題,我編輯的程式碼在遠端開發機上,opengrok 必須得部署在開發機上,我本地呼叫開發機上 opengrok 命令麻煩,要寫轉換指令碼,解決兩端目錄還不一致等問題。再加上opengrok 基於 java開發,開發機上各種環境都比較老舊,且不好動,真是麻煩。 ## opengrok-restful 未果後,發現了 opengrok 提供了 [restful api](https://opengrok.docs.apiary.io#reference/0/search),突然想到我 Emacs 直接走 restful api 與 opengrok 互動豈不美哉,我本地查詢符號,查詢定義時,只是和開發機做一次 http 互動,這可太清晰簡單明瞭。 說幹就幹,暴力開發了一段時間後,基本上成型可用,專案提交程式碼到 github 上了,希望感興趣的童鞋也來嘗試使用鴨~ > https://github.com/RainMark/opengrok-restful 目前基本實現了各個專案之間專案查詢符號定義,引用,檔案查詢等,個人平時使用感覺還行,上個圖看下。 --- ![](https://img2020.cnblogs.com/blog/778689/202101/778689-20210123191952483-11857156