技術評論社の雑誌Software Designで5月から連載させていただいていますが、
古い記事の掲載許可をいただきましたので、ブログに載せます。

初心者にとって難しいEmacsですが、挫折する人が一人でも減れば幸いです。

株式会社技術評論社の許可を得て掲載しています。
草稿なので細かい部分は実際の記事とは異なることがあります。

ようこそ、Emacsの世界へ

 初めまして、Emacsを溺愛しているるびきちと申します。書籍『Emacsテクニックバイブル  作業効率をカイゼンする200の技〜』と『Emacs Lispテクニックバイブル 〜真髄を知るLispの掟〜』を著しました。Software Design誌でもEmacs特集のときには記事を書かせていただいています。Emacs愛が高じて毎週土曜日に無制限メール相談付きの有料メルマガも発行しています。そして今回はこの連載を任されました。ありがとうございます。

色あせぬ・尽きぬ魅力

 1996年初めからEmacs一筋でたくさんのEmacs Lispプログラムに触れ、自分でも作ってきました。今年で19年目になりますがいまだにEmacs愛は冷めることを知りません。

 今回は第1回目ということで、難しいことは抜きにしてEmacsとは何なのか、そしてEmacsの魅力について語っていこうと思います。

潤沢リソース時代のエディタの役目とは

 「Emacsとは何なのか?」と聞かれればテキストエディタというのが一般的な答えです。Emacs vs Vi(m)はUnixテキストエディタ界の「きのこたけのこ戦争」といったところで、両者は人気を二分している状況でした。最近は Sublime TextAtom などの新しい勢力も現れてきている上、 Vim にも後れをとっている状況です。今ではEmacsをあえて使う人はますます減ってきています。その中でも時代の流れから敢えてEmacsを選ぶ意味があります。

 元来 テキストエディタ はとても軽いアプリケーションで、シェルから瞬時に立ち上がり、テキストを変更したら即終了という使い方をするものです。Vi(Vimではない)はまさにそんな使い方をすることが念頭にありました。

 対してEmacsはヘビー級のアプリケーションで、ひとつ立ち上げたらログイン中はずっとそのEmacsセッションを使い回す文化です。いわゆる「Emacsひきこもり」ですね。Emacsはあまりにも大きいプログラムだったので、リソースが厳しかった大昔は、Emacsを複数個立ち上げると怒られたものでした。今はリソースが潤沢なのでEmacsを複数個立ち上げたくらいではびくともしません。Vimなど他のテキストエディタも高機能化・充実したプラグインによりひきこもり生活が送れるようになっています。Emacsは30年以上昔からひきこもり文化であったことから、いかに特別な存在であったかがうかがい知れます。今はヘビー級ひきこもりアプリケーションといえばWebブラウザにその地位をゆずってしまっていますが、Emacsは先駆者といえます。

Emacs Lisp

 Emacsはテキストエディタの皮をかぶったLispマシンであり、ひとつの世界をつくっています。Emacs環境には様々なアプリケーションが存在します。これらはすべてEmacs Lispで書かれています。

シェル
eshell
ファイラ
dired, nav, speedbar
ページャ
view-mode
メーラ
gnus, mew
Twitterクライアント
twittering-mode
Webブラウザ
emacs-w3m
RSSリーダー
newsticker
Skypeクライアント
skype
カレンダー
calendar
ワープロ
org
スケジュール・TODO管理
org
プレゼンテーションツール
org
バージョン管理
vc, magit, psvn, pcvs
メディアプレイヤー
emms
テキスト翻訳
text-translator
ゲーム
gomoku, tetris, doctor
manインターフェース
man
grepインターフェース
grep
(no term)
その他もろもろ

 Emacsの魅力は以下の3点に集約されます。それでは1つ1つ見ていきましょう。

  • 文字入力の一元化される
  • 外部プログラムとの連携が得意
  • 拡張言語がLispであること

