每个文件的Emacs定制

每个文件的Emacs定制,emacs,elisp,Emacs,Elisp,我有一个带有自定义宏的Emacs Lisp文件,我希望以不同的方式进行格式化和标识。代码如下所示: (defmacro* when-let ((var value) &rest body) `(let ((,var ,value)) (when ,var ,@body))) (defun func () (when-let (a 1) a)) 当let格式化为字体锁定关键字并如上所述进行缩进时,我需要。我知道我可以在.emacs文件中执行此操作,但我更喜欢将

我有一个带有自定义宏的Emacs Lisp文件,我希望以不同的方式进行格式化和标识。代码如下所示:

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

(defun func ()
  (when-let (a 1)
    a))
当let格式化为
字体锁定关键字
并如上所述进行缩进时,我需要
。我知道我可以在.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)))))

我希望在
.dir locals.el
中使用它,因为它只适用于一个文件。

您可以通过指定
eval:
值(文档中说“eval:”但只有小写的“eval:”似乎有效)在文件本地变量1中指定用于求值的elisp。e、 g:

作为一种安全措施,只要Emacs发现一个尚未识别为安全的值,它就会要求您确认。如果您让它永久记住它,它会将该值写入init文件的
(自定义设置变量)
部分的
安全局部变量值中

请注意,上面启用次要模式的示例已被弃用(
mode
局部变量仅适用于主要模式),因此我们需要将其重新编写为另一个求值形式,在该形式中我们调用次要模式函数

如果需要计算多个表单,可以指定多个
eval
值,这些值将按顺序计算:

;;; Local Variables:
;;; eval: (outline-minor-mode 1)
;;; eval: (hide-body)
;;; End:
或者,只需使用progn:

;;; Local Variables:
;;; eval: (progn (outline-minor-mode 1) (hide-body))
;;; End:
不同之处在于,就安全局部变量值而言,后者将被视为一个值,而对于多个
eval
值,每个值都被独立考虑


1 C-hig
(elisp)文件局部变量
RET

要识别when-let宏,可以使用缩进声明:

(defmacro* when-let ((var value) &rest body)
  (declare (indent 1))
  `(let ((,var ,value))
     (when ,var ,@body)))
有关此操作的详细信息,请查看信息节点缩进宏(elisp)。
我不知道类似的字体处理方法。

作为澄清,上面的代码块应该放在您希望应用的文件的顶部。这将适用于任何类型的文件,只要它作为注释出现在文件的语言中(例如在C++文件中,可以;用//替换)。我希望它可以在任何地方进行,但更典型的是在文件的末尾放置一个类似的本地变量块。文件顶部的文件局部变量总是使用其他语法(请参见指定文件变量的
C-hig
(emacs))。
(defmacro* when-let ((var value) &rest body)
  (declare (indent 1))
  `(let ((,var ,value))
     (when ,var ,@body)))