根据Emacs文档,目录变量适用于包含文件的目录下的所有.dir-locals.el文件.
如何在该文件中将变量设置为包含该文件的完整路径?例如:
((nil . ((indent-tabs-mode . t)
(my-project-path **THIS_DIRECTORY**))))
Run Code Online (Sandbox Code Playgroud)
nbe*_*rth 11
我问自己同样的问题,并没有在网上找到解决方案,所以我认为这个答案可能有所帮助.实际上,事实证明我们可以重dir-locals-find-file用来获取包含该.dir-locals.el文件的目录.所以这就是我找到的,例如,设置一个专用于整个目录的aspell个人字典:
((nil . ((eval . (setq ispell-personal-dictionary
(expand-file-name
".aspell_words"
(file-name-directory
(let ((d (dir-locals-find-file ".")))
(if (stringp d) d (car d))))))))))
Run Code Online (Sandbox Code Playgroud)
此外,似乎条目按照指定的顺序进行评估,因此以下代码应该起作用:
((nil . ((eval . (set (make-local-variable 'my-project-path)
(file-name-directory
(let ((d (dir-locals-find-file ".")))
(if (stringp d) d (car d))))))
(eval . (message "Project directory set to `%s'." my-project-path)))))
Run Code Online (Sandbox Code Playgroud)
Emacs会抱怨不安全的局部变量(由于eval构造),但仍然可以永久地标记它是安全的.
我认为(file-name-directory (or load-file-name buffer-file-name))应该给你目录路径.
请参见http://xahlee.org/emacs/elisp_idioms_batch.html
编辑:除非它不会,因为任何eval表达式都是在其变量被黑客攻击的缓冲区的上下文中计算的.
如果对OP或其他人来说仍然很重要,我建议您创建一个函数来生成文件.dir-locals.el。然后我们可以写这样的东西:
(let ((path default-directory)
file)
(setq file (format "%s/.dir-locals.el" path))
(with-temp-buffer
(insert (format "((nil . ((indent-tabs-mode . t)
(my-project-path \"%s\"))))" path))
(when (file-writable-p file)
(write-region (point-min)
(point-max)
file))))
Run Code Online (Sandbox Code Playgroud)
在项目主目录中执行。
| 归档时间: |
|
| 查看次数: |
7767 次 |
| 最近记录: |