18

是否有任何 emacs 插件可以自动更新我的 C 项目中的 TAGS 文件(例如在缓冲区保存或访问时),或者如果不存在 TAGS 文件则创建一个新的?

我在 Windows 上运行(没有 Cygwin),所以所有花哨的 shell 脚本都无济于事。我希望有一个不使用任何外部脚本的本机 emacs 解决方案。

我已经尝试过build-tags.eletags-table.el但这些都没有真正起作用(我想要的方式)。

还有其他想法吗?

4

7 回答 7

10

以下是我为 C 项目生成 TAGS 文件的方法:

  1. Mx cd YOUR_DIRECTORY
  2. MX 编译
  3. 寻找 。-name "*.[chCH]" -print | 电子标签 -

这将在当前目录中为所有子目录和文件创建一个 TAGS 文件。

这是一个执行完全相同的操作的 emacs 函数:

(defun compile-tags ()
  "compile etags for the current project"
  (interactive)
  (cd "YOUR_DIRECTORY")
  (compile "find . -name \"*.[chCH]\" -print | etags -"))

注意:如果您在 Windows 上,则需要安装 cygwin 并确保c:\cygwin\bin在您的路径中,以便您进入find您的路径。还要确保 emacs bin 目录在您的路径中,以便您也可以获取etags

于 2009-02-14T08:13:00.073 回答
10

etags-update可能对您的情况有所帮助。我没有测试它,但根据自述文件:

etags-update.el 是一个 Emacs 全局次要模式,它会在保存文件时更新您的 TAGS。

我在用于构建 TAGS 文件的 Emacswiki 页面上找到了它

于 2010-04-23T12:54:51.743 回答
4

为什么不将 ctags 的执行添加到您的构建脚本中?编译时(最多)你真的只需要一个新的标签文件。我倾向于每天晚上编写一个计划任务来构建标签文件。似乎工作得很好。

于 2009-02-14T03:37:35.397 回答
2

I use combination of semantic + gnu global for my day-to-day work. GNU Global's databases are updated once per day, while semantic use them for basic navigation, and re-parse changed files on the fly.

You can find more about these packages in my article about Cedet

于 2009-02-14T06:59:25.910 回答
2

试试我的 `ctags.el'[1] 模块。

配置示例:

(setq tags-revert-without-query t)
(global-set-key (kbd "<f5>") 'ctags-create-or-update-tags-table)

然后只需按下<f5>即可更新或创建您的 TAGS 文件。该函数在当前及其父目录中查找文件 TAGS,如果未找到 TAG 文件,它会询问您在哪里创建新文件。

这是一个新库,可能有错误等,所以欢迎任何帮助。

[1] https://bitbucket.org/semente/ctags.el/

于 2011-06-18T12:43:04.863 回答
1

这可能会让你接近(未经测试):

(defvar my-auto-update-tags-alist
  (list '("/some/path/to/TAGS" "command_to_build_tags")
        '("/another/path/to/TAGS" "another_build_command")))

(defun my-auto-update-tags ()
  "Automatically update TAGS files"
  (tags-table-check-computed-list)
  (let ((filename (buffer-file-name))
        build-cmd)
    (mapc (lambda (tag-file)
            (set-buffer tag-file)
            (when (member filename (tags-table-files))
              (setq build-cmd (cdr (assoc tag-file my-auto-update-tags-alist)))
              (when build-cmd
                (call-process build-cmd nil 0))))
          tags-table-computed-list)))

(add-hook 'after-save-hook 'my-auto-update-tags)

它仅适用于已经在 TAGS 文件中的文件(我是否提到它未经测试?)。如果您添加一个新文件,您必须自己第一次重新生成 TAGS 文件。调用过程部分应该异步工作,因此可能需要片刻才能真正重建 TAGS 文件(如果这甚至可以工作;)

于 2009-02-14T12:53:35.950 回答
1

安装 find-and-ctags ( https://github.com/redguardtoo/find-and-ctags ),然后将以下代码插入 ~/.emacs,

(defun my-setup-develop-environment ()
  (interactive)

  ;; you can use `find-and-ctags-current-full-filename-match-pattern-p' instead
  (when (find-and-ctags-current-path-match-pattern-p "/MYPROJ")
    (setq-local tags-table-list
                (list (find-and-ctags-run-ctags-if-needed "~/workspace/MYPROJ" ; project directory
               '(("-not -size +64k" "--exclude=*.min.js") ; (find-opts ctags-opts)
                                                            ;; you may add more find-opts ctags-opts pair HERE to run find&ctags again to APPEND to same TAGS file
                                                            ;; ctags-opts must contain "-a" to append
                                                            ;; (find-opts "-a")
                                                            )))))

  ;; for other projects
  ;; insert NEW `when' statements here
  )
(add-hook 'prog-mode-hook 'my-setup-develop-environment) ; prog-mode require emacs24+
(add-hook 'lua-mode-hook 'my-setup-develop-environment) ; lua-mode does NOT inherit from prog-mode

;; OPTIONAL
(add-hook 'after-save-hook 'find-and-ctags-auto-update-tags)

它适用于 Windows,您只需将“~/workspace/MYPROJ”替换为“C:/workspace/MYPROJ”。CTags 可执行文件可以是任何版本,因为生成的 TAGS 只包含相对路径。

于 2016-06-29T10:05:59.367 回答