`

emacs 中使用etags

 
阅读更多
原文地址:http://blog.csdn.net/emacx/article/details/6064123




以前没有用过这个东西,昨天研究了一下,很不错。把这个东西的使用方法简单的记录在下面! etags是一个用来创建tag table文件的程序,创建的数据格式emacs能够理解(还有一个程序ctags, 创建的tag table文件是给vi用的,和etags命令基本差不错)。 etags能处理 C, C++, Java, Fortran,python,php,perl等很多种语言 etags命令处理在命令行指定的文件,然后默认在当前目录生成表文件(可以通过-o参数修改) etags命令不能支持递归的查找文件,所以使用find命令配合 find . -name "*.[chCHp]*" -print | etags - 这样就可以在当前目录生成一个TAGS文件,剩下的就是在emacs当中使用了! 在emacs中大致记住三个命令 1.ESC x visit-tags-table RETURN --打开Tags tabs文件 2.ESC . 假定当前你把光标放在某个函数或其他语法对象上,这个命令在当前窗口打开当前查找的对象声明,定义所在 3.C-x 4. 这个在一个新窗口中打开--个人认为在阅读代码时这个命令或许更加适用。 4. C-x 1 返回 Emacs中etags的使用 - [技术相关]2006-08-01 etags is basically a multifile search facility that knows about C and Perl function definitions as well as searching in general. With it, you can find a function anywhere in an entire directory without having to remember in which file the function is defined, and you can do searches and query-replaces that span multiple files. etags uses tag tables, which contain lists of function names for each file in a directory along with information on where the functions' definitions are located within the files. Many of the commands associated with etags involve regular expressions (see Chapter 11) in search strings. 使用etags 1.创建tag表。 在当前的工作目录中调用etags程序。它的参数是正则表达式。 如:etags *.[ch]。从所有以.c或.h结尾的文件中,构建一个tag表 在shell mode或M-!命令下,执行etags。输出结果是一个TAGS文件。 如果要更新TAGS文件,则重新调用一下etags命令即可。 2.创建好tag表后,告知emacs。 M-x visit-tags-table 3.相关命令: M-.:在tag表查找函数名中包含有某个字符串的函数。a nice feature:它把光标当前所在的word当作默认查找字符串。 C-x 4:作用与M-.相似,不过是使用另一个缓冲区 M-,:查看下一个函数。如果存在多个符合查询条件的函数,M-.只显示结果列表中按字母序排的第一个函数,M-,用来查看下一个函数 M-x tags-search:输入正则表达式,查找所有列在tag表中的文件。凡是符合reglar expression的内容都显示出来。这点有点类似grep。结果中可通过M-,查看下一个。 M-x tags-query-replace:查询替换。作用在tag中列出的所有文件上。 C-u M-x tags-query-replace:只有完全匹配时,才替换(replaces only matches that are whole words) 如果用Esc或C-g推出了tags-query-replace,可通过M-,再恢复 M-x tags-apropos:如果给定正则表达式作参数,它将在*Tags List*中列出匹配该正则表达式的所有tags M-x list-tags:list所有给定C文件中的在tag表中所有的tag。可通过M-.查看每个函数的定义 1. Etags 基础 在emacs里可以用etags命令生成emacs专用的tags文件,有了此文件之后便可以使用一些emacs tags的命令,比如对于编辑C/C++程序的人员可以方便的定位一个函数的定义,或者对函数名进行自动补齐: find -name "*.h" -or -name "*.cpp" |xargs etags --members / 不好使 --language=c++ 我在使用上述命令时未能成功,但以下命令可以 find -name "*.cpp" -exec etags -a {} /; 或 find . -name "*.[chCH]" -print | etags - 上述命令可以在当前目录查找所有的.h和.cpp文件并把它们的摘要提取出来做成TAGS文件,具体的etags的用法可以看一下etags的manual。 在.emacs中加入这样的语句: (setq tags-file-name "~/sim973/src/TAGS") 这样emacs就会自动读取这个tags文件的内容。 几个重要的命令。 M-. 查找一个tag,比如函数定义类型定义等。 C-u M-. 查找下一个tag的位置 M-* 回到上一次运行M-.前的光标位置。 M-TAB 自动补齐函数名。 2. 一些整合的快捷键 易于编译和TAGS的使用,搜集自 zslevin 的帖子(LinuxForum GNU Emacs/XEmacs) C-f5, 设置编译命令 f5, 保存当前窗口然后编译当前窗口文件 (defun du-onekey-compile () "Save buffers and start compile" (interactive) (save-some-buffers t) (compile compile-command)) (global-set-key [C-f5] 'compile) (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 中可能会用到。 (global-set-key [(f7)] 'visit-tags-table) ; visit tags table (global-set-key [C-f7] 'sucha-generate-tag-table) ; generate tag table (global-set-key [(control .)] '(lambda () (interactive) (lev/find-tag t))) (global-set-key [(control ,)] 'sucha-release-small-tag-window) (global-set-key [(meta .)] 'lev/find-tag) (global-set-key [(meta ,)] 'pop-tag-mark) (global-set-key (kbd "C-M-,") 'find-tag) (define-key lisp-mode-shared-map [(shift tab)] 'complete-tag) (add-hook 'c-mode-common-hook ; both c and c++ mode (lambda () (define-key c-mode-base-map [(shift tab)] 'complete-tag))) 上面定义的命令需要用到的函数: (defun lev/find-tag (&optional show-only) "Show tag in other window with no prompt in minibuf." (interactive) (let ((default (funcall (or find-tag-default-function (get major-mode 'find-tag-default-function) 'find-tag-default)))) (if show-only (progn (find-tag-other-window default) (shrink-window (- (window-height) 12)) ;; 限制为 12 行 (recenter 1) (other-window 1)) (find-tag default)))) (defun sucha-generate-tag-table () "Generate tag tables under current directory(Linux)." (interactive) (let ((exp "") (dir "")) (setq dir (read-from-minibuffer "generate tags in: " default-directory) exp (read-from-minibuffer "suffix: ")) (with-temp-buffer (shell-command (concat "find " dir " -name /"" exp "/" | xargs etags ") (buffer-name))))) (defun sucha-release-small-tag-window () "Kill other window also pop tag mark." (interactive) (delete-other-windows) (ignore-errors (pop-tag-mark))) 在源代码的目录下面运行这个命令: coon@zevita:/usr/local/arm-elf$ find . | grep '/.h$/|/.cc/$' | etags - 然后在emacs中: 运行M-x visit-tags-table 输入刚才的目录,注意不用输入TAGS 然后就可以用下面的命令浏览tag了 `M-. TAG ' 跳到第一个 TAG 的定义处。 `C-u M-.' 如果刚刚用过 M-. , 那么查找下一个定义处。 `C-u - M-.' 回到上一个定义处。 `C-M-. PATTERN ' 按正则表达式搜索 TAG 的定义。 `C-u C-M-.' 如果刚刚用过了 C-M-. , 那么查找下一个。 `C-x 4 . TAG ' 和 M-. 类似, 不过在另一个窗格显示。(`find-tag-other-window'). `C-x 5 . TAG ' 和 M-. 类似, 不过在另一个窗框显示。(`find-tag-other-frame'). `M-*' 回到开始查找 TAG 的地方。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics