查找Emacs site-lisp目录

时间:2011-08-03 19:09:41

标签: emacs elisp dot-emacs

我正在努力使我为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目录?

6 个答案:

答案 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文件的“默认”位置。