Emacs 使用相对于 init.el 文件的路径

Emacs using path relative to init.el file

我将我的 Emacs init.el 文件连同颜色主题等相关文件一起存储在 Dropbox 中。假设我有一个目录 ~/Dropbox/emacs,其内容类似于:

.
├── init.el
└── themes
    └── zenburn-theme.el

然后在我的 Linux 机器上,我只是有一个从 ~/emacs.d/init.el~/Dropbox/emacs/init.el 的符号链接,它工作得很好。不过在我的 init.el 中,我希望能够使用相对于 init.el 文件本身的路径加载主题。即我想做类似的事情:

(add-to-list 'custom-theme-load-path "./themes/")
(load-theme 'zenburn t)

我使用 "./themes/" 作为相对于 init.el 的路径似乎没有按预期工作。我可以将其更改为:

(add-to-list 'custom-theme-load-path "~/Dropbox/emacs/themes/")
(load-theme 'zenburn t)

它会起作用的。但是,我更喜欢相对于 init.el 文件的表示法。这样,例如,如果我以后决定将所有 init.el 文件和其他相关文件放在 Dropbox 以外的其他地方,我可以简单地复制整个目录并重新连接单个 init.el 符号链接,而无需将所有引用更改为 ~/Dropbox.

所以,

  1. 有没有办法引用与 init.el 文件相关的目录?
  2. 作为一个不太精通 Lisp 语法的人,在上面的具体示例中(添加自定义主题路径)会是什么样子?

我在评论中提到,如果您改为对目录进行符号链接而不是仅对 init.el 文件进行符号链接,则可以避免该问题。

但是,我突然想到警告您这种方法的一些陷阱可能是个好主意。我以前是这样做的,但后来发现它会产生一些问题。

如果您最终在不同机器上有多个 emacs 会话,可能会发生奇怪的冲突。例如,我最初这样做是因为我在家里和工作中都使用 emacs,我只想维护一个配置设置。但是,我有时会注意到 'odd' 行为,因为它与一些 emacs 的内务管理文件、自动保存文件、会话恢复文件等发生冲突。当我的系统长时间未联机时,我也遇到了一些问题当它确实上线时,在解决如何与 dropbox 同步文件等问题时遇到了问题。

我现在为托管在 github 上的 emacs 配置使用 git 存储库。它不需要任何费用,我要做的就是让我的配置 git co into .emacs.d。工作得更好,没有冲突。

Dropbox 非常适合共享文件,但如果文件代表经常修改的应用程序数据,则效果不佳。

关于您最初的问题,如果您不想对整个目录树进行符号链接,另一种选择是只添加其他目录,例如您的主题位于 init.el 文件,然后不用担心必须做任何默认路径的事情

您要查找的是 load-file-name,它包含当前正在加载的文件的完整路径,对于您的示例,它类似于 "/home/username/emacs.d/init.el".

然后您可以使用 file-name-directory 剥离文件名本身,只保留目录路径,然后在其前面添加 expand-file-name.

(add-to-list 'load-path (expand-file-name "themes/" (file-name-directory load-file-name)))

请注意,它不会遵循符号链接:您将获得最初打开的路径,而不是符号链接指向的路径。对于您的示例,您需要确保在与 ~/Dropbox/emacs/init.el.

的符号链接相同的文件夹中还有一个指向 ~/Dropbox/emacs/themes 的符号链接