配置每个缓冲区的Emacs扩展,监视更改

配置每个缓冲区的Emacs扩展,监视更改,emacs,configuration,elisp,Emacs,Configuration,Elisp,我编写了一个Emacs扩展,它在保存缓冲区时运行任意函数。配置按照Git repo存储在.graffitist文件中,格式如下: (setq graffitist-rules '((".*" . (lambda (file-name project-dir-name) ... )))) 也就是说,如果保存的缓冲区文件名与正则表达式“*”匹配,则执行提供的函数。负责此操作的Emacs Lisp代码如下: (defun graffitist--run-actions-for-file

我编写了一个Emacs扩展,它在保存缓冲区时运行任意函数。配置按照Git repo存储在.graffitist文件中,格式如下:

(setq graffitist-rules
      '((".*" . (lambda (file-name project-dir-name) ... ))))
也就是说,如果保存的缓冲区文件名与正则表达式“*”匹配,则执行提供的函数。负责此操作的Emacs Lisp代码如下:

(defun graffitist--run-actions-for-file ()
  "Runs the action specified in the project .graffitist file for the filename of the current buffer, if any."
  (let* ((filename (buffer-file-name (current-buffer)))
         (project-directory (graffitist--find-project-dir filename))
         (config-filename (graffitist--config-filename project-directory))
         (action (graffitist--find-action config-filename filename)))
    (if action
        (funcall action filename project-directory))))

(defun graffitist--find-project-dir (filename)
  "Finds the project directory for the specified filename.  Returns nil if there is no project directory.
The project directory is defined as the first directory upwards in the hierarchy containing .git."
  (let ((directory-name (locate-dominating-file filename ".git")))
    (if directory-name
        (file-name-as-directory directory-name)
      nil)))

(defun graffitist--config-filename (project-directory)
  "Returns the filename to the .graffitist configuration file for the specified project directory."
  (if project-directory
      (concat project-directory ".graffitist")
    nil))

(defun graffitist--find-action (config-filename filename)
  "Finds the first action associated with a regex that matches filename."
  (if (and config-filename (file-exists-p config-filename))
      (progn
        (load config-filename)
        (assoc-default filename graffitist-rules #'string-match))))

(add-hook 'after-save-hook #'graffitist--run-actions-for-file)
这是可行的,但似乎有点奇怪。每次保存缓冲区时,它都会加载.graffitist文件,这很昂贵。此外,只有一个
涂鸦规则
global在每次保存缓冲区时都会更新


在Emacs Lisp中有没有更惯用的方法来实现这一点?也就是说,加载每个缓冲区配置并在配置文件更改时保持其最新状态?

也许一旦加载了给定的配置文件,您就可以缓存它,然后利用它监视该文件上的更改。如果监视的文件发生更改,请将其从缓存中清除,以便下次需要时重新加载