我有一个带有自定义宏的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因为它只适用于一个文件.
您可以通过指定值来指定文件局部变量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