先週に引き続き、今週はC言語以外の言語や開発をサポートするための、いくつかの機能を紹介します。
scratchバッファでEmacs Lispを使ってみよう
ご存じの通り、Emacs LispはEmacsで使われているLispの方言です。EmacsはC言語で書かれたコア部分以外のほとんどがこのelispによって実装されており、ユーザはelispによってEmacsそのものを拡張することができます。
Emacsの設定ファイルである.emacsもelispのプログラムそのもので、Emacsは.emacsに書かれたコードを評価することで、設定を行っています。
といっても、そんなに難しいものではありません。Emacsを起動した時に、最初に開かれるバッファ *scratch* は、デフォルトでメジャーモードが lisp-interaction-mode になっており、このモードではelispの式をその場で評価することができます。
例えば、elispで計算式を書いてC-jで評価することで、*scratch*バッファを簡易的な電卓として使うようなことができます。ちょっとした処理を書き捨てるには最適な場所といえるでしょう。
(+ 2 3)
5
ただし、elispは整数を29bitで扱っており、-268435456から268435455の範囲の値しか扱うことができません。あまり大きな数はオーバーフローとなってしまうため、注意が必要です。
Rubyを使ってみよう
Rubyのようなスクリプト言語は、C言語のように事前コンパイルを行わなくてもプログラムを評価できるため、非常にお手軽です。
例えば、Rubyには標準入力から入力した式をその場で実行できるirbというツールが存在しますが、このirbを利用することで、Emacs上から対話的なプログラミングを行うことができます。
まずは、Rubyとirb、Ruby用のモードをインストールします(注1 )。
$ sudo apt-get install ruby irb ruby-elisp
[1] Ubuntu 10.04では、rubyパッケージをインストールするとruby 1.8がインストールされます。ruby 1.9.1が使用したい場合は、ruby1.9.1やirb1.9.1を使用する必要があります。
ruby-elispパッケージにはinf-ruby.elというファイルが含まれています。/usr/share/emacs/site-lisp/ruby1.8-elisp/inf-ruby.elの先頭に、.emacsファイルに記述する設定が記載されていますので、該当部分を.emacsにコピーしてください。具体的には以下の内容になります。
(autoload 'ruby-mode "ruby-mode"
"Mode for editing ruby source files" t)
(setq auto-mode-alist
(append '(("\\.rb$" . ruby-mode)) auto-mode-alist))
(setq interpreter-mode-alist (append '(("ruby" . ruby-mode))
interpreter-mode-alist))
(autoload 'run-ruby "inf-ruby"
"Run an inferior Ruby process")
(autoload 'inf-ruby-keys "inf-ruby"
"Set local key defs for inf-ruby in ruby-mode")
(add-hook 'ruby-mode-hook
'(lambda ()
(inf-ruby-keys)))
これにより、Emacsで*.rbファイルを開くと、自動的にメジャーモードがruby-modeになります。ruby-mode上でC-c C-sと入力すると、*ruby*バッファが開かれ、その中でirbが起動されます。端末からirbを起動した時と同様に、Rubyのプログラムを評価することが可能です。また、ソースコード上でC-c C-rと入力することで現在のリージョンを、C-c C-bで現在のブロックをirbに評価させることができます。
コーディングしながら任意の式を評価できるため、「 ソースを保存」=>「端末を開く」=>「rubyインタプリタを起動」のような手順を踏む必要がありません。
図1 Emacs上でirbを起動して、その場で式を評価する
さらに興味のある方は、inf-rubyを拡張したirbsh などを調べてみるのも、面白いかもしれません。
バージョン管理ツールと連携しよう
プログラム開発において、バージョン管理ツールの使用は必須といってよいでしょう。EmacsはVCというバージョン管理ツールへのインターフェイスを標準で持っており、コードのバージョン管理もEmacs上から行えます。
VCはバックエンドとしてCVSやSubverionなど、複数のバージョン管理ツールに対応しており、ソースコードのディレクトリ内に.svnディレクトリがあればSubversionを、CVSディレクトリがあればCVSをというように、使用するツールも自動的に選択してくれます。
ここでは第58回 でも紹介した、Subversionを使った例を紹介します。
Subversionからチェックアウトしたソースを開くと、モードラインに"SVN-x"と示され、SVNによるバージョン管理下にあることと、現在のリビジョン番号が表示されます。ソースコードに変更を加えて保存したら、C-x v vで変更をコミットすることができます。その際に、別バッファでコミットログの入力を促されるので、ログを入力してC-c C-cと入力してください。
バージョン管理ツールを使うメリットは、変更履歴の管理や、内容の比較、変更の破棄などが簡単に行えることですが、そのような機能もEmacs上から利用することができます。
例えば、C-x v =と入力すると、編集中のソースとリポジトリ上のHEADとの差分のdiffをとることができます。現在のファイルへの変更を破棄して、チェックアウトした最新版へ戻したい場合は、C-x v u、コミットログの履歴を見たい場合はC-x v l、新しいファイルをバージョン管理下に置きたい場合はC-x v iです。
詳しくは、VCのマニュアル を調べてみてください。
図2 VCを利用して、コミットログを閲覧してみた。バージョン間の比較なども行える。
psvnを使う
バージョン管理にSubversionを使っているのならば、subversionパッケージに含まれるpsvnを使うという方法もあります。前述のVCは、ファイル単位で操作を行いましたが、psvnを使えばファイルのリストから複数のファイルの追加、コミット処理などをまとめて行うことが可能です。
subversionパッケージがインストールされていれば、使い始めるにあたって特に設定は必要ありません。Emacs上でM-x svn-statusを実行すると、対象とするディレクトリを訊いてきますので、ミニバッファにパスを入力してください。ディレクトリ内のファイル一覧と、現在のステータスが表示されます。
コミットしたいファイルにカーソルをあわせて"c"キーを押すと、コミットログを入力するバッファが開きます。ここでログを入力してC-c C-cでコミットを行うことが可能です。複数のファイルをコミットしたい場合は、"m"キーでコミットしたいファイルにマークをつけてから、コミット操作を行ってください。ファイルを追加したい場合は"a"でマーク、削除したい場合は"D"を使います。他にも"="でdiff、"U"でアップデートが行えます。
詳細なコマンドの説明は、/usr/share/emacs/site-lisp/psvn.el内に記述されていますので、参考にしてください。
図3 psvnで複数のファイルをコミットしてみた
ふたつのファイルをマージする
あるファイルについて、微妙に内容が異なる二つのバージョンができてしまうということがあります[2] 。
これがバージョン管理下にあるファイルならば、差分のマージはツールが機械的に行うことが可能です。しかし場合によっては、バージョン管理下にない別のファイルから差分を抽出してマージしなければならないことがあるかもしれません。
そんな際に便利なのが、ediff-mergeモードです。
M-x ediff-mergeを実行すると、マージ元になる二つのファイルを訊いてきますので、ミニバッファにファイル名を入力しましょう。すると、ウィンドウが三分割され、上半分の左右にマージ元のファイルが下半分にマージ後の状態が表示されます[3] 。
n/pキーで差違のある箇所を前後に移動することが可能で、ここでaまたはbを入力すると、マージ後のバッファにVariant A/Variant Bそれぞれの内容が反映されます。またこの反映は"r"で取り消すことも可能です。
すべての箇所でマージ作業が完了したら、"q"でediff-mergeモードを抜けることができます。その後はマージ結果が*ediff-merge*バッファとして残っていますので、通常通り保存を行うだけです。
図4 ediff-mergeモード。マージ元になる二つのファイルとマージ後のバージョンが表示され、選択しながらマージを行える
来週は、Emacsでのプログラミングに役立つ、便利な拡張機能を紹介します。お楽しみに。