【问题标题】:Path with a folder named tilde(~) can't be recognized by load-file in emacsemacs 中的加载文件无法识别带有波浪号 (~) 文件夹的路径
【发布时间】:2014-11-25 09:28:47
【问题描述】:

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

【问题讨论】:

  • 该目录的字面意思是 ~ 吗?如果是这样,这并不是一个绝妙的主意,因为~ 在各种情况下往往会扩展到主目录。
  • Emacs 开个玩笑,这是关于使用程序,而不是制作程序。
  • Paul R 是正确的 - 将您的文件夹 ~ 重命名为其他名称,因为该字符通常被 Emacs 识别为主目录的路径。
  • 出于好奇:你为什么将目录命名为~?是什么让你想到这样做?我想知道某处的某些文档是否可能不清楚并导致您这样做。
  • 因为好奇:)

标签: emacs directory tilde


【解决方案1】:

您需要重命名您的目录。

load-fileload 的简单包装器,它通过substitute-in-file-name 传递给定的文件名。来自substitute-in-file-name 的文档字符串(强调我的):

替换 FILENAME 中引用的环境变量。 `$FOO' 其中 FOO 是一个环境变量名意味着替换 该变量的值。变量名应该终止 字符不是字母、数字或下划线;否则,附上 大括号中的整个变量名。

如果 `/~' 出现,则通过该 `/' 的所有 FILENAME 都将被丢弃。 如果出现 `//',则包括第一个 `/' 在内的所有内容都将被丢弃。

换句话说,substitute-in-file-name 抛弃了/~ 之前的所有内容,将/var/~/foo.el 变成了~/foo.el

我完全看不出这种行为有任何原因,但事实就是如此,您无法(轻松)解决它,因此重命名是摆脱这种困境的最佳方法。

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

【讨论】:

  • 感谢您的回复,也许重命名是最好的解决方案。
  • 我相信原因是作为返回~/(根目录)的捷径。否则,唯一的方法是从任意深度的目录退格到根目录,然后/home/username/ 回到~
【解决方案2】:

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

基本上,您需要将nil 添加到您的load-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 的第一个位置。

How programs do loading

【讨论】:

    猜你喜欢
    • 2017-05-10
    • 2018-12-20
    • 2019-12-19
    • 1970-01-01
    • 2021-05-24
    • 1970-01-01
    • 2019-05-22
    • 2020-11-29
    • 2020-01-19
    相关资源
    最近更新 更多