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 Variables2
文件局部变量很危险,当你访问别人的文件时,你无法知道它的局部变量列表会对Emacs做什么。
因此每当Emacs遇到未知安全的文件局部变量值时,它会显示文件的整个局部变量列表,在设置之前请求确认。
Footnotes:
Safety of File Variables: https://www.gnu.org/software/emacs/manual/html_node/emacs/Safe-File-Variables.html