SpacemacsからEmacsに移行した話


SpacemacsからEmacsに移行した話

Spacemacsから、Emacsに移行しました。
端的な理由としては、「カスタマイズしづらいから」です。

せっかくなので、これからSpacemacsから入ってEmacsを初めて設定書く人も参考になればいいなぁ

エディター遍歴

私の浮気性なエディター遍歴
メモ帳→言語ごとのIDE→Emacs→Atom→Emacs→VSCode→Emacs→Spacemacs→Emacs

CommonLispを書いていたこともあってSlimeが使えるEmacsに落ち着きがち。
Slimeの再現度は流石にEmacsが安定してますが、RoswellとかもあるのでVSCodeでも書けるかな、って気持ちになってます。

今もEmacsでこんな感じで書いてます。

そもそもSpacemacsとはなんぞや

Spacemacs、知らない人もいると思うので説明すると、「Emacsディストリビューション」です。
要するにSpacemacsはEmacsパッケージセットみたいなもんになります。
各種プラグインは入っているし、「Layer」と呼ばれるmodeの上位レイヤーみたいなものがあって、そいつを設定すれば必要なものをまとめて入れてくれます。
めっちゃ便利です。

では何故Spacemacsから無印Emacsに乗り換えたのか。
順を追って詳しく説明していきます。

きっかけ

きっかけは、emacs-mozcがバグっていて、Archとfcitx-mozcとコンフリクトする事でした。
このバグ自体はSpacemacs依存ではないのですが、手動で入れたmozcが消されたり、バージョン指定するのが、面倒くさくなったからですね。

カスタマイズのわかりづらさ

SpacemacsはEmacsと比べて、カスタマイズが容易に見えます。
実際それは、間違っていません。
それこそレイヤーに1単語書けばOK。

だけどもそれはパッケージの数が少ない時に限ります。
LayerとPackageで競合したり、違うバージョンを使いたい時に削除されたり、困ることが増えてきたのでEmacsに帰ることにしました。

設定ファイルのどこに書く?

最大の理由はこれでした。

カスタマイズする時に複数の方法があることでPackageのインストールをするたび迷います。
~/.spacemacsにすべて書けばいいんでしょうけど、複数台のPCを運用してると、片方はDevelopブランチから切ったSpacemacs。
もう一方はMaster
なのにPackageは同じで動かなくなり段々と困りだしました。

そこで、init.el.spacemacsで設定を分ける形を取りました。
こうすることで、共通の設定はspacemacsに書いてinit.elは個別の設定としました。

すると次は~/.spacemacs内部のdotspacemacs/user-config関数が肥大化し始めて収集がつかなってしまいました。
init.elを共通の設定にしてしまうと、dotspacemacs-additional-packagesも共通化しておかなくてはなりません。
正直、このあたりは私の問題だとは思いますが一度Emacsに戻ることで必要な機能の見極めに入ることにしたのです。

dotspacemacs/~という独自関数の多さ

Spacemacsにはdotspacemacs/user-config dotspacemacs/layersといったdotspacemacs独自の関数が現れます。
その結果、dotspacemacs依存のバグが発生した時には、この独自関数を読み解く必要が出てきます。

これがEmacsなら自分の設定ファイルの問題が9割なので、どこを直せば良いのかわかります。

特にLayerまわりに関しては、自動でPackageを入れてくれるぶん、ブラックボックスになりがちです。
気になります。

EmacsDistributionの増加

EmacsのディストリビューションはSpacemacsだけではありません。
DoomEmacs,Prelude,Grapheneなど色々なディストリビューションが存在してます。

「もっとバニラに近くてブラックボックスのすくないやつに移行すればいいのでは」と思い立った次第です。
そうして、各リポジトリを見ていくと
「結局カスタマイズするなら、それらを参考にバニラからカスタマイズしよう!!」という考えにいたりました。

daemonでバグった

emacs --daemonで起動させたとき、themeが反映されてないバグが発生しました。
その時は、適当に直しました。
が、如何せん時間が溶けました。Emacsとは設定を読み込むタイミングが少しことなるようで
after-frameに設定しても反映されず、無駄に時間がかかりました。

