寻找Emacs的site-lisp目录

10

我试图让写给 Mac 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个回答

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
这似乎是Emacs Lisp在解决这个问题时最好的表现。 - hekevintran
或者,为了得到更通用的解决方案,您可以循环遍历当前的 load-path 并查找名为 w3m 的子目录,然后将它们全部添加到加载路径中。但是,我认为这并不是必要的。w3m 不应该安装自己的 autoloads 吗?它应该会自动安装! - tripleee

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目录时,包与那里有什么关系。

然而,真正的“问题”是Windows预编译的Emacs 24.3。它不需要安装,因此可以像从存储设备中运行一样便携。在我看来,ELPA应该使用其site-lisp目录,这样包也可以便携地安装。

1

我在我的Windows Emacs(23.4.1)和Mac OS Emacs(23.4.1)上尝试了我的其他插件,它可以正常工作。

(concat (car load-path) "/w3m")

通常,load-path 列表中的第一项是 site-lisp。

3
我认为那不可靠。 - phils

1
在您的site-lisp目录中创建一个名为subdirs.el的文件,其中包含以下代码:(add-to-list 'load-path (expand-file-name "w3m" (file-name-directory load-file-name)))
此外,您也可以将w3m目录放置在任何您喜欢的位置,这样您就不必担心site-lisp的位置,只需关注w3m的位置即可。

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中的内容,Stefan的答案是最好的)

-1
如果您使用的是Emacs 23,您可以使用以下命令:
(concat user-emacs-directory
        (convert-standard-filename "site-lisp/")) 

然而,这只会找到用户安装的lisp文件的“默认”位置。


那是用户目录,不是系统目录。 - Michael Markert

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