在Emacs中使用GNU Global閱讀程式碼

jollywing發表於2014-05-12
作者: Jolly Wing(jiqingwu@gmail.com)
日期: 2014-05-13
宣告:轉載請保留作者資訊

什麼是GNU Global

GNU global
是一款優秀的程式碼閱讀工具。
能對符號的定義和引用建立索引,方便程式碼閱讀。

GNU global支援的語言很多,
它自身支援 C, C++, Yacc, Java, PHP4 和組合語言中符號的定義和引用,
還通過 Exuberant Ctags 支援40餘種語言的符號定義的索引。
能通過命令列使用,也能和Vim以及Emacs很好地整合。

安裝GNU Global

對於Unix/Linux使用者來說,可以直接從倉庫進行安裝。安裝完不需要進行其它設定,很省事。

Windows使用者要自己去下載。
到Gnu Global的 下載頁面
可以下載程式碼,自己用mingw編譯,也可以下載預編譯的二進位制檔案。

因為自己編譯麻煩,我直接下載了二進位制包。
下載zip壓縮包後,解壓,將其bin目錄加入Emacs路徑。
具體可以這樣做:

(setenv "PATH" (concat "/path/to/global/bin;" (getenv "PATH")))

然後在Emacs的shell中試一下 gtags --help,看gtags能否正常執行。

在Emacs中使用Gtags

  1. 安裝 gtags.el
    gtags安裝時自帶了gtags.el,找到它,把它複製到emacs的 load-path 中。
    也可以用 elpa 安裝 gtags.el.
    準備好 gtags.el 之後,在 .emacs 或是 .emacs.d/init.el 中加入
    (setq gtags-suggested-key-mapping t) 以使用建議的鍵繫結。

  2. 生成程式碼索引檔案。
    開啟在程式碼目錄下執行 gtags,將生成索引,生成GPATH, GTAGS, GRTAGS。
    如果想看詳細輸出,用 gtags -v,能看到哪些檔案被索引了。

  3. 在Emacs中開啟一個原始檔, M-x gtags-mode,如果 gtags.el 正確安裝了,就會啟動 gtags minor-mode。
    然後就可以使用gtags的按鍵繫結了。我常用的按鍵如下:

  • C-c v,告訴Emacs專案的根目錄,即到哪裡去找GTAGS等檔案。這一步不要跳過,否則你查詢符號時Emacs會問你去哪裡查詢tags。
  • M-.,跳轉到符號定義。
  • C-t,返回。
  • C-c g,在程式碼中用grep查詢符號。
  • C-c s, 搜尋某個符號。
  • C-c r, 看一個函式在哪些地方被引用。

使用windows遇到的問題

在Linux/Unix上使用Emacs + global時,一般不會有什麼問題。
但在Windows上會遇到些問題。

第一個問題,我按 C-c v 告訴 global 去哪查詢TAGS時。Emacs報錯。

gtags-get-rootpath: Searching for program: permission denied, global

這說明在執行gtags.el中的 gtags-get-rootpath 時,找不到 global 程式。

如果Emacs報錯: Searching for program: permission denied, xxx
說明 xxx 不在 exec-path 中。

這裡要說一下 emacs 中 “PATH” 和 exec-path 的區別。
如果你想在emacs的SHELL中呼叫某個程式,要把它的路徑加入 “PATH” 中。
如果你想在 elisp 中呼叫某個程式,要把它的路徑加入 exec-path.

Emacs啟動時,會根據系統環境變數PATH的值初始化exec-path
如果你後面通過 setenv 向 PATH 中加入了某個路徑,
exec-path並不會自動包含這個路徑。

比如,剛才我們通過

(setenv "PATH" (concat "/path/to/global/bin;" (getenv "PATH")))

向PATH中加入了global的執行路徑,exec-path 中並不包含該路徑,所以會報錯。
我們要向 exec-path 中加入該路徑。

(setq exec-path (append exec-path `("/path/to/global/bin")))

把global的執行路徑加入 exec-path 之後,再按 C-c v 就能正常執行了。

M-. 尋找一個 TAG 試試。又出錯了。

global: directory `e:/jollywing/job/Casparcg/Server/` not found.

其中e:/jollywing/job/Casparcg/Server/是剛才通過 C-c v 設定的專案根目錄,怎麼會找不到呢?

偶然發現,去掉路徑最後的 / ,即根目錄設為 e:/jollywing/job/Casparcg/Server 就可以了。

最後說明一下,在操蛋的windows下,才會遇到這些問題。

相關文章