2010-12-04 41 views
5

我有一个Emacs Lisp文件与自定义宏,我想要分化和缩进。代码如下:Emacs每个文件定制

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

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

我想when-let fontified为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,因为它只适用于一个文件。

回答

9

您可以通过指定eval:文件局部变量指定评估elisp的(文档“评估和演示:”说,但只有小写“EVAL:”似乎工作)。例如: -

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

作为一种安全措施,Emacs会问你确认,只要自己认为它不承认是安全值。如果您告诉它永久记住它,它会将值写入safe-local-variable-values的init文件的(custom-set-variables)部分。

请注意,上面的启用次要模式的示例已被弃用(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的值则被认为是独立的。

我克(elisp) File Local VariablesRET

+1

作为一点澄清,上面的代码块应该放在您希望应用的文件的顶部。这适用于任何类型的文件,只要它以文件的语言显示为注释(例如,在C++文件中,可以用//替换;;;;;;;;;;;;;;;;;;;;;;;;;;;; – jwernerny 2010-12-06 14:22:18

3

对于identing你的时候,让宏,您可以使用缩进声明:

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

看看信息节点(elisp)Indenting Macros以获得更多关于此的信息。 我不知道有关类似的事情为正义。