4

我有一个文件夹/var/~/。在配置中.emacs,我想从这个文件夹中加载一些文件。我尝试使用(load-file "/var/~/foobar.el"),但emacs警报File error: Cannot open load file, ~/foobar.el。此外,我什至无法使用c-x c-f. 在 minibuffer 中,路径将自动重定向到我的家。我怎样才能在该文件夹中加载文件?

4

2 回答 2

7

您需要重命名您的目录。

load-file是一个简单的包装器load,它将给定的文件名传递给substitute-in-file-name. 从substitute-in-file-name(强调我的)的文档字符串中:

替换 FILENAME 中引用的环境变量。`$FOO' 其中 FOO 是一个环境变量名,意思是替换那个变量的值。变量名应以字符结尾,而不是字母、数字或下划线;否则,将整个变量名括在大括号中。

如果 `/~' 出现,通过那个 `/' 的所有 FILENAME 将被丢弃。如果 `//' 出现,那么直到并包括第一个 `/' 的所有内容都将被丢弃。

也就是说,substitute-in-file-name把之前的一切都扔掉/~,变成/var/~/foo.el~/foo.el

我完全看不出这种行为有任何原因,但它就是这样,你不能(容易)解决它,所以重命名是你摆脱这种困境的最好方法。

无论如何,这是一件合理的事情。通常在 Unix 系统上使用~目录名是个坏主意,而不仅仅是 Emacs。

于 2014-09-30T20:09:40.467 回答
1

lunaryorn 很好地解释了你的问题,我同意他的建议,即不在~文件路径中使用是最好的解决方案。但是,如果您出于某种原因无法重命名这些路径,我相信您可以substitute-in-file-name通过此处load记录的相对文件路径来解决问题。

基本上,您需要添加nilload-path变量中,然后将default-directory变量设置为麻烦的路径,最后使用相对名称加载文件。例如:

; adding nil causes load to also search your 'default-directory'
(setq load-path (append '(nil) load-path))
(setq default-directory "/tmp/~/")
(load "foobar.el")

请注意,如果您怀疑文件名可能存在于您的其他地方(从中加载),您load-path需要确保您想要的文件位于load-path.

请参阅程序如何加载

于 2014-09-30T20:45:04.580 回答