【问题标题】:maintaining multiple emacs configurations at the same time同时维护多个 emacs 配置
【发布时间】:2013-07-05 07:41:25
【问题描述】:

我想在同一台电脑上的同一用户帐户上同时维护多个 emacs 配置,例如 emacs-prelude、emacs-starter-kit 和我自己的自定义 emacs 配置。
为此,我设置了 .emacs1.d、.emacs2.d、.emacs3.d 等目录。

每个 emacs 用户目录都有一个应该在启动时加载的 init.el 文件。而不是 .emacs 文件,我更喜欢使用 init.el 文件。

如何加载这些自定义配置目录?

我尝试运行emacs --eval '(setq user-emacs-directory "~/.emacs1.d/")'

它只是设置 user-emacs-directory 的值,而不是从中加载文件

【问题讨论】:

  • 出于好奇:您需要什么,例如emacs-starter-kit 无法提供?

标签: emacs elisp


【解决方案1】:

我会尝试类似的东西

emacs -q --eval '(load-file "~/.emacs1.d/init.el")'

然后你会在你的 init.el 文件的开头做一些事情:

(setq user-emacs-directory "~/.emacs1.d/")

(或者您也可以将两者都作为命令行参数进行评估)

【讨论】:

  • 我刚刚尝试这样做,这样我就可以使用我自己配置​​的~/.emacs.d/ 和 emacs-for-clojure。它让我意识到一个潜在的问题,即配置文件在某些​​地方硬编码"~/.emacs.d/foobar.el",忽略您对user-emacs-directory 的更改并破坏配置。这个问题可以通过使用(concat user-emacs-directory "foobar.el") 来避免,因此路径名取决于您将user-emacs-directory 设置为什么。人们在为其他人使用配置时应该真正考虑到这一点。
【解决方案2】:

如果你想从控制台调用东西,我会把它放在 .bashrc 中:

export emacs1=~/.emacs1.d/init.el
export emacs2=~/.emacs2.d/init.el
export emacs3=~/.emacs3.d/init.el

然后像这样调用它们:

emacs -q -l $emacs1
emacs -q -l $emacs2
emacs -q -l $emacs3

你甚至可以在 $ 符号后完成 bash。

你甚至可以像这样给这些东西起别名:

alias emacs1='emacs -q -l ~/.emacs1.d/init.el'
alias emacs2='emacs -q -l ~/.emacs2.d/init.el'
alias emacs3='emacs -q -l ~/.emacs3.d/init.el'

然后像这样调用它们:

emacs1
emacs2
emacs3

当然,

(setq user-emacs-directory "~/.emacs1.d/")

仍然必须在每个init.el 中。

【讨论】:

    【解决方案3】:

    或者,您可以使用单个 ~/.emacs 或 init.el 文件并选择要加载的配置目录。

    (defvar *emacs-prelude-enabled* t)
    (defvar *emacs-starter-enabled* nil)
    (defvar *other-config-enabled* nil)
    
    (cond (*emacs-prelude-enabled* 
           (add-to-list 'load-path "~/.emacs1.d/")
           (load "~/.emacs1.d/init.el"))
          (*emacs-starter-enabled* 
           (add-to-list 'load-path "~/.emacs2.d/")
           (load "~/.emacs2.d/init.el"))
          (*other-config-enabled*
           (add-to-list 'load-path "~/.emacs3.d/")
           (load "~/.emacs3.d/init.el")))
    

    【讨论】:

    • 如果您可以使用命令行参数将其中一个值设置为 true,这可能会很有用。
    • 你可以试试emacs --eval '(setq *emacs-prelude-enabled* t)'
    • 您可以将其隐藏在别名后面,或者使用 command-switch-alist 构建类似 emacs --startup prelude 的内容(如果您关心的是 eval)。
    • 实际上,如果您将其与 juanleon 的答案结合起来并包括为每个条件设置 user-emacs-directory 变量(并将该变量用作 (add-to-list) 的第二个参数),这真的很优雅出于 DRY 的原因),然后使用 command-switch-alist 加载。
    【解决方案4】:

    chemacs 是一款用于管理多个 Emacs 配置的软件。见https://github.com/plexus/chemacs

    【讨论】:

      【解决方案5】:
      • 为您的 Emacs 配置文件创建新文件夹 - 例如/home/user/.emacs.d.vanilla
      • 在其中创建init.el 并在其中复制以下两行。这些行将告诉 Emacs 将新的 init.el 视为主配置文件,并将其文件夹视为主配置文件夹:
      (setq user-init-file (or load-file-name (buffer-file-name)))
      (setq user-emacs-directory (file-name-directory user-init-file))
      

      现在像这样启动emacs:

      emacs -q -l /home/user/.emacs.d.vanilla/init.el
      
      • -q - 跳过默认的 ~/.emacs.d/init.el
      • -l - 加载我们的特殊 init.el,它告诉 Emacs 新的初始化文件夹和初始化文件位置。

      【讨论】:

        【解决方案6】:

        作为nikanswer 和他们的评论here 的扩展,这就是我所做的,最后:

        ;;; -*- lexical-binding: t -*-
        ;;
        ;; Added to appease the package.el gods
        ;; (package-initialize)
        
        ;; Select the profile based on which command-line argument used
        
        (defvar *emacs-config-switcher/profiles-alist* nil
          "An alist for the profiles that are registered here")
        
        (defun emacs-config-switcher/register-profile (key path &optional file)
          "Register profiles to global variable, referenced by KEY.
        
        PATH points to the directory where the profile is stored. By default, will use init.el,
        but it can be specified using FILE."
          (or file (setq file "init.el"))
          (setq *emacs-config-switcher/profiles-alist* (cons (cons key (list
                                                                        :directory (file-name-as-directory path)
                                                                        :file (expand-file-name file path)))
                                                        *emacs-config-switcher/profiles-alist*)))
        
        (defun emacs-config-switcher/load-profile (switch)
          "Load profile based on key."
          (let ((key (pop command-line-args-left)))
            (if (assoc key *emacs-config-switcher/profiles-alist*)
            (progn (let ((directory-path
                      (plist-get (cdr (assoc key *emacs-config-switcher/profiles-alist*)) :directory))
                     (init-file
                      (plist-get (cdr (assoc key *emacs-config-switcher/profiles-alist*)) :file)))
                 (setq user-emacs-directory directory-path)
                 (load init-file)))
              (error "Profile %s does not exist." key))))
        
        ; Register profiles here
        
        (emacs-config-switcher/register-profile "emacs-starter-kit" "~/emacs-profiles/emacs24-starter-kit")
        (emacs-config-switcher/register-profile "spacemacs" "~/emacs-profiles/spacemacs")
        
        ; Add the custom switches
        
        (add-to-list 'command-switch-alist '("-S" . emacs-config-switcher/load-profile))
        (add-to-list 'command-switch-alist '("--startup" . emacs-config-switcher/load-profile))
        
        ;;; init.el ends here
        

        我注意到的一件事是,如果您使用像 spacemacs 这样的东西,它会失败,因为它正在寻找的不是 load-path,而是 user-emacs-directory。另外,将load-path 放入spacemacs 文件夹会使Emacs 抱怨load-path 有你的.emacs.d 文件,这会导致问题。

        事实上,这适用于spacemacsemacs-starter-kit。没有尝试任何其他配置,但我可能会开始研究。

        【讨论】:

          猜你喜欢
          • 2015-12-05
          • 2016-08-27
          • 2020-02-19
          • 2012-12-22
          • 2010-10-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多