« ^ »

Spacemacs/Doom Emacsを飲み込む

所要時間: 約 5分

Emacsには良く設定された設定群に固有の名前を付けて配布するということがある。 通常それらはディストリビューションやスターターキットと呼ばれるらしい。 ここではそれらをプリセットと呼ぶことにする。

例えばSpacemacsやDoom Emacsが該当する。他にも実はいくつかある。 他にどのようなものがあるかについてはawesome-emacsのStarter Kitの項目を参照すると、 いろいろと紹介されている。もちろん紹介されていないものも世の中にはいっぱいあるだろう。

私自身はそれらをあまり使用しないが、設定の方法などを確認するためにしばしば使いたくなる。

それらプリセットはEmacsの初期化時に設定が読み込まれる。 しかし常にそれらを使用しない場合、任意のタイミングで環境を切り替えたい。 そのためEmacsが完全に起動した後で、任意のタイミングでに切り替えられるようにする。

Spacemacsを飲み込む

Spacemacsは非常に人気のあるEmacsのディストリビューションのひとつだ。 通常は~/.emacs.dにSpacemacsのリポジトリをcloneして用いる。

運用方法としてはhttps://github.com/TakesxiSximada/emacs.dを~/.emacs.dにcloneしている。 このリポジジトリの中のdistributions/spacemacsはGit Submoduleとなっており、実体はhttps://github.com/syl20bnr/spacemacsだ。 distributions/spacemacs/init.elをloadするための関数を定義する。

