2009-02-14 46 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只包含相對路徑。