文字入力の一元化

 Emacsを使うことによって受ける最大の恩恵が「 文字入力の一元化 」です。テキストエディタとしてのEmacsは成熟していて、強力なカーソル移動や入力機能が使えます。もちろん好きな機能を自分で追加できます。それらの機能はプログラミング時だけでなく、メールや文書作成、TwitterやIMのメッセージ入力でさえも同じように使えるのです。

 想像してみてください。あなたは今プログラミング用には普通のエディタを使っています。メール、Twitter、スカイプはそれぞれ別のソフトを使っています。ブラウザのフォーム入力はブラウザからそのまま入力しています。ウィンドウが画面中に散らばっており、タスクを切り替えるときにアプリケーションのウィンドウを切り替えるのが面倒だと感じています。エディタで使えるはずの強力なコマンドが他のアプリケーションでは使えずにもどかしい思いをしています。ブラウザで見ているサイトの内容をURL付きで引用するメールを面倒だと思いながら書いています…

 あなたがEmacsを使うようになったら、その状況は一変します。普段使っている文字入力方法、コマンドが「文字入力をするすべての場面で」使えるようになるのです。つまり、文字入力するときは一貫して同じ方法が使えます。アプリケーションごとに操作方法を切り替えるストレスから解放され、入力する内容に集中できます。ブラウザのフォーム入力時にEmacsを呼び出せます。サイトの内容をURL付きで引用するメールなど、Emacsを使えば楽勝で書けてしまいます。シェルコマンドの実行結果をそのまま書き込むことができます。ふとアイデアが思い付いたら、一瞬でメモ入力コマンドを起動し、メモを書いたら自動的にメモ起動前のタスクに戻ってくれます。

 アプリケーション間でデータのやりとりをするクリップボードなど、Emacsの キルリング と比べたらオモチャ同然です。なぜたった1つのテキストしか記憶できないのでしょうか?キルリングは大昔から何個もテキストを記憶できていたというのに。

 プログラマはコマンドラインシェルも好んで使います。文字入力の一元化というのは、シェルにも波及します。M-x shell((「M-x」はAltを押しながらxを押すEmacs流キー表記。M-xはコマンド名を指定して実行する。Emacsのコマンドを明示的に表記するときにも「M-x コマンド名」が使われる。))はいつも使っているシェルをEmacs上で動かしているので、Emacsの持つ強力な機能がそのまま使えます。しかし、シェルの持つ本来の機能が使えない欠点もあります。それに対して eshell は完全にEmacs Lispで書かれたシェルであり、しっかり作り込まれています。通常のシェルとは異なりeshellはフルEmacs Lispなのでコードを書けば完全に自由にアレンジできます。しかもWindowsでも問題なく使えるので複数のOSを使う人ならばeshellは手軽でおすすめです。真新しいWindows PCが筆者に与えられた場合、真っ先にEmacsをインストールしてeshellを立ち上げるところからスタートです。

外部プログラムとの連携

 Emacs自体でもEmacs Lispでいろいろなものが作れますが、それだけだと力不足なこともあります。そこで 外部プログラム とやりとりすることになります。シェルコマンドの実行結果を表示・挿入することはもちろん、シェルなどの対話的プログラムを動かせます。また、プログラムをEmacsから使いやすくするコマンドがたくさんあります。「 Emacsはエディタではなくて環境だ 」とか「 EmacsはOSだ 」と言われている最大の要因はこの プロセス を扱う機能のおかげです。

