ChangeLog メモを試してみよう
本テキストは、ChangeLog メモと関連ツールの解説を目的としている。
ChangeLog メモとは、プログラム開発の現場で更新履歴を取るために利用されている ChangeLog と呼ばれるファイルの書式を利用して、電子メモを取ろうというアイデアである。
エッセイ風の序文
本テキストの目的は ChangeLog メモの紹介である。 この題名にもなつてゐる ChangeLog メモとは一体何か。 一言でいへば、それは概念である。 それも、コンピューター上のメモ、つまり電子メモのための概念である。 アイデアといつても差し支えない。
大仰にいふのだから、難しいにちがひない。 私なんかにはとても手が出まい、と思はれるむきもあらう。 しかしさにあらず。 プログラムの知識なんて要らない。 レポート用紙に書くまでもない。 実は、とても簡単なものである。 それも、ただの一行で説明できる (ウェブ・ブラウザーでお読みの方は、ブラウザーの幅をあまり狭くなさらぬやうに)。 かうである。
一つのファイルに ChangeLog 形式で全てのメモを取る
これだけである。 なあんだそれだけか、と侮るなかれ。 ここには二つの意味がある。
一つは、一つのファイルに全てのメモを取る といふ件である。 これは、「超」整理法のポケット一つの原則 —「必要なものは一つの収納場所にしまうべきである」といふ考え— をコンピューター上のメモに適用したものである。 言ひ換えれば、「必要なメモは一つのファイルにしまうべきである」とならうか。 しかしこの効能について、私が下らないことを書き連らねるよりも、 「超」整理法から引用した方がよろしからう。
目的の書類は、本棚の中に必ず存在しているからだ。 捨ててさえいなければ、必ずこの中にある。 ほかの場所を探す必要はない。 つまり、「存在定理」が証明されているのである。 だから、ここを探せば、必ず出てくる。 捜索は、この場所に限定して行えばよい。
ここで、「目的の書類」は「目的のメモ」、「本棚」は「ファイル」と読み換えればよろしい。 一般に、ないものをないと証明するのは難しい。 ファイルを一つに限定することで、 メモの検索効率が上がり、 ないものを探しまわる手間が省けるわけである。 ついでにいへば、ファイルの移動・編集も楽になる。 たくさんのファイルと一つのファイルでは、どちらが扱い易いか自明であらう。
さて、ChangeLog メモ のもう一つの重要な意味を説明しやう。 それは、ChangeLog 形式でメモを取る といふ件である。 なぜ ChangeLog 形式なのか。 それは、メモとメモの記入日が常に一緒になるからである (ChangeLog 形式の詳しい説明は本文にゆずる)。 日付の入つていない日記が役にたたないのと同じやうに、 何時書いたのかわからぬメモは価値が低い。 もちろん、メモに記入日が一緒に入れば何でもよいのである。 ChangeLog 形式は、たまたまその要求を満たしており、 プログラムの世界では比較的有名で、 特別なソフトに依存しておらず、わかりやすい形式であった。 だから、我々は ChangeLog 形式を使っているにすぎない。
蛇足ながら付け加えると、メモをプレーン・テキストで取れることも嬉しい。 というのも、特定のプログラム (例えば Word) に依存せずにすむからである。 もしさういふことになれば、プログラムの寿命がメモの寿命になつてしまう。 メモは一生ものであるから、 できるだけプログラムに依存しないやうにしたい。 いわゆる、データとアプリケーションの分離である。 ChangeLog 形式は、さういふ意味でも電子メモとして優れている。
ChangeLog メモに興味を持つていただけたであらうか。 よろしければ、この先をお読み頂きたい。 ChangeLog メモの具体的な書き方、 編集・検索用ツールの紹介、 いくつかの有用なポインターがある。
最後に、ChangeLog メモの一例をもつて、序文を締めくくらせて頂く。
2004-09-06 Masayuki Ataka <ataka@milk.freemail.ne.jp> * clmemo: エッセイ風の序文を書いた。
1 ChangeLog
ChangeLog ファイルは、
プログラムが何時、何故変更されたのかという時系列記録を持つ。
記録は変更点を記述した連続物のエントリーで構成されている。
普通、その記録は ChangeLog と呼ばれるファイルに保存されている...
— from GNU Emacs Reference ManualA change log file contains a chronological record of when and why you
have changed a program, consisting of a sequence of entries describing
individual changes. Normally it is kept in a file called ChangeLog...
本章では、ChangeLog メモが利用している ChangeLog のフォーマットを説明する。 そもそも ChangeLog とは、(プログラムの) コードの変更履歴を書く為のフォーマットであった。 そのためいくつかのバリエーションがあるが、 ここでは GNU Emacs がサポートしている ChangeLog 形式を紹介する。 なお、ChangeLog の用語は Change Logs に依った。
最初に ChangeLog の例を示す。
1993-05-25 Richard Stallman <rms@gnu.org> * man.el: Rename symbols `man-*' to `Man-*'. (manual-entry): Make prompt string clearer. * simple.el (blink-matching-paren-distance): Change default to 12,000. 1993-05-24 Richard Stallman <rms@gnu.org> * vc.el (minor-mode-map-alist): Don't use it if it's void. (vc-cancel-version): Doc fix.
ChangeLog は、複数の「エントリー」によって構成されている。 「エントリー」の一行目は「エントリー・ヘッダー」で、 記入日と名前、そしてメール・アドレスから成る。 エントリー・ヘッダーから次のエントリー・ヘッダーを一つのエントリーと数える。 上の例では、‘1993-05-25 Richard Stallman <rms@gnu.org>’ と ‘1993-05-24 Richard Stallman <rms@gnu.org>’ の二行がエントリー・ヘッダーで、 二つのエントリーがあることが分かる。
「エントリー・ヘッダー」に続けて、複数の「アイテム」が続く。 ここが変更点を具体的に書く場所である。 アイテムのルールは次の 2 つ。
- アイテムはタブでインデントされる。
- アイテムは ‘*’ (アスタリスク) で始まり、空行で終わる。
アイテムは通常、 ‘* ファイル名: ’ もしくは ‘* ファイル名 (関数名or変数名): ’ という形を取る。
上の例では、最初のエントリーに 2 つのアイテム。次のエントリーに 1 つのアイテムがある。 一番最初のアイテムは man.el というファイルに関する変更履歴である: まず、‘man-*’ で始まるシンボルを ‘Man-*’ という形にリネームしたとある。 続けて、‘manual-entry’ という関数のプロンプト文字列を分かり易くしたとある。 二番目のアイテムは simple.el というファイルの変更履歴だ。 ‘blink-matching-paren-distance’ という変数のデフォールト値を 12000 にしたとある。
これにエントリー・ヘッダーの情報を合わせれば、 上記変更が 1993 年 5 月 25 日に Richard Stallman 氏によって行われた事が分かる。 そして 1993 年 5 月 24 日の変更履歴が続くわけだが、もはや説明は不要であろう。
1.1 Emacs の ChangeLog モード
Emacs は標準で ChangeLog を編集する為のモードを備えている。 通常 ChangeLog という名前のファイルを開けば、 自動的に ChangeLog モードに入る。 ChangeLog モードは、次の機能を提供する。
- ChangeLog に応じた色付け。
- 改行で行頭への TAB 文字自動挿入。
- 行頭の TAB を考慮した fill。
しかし、Emacs ユーザーは ChangeLog ファイルを直接、手で開いたりしない。 編集中のファイルで C-x 4 a (‘M-x add-change-log-entry-other-window’) と打つのである。 すると Emacs は、 適切な ChangeLog ファイルを開き、 エントリー・ヘッダーとファイル名と関数名or変数名を自動的に挿入する。 この機能は、C でも Perl でも Ruby でも Fortran でも Java でも、 ほとんどの言語でサポートされている。
なお、エントリー・ヘッダーに使われるユーザー名とメール・アドレスは、 次の 2 つの変数で変えられる。
もし、編集中の File が CVS などのバージョン管理下にあるなら、 ‘*VC-Log*’ バッファーで C-c C-a してみよう。 ChangeLog からログがコピーされる。
2 ChangeLog メモ
年寄りパイロットや勇敢なパイロットはいるが、
勇敢な年寄りパイロットはいない。
— from chalow を用いた ChangeLog 電子メモ術の極意There are old pilots, and there are bold pilots,
but there are no old, bold pilots.
ChangeLog メモとは、ChangeLog 形式を利用して電子メモを取ろうというアイデアで、 山下達雄氏によって 2000 年頃に提唱され、 2002 年 12 月、Namazu で有名な高林哲氏が Unix Magazine の「横着プログラミング」 で取り上げた事から広く知られるようになったものである。 序文にある通り、 ChangeLog メモファイルは一つのファイルで、 メモに限らず、日誌、予定、家計簿などを書いておく。 プレーン・テキストを利用した電子メモなので、
- grep やエディターのサーチといった既存のツールで検索可能
- sed や Perl, Ruby などで簡単に加工可能
2005-03-11 Masayuki Ataka <ataka@milk.freemail.ne.jp> * タイトル (サブ・タイトル): ChangeLog の「アイテム」は一日のメモに、 ファイル名はメモの「タイトル」に、 関数名or変数名はメモの「サブ・タイトル」にあたる。 昔は空行をメモの区切りとしていたが、今はそうではない。 空行の後に TAB* があると新しいメモが始まったとみなす。 * chalow [カテゴリ]: chalow では、サブ・タイトル部分に [...] を使う。 ここをカテゴリと呼ぶ。 2004-07-22 Masayuki Ataka <ataka@milk.freemail.ne.jp> * pop-club: blgrep-0.1rc1 と clmemo-1.0rc1 をリリース。 chalow ML にもリリースをメールした。 ※ pop-club は筆者のウェブページ。作業日誌としてメモを取った。 * Command (grep): -v 結果の反転。マッチしなかった行を選択する。 ※ grep コマンドの使い方をメモした。 ※ もう man の網羅的な説明から -v オプションを探す必要はない。
ChangeLog メモは一生使える電子メモを目的としている。
「勇敢な (=格好いい) ツールを次から次へと現れるとしても、 結局、最後はシンプルなものが生き延びると信じている。
2.1 インライン日付
インライン日付とは、 年月日をハイフンで繋ぎ角カッコ ‘[...]’ で囲んだものである。 一桁の月や日は、‘0’ を補って二桁にする。
[2004-07-07]
インライン日付はアイテム中のどこにでも書けるが、 下記のように行をまたいではならない。
[2004-07- 07]
インライン日付に対して、エントリー・ヘッダーにある日付を、 エントリーの日付とか単に日付と呼ぶ。 後に説明する clmemo.el や clgrep や chalow では、 インライン日付はそのエントリーの日付へのハイパーリンクになる。
インライン日付では、アイテムを直接指定することもできる。 以下のように、アイテムも指定したインライン日付をアイテム情報付インライン日付と呼ぶ。
[2004-07-07-3]
上の例は、2004 年 7 月 7 日のエントリーの下から 3 番目のアイテムを指す。 アイテム情報付インライン日付では、アイテムの番号をエントリーの下から数える。 これは、上から数えるとアイテムを追加した時に番号がずれてしまうためである。
2.2 引用文
ChangeLog メモでは、引用を表すのに次の二つの表記を用いることが多い。 一つは、行頭に ‘>’ もしくは ‘|’ といった記号を付ける方法である。
2005-03-12 (Sat) Masayuki Ataka <ataka@milk.freemail.ne.jp> * clmemo: 短い引用のやり方 > メールの引用記号のようなノリで書ける。 > ただし、長い引用には向かない。 | 引用記号は、`>' でも `|' でもよい。 | 引用記号は TAB のすぐ後に来ることが期待される。 | 従って、これは引用ではない。
もう一つの方法は、 引用の始まりに ‘>>’ と書いた一行を、 引用の終わりに ‘<<’ と書いた一行を入れる方法である。
2005-03-12 (Sat) Masayuki Ataka <ataka@milk.freemail.ne.jp> * clmemo: 長い引用のやり方 >> 長い引用は `>>' と `<<' の間に書く。 行頭に引用記号を入れなくて済むので楽だ。 せっかくの長い引用の例なのに、短くてスマン。 短い引用に使ってもよいということで... <<
後述の chalow は、引用部分を blockquote 要素で囲う。
2.3 タグ
(tagname: text)
後に説明する clmemo, clgrep では、 url タグはそのアドレスへのハイパーリンクになる。
chalow では対応していない?
3 clmemo — ChangeLog メモ モード
— from ex-webpageEmacs ユーザーは幸せです。
何故なら、C-x 4 a と押すだけで、
簡単に ChangeLog ファイルを作れちゃうからです。
clmemo.el は、ChangeLog メモの入力を支援するコマンドやマイナー・モードを提供する。
3.1 clmemo のインストール
最新版の clmemo.el は以下の場所にある。
ダウンロード後の作業は、以下の通り。 make 前に必要に応じて、Makefile を編集する。
$ tar xzvf clmemo-1.0.tar.gz $ cd clmemo-1.0 $ make # make install
続けて、.emacs に以下のコードを追加する。
(autoload 'clmemo "clmemo" "ChangeLog memo mode." t) ;; あなたの ChangeLog メモファイルへのパス (setq clmemo-file-name "~/personal/memo/clmemo.txt") ;; 好きなキーへバインド (global-set-key "\C-xM" 'clmemo)
ここでは、ChangeLog メモ が ~/personal/memo/clmemo.txt にあるとしている。 また、関数 ‘clmemo’ を C-x M にバインドした。 以降の説明は、上の設定に従うものとする。 もし、違う設定を施した場合は、適宜読み替えて頂きたい。
最後に、ChangeLog メモファイルの末尾に以下のコードを追加する。
^L Local Variables: mode: change-log coding: utf-8 clmemo-mode: t End:
3.2 メモの入力
- C-x M
- あなたの「ChangeLog メモ」を開き、メモのタイトルを補完入力する。
- C-u C-x M
- あなたの「ChangeLog メモ」を開く。or 過去のメモを追加。
- C-u C-u C-x M
- あなたの「ChangeLog メモ」を検索する。
例として「メモ」というタイトルのメモを書いてみよう。 M-x clmemo とすると、タイトルの入力を促すプロンプトが出るので、 ‘メモ’と入力する。
clmemo title: メモ<RET>
ウィンドウが二つに分かれて、 片方のウィンドウに ChangeLog メモファイルが現れる。
2004-09-06 Masayuki Ataka <ataka@milk.freemail.ne.jp> * メモ: -!-
‘-!-’ は、カーソルの位置を表す。 エントリー・ヘッダーに挿入されるユーザー名・e-mail アドレスの変更方法は See Emacs の ChangeLog モード.
もし ChangeLog メモファイルの中から clmemo を実行した場合は、 ウィンドウを二つに分けない。 また、タイトルの入力プロンプトで C-g を打つと、clmemo はメモの入力を中止する。
C-u M-x clmemo のように数引数をつけて clmemo を呼び出すと、 ChangeLog メモファイルの外にいる場合、ChangeLog メモファイルを開く。 ChangeLog メモファイルの内にいる場合、カーソルを含む日付にメモを追加する。 過去の日付にメモを追加するには、 その日付に移動してから C-u M-x clmemo とする。
clmemo を呼び出す前の状態に戻るには、C-c C-q (clmemo-exit) とする。
リージョンをメモに追加する
.emacs に次のコードを追加すると、リージョンがある場合、 C-x M はリージョンをメモに追加するようになる。
(setq clmemo-buffer-function-list '(clmemo-insert-region))
3.2.1 タイトルの補完入力
タイトルの入力には補完が使える。 補完リストは変数 clmemo-title-list で定義されている。 例えば次のように設定すると、 ‘idea’, ‘computer’, ‘購入’ に対して補完入力ができるようになる。
(setq clmemo-title-list '(("idea" "computer" "購入")))
補完リストには、別名を定義する事もできる。 その場合は、‘(別名 . 本体)’ という形で書く。 例えば、上の設定では‘購入’の補完はいかにも面倒そうだ (補完するのに日本語入力を ON にしなければならない!) そこで、別名に ‘buy’ を定義してみよう。
(setq clmemo-title-list '(("idea" "computer" ("buy" . "購入"))))
タイトルに ‘buy’ と入力すると、自動的に‘購入’へと展開される。
サブ・タイトルの入力も続けて行うには、 タイトルの末尾に ‘(’ を置く。 サブ・タイトルの入力でもタイトルと同様の補完が効く。
上の clmemo-title-list 設定を使って、 「CD の購入」というようなメモを作ってみよう。 まず、C-x M でタイトル入力画面を出し、‘buy(’ と入れる。
clmemo title: buy(<RET>
‘buy’ の後ろに‘(’ がついているので、サブ・タイトルの入力を促すプロンプトが出る。 ここで、‘buy’ は自動的に‘購入’へと置き換えられる。
subtitle for `購入': CD<RET>
‘CD’ というサブ・タイトルを入力した。 これで、次のようなメモを得る。
2005-03-12 (Sat) Masayuki Ataka <ataka@milk.freemail.ne.jp> * 購入 (CD): -!-
chalow カテゴリー風のサブ・タイトル
変数 clmemo-subtitle-char と clmemo-subtitle-punctuation-char を次のように変更することで、 chalow 風のカテゴリーが入力される。
(setq clmemo-subtitle-char "[" clmemo-subtitle-punctuation-char '(" [" . "]"))
なお、chalow では次のように複数のカテゴリーを入力する場合がある。
* うまい! [酒][コンビニ]: 昨日、コンビニで見つけた...
このようなカテゴリーを入力するには、 カテゴリー入力の末尾に ‘[’ を加える。 上の例を入力するには... C-x M でタイトルを入力 (末尾に ‘[’ を忘れないように)、
clmemo title: うまい![<RET>
最初のカテゴリーが聞かれるから、それに答えて (末尾に ‘[’ を忘れないように)、
subtitle for `うまい!': 酒[<RET>
もひとつカテゴリーが聞かれるから、答えてやる。
subtitle for `うまい! (酒)': コンビニ<RET>
すると、複数カテゴリー付のメモができる。
2005-03-13 (Sun) Masayuki Ataka <ataka@milk.freemail.ne.jp> * うまい! [酒] [コンビニ]: -!-
タイトルの自動修正
変数 clmemo-title-format-function を定義する事で、 例えば、タイトルを常に大文字にするとか、小文字にするとかといった自動修正ができる。
- ‘(setq clmemo-title-format-function 'upcase-word)’
- 入力したタイトルを常に大文字にする
- ‘(setq clmemo-title-format-function 'capitalize-word)’
- 入力したタイトルの一文字目を常に大文字にする
- ‘(setq clmemo-title-format-function 'downcase-word)’
- 入力したタイトルを常に小文字にする
3.2.2 曜日情報の追加
clmemo のデフォールトのエントリー・ヘッダーは次のような形をしており、 メモを取った日の曜日が分からない。
2004-09-06 Masayuki Ataka <ataka@milk.freemail.ne.jp>
変数 clmemo-time-string-with-weekday を ‘t’ にすると、 新規エントリー・ヘッダーに曜日情報を加えるようになる。
2004-09-06 (Mon) Masayuki Ataka <ataka@milk.freemail.ne.jp>
また、既存のエントリー・ヘッダーを編集するために、 次の 2 つのコマンドが用意されている。
3.3 メモの編集
本章では、ChangeLog メモの編集にかかわるコマンドを紹介する。
3.3.1 移動とマーク
メモ単位の移動コマンドが、いくつか用意されている。 下記のコマンドは、全て数引数を取ることで複数年・月を移動することができる。
マーク用の関数もある。
3.3.2 行頭の TAB
ChangeLog メモの欠点はメモの先頭に常に TAB が入ることだ、とよく言われている。 本節では行頭の TAB と仲良くつきあうためのコマンドを紹介する。
なお clmemo.el では、 TAB (C-i) に clmemo-next-inline-date が割り当てられている。 そのため、TAB で TAB 文字が入力できない。 TAB 文字を入力するには、C-q TAB もしくは C-q C-i とする。 ただし、行頭に TAB を挿入するだけなら、clmemo-indent-region を使う方が楽である。
3.3.3 インライン日付の編集
インライン日付入力モードは、インライン日付 の入力を少し (?) 楽にする挿入コマンドである。 インライン日付を挿入したいと思ったら、 C-c C-d (clmemo-insert-inline-date) としてインライン日付入力モードに入る。 この時点で、まだインライン日付は挿入されない。 入力したい日付のエントリーに移動して RET を押す。 すると、インライン日付入力モードに入った場所へカーソルが戻り、 そのエントリーの日付がインライン日付として入力される。 インライン日付入力モードから抜けるには q である。
具体的な例を見てみよう。 例えば、次のようなメモを書いていたとする。
2003-09-15 (Mon) Masayuki Ataka <ataka@milk.freemail.ne.jp> * 映画鑑賞: 「X-Men 2」 on DVD X-Men 2 (2003) -!-
この映画の前作は、以前見たことがあるのでリンクをはっておきたい。 上の ‘-!-’ の位置で、インライン日付入力モードに入る (C-c C-d)。 前作の題名は「X-Men」であるから、 C-s X-Men として X-Men について書いてあるメモを探す。 次のようなメモが見つかった。
2003-05-11 (Sun) Masayuki Ataka <ataka@milk.freemail.ne.jp> * 映画鑑賞: 「X メン」 on TV X-Men-!- (2000) - 借りてきた (IT 以外の) DVD よりも、このテレビでやっていた X メンの方が面白い。 今、X-Men II をやっているから、ブームに乗ろうというテレビ企画か? - マグニート (敵) 役でイアン・マッケランが出演。 次作では、X-Men 達と手を組んで活躍するというので楽しみだ。
まさに、これこそ求めていたメモだ (X-Men は TV で見たのだなぁ)。 RET をおすと、もといた場所に ‘[2003-05-11]’ と日付が挿入される。
2003-09-15 (Mon) Masayuki Ataka <ataka@milk.freemail.ne.jp> * 映画鑑賞: 「X-Men 2」 on DVD X-Men 2 (2003) [2003-05-11]-!-
最終的には、こんなメモができた。
2003-09-15 (Mon) Masayuki Ataka <ataka@milk.freemail.ne.jp> * 映画鑑賞: 「X-Men 2」 on DVD X-Men 2 (2003) [2003-05-11] に観た X-Men の続編。 - ヒュー・ジャックマン、ハル・ベリー、イアン・マッケラン、パトリック・スチュワート と豪華なメンバーが再び大活躍。 - SFX と相まって、とても面白い出来に仕上っていた。
上の例ではインライン日付を挿入したが、 アイテム情報付インライン日付を入力したければ、 RET のかわりに C-u RET とする。
インライン日付入力モードは、(View モードのように) 文字の編集を受けつけない代わりに、 space や backspace に移動用のコマンドを割り当てている。
- RET
- カーソルのあるエントリーの日付をもといた位置に挿入する。
- C-u RET
- カーソルのあるエントリーの日付とアイテム情報をもといた位置に挿入する。
- q
- インライン日付入力モードを抜ける。
- s (r)
- 前方 (後方) インクリメンタル・サーチ
- n (p)
- 次の (前の) アイテムへ移動する。
- f (b)
- 次の (前の) エントリーへ移動する。
- { (})
- 次の (前の) 月へ移動する。
- space (backspace)
- 前の (後ろの) ページへ移動する。
インライン日付へのジャンプ
3.3.4 引用文の編集
— Function: clmemo-quote-region
リージョンの行頭に引用記号を追加する。
数引数付で呼び出すと (C-u C-c >)、使用する引用記号を尋ねてくれる。
3.3.5 タグの編集
本節では、タグ の設定方法と使い方を説明する。
タグは変数 clmemo-tag-list で設定する。 デフォールトでは、2 つのタグ (‘url’ と ‘file’) が用意されている。 電話番号用のタグ ‘tel’ とメール・アドレス用のタグ ‘e-mail’ を作ってみよう。
(setq clmemo-tag-list (cons '("tel" "e-mail") clmemo-tag-list))
タグを入力するには C-c ( (clmemo-tag-insert-quick) とする。
tag:
とタグを聞いてくる。 ここで、タグの頭文字を入れるとタグが入力される。 例えば、‘url’ タグを入力したい場合は u と入れればよい。 頭文字が同じタグを設定していた場合は、 list の中で一番最初に定義されているものが挿入される。 二番目以降のタグを入力するには、space を打つ。 すると、補完が効くようになる。
タグの上で C-c RET すると、 タグに関連づけられた関数が呼ばれる。 これを、タグ・ジャンプと呼ぶ。 デフォールトでは、 ‘url’ タグには browse-url-at-point が、 ‘file’ タグには find-file-at-point が呼ばれる。
タグ入力時、タグ・ジャンプ時に関連を関連付けるには、 変数 clmemo-tag-list を次の書式で設定する。
(タグ名 ジャンプ用関数 入力用関数)
clmemo-tag-list のデフォールト値は、次の通り。
(defvar clmemo-tag-list '(("url" browse-url-at-point) ("file" find-file-at-point clmemo-read-file-name))
3.3.5.1 Emacs-w3m とのコラボレーション
Emacs-w3m とは、 Emacs 上で動作するウェブ・ブラウザーである。 Emacs-w3m には独自のブックマーク機能があるが、 本節では、ブックマークを ChangeLog メモで取る方法を説明する。 なお、Emacs-w3m のインストール方法および使用法は、Emacs-w3m のページを参照されたい。
まず、次のコードを .emacs に入れる。
(setq clmemo-buffer-function-list '(clmemo-tag-insert-url-from-w3m))
次に、Emacs-w3m でウェブ・ページをブラウズする。 ここでは、clmemo.el を配布しているウェブページを覗いてみることにしよう。 ウェブページのアドレスは http://pop-club.hp.infoseek.co.jp/emacs/clmemo.html である。 さて、このページはよいページなので (もちろんだとも!) ChangeLog メモにブックマークとして保存したくなった。 C-x M でメモを開こう。 まず、title が聞かれる。 ‘URI’ という名前にしよう。
clmemo title: URI<RET>
普段ならここでメモの編集ができるようになるが、 Emacs-w3m の中から clmemo を呼び出した時は少し違う。 ウェブページの「タイトル」を入れるかどうか聞いてくる。
Insert `Let's Try ChangeLog Memo' as title? (y or n)
ここは ‘y’ と答えよう。 次にウェブページの URL を入れるかどうか聞いてくる。
Insert URL? (y or n)
更に ‘y’ と答える。 すると、次のようなメモができる
2002-01-15 (Tue) Masayuki Ataka <ataka@milk.freemail.ne.jp> * URI: Let's Try ChangeLog Memq-!- (url: http://pop-club.hp.infoseek.co.jp/emacs/clmemo.html)
url タグの中で C-c RET とすると browse-url-at-point が呼ばれ、 (おそらく Emacs-w3m が起ち上がって) ウェブページが見れる。
3.4 各エディタ上の clmemo
- Vim
- ChangeLogMemo Tips
- 秀丸
- TeraPad
- WZ エディタ
- TeraPad
- Windows ユーザーのための電子メモ術
- xyzzy
- changelogmemo
4 clgrep — ChangeLog grep
clgrep は ChangeLog メモ専用の grep である。
まず、ChangeLog メモは「アイテム」単位のメモである。 そして、(我々がよく利用する) grep は「行」単位の検索ツールである。 従って、grep は検索が成功しても「メモの一部」しか表示しない。 一部で十分な場合もあろうが、「メモの全体」を俯瞰できると便利である。 そこで、検索結果をアイテム単位で出力するように拡張された grep ツールが求められた。 それが clgrep なのである。
次の出力は、‘M-x occur’1を使い、 私の ChangeLog メモで「弟子」を検索した結果である。
2 matches for "弟子" in buffer: clmemo.txt 4653: * Quotation: 弟子が尋ねた。 17978: が鼻祖となり、その弟子 S. I. ハヤカワらが世に広めた新しい言語学体系
メモの一部分を抜き出しているため、何を書いてあるのかよく分からない。 一方、clgrep を使って検索すると、 次のように検索にヒットしたメモ全体が出力される。
2004-06-24 (Thu) Masayuki Ataka <ataka@milk.freemail.ne.jp> * Quotation: 弟子が尋ねた。 「先生、私は先生がカッコをまるで魔術師のように 扱っているのを常々敬服しています。 どうすれば先生のようになれるのでしょうか?」 師「えっ? カッコ? あ、そうか。そんなものもあったな。いやあ、 すっかり忘れておったわ」 (author: 竹内 郁雄) (cite: 竹内郁雄: やっぱり Lispだね, bit, Vol. 32, No. 5., 2000.) pp.33-39 2003-01-13 (Mon) Masayuki Ataka <ataka@milk.freemail.ne.jp> * 本: 「非 A の傀儡」読了。 The Pawns of NULL-A (1956) p.352 <author; A. E. van Vogt> A. E. ヴァン・ヴォークト - 解説に「非 A」の簡単な紹介がある。 >> 「非 A」即ち「非アリストテレス」主義はアルフレッド・コージブスキー (1879-1950) が鼻祖となり、その弟子 S. I. ハヤカワらが世に広めた新しい言語学体系 「一般意味論」の別称である。 <<
4.1 blgrep — Block grep
clgrep.el は Emacs 上で動作する clgrep で、 blgrep パッケージに含まれている。 blgrep パッケージは EmacsLisp で書かれた grep コマンド集で、 以下のサイトからダウンロードできる。
clgrep のインストール
ダウンロード後の作業は、以下の通り。 clgrep のコンパイルには clmemo.el が必要なので、 clmemo.el を clgrep.el のあるディレクトリーにコピーする。
$ tar xzvf blgrep-0.2.tar.gz $ cd blgrep-0.2 $ cp path/to/clmemo.el ./ $ make # make install
インストールに成功したら、 .emacs に以下のコードを追加する。
; ; clgrep ; (autoload 'clgrep "clgrep" "ChangeLog grep." t) (autoload 'clgrep-item "clgrep" "ChangeLog grep." t) (autoload 'clgrep-item-header "clgrep" "ChangeLog grep for item header" t) (autoload 'clgrep-item-tag "clgrep" "ChangeLog grep for tag" t) (autoload 'clgrep-item-notag "clgrep" "ChangeLog grep for item except for tag" t) (autoload 'clgrep-item-nourl "clgrep" "ChangeLog grep item except for url" t) (autoload 'clgrep-entry "clgrep" "ChangeLog grep for entry" t) (autoload 'clgrep-entry-header "clgrep" "ChangeLog grep for entry header" t) (autoload 'clgrep-entry-no-entry-header "clgrep" "ChangeLog grep for entry except entry header" t) (autoload 'clgrep-entry-tag "clgrep" "ChangeLog grep for tag" t) (autoload 'clgrep-entry-notag "clgrep" "ChangeLog grep for tag" t) (autoload 'clgrep-entry-nourl "clgrep" "ChangeLog grep entry except for url" t) (add-hook 'clmemo-mode-hook '(lambda () (define-key clmemo-mode-map "\C-c\C-g" 'clgrep)))
4.2 clgrep の使い方
ChangeLog メモファイルの中に入り、M-x clgrep を実行する。 検索文字列を聞いてくるので答える。 検索には正規表現が使える。 ここではシンプルに「clmemo」を検索してみよう。
Query: clmemo
検索結果はアイテムごとに日付の新しい順に並ぶ。
2004-09-17 (Fri) Masayuki Ataka <ataka@milk.freemail.ne.jp> * Idea (idate): 日付入力用ツール。 clmemo.el で clmemo-inline-date-convert としているコードを改良。 2004-09-06 (Mon) Masayuki Ataka <ataka@milk.freemail.ne.jp> * pop-club (clmemo): clmemo-1.0rc3 リリース。 以下続く...
数引数を取ると (C-u M-x clgrep)、検索結果を逆順に表示する。
AND 検索
clgrep は Google などの検索エンジンでよくみかける AND 検索をサポートしていない。 「A」と「B」と「C」の AND 検索をする場合は、 まず「A」で clgrep して、その結果に対して更に「B」で clgrep して、 そして「C」について clgrep する。
例えば、「指輪物語」と「本」 の両方にマッチするメモだけ表示させるには、 最初に「指輪物語」で検索をかける。 するとカーソルは *clgrep* バッファーに移動して検索結果が表示される。 そこで更に M-x clgrep とするか g を押すと、 *clgrep* バッファに対して検索がかけられる。 検索文字に「本」を指定して、「指輪物語」と「本」の両方にマッチするメモだけを得る。
OR 検索
例えば、‘foo’ か ‘bar’ にマッチするメモを検索するには
Query: foo\|bar
とする。ここで ‘\|’ が正規表現にあたり、 ‘\|’ より前のものと後のものにマッチする。 つまり ‘\|’ の前の ‘foo’ と後の ‘bar’ にマッチするのである。
正規表現の詳しい説明は See Syntax of Regular Expressions.
4.3 clgrep の他の実装
本節では、blgrep 以外の clgrep を紹介する。
なお、コマンドラインから呼び出すタイプの clgrep は (clgrep に限らず、普通の grep でもだが) ファイルの文字コードとプロセスの文字コードが合っている必要がある。 この問題は、特に日本語を検索するときに重要になる。
例えば、もし ChangeLog メモファイルを Shift_JIS で書いていたとして、 clgrep をコマンドラインから実行したらどうなるか。 あなたの端末が Shift_JIS ならよいが、 それ以外 (ex. EUC-JP, ISO-2022-JP, UTF-8) だったなら文字コードが違うので、 検索に失敗してしまう。 そういう場合は、ファイルを端末の文字コードに変換しておくとよい。
4.3.1 clgrep — Ruby での実装
- コマンド名
- clgrep
- 作者
- 高林哲さん
- ウェブページ
- Unix Magazine連載: 横着プログラミング
clgrep の最初の実装。
以下の機能をサポートしている。
- 検索結果の逆順表示
- 大文字・小文字の無視
4.3.2 pickup — Perl での実装
- コマンド名
- pickup
- 作者
- 藤部修平さん
- ウェブページ
- メモの活用
以下の機能をサポートしている。
- 検索結果の逆順表示
- 検索文字列の強調表示
- アイテムごとの出力一時停止
5 関連ツール
本章では、ChangeLog メモ関連ツールの紹介をする。
5.1 Chalow — CHAngeLog On the Web
chalow は ChangeLog メモ を HTML に変換する Perl スクリプトである。
- 作者
- 山下達雄
- ウェブページ
- http://nais.to/~yto/tools/chalow/
手元に clmemo.txt という名前の ChangeLog メモ ファイルがあるとして これを HTML に変換するには
$ chalow -o sample clmemo.txt
とする。 ここで ‘-o sample’ は、 sample というディレクトリーの中にできた HTML ファイルを入れる、 という意味である。 sample/index.html ファイルをウェブ・ブラウザーで開いてみよう。 あなたの ChangeLog メモファイルが HTML になっているのが見れるはずだ。
詳しくは、chalow 付属の README をお読み頂きたい。
5.2 iimage.el
iimage は Emacs 上で画像を表示するマイナー・モードである。 下にあるような「画像へのパス」を、実際の画像へと置き換えてくれる。
file://foo.png `file://foo.png' [[foo.gif]] <foo.png> `foo.JPG'
- 作者
- 小関吉則
- ウェブページ
- http://www.netlaputa.ne.jp/~kose/Emacs/iimage.html (英語) http://www.netlaputa.ne.jp/~kose/Emacs/200402.html (日本語)
作者のページから iimage.el をダウンロードして load-path に置き、.emacs に以下の内容を追加する。
(autoload 'iimage-mode "iimage" "Support Inline image minor mode." t) (autoload 'turn-on-iimage-mode "iimage" "Turn on Inline image minor mode." t)
ChangeLog メモに入って、M-x iimage-mode とすると画像が表示される。 もう一度 M-x iimage-mode すると画像は非表示になる。
デフォールトの設定では、画像をカレント・ディレクトリーだけからしか探さない。 画像を他のディレクトリーに入れて管理している場合は、 ‘image-dir/foo.jpg’ というように、ディレクトリーも指定しなければならない。 しかし、この方法はいかにも患わしいし、 ディレクトリーの名前を変えた時の処理が大変である。 変数 iimage-mode-image-search-path にディレクトリー名を指定する事で、 ディレクトリー名を省略できるようになる。
(setq iimage-mode-image-search-path '("image-dir"))
clgrep の検索時に iimage を自動 ON するには、次の設定を .emacs に加える。
(add-hook 'clgrep-mode-hook 'turn-on-iimage-mode)
参考文献およびウェブページ
参考文献
- Change Logs
- GNU 形式の ChangeLog の説明。
ChangeLog メモの用語も、このマニュアルに則っている。
- 「超」整理法 [中公新書 1159]
- 副題「情報検索と発想の新システム」。
「ポケット一つの原則」や「押し出しファイリング」を世に広めたベストセラー。
タイム・マネージメントを扱った続刊 続「超」整理法・時間編、
捨てる技術を扱った続々刊 「超」整理法 3 あり。
- 横着プログラミング 第 1 回: UNIX のメモ技術 [Unix Magazine 2002/01]
- 連載 横着プログラミング では、
Namazu や migemo で有名な高林哲氏が、
横着した Unix ライフを送るためのツールを紹介した。
ChangeLog メモは、その第 1 回を飾った。
- 横着プログラミング 第 12 回: [Unix Magazine 2002/12]
- 連載 横着プログラミング は、Unix Magazine に一年間続いた。
最終号は、締め括りとして連載分を振り返る形を取った。
第 1 回で取り上げた ChangeLog メモについては、Emacs 版 clgrep が紹介された。
- 書き散らかし指向メモツール howm [UNIX USER 2004/02] pp.50–63
- 副題 「一人お手軽 Wiki もどき」。
ChangeLog メモとは一味違うメモツール howm の解説。
2 部構成で、第 1 部は howm の創案者、
平岡和幸氏による howm の概略と Emacs との連携について。
第 2 部は、七尾功一氏による vim 用 howm-mode.vim の解説。
- chalow を用いた ChangeLog 電子メモ術の極意 [UNIX USER 2004/08] pp.54–61
- ChangeLog メモの創案者、山下達雄氏による chalow の解説。
参考ウェブページ
- たつをのホームページ
- ChangeLog メモの創案者、山下達雄氏のウェブページ。
ChangeLog メモから HTML を作成するツール chalow も公開されている。
- Unix Magazine 連載: 横着プログラミング
- 高林氏が Unix Magazine 誌に連載した横着プログラミングの記事が公開されている。 連載の栄えある第 1 回こそ、ChangeLog メモ の特集であった。
Appendix A 他の ChangeLog 形式
古い ChangeLog 形式
バージョン 20.1 前の Emacs では、日付情報に違うフォーマットを使っていた。
(20.1 前): Fri May 25 11:23:23 1993 Richard Stallman <rms@gnu.org> (20.1 後): 1993-05-25 Richard Stallman <rms@gnu.org>
旧形式のタイム・フォーマットから現在のフォーマットに変換するには、 旧形式のタイム・フォーマットを使っている ChangeLog ファイルに入り、 ‘M-x change-log-redate’ とすればよい。 これは Emacs の標準関数である。
旧形式のタイム・フォーマットは、 Ruby の ChangeLog などで、まだ見る事ができる。
GNU Arch の形式
バージョン管理システムの一つである GNU Arch では、 一風変わった ChangeLog 形式を用意している。 以下に示すのは、GNU Arch 1.2 に附属のマニュアルに載っている ChangeLog の例から 一つのエントリーを抜粋したものである。
2003-01-30 GMT Tom (testing) Lord <lord@@emf.net> patch-2 Summary: merge from mainline sources Revision: hello-world--candice--0.1--patch-2 Patches applied: * lord@@emf.net--2003-example/hello-world--mainline--0.1--patch-3 added copywrong statements * lord@@emf.net--2003-example/hello-world--mainline--0.1--patch-2 commented return from main new files: @{arch@}/ [...] /hello-world--mainline--0.1 [...] /patch-2 @{arch@}/ [...] /hello-world--mainline--0.1 [...] /patch-3 modified files: hw.c main.c new patches: lord@@emf.net--2003-example/hello-world--mainline--0.1--patch-2 lord@@emf.net--2003-example/hello-world--mainline--0.1--patch-3
ChangeLog から、「アイテム」がなくなってしまっている。 GNU Arch では GNU 形式の ChangeLog も併用できるので、 私は (Arch 上では) 両方の ChangeLog 形式を使っている。
変数索引
clmemo-buffer-function-list
: tag with emacs-w3mclmemo-buffer-function-list
: clmemo regionclmemo-file-name
: install clmemoclmemo-quote-prefix
: edit quotationclmemo-subtitle-char
: subtitle as categoryclmemo-subtitle-char
: titleclmemo-subtitle-punctuation-char
: subtitle as categoryclmemo-subtitle-punctuation-char
: titleclmemo-tag-list
: edit tagclmemo-time-string-with-weekday
: day of weekclmemo-title-format-function
: title correctionclmemo-title-list
: titleiimage-mode-image-search-path
: iimageuser-full-name
: ChangeLog mode on Emacsuser-mail-address
: ChangeLog mode on Emacs
関数・キー索引
C-c (
: edit tag- C-c >: edit quotation
C-c C-d
: edit inline date- C-c C-h: move and mark
- C-c C-i: edit tab
- C-c C-w: edit tab
- C-c C-y: edit tab
- C-c TAB: edit tab
- C-c {: move and mark
- C-c }: move and mark
C-q C-i
: edit tabC-q TAB
: edit tab- C-x C-p: move and mark
- C-x [: move and mark
- C-x ]: move and mark
- Shift-TAB: clmemo inline date jump
- TAB: clmemo inline date jump
add-change-log-entry-other-window
: ChangeLog mode on Emacscapitalize-word
: title correctionchange-log-redate
: old formatclgrep-entry-*
: clgrep usageclgrep-item-header
: clgrep usageclgrep-item-notag
: clgrep usageclgrep-item-nourl
: clgrep usageclgrep-item-tag
: clgrep usageclmemo-exit
: input memoclmemo-format-header-with-weekday
: day of weekclmemo-format-header-without-weekday
: day of weekclmemo-indent-region
: edit tabclmemo-insert-inline-date
: edit inline dateclmemo-insert-region
: clmemo regionclmemo-kill-ring-save
: edit tabclmemo-mark-month
: move and markclmemo-mark-year
: move and markclmemo-next-inline-date
: clmemo inline date jumpclmemo-next-inline-date
: edit tabclmemo-next-month
: move and markclmemo-next-year
: move and markclmemo-previous-inline-date
: clmemo inline date jumpclmemo-previous-month
: move and markclmemo-previous-year
: move and markclmemo-quote-region
: edit quotationclmemo-tag-insert-quick
: edit tagclmemo-tag-insert-url-from-w3m
: tag with emacs-w3mclmemo-yank
: edit tabdowncase-word
: title correctioniimage-mode
: iimagekill-ring-save
: edit taboccur
: clgrepturn-on-iimage-mode
: iimageupcase-word
: title correctionyank
: edit tabyank-pop
: edit tab
概念・プログラム索引
- *VC-Log*: ChangeLog mode on Emacs
- AND search: and
Arch, GNU
: gnu arch format- Block grep: blgrep
CVS
: ChangeLog mode on Emacs- ChangeLog on the Web: chalow
- EUC-JP: other clgrep
Emacs
: ChangeLogEmacs, GNU
: ChangeLog mode on EmacsEmacs-w3m
: tag with emacs-w3mGNU Arch
: gnu arch formatGNU Emacs
: ChangeLog mode on EmacsGNU Emacs
: ChangeLog- Google: and
- HTML: web page
Hidemaru
: other editor- ISO-2022-JP: other clgrep
- Inline image: iimage
- Log: ChangeLog mode on Emacs
Namazu
: ChangeLog Memo- OR search: or
Perl
: chalowPerl
: clgrep in Perl- Regular Expressions: or
- Rivision Control System: ChangeLog mode on Emacs
Ruby
: old formatRuby
: clgrep in Ruby- Shift_JIS: other clgrep
- TAB: ChangeLog
TeraPad
: other editor- UTF-8: other clgrep
- Version Control System: ChangeLog mode on Emacs
WZ-editor
: other editor- alias: title
- asterisk: ChangeLog
blgrep
: blgrep- blockquote: quote
- bookmark: tag with emacs-w3m
- browser, web: tag with emacs-w3m
- category, chalow: subtitle as category
- category, chalow: ChangeLog Memo
- chalow: web page
chalow
: bookchalow
: chalowchalow
: subtitle as categorychalow
: quotechalow
: ChangeLog Memoclgrep
: clgrep in Rubyclgrep
: clgrepclgrep
: tag- clgrep, Perl: clgrep in Perl
- clgrep, Ruby: clgrep in Ruby
clmemo
: clmemoclmemo
: tag- completion, title: title
- day of week, entry header: day of week
- e-mail address: ChangeLog
- entry: ChangeLog
- entry header: ChangeLog
- entry header, day of week: day of week
grep
: clgrep- header, entry: ChangeLog
howm
: bookiimage
: iimage- image, inline: iimage
- inline date: edit inline date
- inline date: inline date
- inline date, item number: inline date
- item: ChangeLog
- item number, inline date: inline date
- keyword, one line: tag
- old-style: old format
- one line keyword: tag
pickup
: clgrep in Perl- plain text: ChangeLog Memo
- plain text: Preface
- quotation: edit quotation
- quotation: quote
- region: clmemo region
- search, AND: and
- search, OR: or
- subtitle: subtitle as category
- subtitle: title
- subtitle: ChangeLog Memo
- tag: edit tag
- tag: tag
- title: input memo
- title: ChangeLog Memo
- title, alias: title
- title, completion: title
- user name: ChangeLog
- view-mode: edit inline date
vim
: bookvim
: other editor- web browser: tag with emacs-w3m
- wiki: book
xyzzy
: other editor
No comments:
Post a Comment