Подтвердить что ты не робот

Одновременное сохранение нескольких конфигураций emacs

Я хочу поддерживать несколько конфигураций 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, но не загружает из него файлы

4b9b3361

Ответ 1

Я бы попробовал что-то вроде

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

И тогда вы сделаете что-то вроде начала ваших файлов init.el:

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

(или вы также можете оценить обе вещи как параметры командной строки)

Ответ 2

В качестве альтернативы вы можете использовать один файл ~/.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")))

Ответ 3

Если вы хотите вызывать вещи из консоли, я бы поместил это в .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.

Ответ 4

В качестве расширения ник ответ, и их комментарий здесь, вот что я сделал, в конце концов:

;;; -*- 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 ваш файл .emacs.d, что может вызвать проблемы.

На самом деле, это работает как с spacemacs, так и с emacs-starter-kit. Я не пробовал никаких других конфигураций, но я мог бы начать изучать это.

Ответ 5

chemacs - это часть программного обеспечения для управления несколькими конфигурациями Emacs. Смотрите https://github.com/plexus/chemacs.

Ответ 6

Симлинки могут быть отличным выбором из нескольких конфигураций. См. fooobar.com/questions/963303/....

Ответ 7

  • Создайте новую папку для вашего профиля Emacs - например, /home/user/.emacs.d.vanilla
  • Создайте в нем init.el и скопируйте в него следующие две строки. Эти строки 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 - пропустить -q по умолчанию ~/.emacs.d/init.el
  • -l - загрузите наш специальный init.el который сообщает Emacs о новой папке инициализации и расположении файла инициализации.