作者: 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
-
安裝
gtags.el
。
gtags安裝時自帶了gtags.el,找到它,把它複製到emacs的load-path
中。
也可以用 elpa 安裝 gtags.el.
準備好gtags.el
之後,在 .emacs 或是 .emacs.d/init.el 中加入(setq gtags-suggested-key-mapping t)
以使用建議的鍵繫結。 -
生成程式碼索引檔案。
開啟在程式碼目錄下執行gtags
,將生成索引,生成GPATH, GTAGS, GRTAGS。
如果想看詳細輸出,用gtags -v
,能看到哪些檔案被索引了。 -
在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下,才會遇到這些問題。