この時間というのは、daemonでSpacemacsを起動できない時間を含めると、相
当な長さになると思われます。

かわEmacs化できてる人がいる

私がSpacemacsを使う大きな理由の一つ、見た目がモダン
だったんですが、SpacemacsじゃなくてもDoomthemeを適用すると、キレイになるではないですか。

ここでなんとなくSpacemacsから離れることを決意しました。

脱Spacemacs

ここから実際に脱Spacemacsをする方法を抽象的に紹介していきます。

自分が何を使っているのかを知る

SpacemacsからEmacsに戻ると、自分が何のPackageを使っていて何がEmacsの標準なのかがわからなくなります。

そこで、あからじめSpacemacsでM-x describe-modeをして、利用していたモードを確認しておきましょう。
あとはそれらをGoogle先生に投げれば、なんのPackageなのかを教えてくれます。

特にevil neotree magitあたり。
ivyhelmまわりの設定も忘れがち。
あとはPackage-archivesの追加もしておきましょう。

init.el
(require 'package)
(add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/") t)
(add-to-list 'package-archives '("melpa-stable" . "https://stable.melpa.org/packages/") t)
(add-to-list 'package-archives  '("marmalade" . "http://marmalade-repo.org/packages/") t)
(add-to-list 'package-archives '("org" . "http://orgmode.org/elpa/") t)

他には、自分が使っている(いた)キーバインドなんかですね。
私はとりあえず、こいつだけ設定しました。
C-hBackspacceです。

init.el
(global-set-key "\C-h" 'delete-backward-char)

それとこれを忘れるとコメントが文字化けしたりします。
こいつを忘れて開発し続けると辛くなるので注意。

init.el
(set-terminal-coding-system 'utf-8)
(set-keyboard-coding-system 'utf-8)
(set-buffer-file-coding-system 'utf-8)
(setq default-buffer-file-coding-system 'utf-8)
(prefer-coding-system 'utf-8)
(setq default-coding-systems 'utf-8)
(setq coding-system-for-read 'utf-8)
(setq coding-system-for-write 'utf-8)

動かないときには

設定ファイルを書いているときに自分がどの機能を追加しているのか意識しましょう。
leafuse-packageを使う時に、読み込む順番を間違えたり、設定順を間違えたりすると動きません。
ほかに動かないときはバージョンをdevelop版にしてみたりすると動き始めます。
私の場合neotreeがそんな感じでした。

キレイにする

こうしてinit.elを書いていくと、設定が肥大化していきます。
なので、設定ファイルを分けましょう。
Centaur Emacsを参考にて各パッ
ケージごとにファイルを分けることにしました。

.emacs.d
├──init.el
└── el
              ├── init-evil.el
              ├── init-ivy.el
              ├── init-key.el
              ├── init-lsp.el
              ├── init-lsp.el~
              ├── init-neotree.el
              ├── init-package.el
              ├── init-theme.el
              └── init-window.el

こんな感じで別フォルダに初期化する処理を放り込み、あとから読み込みをすることにしました。

init.el
(defun update-load-path (&rest _)
  "Update `load-path'."
  (push (expand-file-name "el" user-emacs-directory) load-path))
(require 'init-package)
(require 'init-theme)
(require 'init-evil)
(require 'init-ivy)
(require 'init-window)
(require 'init-lsp)
(require 'init-neotree)

こんな感じで分けてやれば、設定ファイルが肥大化する問題も回避できました。

まとめ

正直言って、まだSpacemacsのほうが便利な気がしてます。
というか、たぶん便利です。だんだんとSpacemacsに近づいてます。

けれど、一番大切なのは不要な機能をそぎ落とせたこと。
使いもしないキーバインドを断捨離したことで、キーがすっきりしました。

SPCleader keyに設定する作戦はそのまま、不要なキーバインドはすっきりと。
なかなかキレイになっていい気分です。
Emacsのパッケージ管理もしやすくなりEmacsと仲良くなった気がします。

参考
Spacemacsに乗り換えてみた
spacemacsについて ~~spacemacsが最強で最高で神エディタであると思い始めた件~~
Emacsモダン化計画 -かわEmacs編-
Centaur Emacs