SpacemacsからEmacsに移行した話

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

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

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

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

今もEmacsでこんな感じで書いてます。
![Screenshot_20191218_170315.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/220892/14ebcbbb-40d4-20cb-d0cc-d12b3e592424.png)

# そもそも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`あたり。
`ivy`や`helm`まわりの設定も忘れがち。
あとはPackage-archivesの追加もしておきましょう。

```elisp: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-h`で`Backspacce`です。

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

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

```elisp: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)
```

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

## キレイにする
こうして`init.el`を書いていくと、設定が肥大化していきます。
なので、設定ファイルを分けましょう。
[Centaur Emacs](https://github.com/seagle0128/.emacs.d)を参考にて各パッ
ケージごとにファイルを分けることにしました。

```text:.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
```

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

```elisp: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に近づいてます。

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

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


参考
[Spacemacsに乗り換えてみた](https://qiita.com/shotakaha/items/364fca7d09596d636a8b)
[spacemacsについて \~~spacemacsが最強で最高で神エディタであると思い始めた件~~](https://qiita.com/nobkz/items/994c6b3e6f42a0e33fef)
[Emacsモダン化計画 -かわEmacs編-](https://qiita.com/Ladicle/items/feb5f9dce9adf89652cf)
[Centaur Emacs](https://github.com/seagle0128/.emacs.d)