是否有任何emacs插件可以自动更新我C项目中的TAGS文件(例如缓存保存或访问),或者如果没有TAGS文件存在,可以创建一个新插件?如何以编程方式创建/更新带有emacs的标签文件?
我在Windows上运行(没有Cygwin),所以所有的花哨shell脚本都没有帮助。我希望本机emacs解决方案不使用任何外部脚本。
我已经尝试过build-tags.el和etags-table.el但这些都没有真正奏效(我想要的方式)。
还有其他想法吗?
是否有任何emacs插件可以自动更新我C项目中的TAGS文件(例如缓存保存或访问),或者如果没有TAGS文件存在,可以创建一个新插件?如何以编程方式创建/更新带有emacs的标签文件?
我在Windows上运行(没有Cygwin),所以所有的花哨shell脚本都没有帮助。我希望本机emacs解决方案不使用任何外部脚本。
我已经尝试过build-tags.el和etags-table.el但这些都没有真正奏效(我想要的方式)。
还有其他想法吗?
为什么不将ctags的执行添加到您的构建脚本中?编译时,你确实只需要一个新的标签文件(至多)。我倾向于写一个计划任务来每天晚上构建标记文件。似乎工作得很好。
我在日常工作中使用语义+ gnu全局组合。 GNU Global的数据库每天更新一次,而语义则使用它们进行基本导航,并即时重新解析更改的文件。
这里详细了解这些包是怎么生成一个C项目标签文件:
这将在当前目录中为所有子目录和文件创建一个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
。对在标签文件已经文件
(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文件实际重建(如果这甚至可以);
etags-update可能对您有帮助。我没有测试它,但根据自述:
etags-update.el是一个Emacs全局次要模式,用于在保存文件时更新您的标记。
试试我的`ctags.el“[1]模块。
配置例子:
(setq tags-revert-without-query t)
(global-set-key (kbd "<f5>") 'ctags-create-or-update-tags-table)
然后只需按<f5>
更新或创建标签文件。该函数 在当前及其父目录中查找文件TAGS,如果找不到TAG 文件,它会询问您在哪里创建一个新文件。
这是一个新的图书馆,可能有错误等,所以任何帮助是值得欢迎的。
安装查找和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只包含相对路径。
我希望在源代码中引入新符号后立即更新TAGS文件。我在开发从文件跳转到文件时广泛使用TAGS浏览功能。一旦晚上不够经常。我们的多开发人员环境中无法使用个人构建脚本模块。 – cschol 2009-02-14 03:48:18
你如何构建你的代码?将该命令封装到执行构建的脚本中,然后运行ctags命令。 – 2009-02-14 04:08:23
我不同意 - 编辑缓冲区后立即想要标记。 – jrockway 2009-02-14 04:54:26