[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