Emacs每个文件自定义

Joe*_*Joe 5 emacs elisp

我有一个带有自定义宏的Emacs Lisp文件,我希望它有所不同.代码如下:

(defmacro* when-let ((var value) &rest body)
  `(let ((,var ,value))
     (when ,var ,@body)))

(defun func ()
  (when-let (a 1)
    a))
Run Code Online (Sandbox Code Playgroud)

我希望像上面那样when-let精通font-lock-keyword并缩进.我知道我可以在我的.emacs文件中执行此操作,但我更喜欢将其作为本地目录或文件本地自定义.问题是目录本地和文件本地自定义似乎仅限于设置变量.在我的.emacs文件中,我有以下内容.

(add-hook 'emacs-lisp-mode-hook
   (lambda ()
             (put 'when-let 'lisp-indent-function 1)
             (font-lock-add-keywords nil
                                     '(("(\\(when-let\\)\\>" 1
                                        font-lock-keyword-face)))))
Run Code Online (Sandbox Code Playgroud)

我想要这个,.dir-locals.el因为它只适用于一个文件.

phi*_*ils 9

您可以通过指定值来指定文件局部变量1中的elisp以进行评估eval:(文档说'Eval:'但只有小写'eval:'似乎有效).例如:

;;; Local Variables:
;;; mode: outline-minor
;;; eval: (hide-body)
;;; End:
Run Code Online (Sandbox Code Playgroud)

作为一项安全措施,Emacs会在看到一个尚未识别为安全的值时要求您进行确认.如果您告诉它永久记住它,它会将值写入init文件safe-local-variable-values(custom-set-variables)部分.

请注意,不推荐使用上面启用次模式的示例(mode局部变量仅适用于主要模式),因此我们需要将其重新编写为另一种评估形式,我们将其称为次模式函数.

如果需要评估多个表单,可以指定多个eval值,这些值将按顺序进行评估:

;;; Local Variables:
;;; eval: (outline-minor-mode 1)
;;; eval: (hide-body)
;;; End:
Run Code Online (Sandbox Code Playgroud)

或者,只需使用progn:

;;; Local Variables:
;;; eval: (progn (outline-minor-mode 1) (hide-body))
;;; End:
Run Code Online (Sandbox Code Playgroud)

不同之处在于,后者将被视为单个值safe-local-variable-values,而具有多个eval值,每个值都被认为是独立的.

1 C-hig (elisp) File Local Variables RET

  • 作为一点澄清,上面的代码块应该放在你希望它应用到的文件的顶部。这适用于任何类型的文件,只要它作为注释出现在文件的语言中(例如,在 C++ 文件中,;;; 可以用 // 替换)。 (2认同)