同时维护多个Emacs配置

16

我希望在同一个用户账户和电脑上同时维护多个emacs配置,比如像emacs-prelude、emacs-starter-kit和自己定制的emacs配置等。为此,我已经设置了像 .emacs1.d、.emacs2.d、.emacs3.d 这样的目录。

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

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

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

它只是设置了 user-emacs-directory 的值,但并没有从其中加载文件。


出于好奇,您需要什么,例如emacs-starter-kit无法提供的? - Andreas Röhler
6个回答

6
我会尝试类似这样的东西:
emacs -q --eval '(load-file "~/.emacs1.d/init.el")'

然后,您可以在init.el文件的开头执行以下操作:

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

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

1
我刚试过这样做,这样我就可以同时使用我自己配置的~/.emacs.d/和emacs-for-clojure。这让我意识到一个潜在的问题,即在某些地方硬编码了"~/.emacs.d/foobar.el"的配置文件,忽略了你对user-emacs-directory的更改并破坏了配置。可以通过改用(concat user-emacs-directory "foobar.el")来避免这个问题,这样路径名就取决于你设置的user-emacs-directory。当为其他人制作配置时,人们应该真正考虑到这一点。 - Sotanaht

6

如果你喜欢从控制台调用东西,那么我会把这个放在.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文件中进行设置。


5

4

或者,您可以使用单个~/.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,那么这可能会很有用。 - Sotanaht
1
你可以尝试这样做:emacs --eval '(setq *emacs-prelude-enabled* t)' - zzkt
1
你可以将其隐藏在别名后面,或使用command-switch-alist来构建类似 emacs --startup prelude 的东西,如果您担心的是eval - zzkt
如果你将这个与juanleon的回答结合起来,并为每个条件设置user-emacs-directory变量(并将变量用作DRY原则的第二个参数添加到(add-to-list)中),那么这实际上非常优雅,然后使用command-switch-alist进行加载。 - mike

3
  • 为你的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新的初始化文件夹和初始化文件位置。

1
作为nik答案的延伸,以及他们在这里的评论,最终我做了以下事情:
;;; -*- 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文件,这将引起问题。
目前为止,这个方法可以与 spacemacs emacs-starter-kit一起使用。我还没有尝试其他配置,但我可能会开始研究一下。

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