[emacs] 使用ggtags浏览代码

2023-02-12,,

[emacs] 使用ggtags浏览代码

<!--
/*--><!--*/
html { font-family: Times, serif; font-size: 12pt; }
.title { text-align: center; }
.todo { color: red; }
.done { color: green; }
.tag { background-color: #add8e6; font-weight:normal }
.target { }
.timestamp { color: #bebebe; }
.timestamp-kwd { color: #5f9ea0; }
.right {margin-left:auto; margin-right:0px; text-align:right;}
.left {margin-left:0px; margin-right:auto; text-align:left;}
.center {margin-left:auto; margin-right:auto; text-align:center;}
p.verse { margin-left: 3% }
pre {
border: 1pt solid #AEBDCC;
background-color: #F3F5F7;
padding: 5pt;
font-family: courier, monospace;
font-size: 90%;
overflow:auto;
}
table { border-collapse: collapse; }
td, th { vertical-align: top; }
th.right { text-align:center; }
th.left { text-align:center; }
th.center { text-align:center; }
td.right { text-align:right; }
td.left { text-align:left; }
td.center { text-align:center; }
dt { font-weight: bold; }
div.figure { padding: 0.5em; }
div.figure p { text-align: center; }
div.inlinetask {
padding:10px;
border:2px solid gray;
margin:10px;
background: #ffffcc;
}
textarea { overflow-x: auto; }
.linenr { font-size:smaller }
.code-highlighted {background-color:#ffff00;}
.org-info-js_info-navigation { border-style:none; }
#org-info-js_console-label { font-size:10px; font-weight:bold;
white-space:nowrap; }
.org-info-js_search-highlight {background-color:#ffff00; color:#000000;
font-weight:bold; }
-->

 

[emacs] 使用ggtags浏览代码

Table of Contents

1 相关的连接
2 global简介
2.1 安装
2.2 使用
3 ggtags使用介绍
3.1 补充

3.1.1 gtags-find-tag-dwim
3.1.2 ggtags-find-definition
3.1.3 ggtags-find-reference


1 相关的连接

ggtags地址

global下载地址

global入门

2 global简介

ggtags在实现过程中主要运到了global程序, 因此在这里首先介绍一下global的使用.

2.1 安装

参见:

https://github.com/leoliu/ggtags#install-global-and-plugins

http://www.gnu.org/software/global/download.html

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使用介绍

主要的使用方法参见:

https://github.com/leoliu/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


Date: 2014-05-20 Tue

Author: Zhong Xiewei

Org version 7.8.11 with Emacs version 24

Validate XHTML 1.0

[emacs] 使用ggtags浏览代码的相关教程结束。

《[emacs] 使用ggtags浏览代码.doc》

下载本文的Word格式文档,以方便收藏与打印。