是否有任何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