【问题标题】:Emacs Per File CustomizationEmacs 每个文件自定义
【发布时间】:2010-12-04 23:42:15
【问题描述】:

我有一个带有自定义宏的 Emacs Lisp 文件,我希望字体化和缩进不同。代码如下:

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

(defun func ()
  (when-let (a 1)
    a))

我希望将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)))))

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

【问题讨论】:

    标签: emacs elisp


    【解决方案1】:

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

    ;;; Local Variables:
    ;;; mode: outline-minor
    ;;; eval: (hide-body)
    ;;; End:
    

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

    请注意,上面启用次要模式的示例已弃用(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:
    

    不同之处在于,对于 safe-local-variable-values,后者将被视为单个值,而对于多个 eval 值,每个值都被独立考虑。

    1C-hig (elisp) File Local Variables RET

    【讨论】:

    • 澄清一下,上面的代码块应该放在你希望它应用到的文件的顶部。这适用于任何类型的文件,只要它作为注释出现在文件的语言中(例如,在 C++ 文件中,;;; 可以替换为 //)。
    • 我希望它可以去任何地方,但更典型的做法是将像这样的局部变量块放置在文件的最 end 处。位于文件顶部的文件局部变量总是使用其他语法(参见C-h i g(emacs) Specifying File VariablesRET)。
    【解决方案2】:

    为了识别你的 when-let 宏,你可以使用缩进声明:

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

    查看信息节点(elisp)Indenting Macros 了解更多信息。 我不知道关于字体化的类似事情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-19
      相关资源
      最近更新 更多