关于 .dir-locals.el 和 default-directory

问题

Emacs会自动把 default-directory 设置成 .dir-locals.el 所在的目录, virtualenvwrapper.el 提供的 venv-workon会修改default-directory,find-file 是依赖 default-directory的,导致执行find-file时每次的目录前缀都是 .dir-locals.el 所在的目录,而不是当前文件所在目录。

我没有看到相关文档里有说明 .dir-locals.el 对 default-directory 的影响,所以发现这个问题时没想到是 .dir-locals.el 导致的。

.dir-locals.el 内容:

((python-mode
  (eval . (venv-workon "myproject"))
  (flycheck-checker . python-pylint)))

解决方法

给项目的每个目录都加上一个 .dir-locals.el 不是一个太好的方法。 现在办法是在find-file时设置default-directory。

(add-hook 'find-file-hook (lambda ()
                            (setq default-directory
                                  (file-name-directory (buffer-file-name)))))

听起来很怪?不太可能会这样,或许你漏提了某些条件?比如这个 .dir-locals.el 的内容。

修改了原帖。

我测试过把项目根目录的 .dir-locals.el 删掉,find-file的行为就正常了。

我又细致的检查了下,是 venv-workon的问题。

1 个赞