かなりすごいブログ

資本主義の崩壊とEmacs Evilの勃興について

Evil Advent Calendar 1日目

Evil Advent Calendar 20141日目の記事になります。

明日の執筆者は未定です。というか私含めて2人しかエントリーしていません。Evil使いもっと増えて欲しい(もっと)。

1日目ということで、今日はポエムです。あとタイトルは考えるのが面倒だったのでホッテントリメーカーで作りました。

資本主義の崩壊とEmacs Evilの勃興について

1.

Emacsは単なるテキストエディタではなく、アプリケーション実行環境です。その表現力の高さから、ウェブブラウザやメーラー、IRCクライアントに始まりTwitterクライアントまで、様々なアプリケーションが動作し、それらは基本的に全てキーボードで操作を完結させることができます。それを指しEmacsはテキストエディタではなくOSだと言われることがありますが、まさにその通りだと私は思います。というのも、単なるテキストエディタに画像を表示する機能なんて要らないでしょうし、ましてやGTKウィジェットを表示できるようにしようという試みも起こらないでしょう。私は、Emacsが目指しているのはテキストエディタではなくアプリケーション実行環境であるということを明確に感じます。

そんなEmacsで動くVim風テキストエディタがリリースされたのは自然な流れだと言えます。Emacsデフォルトのテキスト編集機能はVimのそれに遠く及びません。Emacsには様々なアプリケーションを構築するための土台があるのですから、無ければ作ってしまえ、ということなのでしょう。

そして、この様にEmacsをアプリケーション実行環境として捉え、かつVimに親しみのある私がEmacsにEvilを導入したのは当然の成り行きでした。

2.

Evilは私の想像以上の完成度でした。非常に高いレベルでVimのパラダイムが実現されており、かつEmacs Lispにて容易にその挙動をカスタマイズできる様に設計されていました。Emacs Lispを書くことができる人であれば、Vim scriptを書きVim用のプラグインを作るのと同じ感覚で、Evil用のプラグインを作る事も容易いでしょう。実際に、いくつかの有名なVimプラグインは既にEvil版として移植されています。

私はEvilに夢中になりました。Vimから本格的にEmacsへ移行しようかとも悩んだほどです。

3.

Evilを使い始めてすぐ、私はその違和感に気づきました。Evilでは、Emacs元々の用語とバッティングしないように、Vimで言うところモードステートと読んでいます。挿入ステートビジュアルステートといった具合です。更に、Vimには(当然)存在しない、元々のEmacsのキーバインドに戻るという、Emacsステートが存在します。そして、Evilにはevil-emacs-state-modesという設定変数があり、ここに設定したモードでは、自動的にEvilがEmacsステートに切り替わります。デフォルトで、この変数には多くのモードが設定されています。この機能により、Evilはいわゆるアプリケーション実行環境であるEmacsにおいて、「テキストを編集する時はVimの操作感」を、「テキスト編集時以外はEmacs元々の操作感」を実現しています。

これは言うなれば、丁度あなたがお使いのOSと同じ様な感覚です。WindowsでもLinuxでもMac OS Xでも何でもよいのですが、Vimを使っている時の操作方法と、その他アプリケーションを使っている時の操作方法は基本的に全く異なるはずです。EmacsにEvilを導入することで、私は「Evilから出て他の操作をEmacs内で行う」時、「Vimから出て他の操作をOS内で行う」のと同じ感覚に駆られました。

本来なら、EvilがEmacs本来の機能や資産を損なわないように上手に実装されていると褒める所でしょうが、私はこの点について大きな違和感を感じました。

4.

それもそのはずでした。私は、Vimに多くのプラグインを導入し、Vimを単なるテキストエディタとしてでなく、ターミナルに始まり、メーラー、Twitterクライアント、チャットサービスクライアントといった様々な目的で利用していたのです。私は、evil-emacs-state-modesによって、Vimの世界から突然素のEmacsの世界に引き戻されてしまうことに、非常にストレスを感じていたのです。

また、例えばVimではgt, gTにてタブの切り替えを行えますが、Evilでこれを行うと、Emacsステートのタブに移動した瞬間、gt, gTでの操作ができなくなり、意図しないタイミングでVimの世界から追い出されてしまうといった様な弊害もありました。

私はEmacsの世界とVimの世界を行き来することにすっかり辟易してしまいました。Emacsで動く全てのアプリケーションをVimライクに操作したい、そう思った私は、思い切ってevil-emacs-state-modesnilを設定しました。

5.

evil-emacs-state-modesnilを設定することで、Emacsで動く各アプリケーションがほぼ全て、まともに動作しなくなりました。アプリケーションごとに独自にEmacsステート用のキーバインドが設定されており、それを全て無効にしてしまったのですから当然です。

私を待っていたのは、Emacsで動く全てのモード用に、Vim風のEvilキーバインドを1から割り当てていくという地道な作業でした。更に、Evilによって導入されるステートという独特の概念により、キーバインドの設定をするだけでは上手く動かないアプリケーションも存在します。たとえば、Emacs Lispで実装されたEmacsで動くターミナルエミュレータであるeshellがあります。eshellでは、通常Emacsステートにおいてはプロンプト上にカーソルが移動できないようになっていますが、Evilのノーマルステートに入る事によってカーソルをプロンプト上に移動することができるようになってしまいます。その状態でxを打鍵したり、iを打鍵するなどして挿入ステートに入ってしまうと、プロンプトを書き換えることができてしまい、eshellの動作に良からぬ影響を及ぼしてしまいます。これを防ぐため、「挿入ステートに入った後、プロンプトと被らない適切な場所にカーソルを移動する」という関数をEmacs Lispで定義し、eshellモードのノーマルステートにおけるiaへのマッピングとして割り当てることが必要でした。その他、私がVimで愛用しているVimShellと同じ操作感を実現するため、多数の独自関数・キーバインドを設定することが必要でした。(余談ですが、私はこうして出来上がったEvil用にカスタマイズされたeshellを、eshellとVimShellにちなんでEvilShellと呼んでいます。)

この様に、Emacsで動く全てのモードに関して、キーバインドの再定義や動作補助用の関数定義を行うといったことが必要でした。これはとても体力の要る、地道な作業です。「Vimのパラダイムと完全に協調する理想のEmacs」を求め、茨の道へ歩き出してしまったのです。

6.

2014年12月1日現在でも、これらの設定を終えることはできていません。設定を終えた後は、Emacs Lispを習得し、普段愛用しているVimプラグイン達をEvil用に移植していく必要もあります。

理想のEmacsを手に入れるまでの道のりは長そうですが、私のEmacsが着実に私の理想に近づいていっていることだけは分かります。そして、地道に理想の環境を作リ上げていくのはなんと楽しい事でしょうか。

おわり

以上になります。

Evil、設定に苦労するけど超便利なのでみなさん使っていきましょう。