在emacs编程中有以下需求

  • 从调用一个函数的地方跳转到函数的定义的地方
  • 或是反过来从函数定义的地方列出所有调用这个函数的地方

实现办法

需要安装以下软件

  • gnu global(阅读源代码的工具)官网
  • emacs的gtags插件
  • 启动emacs后,输入下面的命令,来启动gtags的功能
M-x ggtags-mode
gnu global安装
apt-get install global

emacs的gtags插件安装

M-x list-packages

找到ggtags后,鼠标点击,再点安装

使用方法

1,在存放代码的根目录执行:

$ gtags

执行后,会发现在生成了3个文件, GPATH GRTAGS GTAGS

2,启动emacs

3,启动emacs后,输入下面的命令,来启动gtags的功能

M-x ggtags-mode

每打开一个文件都输入ggtags-mode,太麻烦了,所以在.emacs文件里加一个钩子,当打开c,c++,java的源文件时,自动启动ggtags-mode

(add-hook 'c-mode-common-hook
(lambda ()
(when (derived-mode-p 'c-mode 'c++-mode 'java-mode)
(ggtags-mode 1))))

4,使用下面的函数就可以实现,查看代码的各种需求了。

ggtags-find-tag-dwim

   Find a tag by context.

   If point is at a definition tag, find references, and vice versa.
If point is at a line that matches ``ggtags-include-pattern``, find
the include file instead. To force finding a definition tag, call it with a prefix (``C-u``). ggtags-find-tag-mouse Like ``ggtags-find-tag-dwim`` but suitable for binding to mouse
events. ggtags-find-definition Find definition tags. With ``C-u`` ask for the tag name with
completion. ggtags-find-reference Find reference tags. With ``C-u`` ask for the tag name with completion. ggtags-find-other-symbol Find tags that have no definitions. With ``C-u`` ask for the tag
name with completion. ggtags-find-tag-regexp Find definition tags matching a regexp. By default it lists all
matching tags in the project. With ``C-u`` restrict the lists to a
directory of choice. ggtags-idutils-query Use idutils to find matches. ggtags-grep Grep for lines matching a regexp. This is usually the slowest. ggtags-find-file Find a file from all the files indexed by ``gtags``. ggtags-query-replace Do a query replace in all files found in a search. Handling multiple matches
+++++++++++++++++++++++++ When a search finds multiple matches, a buffer named
``*ggtags-global*`` is popped up and ``ggtags-navigation-mode`` is
turned on to facilitate locating the right match.
``ggtags-navigation-mode`` makes a few commands in the
``*ggtags-global*`` buffer globally accessible: ``M-n`` Move to the next match. ``M-p`` Move to the previous match. ``M-}`` Move to next file. ``M-{`` Move to previous file. ``M-=`` Move to the file where navigation session starts. ``M-<`` Move to the first match. ``M->`` Move to the last match. ``C-M-s`` or ``M-s s`` Use ``isearch`` to find the match. ``RET`` Found the right match so exit navigation mode. Resumable by ``M-,``
(``tags-loop-continue``). ``M-*`` Abort and go back to the location where the search was started. Miscellaneous commands
++++++++++++++++++++++ Commands are available from the ``Ggtags`` menu in ``ggtags-mode``. ggtags-prev-mark Move to the previously (older) visited location. Unlike ``M-*``
this doesn't delete the location from the tag ring. ggtags-next-mark Move to the next (newer) visited location. ggtags-view-tag-history Pop to a buffer listing all visited locations from newest to
oldest. The buffer is a next error buffer and works with standard
commands ``next-error`` and ``previous-error``. In addition ``TAB``
and ``S-TAB`` move to next/prev entry, and ``RET`` visits the
location. ``M-n`` and ``M-p`` move to and display the next/previous
entry. ggtags-view-search-history View or re-run past searches as kept in
``ggtags-global-search-history``. ggtags-kill-file-buffers Kill all file-visiting buffers of current project. ggtags-toggle-project-read-only Toggle opening files in ``read-only`` mode. Handy if the main
purpose of source navigation is to read code. ggtags-visit-project-root Open the project root directory in ``dired``. ggtags-delete-tags Delete the GTAGS, GRTAGS, GPATH and ID files of current project. ggtags-explain-tags Explain how each file is indexed in current project. ggtags-browse-file-as-hypertext Use ``htags`` to generate HTML of the source tree. This allows
browsing the project in a browser with cross-references.

使用举例

1,从调用一个函数的地方跳转到函数的定义的地方

M-x ggtags-find-definition
对应的快捷键:M-.

2,从调用一个函数的地方跳转到函数的定义的地方后,返回到调用函数的地方

M-x ggtags-prev-mark
对应的快捷键:M-,

3,或是反过来从函数定义的地方列出所有调用这个函数的地方

M-x ggtags-find-reference
对应的快捷键:M-]

4,查看导航过的历史记录

M-x ggtags-view-tag-history
对应的快捷键:C-c M-h

