使用的工具
etags
使用 etags 是因为这是 Emacs 自带的,想在能用的情况下尽量少引入多余的工具。但是如果用其他 tags 工具可以解决问题的话,也欢迎赐教。
现状
使用当前的配置,在阅读 C/C++ 代码的时候能方便地跳转到项目下函数的定义。
问题
当前的配置下, etags 无法跳转到系统函数或标准库的定义,只能对当前目录下的文件建 TAGS。
希望达成的目标
1、能跳转到系统函数或者标准库函数的定义,比如 malloc
, new
等函数。
2、系统头文件的 TAGS 之需要创建一次,不用换个目录就重新生成一次。
当前的 etags 配置
;; [etags]
(defun create-tags (dir-name)
"Create tags file."
(interactive "DDirectory: ")
(eshell-command
(format "find %s -type f -name \"*.c\" -o -name \"*.h\" -o -name \"*.cpp\" -o -name \"*.hpp\" | etags -C -" dir-name)))
(defadvice find-tag (around refresh-etags activate)
"Rerun etags and reload tags if tag not found and redo find-tag.
If buffer is modified, ask about save before running etags."
(let ((extension (file-name-extension (buffer-file-name))))
(condition-case err
ad-do-it
(error (and (buffer-modified-p)
(not (ding))
(y-or-n-p "Buffer is modified, save it? ")
(save-buffer))
(er-refresh-etags extension)
ad-do-it))))
(defun er-refresh-etags (&optional extension)
"Run etags on all peer files in current dir and reload them silently."
(interactive)
(shell-command (format "etags *.%s" (or extension "el")))
(let ((tags-revert-without-query t)) ; don't query, revert silently
(visit-tags-table default-directory nil)))
这个配置使用了一段时间,没什么问题,但是最近有时候想看一下系统库的函数实现,发现这个配置还有所不足,希望熟悉 tags 工具的朋友能分享下你们的配置。