[emacs] 使用ggtags瀏覽代碼
[emacs] 使用ggtags瀏覽代碼
Table of Contents
2 global簡介
ggtags在實現過程中主要運到了global程序, 因此在這里首先介紹一下global的使用.
2.1 安裝
2.2 使用
那么如何使用呢, 首先應該考慮到的是, 察看軟件自身攜帶的幫助信息,
global --help
那么就將出現一系列的使用規則. 剩下的就是對這些規則一點點的嘗試了, 由於在http://www.gnu.org/software/global/ 中說明: global支持C, C++, Yacc, Java, PHP4 和匯編的定義以及引用的查找, 對於其他的41種語言 只支持定義的查找, 因此文中舉例的對象為jsoup, 下載地址為: http://jsoup.org/.
先在jsoup源代碼目錄中的src目錄下使用以下命令建立tags文件:
gtags
此時新增的文件有:
GPATH : 用於存儲目錄相關信息 GRTAGS : 用於存儲引用相關信息 GTAGS : 用於存儲定義相關信息
主要選項介紹:
- -c, –completion [prefix]
# 輸出prefix開頭的所有符號 $ global -c | more # 所有的類名變量名都會被列舉出來, 並按照字符順序給出 Accumulator ... xmlParser
- -f, –file files
# 輸出文件中所有的tags $ global -f test/java/org/jsoup/TextUtil.java # 輸出的結果 # 從左往右依次是tags名稱, 出現的行數, 文件, 那一行的內容 TextUtil 7 test/java/org/jsoup/TextUtil.java public class TextUtil { stripNewlines 8 test/java/org/jsoup/TextUtil.java public static String stripNewlines(String text) { # 接着來察看一下TextUtil.java中到底含有什么內容 $ cat test/java/org/jsoup/TextUtil.java package org.jsoup; /** Text utils to ease testing @author Jonathan Hedley, jonathan@hedley.net */ public class TextUtil { public static String stripNewlines(String text) { text = text.replaceAll("\\n\\s*", ""); return text; } } # 從下面一個示例中, 我們可以發現-c對於java而言選項得到的是類, 接口, 以及方法. # 測試代碼如下: class PackageClass { class Inner { } private int value; public int method() { return value; } } interface Inter { public void method(); public void methodInter(); } public class Test { public static void main(String[] args) { } } $ gloabl -c Inner Inter PackageClass Test main method methodInter - -g, –grep pattern [files]
# 輸出所有內容中匹配pattern的行, 當提供目標文件時, 輸出目標文件中匹配的所有行 $ gloabl -g Elements # 結果為 main/java/org/jsoup/examples/ListLinks.java main/java/org/jsoup/helper/Validate.java main/java/org/jsoup/nodes/Document.java main/java/org/jsoup/nodes/Element.java ... $ global -g Elements test/java/org/jsoup/parser/HtmlParserTest.java test/java/org/jsoup/parser/HtmlParserTest.java # 我們發現並不是像幫助文檔中所說, 那么怎樣才能輸出對應的行信息呢? # 就從幫助信息中尋找相應的解決辦法 # 發現有兩個option和輸出結果的格式相關: # --result format; -x; -t # 如: $ global -xg Elements test/java/org/jsoup/parser/HtmlParserTest.java Elements 7 test/java/org/jsoup/parser/HtmlParserTest.java import org.jsoup.select.Elements; Elements 69 test/java/org/jsoup/parser/HtmlParserTest.java Element p = doc.getElementsByTag("p").get(0); ... - -p, –print-dbpath 輸出GTAGS的位置
- -P, –path [pattern] 輸出匹配的路徑名稱
- -u, –update 更新tag文件
- -a, –absolute 輸出絕對路徑名, 默認的輸出的路徑名為相對路徑
$ global -P Elements main/java/org/jsoup/select/Elements.java test/java/org/jsoup/select/ElementsTest.java $ global -aP Elements /home/zz/src/jsoup/src/main/java/org/jsoup/select/Elements.java /home/zz/src/jsoup/src/test/java/org/jsoup/select/ElementsTest.java
- –color 對匹配部份進行高亮顯示
- -d, –definition 輸出定義的位置
$ global -d Elements main/java/org/jsoup/select/Elements.java
- -e, –regex pattern 用正則表達式進行匹配
$ global --result grep -e .*Elements main/java/org/jsoup/select/Evaluator.java:288: public static final class AllElements extends Evaluator { main/java/org/jsoup/select/Elements.java:16:public class Elements implements List<Element>, Cloneable { test/java/org/jsoup/select/ElementsTest.java:18:public class ElementsTest { ... - -i, –ignore-case 忽略匹配模式中的大小寫
- -l, –local 只輸出當前目錄下的tags
- -r, –reference, –rootdir 輸出引用tags
3 ggtags使用介紹
3.1 補充
3.1.1 gtags-find-tag-dwim
M-x ggtags-find-tag-dwim
查找輸入點所在位置的tag的所有引用以及定義的位置. 當使用下面的命令的時候:
C-u M-x ggtags-find-tag-dwim
只查找定義的位置, 並且允許交互性的輸入查找的對象. 這正類似於 global -d Elemetns
要進一步的知道該命令的默認快捷鍵, 可以通過下面的方式進行查找: 直接從ggtags.el源代碼中察看
C-x C-f ggtags.el C-s ggtags-find-tag-dwim # 可以找到相應的快捷鍵為 M-.
因此上面的兩條命令可以用下面的方式搞定:
M-. C-u M-.
3.1.2 ggtags-find-definition
這個函數並沒有在相應的源文件中找到, 可能是已經被上面一條前面加C-u的方式替代了
3.1.3 ggtags-find-reference
該命令類似於 global -r Elements
