是否有任何 emacs 插件可以自动更新我的 C 项目中的 TAGS 文件(例如在缓冲区保存或访问时),或者如果不存在 TAGS 文件则创建一个新的?
我在 Windows 上运行(没有 Cygwin),所以所有花哨的 shell 脚本都无济于事。我希望有一个不使用任何外部脚本的本机 emacs 解决方案。
我已经尝试过build-tags.el和etags-table.el但这些都没有真正起作用(我想要的方式)。
还有其他想法吗?
是否有任何 emacs 插件可以自动更新我的 C 项目中的 TAGS 文件(例如在缓冲区保存或访问时),或者如果不存在 TAGS 文件则创建一个新的?
我在 Windows 上运行(没有 Cygwin),所以所有花哨的 shell 脚本都无济于事。我希望有一个不使用任何外部脚本的本机 emacs 解决方案。
我已经尝试过build-tags.el和etags-table.el但这些都没有真正起作用(我想要的方式)。
还有其他想法吗?
以下是我为 C 项目生成 TAGS 文件的方法:
这将在当前目录中为所有子目录和文件创建一个 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
。
etags-update可能对您的情况有所帮助。我没有测试它,但根据自述文件:
etags-update.el 是一个 Emacs 全局次要模式,它会在保存文件时更新您的 TAGS。
为什么不将 ctags 的执行添加到您的构建脚本中?编译时(最多)你真的只需要一个新的标签文件。我倾向于每天晚上编写一个计划任务来构建标签文件。似乎工作得很好。
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
试试我的 `ctags.el'[1] 模块。
配置示例:
(setq tags-revert-without-query t)
(global-set-key (kbd "<f5>") 'ctags-create-or-update-tags-table)
然后只需按下<f5>
即可更新或创建您的 TAGS 文件。该函数在当前及其父目录中查找文件 TAGS,如果未找到 TAG 文件,它会询问您在哪里创建新文件。
这是一个新库,可能有错误等,所以欢迎任何帮助。
这可能会让你接近(未经测试):
(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 文件(如果这甚至可以工作;)
安装 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 只包含相对路径。