用emacs 阅读 c/c++ 代码的更多相关文章

  1. [emacs] 使用ggtags浏览代码

    [emacs] 使用ggtags浏览代码 // */ // ]]>   [emacs] 使用ggtags浏览代码 Table of Contents 1 相关的连接 2 global简介 2.1 ...

  2. Emacs阅读chm文档

    .title { text-align: center; margin-bottom: .2em } .subtitle { text-align: center; font-size: medium ...

  3. Kaldi阅读并更改代码

    Common utilities base/kaldi-common.h 几乎所有Kaldi程序都会include该头文件. 该头文件include了一些其他位于base/目录的头文件,主要提供: 错 ...

  4. Week3 博客阅读感想和代码复审

    一.关于博客阅读感想 阅读了十多篇老程序员(大多在计算机相关行业工作超过10年)关于自身经历的博客,很有感触.这里一方面总结一下看博客的收获,另一方面写点自己的感受. 首先,这些博客不少涉及到了两大类 ...

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

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

  6. 如何阅读luajit的代码——用vs调试篇

    为什么要看luajit的源码 作为目前最快的脚本语言之一,luajit确实是一个杰作,但相比原生lua仅仅几万行的代码而言,luajit却可以说是巨无霸.更要命的是,luajit之所以快,是因为大量使 ...

  7. perl 里面如何写出阅读友好的代码提示

    在我们使用别人写好的程序时,经常会使用-h 之类的东西查看一下简单的帮助手册或者说明信息: 对于perl 语言而言,写起来简单,经常随手一写,解决了当时的问题,但是过几天去看,你都不知道这个脚本该怎么 ...

  8. 阅读prettytable 一些代码、get、set 检查参数

    阅读代码是因为我发现官方教程里的代码在本地不能用,所以就通过”查看定义“转到了源代码里. 通过阅读源代码,查看方法内是否有教程中所说的方法名和参数名,然后再通过”查看引用“来试图了解函数的流程,如果没 ...

  9. 利用Eclipse CDT 阅读C/C++代码

    本文转自: https://xbgd.iteye.com/blog/1259544 常见阅读代码的工具有 , visual c++, visual studio + va(visual assista ...

随机推荐

  1. SLAM入门之视觉里程计(3):两视图对极约束 基础矩阵

    在上篇相机模型中介绍了图像的成像过程,场景中的三维点通过"小孔"映射到二维的图像平面,可以使用下面公式描述: \[ x = MX \]其中,\(c\)是图像中的像点,\(M\)是一 ...

  2. tcp关闭状态详解

    tcp关闭连接不区分客户端和服务端,哪一端口可以主动发起关闭连接请求.所以为了描述方便,描述中的“主动方”表示主动发起关闭连接一方,“被动方”表示被动关闭连接一方. 1. tcp关闭连接状态转换 上图 ...

  3. Magicodes.NET框架之路——让Magicodes.NET帮你编写代码

    时间总是过得很快,而我几乎没有时间来安安静静的写博客和完善文档.不过总算是框架在一直前进,而我的计划是在今年年底(公历)前,让此框架成熟稳定. 在很长一段时间里,我尝试了很多我之前没有接触的技术或者没 ...

  4. NLP入门(三)词形还原(Lemmatization)

      词形还原(Lemmatization)是文本预处理中的重要部分,与词干提取(stemming)很相似.   简单说来,词形还原就是去掉单词的词缀,提取单词的主干部分,通常提取后的单词会是字典中的单 ...

  5. oracle表空间大小的限制和DB_BLOCK_SIZE的概念

    之前接触的项目表空间最大也不超过10G,所以导入数据库时一直使用导入本地的oracle数据库文件的方法,即根据dmp文件大小设置一个数据文件,设定表空间最大值. --创建表空间,数据文件为'F:\ap ...

  6. CSharp工程中的几个文件

    以下基于.NET Framework4.6及.NET Core2.0 .csproj 用于配置项目信息,如: 程序集名称.类型 Framework版本 项目所包含的文件信息,如:cs.html.js. ...

  7. echarts地图 禁止高亮显示(转载)

    转载来源: https://blog.csdn.net/john1337/article/details/54666759 案例一:在实际应用中希望(没有数据的省会)禁止高亮颜色,解决方案: mapC ...

  8. C#中MessageBox.Show问题(让提示窗口不显示在任务栏中)

    在winform中让MessageBox.Show显示的窗口不显示在任务栏中:第一个参数很明显是你要显示的内容   类型是string 语法Visual Basic(声明) Public Shared ...

  9. 程序猿制造Bug的根本原因竟然是....

    传说中: 「杀一个程序猿不需要用枪,改三次需求就可以了.」 而且, 「这竟然也是程序猿制造Bug的根本原因....」 ↓↓↓↓↓↓↓ #/原始需求/#   你去饭店,坐下来. “服务员,给我来份宫保鸡 ...

  10. 我是如何解决java.security.cert.CertPathValidatorException异常的

    目录 问题来了 问题分析 解决问题 重新安装服务器端证书 日志带来曙光 刨根到底 总结 附录 tomcat的SSL配置 服务器端证书配置 Keytool命令常用参数 问题来了 昨天,我还在我的工位上愉 ...