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

时间:2015-02-12 23:25:34

标签: emacs

我将我的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语法的人,在上面的具体示例中会是什么样子(添加自定义主题路径)?

2 个答案:

答案 0 :(得分:1)

您要找的是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/themes的符号链接所在的文件夹中还有~/Dropbox/emacs/init.el的符号链接。

答案 1 :(得分:0)

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

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

如果您在不同的计算机上最终遇到多个emacs会话,则可能会发生奇怪的冲突。例如,我最初这样做是因为我在家和工作中使用emacs,我只想维护一个配置设置。但是,我有时会注意到“奇怪的”#39;由于与某些emacs的冲突导致的行为。管家文件,自动保存文件,会话恢复文件等。我有一些问题,当我有一个系统没有在线一段时间,然后它确实上线,有问题解决如何同步文件用Dropbox等。

我现在使用git repo为我在github上托管的emacs配置。它不需要花费任何成本,我只需要将配置只是git co到.emacs.d。工作得更好,没有冲突。

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

关于您的原始问题,如果您不想对整个目录树进行符号链接,则另一个选项是添加其他目录,例如您的主题是否在您的init中的加载路径中.el文件,然后不用担心必须做任何默认路径的东西

相关问题