在Emacs根项目中保存标记文件

在Emacs根项目中保存标记文件,emacs,tags,etags,Emacs,Tags,Etags,如何将标签保存在项目的根目录中 当我更改文件时,我的emacs配置将在每个目录中保存标记文件。 例如,当我更改src/目录中的文件时,它将在该目录中保存标记文件,而不是将该文件保存在项目的根目录中: project1: main.py TAGS <<< correct. src/ newlib.py TAGS <<< incorrect. this file should be store in

如何将标签保存在项目的根目录中

当我更改文件时,我的emacs配置将在每个目录中保存
标记
文件。
例如,当我更改
src/
目录中的文件时,它将在该目录中保存
标记
文件,而不是将该文件保存在项目的根目录中:

project1:
  main.py
  TAGS          <<< correct.
  src/
      newlib.py
      TAGS      <<< incorrect. this file should be store in root directory (project1/TAGS)
  libs/
      something.py

您将如何确定“项目的根”?如果您不知道,那么函数
定位主控文件
可能会对您有所帮助。@phils,目前只需将
放在当前目录中即可。@phils,是的,您是对的。但我正在寻找一种解决方案来解决这个问题。我要补充的是,许多人都找到了一种管理项目的有用方法,所以这可能值得研究。它包括自己的一些标记功能,但也提供了一种获取项目根的通用方法(看起来是
投射项目根
函数)。
;; create tags
(defun create-tags (dir-name)
  "Create tags file."
  (interactive "DDirectory: ")
    (eshell-command
      (format "find . -type f -iname \"*.py\" -not -path \"*/venv/*\" | etags -" dir-name)))

;; refresh tags
(defun er-refresh-etags (&optional extension)
  "Run etags on all peer files in current dir and reload them silently."
  (interactive)
    (shell-command (format "find . -type f -iname \"*.py\" -not -path \"*/venv/*\" | etags -" '.))
    (let ((tags-revert-without-query t))  ; don't query, revert silently          
      (visit-tags-table default-directory nil)))

;; hooks for tags
(create-tags '.)
(add-hook 'after-save-hook (create-tags '.))
(add-hook 'after-save-hook #'er-refresh-etags)