如何使用emacs以编程方式创建/更新TAGS文件?

时间:2009-02-14 03:15:41

标签: emacs ctags

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

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

我已经尝试了build-tags.eletags-table.el,但这些都没有用(我想要的方式)。

还有其他想法吗?

7 个答案:

答案 0 :(得分:9)

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

  1. M-x cd YOUR_DIRECTORY
  2. M-x compile
  3. 找到。 -name“*。[chCH]” - print | etags -
  4. 这将在当前目录中为所有子目录和文件创建一个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

答案 1 :(得分:9)

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

  

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

我在Emacswiki page for building TAGS files

上找到了它

答案 2 :(得分:4)

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

答案 3 :(得分:2)

我将semantic + gnu global的组合用于我的日常工作。 GNU Global的数据库每天更新一次,而语义使用它们进行基本导航,并动态地重新解析更改的文件。

您可以在my article about Cedet

中找到有关这些软件包的更多信息

答案 4 :(得分:2)

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

配置示例:

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

然后只需按<f5>即可更新或创建TAGS文件。那个功能 如果是TAG,在当前及其父目录中查找文件TAGS 找不到文件,它会问你在哪里创建一个新文件。

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

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

答案 5 :(得分: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文件(如果这样可行;)

答案 6 :(得分: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,您需要的只是替换&#34;〜/ workspace / MYPROJ&#34;用&#34; C:/ workspace / MYPROJ&#34;。 CTags可执行文件可以是任何版本,因为生成的TAGS只包含相对路径。