Life goes on

何かJavaScriptとかVimとかMacとかに関係してそうな深淵から覗かれる者

6年間使っていたVimからEmacs(Spacemacs)に乗りかえた

6年間ずーっとVimを使ってきましたが、今のところ完璧に乗りかえられた。EmacsというよりかはSpacemacsがすごく良い。

発端

Spacemacs自体は2014年にGithubのTrendingで見かけて気にはなってStarはしていたけど、そのまま忘れてた。で、今年のクリスマスイブ(特に関係はない)にQiitaのVimも秘伝のタレも飲み込むEmacsの超強力ディストリビューションSpacemacsまとめ - Qiitaという記事を見かけて「あ、そういえばあったな」って思いだした。これ読んで改めて便利そうだなと思ったので。

感想

Spacemacsのサイトにキャッチコピーがあってそれが

The best editor is neither Emacs nor Vim, it's Emacs and Vim!

って書いてるんだけど、マジでこの通りだなと思った。すごく良い。調べるとわりとみなさん、Emacsとして使ってる人が多数派っぽいんだけどもマジでVimから乗り換えできる感じ。機能的には上記のQiitaの記事などをご覧いただくとして、ここでは自分が良いなーと思った点をいくつか。

Evilが高度に統合されている

実は1年くらい前にもEvil: EmacsをVimのごとく使う - 導入編 - 貳佰伍拾陸夜日記のシリーズを参考にしてEvilを導入したEmacsを使おうとしたことがあった。

最初は「マジでキーバインドVimと遜色ないわこれ…!」と感動したんだけど、それはそもそもテキストの編集だけだったので、例えばEmacsでGitを扱う場合に使うMagitとかを使う場合にはEmacs流のキーバインドで操作しなければいけなかった。これが不満だったので、途中で導入をあきらめた。もちろん、自分でフックを作ったりしてキーバインドを設定したりしてあげれば大丈夫なんだけど、そもそも大昔(7年前くらい?)に3年間使ってたEmacsを使おうとするとまあバージョンも新しいから昔の知識なんぞ役に立たないし、そもそも覚えてないってことで挫折していた。

しかし、Spacemacsのとても優れている点はそこら辺の違和感を無くすような工夫がしてある点だと思う。どういうことかというと、Spacemacsを使う際にはLeaderキーとして<Space>が割り当てられているのだが、この使い勝手がものすごく良いからだ。前述のMagitでいうと、Emacsとしては

  • M-x magit-status

としてまず、magit-statusを呼び出すのだが、これがSpacemacsだと

  • <Space>g g

で呼び出せるようになる。しかもリアルタイムに押したキーに対応してどのキーが何の機能を呼び出すのかを教えてくれるという親切設計。上記のキーバインドGitgとして覚えれば覚えやすい。公式サイトにMnemonicって書いてるけどその通りだと思う。

このEmacsでも(正確に言えば)Vimでも無い独自かつ一貫性のあるコマンド体系で、コマンド入力が全く苦ではなくなるのがすばらしい。しかも大体のコマンドはこの<Space>からのキーを押すだけで使うことが可能。

言語別にプラグインをまとめて設定してくれてる

自分のような門外漢がEmacsで開発しようとしたときの高いハードルとしてこの言語ではどんなモードを組み合わせれば良いのか分からないというのがあった。JavaScriptで具体的に書くと、そもそもEmacsJavaScriptを使おうとすると4つほどメジャーモードがあるっぽいというのがググって出てくる

  • js-mode
  • js2-mode
  • js3-mode
  • web-mode

で、情報の探し方がイマイチ分からなくて何が良いのかちょっと分からん…ってことになる。大体はjs2-modeか、web-modeのどっちかぽいんだけど…ってとこまでは分かるんだけども。これに加えて、auto-completeの設定やsnippetの設定、Tern.js使ったauto-completeとの連携、リアルタイムのエラーチェックなんかをしようと思うともう、ネットの海は広大よ状態。

Spacemacsではこの辺がすごく簡単に設定できる。導入時に勝手に作られる.spacemacsというdotfileがあり、ここで全ての設定を管理するのだが、このファイルで以下のようにするだけで、JavaScriptが簡単便利に使えるようになる。

(dotspacemacs-configuration-layers '(auto-complete javascript))

これだけの設定で以下の機能が設定済みで使えるようになる。

素敵すぎる。他の言語もこんな調子でどんどんとdotspacemacs-configuration-layersに言語名や機能名を追加するだけで使えるようになる。

そして、大体のメジャーモード固有のキーは<Space> mに集約されているので、どの言語を使ってもこれ覚えておけば困らないというおまけ付き。

Vimとほとんど操作感は一緒

一番気になる、操作感だけど現状ではほぼ変わらない…と思う。一番デカい違いがこれくらいかな。

function hoge(fuga, hogera) {
    //処理
} 

みたいなコードのfunctionfにカーソルがあったときにcibのコマンドを打つと、Vimでは

function hoge() {
    //処理
}

と、丸カッコの中が編集可能な状態になるんだけど、Spacemacsでは丸カッコに移動してくれない。

それ以外、ちょっとずつ「あれ、これ違うのか」みたいなとこはあるけども根本の不満ではないんであんまり気にならない。もしかしたら設定あるのかもしれないけども。

最初からテーマがステキ

これも昨今、俺のなかで重要なんですが、Powerlineみたいな拡張を入れているので、Spacemacsの最初からシャレオツな感じでテーマや、ステータスバーが設定されてるのもグッド。

そもそも何で乗りかえようと思ったのか

自分のVimの使いかたって元々気付いてはいたんだけど、俗にいうEmacs的な使い方してたからです。だったらEmacsにしちゃえば良いかーと。

Emacs的な使いかたっていうのはこんな感じです。

  • 朝立ち上げたVimをスプリットやらタブやらでプロジェクトや用途毎に分けて1日終わるまでずーっと立ち上げっぱなし
  • 入れてるプラグインがエラい数になってる(120個くらい?)

この使いかたしてるとたまにVimのUniteとかCtrlPとかがおかしくなってVimの再起動したりとか、Syntastic + neocompleteで入力がすごい重くなったりという現象があったので乗りかえました。

これはVimが悪いんじゃなくって完璧に自分の使い方が間違ってるだけなんですが。

ということで、今はSpacemacsのおかげでかなり快適なエディタ生活を送っています。

自分のSpacemacs導入方法

リポジトリREADMEに書いてるインストール方法でも全然問題ないんですが、自分はdotfilesをGitHubで管理しているのでこんな感じでインストールしてます。

$ cd dotfiles
$ git submodule add git@github.com:syl20bnr/spacemacs.git .emacs.d
$ git submodule sync
$ git sumodule update
$ cd ~
$ ln -s dotfiles/.emacs.d ./
$ mv .spacemacs dotfiles/ # Spacemacsを立ち上げたあとに
$ ln -s dotfiles/.spacemacs ./

あとは、Spacemacsでアップデートがあったときには、submoduleのアップデートを自分のdotfilesにpushしていくだけになります。最初はまんまcloneしてきたんですが、他のMacでの共有とかを考えるとsubmoduleが良いかなあなど。

結論

Vimmerが乗りかえるクォリティをSpacemacsは持ってる。かなり良いです。オススメ。ただし、難点は何か調べものするときにSpacemacsとしての情報がとても少ないということです…。Emacsの情報を調べても自分の頭のなかでコマンドなんかの変換してあげなきゃいけない。あと、日本語の情報も少ないです。が、リポジトリの中のlayersとか見たりしてるとなんとなく分かるので、なんとかなるかなあ。