如何将Emacs的初始化文件位置声明为变量

3
我在几台计算机上使用Emacs(Linux和Windows计算机),通过ownCloud同步我的.emacs.d:.emacs(在~或Appdata中)只需加载{ownCloud目录}/.emacs.d/init.el。
我的问题是,如何获取该路径作为变量取决于操作系统/用户名。
例如,Zenburn主题的README要求您的init包括...
(add-to-list 'custom-theme-load-path "~/.emacs.d/themes/")

但是由于不同机器上我的主目录和.emacs.d路径不同,因此这将无法正常工作。我考虑采用以下方法进行修复:

(add-to-list 'custom-theme-load-path "{THE DIRECTORY THAT CONTAINS THIS INIT FILE}/themes/")

这可以做到吗?我只使用Emacs两周,所以请不要咬得太紧 :P


(注:fortnight为英国习惯用语,意为两周)

哦,你可能需要澄清一下你的问题。你的标题和正文不同。(另外,init文件的位置已经是一个变量了) - Malabarba
谢谢大家。对于第二个问题(正文)的示例,结果我需要在各个系统的.emacs中定义user-emacs-directory,然后在同步的init文件中使用类似(add-to-list 'custom-theme-load-path (concat user-emacs-directory "themes/"))的东西来允许主题文件夹。不是很优雅,但它有效。哦,对于问题的不清晰表示抱歉,那时已经很晚了。感谢@BruceConnor提供有关如何模块化我的init文件的信息。 - Inops
2个回答

3
变量system-type区分Linux和Windows机器。变量user-login-name是不言自明的。我使用它们来根据所在机器加载不同的文件。
(if (eq system-type 'gnu/linux)
   (when (string= user-login-name "home user name")
     (load-file "/path/to/file"))
   (when (string= user-login-name "work user name")
     (load-file "/path/to/other-file")))

说实话,这更适用于杂项配置。我不建议使用它来更改您的emacs目录位置。相反,为每台机器创建符号链接,以假装您的emacs目录在标准位置上。(我已经在4台不同的机器上这样做了几年,效果很好)。
最后,回答您的最后一个问题。 init文件已经是一个变量,它的名称是user-init-file。要提取其所在的目录,只需执行
 (file-name-directory user-init-file)

如果您的用户名相同,您也可以使用(getenv“变量名称”)查询环境变量,这应该足以区分任何两个系统。 - Malabarba

2

有一个user-emacs-directory变量。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接