在Emacs中使用GNU Global閱讀代碼

做者: Jolly Wing(jiqingwu@gmail.com)
日期: 2014-05-13
聲明:轉載請保留做者信息

什麼是GNU Global

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

GNU global支持的語言不少,
它自身支持 C, C++, Yacc, Java, PHP4 和彙編語言中符號的定義和引用,
還經過 Exuberant Ctags 支持40餘種語言的符號定義的索引。
能經過命令行使用,也能和Vim以及Emacs很好地集成。shell

安裝GNU Global

對於Unix/Linux用戶來講,能夠直接從倉庫進行安裝。安裝完不須要進行其它設置,很省事。windows

Windows用戶要本身去下載。
到Gnu Global的 下載頁面
能夠下載代碼,本身用mingw編譯,也能夠下載預編譯的二進制文件。app

由於本身編譯麻煩,我直接下載了二進制包。
下載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) 以使用建議的鍵綁定。spa

  2. 生成代碼索引文件。
    打開在代碼目錄下執行 gtags,將生成索引,生成GPATH, GTAGS, GRTAGS。
    若是想看詳細輸出,用 gtags -v,能看到哪些文件被索引了。命令行

  3. 在Emacs中打開一個源文件, M-x gtags-mode,若是 gtags.el 正確安裝了,就會啓動 gtags minor-mode。
    而後就可使用gtags的按鍵綁定了。我經常使用的按鍵以下:code

  • 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上會遇到些問題。htm

第一個問題,我按 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下,纔會遇到這些問題。

相關文章
相關標籤/搜索