【问题标题】:Finding the Emacs site-lisp directory查找 Emacs site-lisp 目录
【发布时间】:2011-08-03 19:09:40
【问题描述】:

我正在尝试让为 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 目录?

【问题讨论】:

    标签: emacs elisp dot-emacs


    【解决方案1】:

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

    【讨论】:

    • 这看起来像是 Emacs Lisp 可以为这个问题做的最好的。
    • 或者对于更通用的解决方案,您可以遍历当前的 load-path 并查找名为 w3m 的子目录,然后将它们全部添加到加载路径。但是,我不认为这真的是必要的。 w3m 不安装自己的自动加载器吗?应该!
    【解决方案2】:

    我在我的 Windows Emacs (23.4.1) 和 Mac OS Emacs (23.4.1) 上为我的其他加载项尝试了这个,它工作正常。

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

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

    【讨论】:

    • 我认为这不可靠。
    【解决方案3】:

    在您的 site-lisp 目录中创建一个 subdirs.el 文件,该文件执行 (add-to-list 'load-path (expand-file-name "w3m" (file-name-directory load-file-name)))。 也就是说,您也可以将 w3m 目录放在您喜欢的任何位置,这样您就不必担心 site-lisp 在哪里,而只需担心 w3m 在哪里。

    【讨论】:

      【解决方案4】:

      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 的回答是最好的)

      【讨论】:

        【解决方案5】:

        出于某种原因(见下文),我想将 package-user-dir (ELPA) 设置为 site-lisp-directory。

        应该可以从标准的exec-directory变量中推导出site-lisp-directory:

        (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。它不需要安装,因此可以便携运行,就像从棍子上一样。恕我直言,ELPA 应该使用它的 site-lisp-directory,以便这些软件包也可以便携安装。

        【讨论】:

          【解决方案6】:

          如果您使用的是 Emacs 23,您可以使用以下内容:

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

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

          【讨论】:

          • 那是 user 目录而不是系统目录。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多