[emacs] 使用ggtags浏览代码

 

[emacs] 使用ggtags浏览代码

2 global简介

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

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 : 用于存储定义相关信息

主要选项介绍:

  1. -c, –completion [prefix]

    # 输出prefix开头的所有符号
    $ global -c | more
    # 所有的类名变量名都会被列举出来, 并按照字符顺序给出
    Accumulator
    ...
    xmlParser
  2. -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
  3. -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);
    ...
  4. -p, –print-dbpath 输出GTAGS的位置
  5. -P, –path [pattern] 输出匹配的路径名称
  6. -u, –update 更新tag文件
  7. -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
  8. –color 对匹配部份进行高亮显示
  9. -d, –definition 输出定义的位置
    $ global -d Elements
    main/java/org/jsoup/select/Elements.java
  10. -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 {
    ...
  11. -i, –ignore-case 忽略匹配模式中的大小写
  12. -l, –local 只输出当前目录下的tags
  13. -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浏览代码的更多相关文章

  1. 用emacs 阅读 c/c++ 代码

    在emacs编程中有以下需求 从调用一个函数的地方跳转到函数的定义的地方 或是反过来从函数定义的地方列出所有调用这个函数的地方 实现办法 需要安装以下软件 gnu global(阅读源代码的工具)官网 ...

  2. IE全屏浏览代码

    以前做过一个网络版的商场导购触摸屏系统,用ASP写的,就是要在运行的时候全屏浏览而不能出现标题栏.工具栏.状态栏等.解决方法是用JS弹出全屏窗口,建立html文件,代码如下: <script l ...

  3. 【实习记】2014-09-04浏览代码查middle资料+总结我折腾过的源码浏览器

        浏览着代码,看源码可以先看make文件,make文件有制造的流程信息. 一般可以从运行的程序对应的cpp看起.然而如果有框架,那就不容易了,会关系错纵复杂. 总结一下我折腾过的源码阅读器. s ...

  4. 改变Emacs下的注释代码方式以支持当前行(未选中情况下)的注释/反注释

    Emacs下支持多行代码的注释/反注释,命令是comment-or-uncomment-region. 我喜欢把它绑定在快捷键C-c C-/上,如下: (global-set-key [?\C-c ? ...

  5. linux 和 android 源码的 cross reference (即网页浏览代码的引用)

    linux: http://lxr.free-electrons.com/               相当好 android: http://androidxref.com

  6. [chrome插件分享] gitlab-tree 更方便的浏览Gitlab上的代码

    说明 经常玩Github的人肯定都知道大名鼎鼎的octotree吧,这款chrome插件可以说是浏览代码的神器,利用左侧的树形菜单可以很方便的打开目录.浏览文件等,加上Github全站本身使用了pja ...

  7. Xcode之外的文档浏览工具--Dash (在iOS代码库中浏览本帖)

    链接地址:http://www.cocoachina.com/bbs/read.php?tid=273479 Xcode之外的文档浏览工具--Dash    (在iOS代码库中浏览本帖)       ...

  8. 可能是迄今为止最好的GitHub代码浏览插件--赞

    https://chrome.google.com/webstore/category/extensions?hl=zh-CN 搜索"insight.io" chrome://ex ...

  9. 搭建emacs的go编程语言环境

    关于emacs就不说明了,直接切入主题.关于我的emacs配置,可以直接参考GitHub上的lienhua34/myemacs-conf. go-mode 安装 关于go-mode的安装,可以直接参考 ...

随机推荐

  1. 深入理解OAuth2.0协议

    1. 引言 如果你开车去酒店赴宴,你经常会苦于找不到停车位而耽误很多时间.是否有好办法可以避免这个问题呢?有的,听说有一些豪车的车主就不担心这个问题.豪车一般配备两种钥匙:主钥匙和泊车钥匙.当你到酒店 ...

  2. HTML5- Canvas入门(一)

    周老虎落网的时候,网易跟腾讯都推出了牛逼轰轰的HTML5页面来展示其关系网(网易http://news.163.com/special/data_zyk/  ,腾讯http://news.qq.com ...

  3. Kosaraju 算法查找强连通分支

    有向图 G = (V, E) 的一个强连通分支(SCC:Strongly Connected Components)是一个最大的顶点集合 C,C 是 V 的子集,对于 C 中的每一对顶点 u 和 v, ...

  4. .Net开发笔记(二十)创建一个需要授权的第三方组件

    在使用需要授权的软件时,注册付费的目标是软件的使用者,我们开发人员平时用到的一些第三方组件也是需要授权付费的,也就是说,付费者是开发人员,并不是系统(使用了该第三方组件)的最终使用者. 以上两者的区别 ...

  5. Net作业调度(四)—quartz.net持久化和集群

    介绍 在实际使用quartz.net中,持久化能保证实例重启后job不丢失. 集群能均衡服务器压力和解决单点问题. quartz.net在这两方面配置都比较简单. 持久化 quartz.net的持久化 ...

  6. 高灵活度,高适用性,高性能,轻量级的 ORM 实现

    ORM(Object-Relational Mapping 对象关系映射),它的作用是在关系型数据库和业务实体对象之间作一个映射,目的是提供易于理解的模型化数据的方法. ORM虽然有诸多好处,但是在实 ...

  7. SQL Agent服务无法启动如何破

    问题现象 从阿里云上镜像过来的一台的数据库服务器,SQL Agent服务启动不了,提示服务启动后停止.(原数据库服务器是正常的,怀疑跟镜像有关) 如下是系统日志和SQL Agent的日志 SQLSer ...

  8. 如何理解T-SQL中Merge语句

    写在前面的话:之前看过Merge语句,感觉没什么用,完全可以用其他的方式来替代,最近又看了看Merge语句,确实挺好用,可以少写很多代码,看起来也很紧凑,当然也有别的优点. ====正文开始===== ...

  9. ASP.NET MVC 5 - 添加一个模型

    在本节中,您将添加一些类,这些类用于管理数据库中的电影.这些类是ASP.NET MVC 应用程序中的"模型(Model)". 您将使用.NET Framework 数据访问技术En ...

  10. 朴素贝叶斯(NB)复习总结

    摘要: 1.算法概述 2.算法推导 3.算法特性及优缺点 4.注意事项 5.实现和具体例子 6.适用场合 内容: 1.算法概述 贝叶斯分类算法是统计学的一种分类方法,其分类原理就是利用贝叶斯公式根据某 ...