Emacs には、バージョンコントロールをするアプリケーションである RCS や CVS, および SCCS に対するインターフェースが附属しています。
単純に言うと、ファイルにどんな変更を施したかを記録するとか、複数の人が編集しているときに、同時に同じファイルを変更したりしないようにするためのものです。
「私はプログラムなんか書かないしー」とか「このマシンを使うのは私だけだしなー」とかいう人もシステムの設定ファイル変更を管理しておくと、いざという時に元に戻すのが簡単だし、昔の設定を思い出したり、変更履歴を見たりすることもできて便利です。 RCS や CVS そのものの働きを知らないことには以下の説明は無意味なので、 そういう方は Web に沢山ある優れた解説を御覧下さるか、 RCS や CVS を御覧下さい。
私は、特に数人でのプログラム開発などやったことのない人間ですが、 自宅と職場など、異なる計算機で編集するようなファイル群の間で整合性を取るような場合には CVS を使い、 特定のファイルを固定された計算機で編集する場合には RCS を使うとよいような気がしています。
(defun hello () "Say hello." (message "hello world!"))というファイルを書いたとしましょう。これを RCS の管理下に登録するには、 C-x v i (
vc-register
) とします。
すると、Note: file is write protected とか言ってきて、無事に登録できるはずです。
これ以降は、単に C-x C-q とタイプするだけで、チェックインしたり、チェックアウトしたりできます。 このキーはもともとは Read-only かそうでないかを切り替えるキーですが、バージョンコントロール下に置かれている場合は、上の動作に置き換わるわけです。
上の状態で C-x C-q としてチェックアウトしてから、上の関数をインタラクティブにしてみましょう。
2行目と3行目の間に、(interactive)
を挿入します。
もう一度 C-x C-q とすると、*VC-log*
というバッファが自動的に開きます。ここには自由に変更ログを書けます。
今回は「関数をインタラクティブにする。」とでも書きましょう。
書き終えたら C-c C-c とします。実際にはこの時点でチェックインされます。後は、これの繰り返しです。
(その1) の説明だけで基本的には使えるはずですが、バージョンコントロールには他にもいろいろと機能があります。割当てられているキーは C-x C-q の他は C-x v がプレフィクスキーになっています。 いくつか挙げると、
C-x v i | RCS の管理下に置く。 |
C-x v h | RCS のヘッダを挿入する。以後自動的にアップデートしてくれる。 |
C-x v u | Undo です。前回チェックインした時の状態に戻す。 |
C-x v c | チェックインのキャンセルです。最後のチェックインでの変更を取り消し。 |
C-x v a | そのディレクトリの ChangeLog をアップデートする。 |
C-x v l | 変更ログを表示する。 |
C-x v = | バージョンの比較を行う。 |
C-x v ~ | バージョン番号を入力すると、そのバージョンを見せてくれる。 |
なお、C-x v h で挿入されるヘッダですが、これはデフォルトでは
; $Id: vc.html,v 1.7 2006/01/15 13:34:42 matsu Exp $
みたいな感じになっています。(その後 check in すると、適切に展開してくれる。) これを例えば Emacs Lisp なら
(defcounst filename-version "$Id")
みたいにカスタマイズしたい場合は、むしろ後で説明する autoinsert.el を 使う方が良いでしょう。こちらも標準でついています。
詳しいことは Info の Emacs の File Handling の中の Version Control の項を御覧下さい。
ここでは CVSの使い方は知っているものとします。 標準でも Emacs は CVS に対応してはいるものの、あまり使い勝手の良いものではありません。 そのため、Stefan Monnier 氏が作られた pcl-cvs というパッケージがあります。
まずは CVS をインストールしなければいけません。
もっとも、FreeBSD や Linux などの配布では最初からインストールされていることが多いでしょう。
pcl-cvs のインストールは、
アーカイブを展開して make; make install
で大抵はうまく行くはずです。
RedHat 系の Linux をお使いの方は linux:pcl-cvs も参照。
基本的には M-x cvs-update
とすると、該当ディレクトリを聞いてくるので、モデュールを checkout した場所を指定します。
すると、CVS で扱われているファイルがその状態と共に表示されます。
後は commit したり、衝突を解消したり、CVS で無視するファイルをそのディレクトリの .cvsignore
に追加する、
などの操作が簡単にできるようになっています。
pcl-cvs は作業ディレクトリでの作業のためのものですが、リポジトリの様子を見るための Emacs Lisp である cvstree.el
というものがあります。
Masatake YAMATO さんが書かれたもので、 cvstree のページ から取って来れます。