etags 如何配置包含系统头文件的TAGS?

使用的工具

etags

使用 etags 是因为这是 Emacs 自带的,想在能用的情况下尽量少引入多余的工具。但是如果用其他 tags 工具可以解决问题的话,也欢迎赐教。

现状

使用当前的配置,在阅读 C/C++ 代码的时候能方便地跳转到项目下函数的定义。

问题

当前的配置下, etags 无法跳转到系统函数或标准库的定义,只能对当前目录下的文件建 TAGS。

希望达成的目标

1、能跳转到系统函数或者标准库函数的定义,比如 malloc, new 等函数。 2、系统头文件的 TAGS 之需要创建一次,不用换个目录就重新生成一次。

当前的 etags 配置

来源:EmacsWIki

;; [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 工具的朋友能分享下你们的配置。

ctags -L file, file 里是需要被索引的文件,把系统文件包含就行了。另外可以看一下上文链接的 Citre,并且也说明了 ctags 优于 etags 的几点

为什么 tags 工具要提供代码补全呢,原因是什么呢?

使用 etags 的 --include TAGS 参数解决了这个问题,只要先生成系统头文件的 TAGS,然后在生成当前项目的 TAGS 时 使用 --include 参数将系统头文件 TAG 添加到里面就可以了。

1 个赞