查找Emacs站点lisp目录

查找Emacs站点lisp目录,emacs,elisp,dot-emacs,Emacs,Elisp,Dot Emacs,我试图让我为OSX编写的Emacs配置文件在Ubuntu上工作。我有一句话: (add-to-list 'load-path "/usr/local/Cellar/emacs/23.3/share/emacs/site-lisp/w3m") 它用于加载emacs-w3m。在OSX上,我使用自制软件安装了Emacs,因此它位于/usr/local/cillar/。Ubuntu上的站点lisp目录位于不同的位置。我怎样才能在两种操作系统上都能工作呢?是否有用于检索站点Lisp目录的Emacs Li

我试图让我为OSX编写的Emacs配置文件在Ubuntu上工作。我有一句话:

(add-to-list 'load-path "/usr/local/Cellar/emacs/23.3/share/emacs/site-lisp/w3m")

它用于加载emacs-w3m。在OSX上,我使用自制软件安装了Emacs,因此它位于/usr/local/cillar/。Ubuntu上的站点lisp目录位于不同的位置。我怎样才能在两种操作系统上都能工作呢?是否有用于检索站点Lisp目录的Emacs Lisp函数?

如果您使用的是Emacs 23,则可以使用以下功能:

(concat user-emacs-directory
        (convert-standard-filename "site-lisp/")) 

但是,这将只找到用户安装的lisp文件的“默认”位置。

不,没有办法。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"))

我在我的WindowsEmacs(23.4.1)和MacOSEmacs(23.4.1)上尝试了这个插件,它成功了

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

通常,加载路径将站点lisp作为列表中的第一项。

在站点lisp目录中创建一个
subdirs.el
文件,该文件不执行
(添加到列表“加载路径”(展开文件名“w3m”(文件名目录加载文件名))

这就是说,您也可以将w3m目录放在任何您喜欢的地方,这样您就不必担心site lisp在哪里,而只需要担心w3m在哪里。

site lisp
旨在使给定系统上的所有用户都可以使用库,因此将按系统进行管理

如果您只是试图跨服务器一致地管理自己的配置,请不要将内容放入
站点lisp
;将它们放在用户目录的子目录下,例如
~/.emacs.d/lisp/
,然后使用:

(添加到列表的加载路径(扩展文件名“~/.emacs.d/lisp/w3m”))
如果您确实想查询
加载路径
中的“site lisp”目录(或类似目录),可以执行以下操作:

(如果没有,请删除
(lambda(路径)(string-match-p“/site lisp\\\'”路径))
加载路径)
(但是如果你真的想把东西保存在
site lisp
中,Stefan的答案是最好的)

出于某种原因(见下文),我想将
package user dir
(ELPA)设置到site lisp目录

应该可以从标准
exec目录
变量推断站点lisp目录:

(setq-site-lisp目录(concat-exec目录)。/site-lisp)
至少对于来自GNU的预编译Emacs版本,这是有效的(目录已经存在)。最终创建目录:

(除非(file-accessible-directory-p site lisp directory)
(使目录站点成为lisp目录)
我的动机是,默认情况下,
package user dir
%USERPROFILE%/.emacs.d/elpa/
,这似乎是一个相当奇怪的位置。软件包应在系统范围内为所有用户安装。此外,
~/.emacs.d
包含服务器设置、自动保存列表和备份。当emacs有一个ded时,软件包在那里做什么一个人可以问到icated站点lisp目录


然而,真正的“问题”是针对Windows的。它不需要安装,因此可以像从一根棍子上一样可移植运行。然后IMHO ELPA应该使用其站点lisp目录,这样包也可以移植安装。

这是用户目录,而不是系统目录。这看起来是Emacs lisp解决此问题的最佳方法。或者,对于更一般的解决方案,您可以UDE循环您当前的代码>加载路径< /代码>,查找名为“代码> W3M < /代码>的子目录,然后将它们全部添加到加载路径。但是,我不认为这真的是必要的。难道<代码> W3M < /代码>安装它自己的AutoLoad?应该!我不认为这是可靠的。