Chinaunix首页 | 论坛 | 博客
  • 博客访问: 30101078
  • 博文数量: 230
  • 博客积分: 2868
  • 博客等级: 少校
  • 技术积分: 2223
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-08 21:48
个人简介

Live & Learn

文章分类

全部博文(230)

文章存档

2022年(2)

2019年(5)

2018年(15)

2017年(42)

2016年(24)

2015年(13)

2014年(1)

2012年(5)

2011年(58)

2010年(56)

2009年(9)

我的朋友

分类: LINUX

2011-11-14 22:44:51

在windows下常用的源代码查看工具是Source Inside。在linux下我习惯用用etags、gtags、grep来查看源代码。

etags用于生成TAGS文件来提供emacs快速浏览C/C++源代码,它的最大作用就是能够快速跳转到函数定义、宏定义、数据结构定义、全局变量定 义等。
etags常常和find命令一同使用来生成TAGS文件,如下所示:

find . -name '*.[ch]' | xargs etags -a
etags常用命令:
M-visit-tags-table:选择生成TAGS文件,
M-tags-reset-tags-tables:重新设置tag table
M-. 查找一个tag,比如函数定义类型定义等。
C-u M-. 查找下一个tag的位置
M-* 回到上一次运行M-.前的光标位置。

.emacs中加入这样的语句:
(setq tags-file-name /usr/src/linux/TAGS")
这样emacs就会自动读取这个tags文件的内容。

对于一些project,makefile里已经做好了这一步,例如对工程glibc,执行make -f MakeTAGS

有了etags,为什么还要gtags?
你可能会遇到这样的情况:有一个函数myfunction,在工程的源代码里被调用了十几次,你想把 它们都找出来,这时候,etags只能找到它的定义,并不能找到它的调用。而使用gtags就能够实现这样的功能(当然,还有很多的办法)。
要使用gtags,首先要装global包:
apt-get install global
接着在project是目录下执行:
gtags
你会发现在当前目录多了几个文件:GPATH、GRTAGS、GSYMS、GTAGS。它们就是用于在源文件之间快速跳转。
在emacs里进入到gtags模式,执行“M-x gtags-mode”。
这样就可以使用“gtags-find-pattern”和“gtags-find-symbol”来查找函数调用和声明以及符号声明。

cscope

cscope只针对C语言。

sudo apt-get install cscope

在.emacs里加入这一句:

(require 'xcscope)

在工程的目录里设置cscope的工作目录,并在该目录下生成cscope.file和scope.out文件:

M-x cscope-set-initial-directory

M-x cscope-create-list-of-files-to-index

好了,如果要找一个符号的定义,那么就执行:

M-x cscope-find-global-definition

找调用某个函数的函数,执行:

M-x cscope-find-functions-calling-this-function

C-c s C-h 能找到更多关系cscope的命令。

grep也是一个很好的代码查找工具。例如在一个工程里查找函数名就schedule的函数的定义以及引用,

grep -n -e schedule -r --include=*.[hc] .

如图所示:

使用grep查看源代码

小结:
配合使用etags的“find-tag”(也就是M-.)命令和gtags的“gtags-find-symbol”命令、rgrep命令,能够更方 便、快捷地查找源代码
==========================================================
from: http://blog.csdn.net/meteor1113/archive/2009/07/16/4349261.aspx

学习了很多年的emacs,却一直都不能熟练使用,可能有工作太忙的原因,不过最大的原因还是没有坚持。 最近几天不忙了,又把emacs捡了起来,希望能坚持下去吧。

这一次直接使用了emacs23,是一个正在开发中的版本,不过因为对国际化支持得好了,我仍然选择了使用它。这个版本不用再像emacs21那样 自己安装mule了,而且在日文平台上也不用写一堆配置文件了。

目前我在win32和linux平台下除了emacs自带的lisp之外还使用了另外几个扩展:muse、cedet、ecb、cscope等。

muse是用来写日记的,也就是以前的emacs-wiki,现在这个文章就是用muse写的。muse的用法很简单,直接把下载的muse解压到 site-lisp里,打开emacs后load-library muse-mode和muse-html就可以了。前者是用来加载muse模式用的,只要加载了muse-mode,就可以在任何时候执行muse- mode切换到muse模式进行编辑,如果一个文件的扩展名是muse,那么打开这个文件的时候还会自动切换到muse模式下。而muse-html是用 来发布用的,它支持html,xhtml,xhtml1.0,xhtml1.1这几种方式,只要在muse模式下用C-c C-t(muse-project-publish-this-file)或者C-c C-T(muse-publish-this-file)就可以发布当前文件了。另外,还有muse-latex,muse-texinfo,muse- docbook等可以用来支持发布不同的格式。

cedet,用来进行代码补全,它的semantic是基于语法分析的,代码补全很智能,而且还有菜单,很好用。

ecb是用来读c/c++代码用的,它把emacs装扮得像一个IDE了。

cscope是用来替代(也不完全是替代,目前我是把cscope和etags结合起来使用的)etags的,用来查找c/c++代码中的符号。 cscope比etags的查找功能更强,不过我喜欢etags的alt+.的简洁用法,所以把etags也留下来了。

装扩展的方法很简单,直接从网上下载代码,解压到site-lisp目录下,在.emacs中require需要的扩展就可以 了。如果像我这么懒的话,连.emacs都可以不用,直接打开emacs,然后运行load-library命令载入就可以了。


==========================================================
from: http://blog.csdn.net/fyzhao/archive/2009/10/13/4658132.aspx

(本文参考,并根据自己的使用情况做了些微修改。)   1. etags 基本用法

在emacs里可以用etags命令生成emacs专用的tags文件,有了此文件之后便可以使用一些emacs tags的命令,比如对于编辑C/C++程序的人员可以方便的定位一个函数的定义,或者对函数名进行自动补齐:

  1. find . -name "*.cpp" -print -o -name "*.h" -print | etags -  

 

上述命令可以在当前目录查找所有的.h和.cpp文件并把它们的摘要提取出来做成TAGS文件,具体的etags的用法可以看一下etags的 manual。

 

在.emacs中加入这样的语句:

 

 

这样emacs就会自动读取这个tags文件的内容。

 

几个重要的命令。

 

  • M-. 查找一个tag,比如函数定义类型定义等。
  • C-u M-. 查找下一个tag的位置
  • M-* 回到上一次运行M-.前的光标位置。
  • M-TAB 自动补齐函数名。

 

2. 参考:一些整合的快捷键

易于编译和TAGS的使用,搜集自 zslevin 的帖子(LinuxForum GNU Emacs/XEmacs)

 

  • C-f5, 设置编译命令
  • f5, 保存当前窗口然后编译当前窗口文件
  1. (defun du-onekey-compile ()   
  2.   "Save buffers and start compile"   
  3.   (interactive)   
  4.   (save-some-buffers t)   
  5.   (compile compile-command))   
  6. (global-set-key [C-f5] 'compile)  
  7. (global-set-key [f5] 'du-onekey-compile)  

 

  • F7, 查找 TAGS 文件(更新 TAGS 表)
  • C-F7, 在当前目录下生成包含所有递归子目录的 TAGS 文件(使用了shell中的find命令)
  • C-. 开个小窗查看光标处的 tag
  • C-, 只留下当前查看代码的窗口(关闭查看 tag 的小窗)
  • M-. 查找光标处的 tag,并跳转
  • M-, 跳回原来查找 tag 的地方
  • C-M-, 提示要查找的 tag,并跳转
  • C-M-. 要匹配的 tag 表达式(系统已定义)
  • Shift-Tab, C/C++ 和 lisp 等模式中补全函数名(一般情况下M-Tab被窗口管理器遮屏了)

 

定义按键,在生成相应 tag 文件时,比如一个目录下所有的 *.cpp 和 *.h 文件使用这样的正则表达式 *.[ch]*,在下面的 C-F7 中可能会用到。

 

  1. (global-set-key [(f7)] 'visit-tags-table)         ; visit tags table  
  2. (global-set-key [C-f7] 'sucha-generate-tag-table) ; generate tag table  
  3. (global-set-key [(control .)] '(lambda () (interactive) (lev/find-tag t)))  
  4. (global-set-key [(control ,)] 'sucha-release-small-tag-window)  
  5. (global-set-key [(meta .)] 'lev/find-tag)  
  6. (global-set-key [(meta ,)] 'pop-tag-mark)  
  7. (global-set-key (kbd "C-M-,") 'find-tag)  
  8. (define-key lisp-mode-shared-map [(shift tab)] 'complete-tag)  
  9. (add-hook 'c-mode-common-hook      ; both c and c++ mode  
  10.           (lambda ()  
  11.             (define-key c-mode-base-map [(shift tab)] 'complete-tag)))  

 

上面定义的命令需要用到的函数:

  1. (defun lev/find-tag (&optional show-only)  
  2.   "Show tag in other window with no prompt in minibuf."  
  3.   (interactive)  
  4.   (let ((default (funcall (or find-tag-default-function  
  5.                               (get major-mode 'find-tag-default-function)  
  6.                               'find-tag-default))))  
  7.     (if show-only  
  8.         (progn (find-tag-other-window default)  
  9.                (shrink-window (- (window- height) 12)) ;; 限制为 12 行  
  10.                (recenter 1)  
  11.                (other-window 1))  
  12.       (find-tag default))))  
  13.   
  14. (defun sucha-generate-tag-table ()  
  15.   "Generate tag tables under current directory(Linux)."  
  16.   (interactive)  
  17.   (let   
  18.       ((exp "")  
  19.        (dir ""))  
  20.     (setq dir  
  21.           (read-from-minibuffer "generate tags in: " default-directory)  
  22.           exp  
  23.           (read-from-minibuffer "suffix: "))  
  24.     (with-temp-buffer  
  25.       (shell-command  
  26.        (concat "find " dir " -name /"" exp "/" | xargs etags ")  
  27.        (buffer-name)))))  
  28.   
  29. (defun sucha-release-small-tag-window ()  
  30.   "Kill other window also pop tag mark."  
  31.   (interactive)  
  32.   (delete-other-windows)  
  33.   (ignore-errors  
  34.     (pop-tag-mark)))  


==========================================================
from: http://blog.chinaunix.net/u/15586/showart_1190390.html

在Emacs中使用etags来浏览代码     对于代码量比较大的情况而言,浏览代码就是一件很重要的事情了。在vi中提供了一个比较好的插件来进行相关操作,但是Emacs又该怎么办呢?
    使用Emacs浏览代码有三个方案,最简单的就是etags,第二种是cscope,第三种暂时想不起来了。今天只说最简单的方式,由简入难吧。
    我本以为etags像其它插件一样,就是一个el文件,然后执行一下,后来发现我错了。etags其实是个shell命令。
    1).安装etags,一般来讲,这是emacs的内建程式;
    2).在当前目录建立tag table:M-! etags *.[ch];
    3).使用:
    A.M-. :跳至相应的函数定义处;
    B.M-* :返回刚才的函数名处;
    C.C-u M-. :如果emacs找错了,找下一个;
    D.M-Tab :自动补齐函数名;
    4).在当前目录将.h和.cpp文件提取出来做成tags文件:
    find . -name "*.[chCH]" -print | etags -
    或
    find -name "*.cpp" -exec etags -a {} ;
    5).将创建好的tag表通知emacs:
    M-x visit-tags-table
    6).让emacs自动读取tag文件内容:
    在~/.emacs文件中类似如下内容:
    (setq tags-file-name "~/project/src/TAGS")

    好了,基本上大体的用法就是这样的了。虽然用起来不是很方便,而且没有类似于代码浏览器那样的视图,但是倒可以满足最基本的需求,不是吗?
    (--完--)

阅读(5017) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~