各コマンドの説明

 M-!は シェルコマンド の実行結果を表示します。このコマンドを使えばシェルコマンドの実行結果を含む文書を楽に作れます。

  M-x shell 、M-x telnet、M-x rlogin、M-x run-rubyなどは対話的プログラムを実行する例です。Emacsのバッファ上で通常の端末と同じように実行できます。端末での実行とは違い、過去の出力を遡れるし、コピーもできるメリットがあります。

  M-x compile はコンパイルコマンドを実行させて、エラー行にジャンプできます。様々なプログラムのエラーメッセージ表示形式に対応していて自動判別してくれます。コンパイルエラーが起きたら次にやることは該当行にジャンプすることなので、このインターフェースはとても素晴しいです。

  M-x grep はその応用例でgrep -n形式の出力に対応しています。grepの出力結果から該当行にジャンプできます。Emacs Lispでgrepを書くこともできますが、速度はgrepプログラムの圧勝です。そこで検索処理をgrepプログラムに丸投げして、grepを呼び出す部分と検索結果からジャンプする部分のみをEmacs Lispで書く方法を採用しました。これにより全部Emacs Lispで書くことと比べて行数を大幅に削減でき、grepの速度も活かせます。

 この方法の嬉しい副産物として、grep以外のコマンドでも行番号にジャンプすることができます。M-x grepではgrepの代わりにソースコード検索に特化したackやagを呼び出してもよいのです。出力がgrep -n形式でありさえすれば任意のプログラムが使えます。

 同じことはEmacs内でmanpageを開く M-x man でも言えます。これは内部でmanを呼ぶのですが、manの代わりにmanと同じようにふるまう別のプログラムに設定できます。

 manpageだけだとわかりにくいので、具体例も表示してほしいですよね。それならば、ワンライナー検索サイトcommandline-fuの検索結果も出力するスクリプトを作成し、manの代わりに呼び出すように設定すればM-x manで具体例つきのmanpageが見られるようになります。外部プログラム側を拡張することで、M-x manに「憑依」する形で commandline-fuのEmacsインターフェース も同時に手に入ります。一石二鳥ですね。

  M-x find-dired はfindプログラムの引数を入力することで、その結果をdiredで表示します。diredなので表示されたファイルを開くことはもちろん、その他のdiredのコマンドが使えます。

 このように、Emacsは外部プログラムとつなぐことを得意としています。外部プログラムを呼び出して、その結果を処理することで、あたかもEmacs組み込みの機能であるかのように動作してくれます。

Lisp・関数プログラミング養成エディタ

 Emacsについて語る場合、 Emacs Lisp について触れないわけにはいきません。高機能でひきこもりができるエディタは今や他にもありますが、なぜEmacsがいいのかというと、それはEmacs Lispの存在です。プログラマにとってのエディタは野球選手でいうバットやグローブのようなもので、まめに手入れをする必要があります。エディタの手入れとは設定やカスタマイズですが、EmacsではLispを使って行います。

 昔から「 プログラマならばLispを学べ 」と言われています。実際に使うか使わないかはともかく、Lispを学べばよりよいプログラマに成長していきます。現在のプログラミング言語の多くはLispの影響を受けているので、Lispを学ぶことで、常用している言語に新たな視点を与えてくれます。

 Lispは最初の 関数型言語 として知られていて、進化を続けて今も使われています。Lisp自体は古代の言語ですが、当初から高階関数、ガーベッジ・コレクション、クロージャーなどといった先進的な機能がありました。Emacsを使うということはEmacs Lispに日々触れるということであり、Emacsを心から愛するようになったら、それこそLisp漬けの日々です。Emacsを好きになれば、だんだんLispも好きになっていき、それがさらにEmacs愛を深めることになります。エディタのカスタマイズという身近なテーマを通してLispを学べるのです。

 筆者は2月号で関数プログラミング特集の記事も書きましたが、今まさに関数プログラミングが注目されています。Emacs Lispはその性質から命令型プログラミングが主流になっていますが、腐ってもLispです。Emacs Lispから関数プログラミングを学ぶことができるんです。

 LispハッカーにとってみればEmacs Lispはオモチャでしかありませんが、Emacs Lispは着実に進化しています。Emacs24でレキシカルクロージャーが正式サポートされました。CPANやAPTを連想させるパッケージシステムが登場し、現代的で強力なライブラリも簡単に導入できるようになりました。Emacs Lispだってスタイリッシュに記述できる時代です!

 Lispの考え方、関数プログラミングが好きな人やこれから学びたい人ならば迷わずEmacsです。大量の括弧が嫌いな関数プログラミング好きも実はEmacs向きです。括弧アレルギーなどすぐに克服してしまう方法があるからです。

終わりに

 今回はEmacsの世界に初めて足を踏み入れた人向けに、Emacsとはどんなものなのかについて書きました。今後も本連載では入門者にもわかりやすいようにEmacsの魅力を余すことなくお伝えしていきます。次回をお楽しみに!

 もっとEmacsについて学びたい意識の高いあなたのために、筆者は毎週土曜日にEmacs専門メルマガを発行しています。無制限メール相談権付きであなたを徹底サポート致します。個別メールでよりよい提案を行ったり、Emacsに関するトラブルを解決いたします。月頭に登録すれば無料で1ヶ月間サポートが受けられます。次の月からは月々512円かかりますので、不満であれば解除していただいて構いません。メルマガの登録お待ちしております。

本日もお読みいただき、ありがとうございました。参考になれば嬉しいです。