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: */
还有一些特殊的本地变量,如 mode , coding , eval , unibyte ,它们不是真的变量,将他们设置在其他上下文中没有特殊的含义。
-*- 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 Variables
文件局部变量很危险2,当你访问别人的文件时,你无法知道它的局部变量列表会对Emacs做什么。
因此每当Emacs遇到未知安全的文件局部变量值时,它会显示文件的整个局部变量列表,在设置之前请求确认。
Footnotes:
Safety of File Variables: https://www.gnu.org/software/emacs/manual/html_node/emacs/Safe-File-Variables.html