我正在努力使我为OS X编写的Emacs配置文件在Ubuntu上运行。我有这条线:
(add-to-list 'load-path "/usr/local/Cellar/emacs/23.3/share/emacs/site-lisp/w3m")
用于加载emacs-w3m。在OS X上,我使用Homebrew安装了Emacs,因此它位于/usr/local/Cellar/,Ubuntu上的site-lisp目录位于不同的位置。如何以适用于两种操作系统的方式编写此行?是否有Emacs Lisp函数来检索site-lisp目录?
答案 0 :(得分:8)
不,没有办法。 site-lisp目录是一个约定,只有它的存在而不是它的路径。
您可以在Mac / Ubuntu上设置符号链接,也可以使用系统开关:
(defconst my-lisp-dir (cond
((equal system-type 'gnu/linux) "/usr/share/emacs/site-lisp/")
((equal system-type 'darwin) (concat "/usr/local/Cellar/emacs/" (number-to-string emacs-major-version) "." (number-to-string emacs-minor-version) "/share/emacs/site-lisp/"))
(t (concat "/usr/local/emacs/site-lisp/")))
然后
(add-to-list 'load-path (concat my-lisp-dir "w3m"))
答案 1 :(得分:1)
我在我的Windows Emacs(23.4.1)和Mac OS Emacs(23.4.1)上试用了我的其他附加组件并且它有效。
(concat (car load-path) "/w3m")
通常,load-path将site-lisp作为列表中的第一项。
答案 2 :(得分:1)
在site-lisp目录中创建一个subdirs.el
文件(add-to-list 'load-path (expand-file-name "w3m" (file-name-directory load-file-name)))
。
这就是说,您也可以将您的w3m目录放在任何您喜欢的位置,这样您就不必担心site-lisp在哪里,而只是在w3m的哪个位置。
答案 3 :(得分:1)
site-lisp
旨在使库可供给定系统上的所有用户使用,因此将基于每个系统进行管理。
如果您只是尝试跨服务器一致地管理自己的配置,请不要将内容放入site-lisp
;将它们放在用户目录的子目录下,例如~/.emacs.d/lisp/
,然后使用:
(add-to-list 'load-path (expand-file-name "~/.emacs.d/lisp/w3m"))
如果您确实想要在load-path
查询“site-lisp”目录(或看起来像这样的目录),您可以这样做:
(remove-if-not
(lambda (path) (string-match-p "/site-lisp\\'" path))
load-path)
(但如果你真的想把事情放在site-lisp
),斯特凡的回答是最好的
答案 4 :(得分:1)
出于某种原因(见下文),我想将package-user-dir
(ELPA)设置为site-lisp目录。
应该可以从标准exec-directory
变量推导出site-lisp目录:
(setq site-lisp-directory (concat exec-directory "../site-lisp")
至少使用GNU预编译的Emacs版本(这个目录已经存在)。最终创建目录:
(unless (file-accessible-directory-p site-lisp-directory)
(make-directory site-lisp-directory))
我的动机是package-user-dir
默认为%USERPROFILE%/.emacs.d/elpa/
,这似乎是一个相当奇怪的位置。应在所有用户的系统范围内安装软件包。此外,~/.emacs.d
包含服务器设置,自动保存列表和备份。当Emacs有一个专门的site-lisp-directory目录时,有什么包可以做。
然而,真正的"问题"是Windows的precompiled Emacs 24.3。它不需要安装,因此可以像棍子一样便携地运行。然后IMHO ELPA应该使用它的site-lisp-directory,这样包也可以移植安装。
答案 5 :(得分:-1)
如果您使用的是Emacs 23,则可以使用以下内容:
(concat user-emacs-directory
(convert-standard-filename "site-lisp/"))
但是,这只会找到用户安装的lisp文件的“默认”位置。