我经常被问到的一个关于CIDER的问题是”我如何基于每个项目配置不同的XXX?”. 有时你会发现有人建议(甚至是去实现)将一些复杂的可配置变量根据不同情况设置不同的值, 幸运的是,我们无须怎么费力就能做到这一点. Emacs已经内置了directory-local(缩写为dir-local)变量来满足这一需求.
望文生义, dir-local变量的值对指定目录(及其子目录)下的所有文件都生效. 当然你也可以在major-mode或子目录中重新设置该变量的值. 要配置一个dir-local变量,步骤为:
- 调用 =M-x add-dir-local-variable=.
- 该命令会提示你依次输入 dir-local变量要在哪个major-mode下生效,变量名称以及变量的值.
- 最后,它会再当前目录下找到或新建一个名为
.dir-locals.el
的文件. 保存该文件,配置就完成了.
经过上面的步骤之后,你就配置了一个变量,该变量在当前目录下的任意位置的值都是指定的值. 因此,请确保你是在项目的根目录执行的这个命令. 若你使用 Projectile, projectile-edit-dir-locals
这个命令就会做这些动作.
还有些事情需要注意一下:
- 若你再输入major-mode时输入了nil,则表示对所有的major-mode都生效.
- 在提示输入变量名是,可以按下TAB键进行补全.
- 若你设置的变量名为eval,则随后应该输入的时一个lisp表达式,而不是一个值. 每次访问该目录下的文件时,都会执行一次该lisp表达式.
- 设置完dir-local变量后,哪些预先已经打开的文件需要调用revert-buffer 才能让这些dir-local变量生效.