Emacs本地变量

一般情况下,我们在 init.el 中设置一些变量可以全局生效,如果想针对不同的目录、不同的mode设置不同的变量,可以借助Emcas提供的Local Variables1机制。

Per-Directory Local Variables

为一个目录定义本地变量时,在目录下的 .dir-locals.el 中增加配置,该目录以及子目录的所有文件打开时配置会生效,未打开和之前已打开的不会生效。

除了 .dir-locals.el 外,还可以额外定义 .dir-locals-2.el ,一般 .dir-locals.el 在仓库中作为共享配置, .dir-locals-2.el 可以进行个性化配置。

示例:

((nil . ((indent-tabs-mode . t)
         (fill-column . 80)
         (mode . auto-fill)))
 (c-mode . ((c-file-style . "BSD")
            (subdirs . nil)))
 ("src/imported"
  . ((nil . ((change-log-default-name
              . "ChangeLog.local"))))))

Specifying File Variables

为某个文件设置本地变量时,一般有两种形式。

第一种形式,在文件第一行的注释中增加本地变量,像下面这样:

;; -*- mode: Lisp; fill-column: 75; comment-column: 50; -*-

另一种形式,在文件末尾的注释中增加,像下面这样:

/* Local Variables:  */
/* mode: xx          */
/* comment-column: 0 */
/* End:              */

还有一些特殊的本地变量,如 modecodingevalunibyte ,它们不是真的变量,将他们设置在其他上下文中没有特殊的含义。

-*- mode: my-old; mode: my-new -*-

Emacs将使用它能找到的最终 major mode 定义,所以在旧的Emacs版本中,它将忽略 my-new-mode ,而在定义 my-new-mode 的Emcas版本中,它将忽略 my-old-mode

类似的,在文件末尾的定义形式如下:

;; Local Variables:
;; mode: my-old
;; mode: my-new
;; End:

不要使用 mode 关键字定义 minor mode ,而应该使用 eval 运行lisp代码来启用或者关闭 minor mode

;; Local Variables:
;; eval: (eldoc-mode)
;; eval: (font-lock-mode -1)
;; End:

可以使用命令 M-x normal-mode 来重置文件的本地变量和 major-mode

Safety of File Variables2

文件局部变量很危险,当你访问别人的文件时,你无法知道它的局部变量列表会对Emacs做什么。

因此每当Emacs遇到未知安全的文件局部变量值时,它会显示文件的整个局部变量列表,在设置之前请求确认。

Footnotes:

Top