emacs/init/multi-emacs-config.el
2019-04-13 22:38:17 +08:00

141 lines
5.3 KiB
EmacsLisp

;;; multi-emacs-config.el --- A tool to use multiple emacs configurations -*- lexical-binding: t; -*-
;;
;; Author: Rongsong Shen<rshen@shenrs.eu>
;;
;;; Commentary:
;; This package will enable us to use multiple EMACS startup
;; configuration(startkit in this package) and switch between
;; these configuration just by change a single environment
;; variable (EMACS_STARTKIT).
;;
;; Currently, we have test it with following:
;; - doom-emacs
;; - spacemacs
;; - frontmacs
;; - ohai-emacs
;; - graphene
;; - prelude
;; - radian emacs
;;
;;; Code:
(require 'cl-lib)
(require 'comint)
(defvar emacs-start-kit "The name of emacs startkit we will use")
(defvar emacs-config-name "The directory name of emacs startkit")
(defvar emacs-config-directory "The based directory of emacs start configuration")
(defvar emacs-init-file "The full path of emacs start file")
(defvar startkit-info "Information to install emacs startkit")
(setq emacs-start-kit
(let ((start-kit (getenv "EMACS_STARTKIT")))
(if start-kit
start-kit
"spacemacs")))
(setq emacs-config-name emacs-start-kit)
(setq emacs-config-directory
(let ((config-dir (getenv "EMACS_CONFIG_DIR")))
(if config-dir
(concat config-dir "/"
emacs-config-name "/")
(concat (substitute-in-file-name "~/.config/emacs/")
emacs-config-name "/"))))
(unless (file-exists-p emacs-config-directory)
(make-directory emacs-config-directory t))
(setq user-emacs-directory emacs-config-directory)
(setq emacs-init-file
(expand-file-name "init.el" user-emacs-directory))
;; setup customization directory for emacs (custom.el)
(unless custom-file
(setq custom-file (expand-file-name "custom.el" user-emacs-directory)))
;; Setup default directory which package will be installed
(setq package-user-dir
(concat user-emacs-directory "/elpa"))
;; setup directory of spacemacs customization
(when (string= emacs-start-kit "spacemacs")
(let ((spacemacs-dir (concat emacs-config-directory "/.local/etc")))
(progn
(setenv "SPACEMACSDIR" spacemacs-dir))))
(setq startkit-info
'((doom-emacs .
(lambda (dir)
(list
(concat "git clone git@github.com:shen390s/doom-emacs.git " dir)
(concat "cd " dir)
"cp init.example.el init.el"
"make install"
"y")))
(frontmacs .
(lambda (dir)
(list
(concat "mkdir -p " dir )
(concat "cd " dir)
"wget https://raw.githubusercontent.com/shen390s/frontmacs/master/scripts/init-frontmacs.el"
"echo \"(load (expand-file-name \\\"init-frontmacs.el\\\" user-emacs-directory))\" >>init.el")))
(graphene .
(lambda (dir)
(list
(concat "git clone git@github.com:shen390s/dotfiles-emacs.git " dir))))
(ohai-emacs .
(lambda (dir)
(list
(concat "git clone git@github.com:shen390s/ohai-emacs.git " dir))))
(prelude .
(lambda (dir)
(list
(concat "git clone git@github.com:shen390s/prelude.git " dir))))
(spacemacs .
(lambda (dir)
(list
(concat "git clone https://github.com/syl20bnr/spacemacs.git " dir))))
(radian-emacs .
(lambda (dir)
(list
(concat "git clone -b radian https://github.com/shen390s/straight-emacs.git " dir))))
(hell-emacs .
(lambda (dir)
(list
(concat "git clone -b doom-emacs https://github.com/shen390s/straight-emacs.git " dir))))))
(defun install-emacs-startkit (name location)
"Function to install EMACS startkit. NAME is the name of EMACS startkit.
LOCATION is the target directory which startkit will be installed."
(progn (let* ((shell-buffer (make-comint-in-buffer "installer" nil "/bin/sh"))
(shell-process (get-buffer-process shell-buffer)))
(progn
(defun on-installer-finished (process event)
"Callback function when uinstaller process has finished.
We use this function to load startkit initialization file"
(cond
((string= event "finished\n") (load-file emacs-init-file))
(t (message "Event %s has been ignored" event))))
(set-process-sentinel shell-process 'on-installer-finished)
(display-buffer shell-buffer)
(cl-loop for cmd in (funcall (cdr (assoc (intern name) startkit-info))
location)
do (comint-simple-send shell-process
(concat cmd "\n")))
(comint-simple-send shell-process
"exit\n")))))
(if (not (file-exists-p emacs-init-file))
(progn
(install-emacs-startkit emacs-start-kit
emacs-config-directory))
(load-file emacs-init-file))
(provide 'multi-emacs-config)
;;; multi-emacs-config.el ends here