Emacsへの知の集約

Emacsでアプリを作ることについての自分の考えのまとめ。

Emacsの2つの側面

Emacsの可能性を議論する場合に、エディタ・IDEとしてのEmacsと、アプリケーション実行環境としてのEmacsの2つの側面を分けた方が良いかなと思っています。両者がごっちゃになるので、「Emacsは環境だ」→「エディタでメールとか変態だ」→「むきー!!!」という不毛な議論になるのだと思っています。

単純なエディタやIDEとしてのEmacsについては、十分議論が出ていると思いますので、ここでは議論しません。個人的には、趣味なら自由、仕事でやるなら望まれた生産性を満たす好きなツールを使えばいいと思っています。

今回の議論は、アプリケーション実行環境としてのEmacsです。こちらは、 Eclipse RCP や FLEXJVM系各種スクリプトや、各種Webフレームワーク、GAE や HTML5 といった言葉と比べるようなものだと思っています。つまり、「GWTFLEX/S2のどちらでメーラーアプリを作る方が良いか?」という感じで、「GWTFLEX/JavaEclipse RCP、EmacsのどれでIMAP4メーラーアプリを作った方が、工数やメンテナンス性の面で良いか?」という質問になるかと思います。

ほら!全然違和感ない!むしろ、Emacsの方が楽そうに見えますね!不思議!!!

Emacs上のアプリケーション使ったり、開発することはそんなにいいのか?

結論から書くと、まずEmacsは単体のアプリを使ったり書くにはあまり向いていません。単体のアプリを書くのであれば他の実行環境を使えばいいと思います。しかしながら、知的活動を支援するたくさんのアプリがそろってますので、もう全部Emacs上に載せてしまって、一連のワークフローを強化するようにカスタマイズしたり、必要なアプリを書くには悪くない選択だと思います。

アプリケーション実行環境としてのEmacs

Emacsの動作環境はかなり広いです。大抵のOSで動作します。GUI付き、端末画面、画面無しのバッチ実行など、動作方法も選べます。開発最先端は多少不安定なことがありますが、リリース版はかなり安定していることが期待できます。処理系としてはかなり枯れている方ですが、今でも精力的に開発が進んでいて進化し続けており、今後も長期的なサポートが期待できます。

実行速度は普通のLL的です。シンプルなスタックマシンのVMで動くので、バイトコンパイルすると多少最適化がかかって速くなります。

言語の機能ですが、伝統的な LISP-2 で、ダイナミックスコープが標準です。レキシカルスコープはもう少ししたら標準で使えるようになりますが、今でもマクロで擬似的に利用可能です。モジュールや名前空間がないので、お行儀良くするには C のように関数や変数に接頭辞をつける必要があります。末尾再帰最適化、リーダーマクロが無く、組み込みの構造体、OOP支援、パターンマッチ、正規表現リテラルはありません。CLの機能をエミュレートするclマクロ集が標準で付いています。

実行環境やライブラリは、もともとエディタなので文字列処理系が強いです。日本語も含めて各種文字コードをある程度まともに扱えます。正規表現、ファイルIO、外部プロセス、ネットワーク、日付・時刻、その他基本的な処理は大体そろっています。また、HTTP通信、非同期、OOPXMLJSON関係などの最近流行っているような機能のライブラリもそろっていますし、EmacsWiki等を探せばいろいろみつかります。スレッドのサポートは無いので、Node.jsのようにシングルスレッドの非同期プログラミングを駆使します。PerlCPANRubyのGEMのようなパッケージ管理がいくつかあるのですが、まだ決定的なものが無いような状況です。

GUIについてですが、一般的なメニュー、マウスでのコンテキストメニューツールバーがあります。画面に画像も表示できますが、現バージョンではEmacs内でサイズの調整が出来ないため、ImageMagickなどを使って自前でサイズを調整する必要があります。ボタン、入力フィールドなどの一般的なGUI部品はありますが、使いこなすにはちょっと癖があります。さらに、ウインドウという表示領域を区切る仕組みがあり、基本的にどのようにウインドウを区切るか、またどのバッファを表示するかはユーザー側が決めるような仕組みになっています。このように、GUIまわりはテキストエディタ由来なので癖のある挙動になります。

Emacsならではの非常に強力な機能としては、日本語migemo検索(migemoは別途インストール必要)とAnythingインタフェースが挙げられます。これらを使うためだけでも実行環境としてEmacsを選ぶ価値があります。