(defun start-spacemacs ()
  (interactive)
  (setq package-user-dir (expand-file-name "~/.elpa.spacemacs")
	spacemacs-start-directory (expand-file-name "~/.emacs.d/distributions/spacemacs/")
	spacemacs-bootstrap-file (file-name-concat spacemacs-start-directory "init.el")
	custom-file (locate-user-emacs-file "custom-spacemacs.el")
	)
  (setenv "SPACEMACSDIR" (expand-file-name "~/.emacs.d/spacemacs/"))
  (package-initialize t)
  (unless (package-installed-p 'use-package)
    (package-install 'use-package))
  (require 'use-package)
  (load spacemacs-bootstrap-file nil nil))

M-x start-spacemacs を実行するとパッケージ関連のパスを書き換え、Spacemacsのbootstrap用のファイルをロードする。

https://res.cloudinary.com/symdon/image/upload/v1645310753/blog.symdon.info/1645313344/spacemacs.gif

Doom Emacsを飲み込む

Doom EmacsはEmacsのディストリビューションでSpacemacsと並んで人気がある。 evil-modeを前提とした構成となっている。

運用方法としてはSpacemacsの時と同じだが、.emacs.dのの中のdistributions/doom-emacsをGit Submoduleにする。 実体はhttps://github.com/hlissner/doom-emacsだ。 distributions/doom-emacs/init.elをloadするための関数を定義する。

(defun start-doom-emacs ()
  (interactive)

  (setenv "EMACSDIR" (expand-file-name "~/.emacs.d/distributions/doom-emacs/"))
  (setenv "DOOMLOCALDIR" (expand-file-name "~/.emacs.d/doom.d/"))
  (setenv "DOOMDIR" (expand-file-name "~/.emacs.d/doom.d/"))

  (setq package-user-dir (expand-file-name "~/.elpa.doom-emacs")
	custom-file (locate-user-emacs-file "custom-doom-emacs.el")
	)

  (setq user-emacs-directory (expand-file-name "~/.emacs.d/distributions/doom-emacs/"))
  (load (concat user-emacs-directory "core/core") nil 'nomessage)
  (load (expand-file-name "~/.emacs.d/distributions/doom-emacs/init.el") nil 'nomessage)
  (switch-to-buffer (get-buffer "*doom*")))

https://res.cloudinary.com/symdon/image/upload/v1645341352/blog.symdon.info/1645313344/doom-emacs.gif

Spacemacsと違い、shellコマンドを用いてインストールや設定の反映を行う必要がある。 パッケージシステムにstraight.elを採用している。

Doom Emacs本体は .emacs.d/distributions/doom-emacs にサブモジュールとして登録した。 Doom Emacsの設定はデフォルトでは ~/.doom.d だが今回は .emacs.d/doom.d に配置したい。 そのため環境変数EMACSDIR / DOOMLOCALDIR / DOOMDIRの設定を行っている。

Doom Emacsでインストールされたパッケージは通常のものと分けたいので package-user-dir の設定を変更しているが、 Doom Emacsはstraight.elを採用しているため意図した挙動になっていない。 現状では ~/.emacs.d/doom.d/straight にパッケージが展開されてしまう。 これはどこかのタイミングで修正する。

過ぎ去った時間を取り戻すことはできない

EmacsがSpacemacsやDoom Emacsに変身した後、元の環境に戻すにはEmacsを再起動するしかない。 SpacemacsやDoom Emacsの初期化処理によって更新された変数や関数などの情報を、以前の状態に元に戻すのが困難だからだ。 過ぎ去った時間を取り戻すことはできない。

関連する処理だけ切り出した

自分のためだけに実装したものだし、こんな使い方をする人はいないだろうと思い、 今までは.emacs.d/init.elに直接関数を実装していた。 ただやはり.emacs.d/init.elの整理をしにくくなったため、別のファイルとして切り出すことにした。

make-possess-preset

;;; make-possess-preset --- Make process preset of configuration. -*- lexical-binding: t -*-

;;                          ⢠⣤⡀
;;                          ⣛⠷⣴⣶⣶⢶⣤⣄ ⣀
;;                          ⠈⠙⠻⡏⠈⠛⠛⠾⣾⣽⣷⣠⡄
;;                       ⣀⣤⠤⠴⠖⠒⠒⠶⠦⢤⣀⡋⠐⠦⠟⠘⠶⠄
;;                    ⣠⠴⠛⠉         ⠈⠙⠲⢤⡀
;;                 ⢀⣴⠛⠁                ⠙⢦⡀
;;                ⢠⠞⠁                    ⠹⣄
;;               ⢠⠏   ⢀⣇⢠     ⣀⣀⡀         ⠘⣆
;;               ⡟    ⠈⠉⠉   ⢠⣾⣿⣿⣿⣷⡄  ⢀⣤⣤⡄⠠⣼⢽⡄
;;              ⢸⠁         ⢀⣾⣿⣿⣿⣿⣿⣿  ⣿⣿⣿⣿⣆  ⣇
;;              ⡟         ⢀⣘⣿⣿⣿⣿⣿⣿⣿⠰⢲⣿⣿⣿⣿⣿  ⣿
;;             ⣸⠁         ⠘⠟⠚⣿⣿⣿⣿⣿⠏ ⢸⣿⣿⣿⣿⣿  ⡟
;;            ⢠⡏            ⢺⣿⣿⣿⠛⠁⣀⣀⠈⠿⣿⣿⣿⣕⠇⢰⡇
;;           ⢀⡾              ⢳⡀   ⠻⡿⠁ ⠹⠿⠟⠋ ⢸⡇
;;          ⣠⠟⢀⡀              ⢻⡄           ⢸⡁
;;       ⢀⡴⠞⠁⣠⠏               ⠈⡇           ⡼⠉⠳⣄
;;    ⣀⡴⠞⠉  ⢰⣇⣠⠤⠒         ⠰⢦⣦⡤⠾⠃          ⢠⠇  ⠸⡇
;; ⢠⠖⠋⢁          ⢠⡦         ⠈⠁        ⡤  ⢀⡞⠲⣶⡶⠶⠃
;; ⠸⡆  ⠑⠢⢤⣀⡀    ⢀⡾⠁        ⢀        ⣇⢠⠇  ⣾⠁
;;  ⠹⣄     ⠉  ⣀⡴⢟⡼         ⣿ ⣠⠄   ⣤ ⠉⠉  ⡼⠁
;;   ⠈⠉⠑⠒⠒⠒⠒⠒⣻⠋ ⡎  ⣀⠄ ⢠⡼⠃  ⠉⠉⠁  ⢀⡾⠁   ⢀⡞⠁
;;          ⢰⠃  ⠉⠉⠉⠁ ⣠⠟       ⣠⡶⠋    ⢠⠞
;;          ⡏⢀       ⡏    ⢀⣀⣠⡾⠋ ⡀  ⢀⡴⠃
;;          ⣇⠈⠁⢀⣠⠤⠖⠒⠚⣇  ⣠⡴⠛⠁ ⢷⣀  ⣀⡾⠋
;;          ⠸⣦⠴⠋     ⠉⠙⠋⠁     ⠈⠛⠛⠁
;;           ⣀⣀  Image: https://emojicombos.com/ghost-ascii-art
;;
;; Copyright (C) 2022 TakesxiSximada

;; Author: TakesxiSximada <[email protected]>
;; Maintainer: TakesxiSximada <[email protected]>
;; Version: 1
;; Package-Version: 20220528.0000
;; Package-Requires: ((emacs "27.1"))
;; Date: 2022-05-28

;; This file is part of make-possess-preset.

;; make-possess-preset is free software: you can redistribute it and/or
;; modify it under the terms of the GNU Affero General Public License as
;; published by the Free Software Foundation, either version 3 of the
;; License, or (at your option) any later version.

;; make-possess-preset is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
;; Affero General Public License for more details.

;; You should have received a copy of the GNU Affero General Public
;; License along with this program.  If not, see
;; <https://www.gnu.org/licenses/>.

;;; Code:

;;;###autoload
(defun make-possess-preset-of-spacemacs ()
  (interactive)
  (setq package-user-dir (format "%s.spacemacs" package-user-dir)
	spacemacs-start-directory (expand-file-name "~/.emacs.d/distributions/spacemacs/")
	spacemacs-bootstrap-file (file-name-concat spacemacs-start-directory "init.el")
	custom-file (locate-user-emacs-file "custom-spacemacs.el")
	)
  (setenv "SPACEMACSDIR" (expand-file-name "~/.emacs.d/spacemacs.d/"))
  (package-initialize t)
  (load spacemacs-bootstrap-file nil nil))

;;;###autoload
(defun make-possess-preset-of-doom-emacs ()
  (interactive)
  (setenv "EMACS" "/Applications/Emacs28.0.50.app/Contents/MacOS/Emacs")
  (setenv "EMACSDIR" (expand-file-name "~/.emacs.d/distributions/doom-emacs/"))
  (setenv "DOOMLOCALDIR" (expand-file-name "~/.emacs.d/doom.d/"))
  (setenv "DOOMDIR" (expand-file-name "~/.emacs.d/doom.d/"))

  (setq package-user-dir (format "%s.doom-emacs" package-user-dir)
	custom-file (locate-user-emacs-file "custom-doom-emacs.el")
	)

  (setq user-emacs-directory (expand-file-name "~/.emacs.d/distributions/doom-emacs/"))
  (load (concat user-emacs-directory "core/core") nil 'nomessage)
  (load (expand-file-name "~/.emacs.d/distributions/doom-emacs/init.el") nil 'nomessage)
  (switch-to-buffer (get-buffer "*doom*")))

(provide 'make-possess-preset)
;;; make-possess-preset.el ends here