2009-02-14 20 views
18

是否有任何emacs插件可以自动更新我C项目中的TAGS文件(例如缓存保存或访问),或者如果没有TAGS文件存在,可以创建一个新插件?如何以编程方式创建/更新带有emacs的标签文件?

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

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

还有其他想法吗?

回答

4

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

+3

我希望在源代码中引入新符号后立即更新TAGS文件。我在开发从文件跳转到文件时广泛使用TAGS浏览功能。一旦晚上不够经常。我们的多开发人员环境中无法使用个人构建脚本模块。 – cschol 2009-02-14 03:48:18

+0

你如何构建你的代码?将该命令封装到执行构建的脚本中,然后运行ctags命令。 – 2009-02-14 04:08:23

+3

我不同意 - 编辑缓冲区后立即想要标记。 – jrockway 2009-02-14 04:54:26

2

我在日常工作中使用语义+ gnu全局组合。 GNU Global的数据库每天更新一次,而语义则使用它们进行基本导航,并即时重新解析更改的文件。

你可以找到my article about Cedet

9

这里详细了解这些包是怎么生成一个C项目标签文件:

  1. M-X CD YOUR_DIRECTORY
  2. M-X编译
  3. 发现。 -name“*。[chCH]”-print | etags -

这将在当前目录中为所有子目录和文件创建一个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) 

它只会工作(我提到这是未经测试):

1

这可能让你接近(未经测试)。如果你添加一个新文件,你必须自己第一次重新生成TAGS文件。呼叫处理部分应该异步工作,因此可能需要等待TAGS文件实际重建(如果这甚至可以);

2

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

配置例子:

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

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

这是一个新的图书馆,可能有错误等,所以任何帮助是值得欢迎的。

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

1

安装查找和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只包含相对路径。