開発環境としては一通りそろった Emacs があります。REPL、アウトライン、補完、ドキュメント参照、定義ジャンプ、デバッガなど、必要なものは大体全部そろってます。


こうやってみると良いのか悪いのか微妙ですが、スペックとしては悪くない方だと思います。結構みんなが困っているのは名前空間、レキシカルスコープが無いことでしょうか。個人的にはDBとの接続が欲しいです。あと、ESGI/Elackとか出来た日には、Emacs LispでWeb開発が始まると思います。

それぞれの環境には一長一短があるので、Emacs Lispを使うかどうかは、やりたいことと困ることのトレードオフで決めればいいかなと思います。

ワークフローとEmacs

アプリにはそれぞれ想定するユースケース(利用状況)があります。一般的にはワークフロー(業務手順)の一部がユースケースに当てはまり(もしくは当てはめて)、そこでアプリを利用することになります。ワークフローによっては、いくつかのアプリを組み合わせる必要が出てきます。このとき、これらのワークフローを支援するアプリ達がうまく繋がれば作業効率が上がります。

例えば、Backlog、RedmineなどのいわゆるBTSでは、単なる課題を管理するWebアプリだけでなく、通知用のメール、ドキュメントとしてのWikiSubversionやGitなどのVCSを、課題情報を中心にうまく接続することで、よくある開発チームのワークフローをサポートして効率を上げることが出来るようになっています。

同様に、Emacsでも各種アプリを自分のワークフローに合うように接続することで、自らの生産性を向上させることが出来ます。その鍵となるのが情報が集まるツール、つまりメモアプリやコミュニケーションアプリ(メール、SkypeIRCTwitterなど)です。Emacsにはメモやコミュニケーションなど、知的活動を支援する数多くのアプリがあります。これらのアプリを自分のワークフローに合うように組み合わせることで、効率的な作業環境を実現することができます。

ということで、Emacs上で知的活動が完結するように、必要なアプリを開発することは十分な動機になると思います。

引きこもり、変態、あるいはユートピア

以上のようなことを書くと、「ひきこもり」「変態」と言われるわけです。しかしながら、個人の情報管理・コミュニケーションを単体でサポートするツールはたくさんあるのですが、それらを自分のワークフローに合うように組み合わせてカスタマイズしていける環境はあまりありません。

自分の乗り換え用として、また他人に勧めるために、Emacsに限らず今も探しているところです。

大昔は、システム手帳を使っていました。すごく良かったです。でも、検索できないことで困ってました。また、年が変わる時期の物理的な制約も気になってました。その後は何台かPDAを使っていました。これらもすごく良かったのですが、PC上のメールが多くなり始めてから、PCとPDAでデータが分かれてしまうことが気になっていました。そのあとしばらくいろいろ試行錯誤の結果、Emacsに全部まとめる方法に落ち着きました。howm最高です。

Outlookはメールだけではなく、アドレス帳(名刺管理)、スケジュール、タスク、メモ帳などの一通りの機能がそろっています。GNOME だと Evolution があります。これらは普通の人が普通に使うには良いと思います。しかしながら、個人的には常用するには至りませんでした。機能やスペックは良いのですが、ヘビーに使うと細かいところで不便なところがたくさん出てきたり(特にパフォーマンスやUIに不満がある)、データの再利用などカスタマイズが難しいところが難点です。

Web上のサービスにも情報を管理するツールはたくさんあります。最近は、技術向上によりWeb上で出来ることが増えてきたり、スマートフォンからも使えるようになってきたことから、今後はローカルではなくクラウドで使うことが普通になりそうです。Evernoteを中心にして、周辺にエコシステムが形成されているのが良いですね。ただ、現在の自分の仕事のスタイルとしてオフライン(客先や移動中など)で使えないと困ることから、まだ様子見で止まっています。

いろいろな環境がありますが、すべてを一つの環境に統合して便利にしようという方向はそれぞれ一緒だと思います。なので、何かを我慢して既存のアプリを使うか、Emacsで自分でカスタマイズしながら頑張るかの違いでしかないと思います。

いろいろ脱線しましたが、要するにEmacsが最高と言いたいんです。

まとめ

すでにEmacsを使っているような人向けに、migemoとAnythingを使うようなツールで、メモやコミュニケーションツール自体やそれらと連携できるようなアプリを開発するのには、大変すばらしい実行環境だと思います。

間違いありません。