はじめに
超初心者ゆえ、 正確性よりも「こんな感じ」「あんな感じ」「これこれに似てる」という雰囲気で進みます。超初心者はメンタル豆腐ですので、それは違うそれはこうだとか怒らないで優しく優しく優しくご指摘願います。
Emacs Lisp をいじるにしても、まずはその実行ができないとどうにもなりません。EmacsでLispはどのように実行するのかを見ていきます。
手元で確かめるられるようにする
Emacs Lisp の実行 == 評価 == eval
どうやれば Emacs Lisp を実行できるのでしょうか。 キーとなるキーワードは 「eval」 です。 Emacs で eval という単語が出てきたら、まずは Emacs Lispの実行(評価;eval)を疑ってください。
まずは scratch バッファ
さて、 最初のうちは scratch バッファで遊ぶのが楽です。
まずは scratch バッファに切り替えましょう(うっかり scratch バッファを削除した場合は、 Emacs を再起動すれば空っぽの状態で復活します)
たいへん重要な「注意」として、 scratch バッファの内容はセーブされないので気を付けてください(今回は必要な部分をファイルにセーブすることにします。下記「ファイル名を決める」を参照)
lisp を 実行(評価;eval) する
lispを実行することを評価(eval)といいます。細かく言うと lisp式を評価してる訳なのですけど、まぁそういうことです。
scratch バッファに切り替えて:
(buffer-name)
の後ろに続けて C-x C-e とすると、ミニバッファーに現在のバッファー名が表示されます。
そうです。今やあなたはlispを実行してのけたのです。実行方法はいろいろありますけど、これが基本のキです。
これは buffer-name という関数を実行したのです。
次はたいへんありがちですけども
(+ 3 5)
を実行してみましょう。そうですね、同様に C-x C-e します。
ミニバッファーに結果が出ます。
なんとなく分かってきたかと思うのですけど、Emacs Lispの基本は (関数 引数1 引数2 ... ) です。いや基本はリストだろとかそりゃそうなんですけど、コマンドを作るっていう面で見ると、真っ先に来るのが
(関数 引数1 引数2 ... )
です。別の言語風に言うと 関数(引数1 引数2 ... ) です。C言語なんかと違うのは、可変長引数がデフォルトであると言うことです。閉じカッコまで幾つでも引数を書いていいです。
関数を実行した結果はいろいろですけど、これまたC言語風に見ればオブジェクトへのポインタを一つ返すだけです。
そのオブジェクトの中身がアトムだったりコンスセルだったりする訳です。なお肝心のリストはコンスセルのリンクリストとして表されます。
次は少し意地悪をしてみましょう。上記の (+ 3 5) を (関数 引数1 引数2) としてではなく、リストそのものとして扱います。
(quote (+ 3 5))
これを実行すると足し算の結果ではなくて (+ 3 5) と表示されます。ここでは + は関数ではなくて 要素の1つと見なされてます。
なお、ここでの quote は関数です。 (関数 引数1) 、 引数1の中身はリストというわけです。
quote は ' (引用符)で略せるので普通は略すようです。
'(+ 3 5)
つまり、 (quote (+ 3 5) と '(+ 3 5) は等価です。 ' の方が括弧の数を減らせるしタイプ量も少ないので好まれますが、 quote の略記であると心のどこかにとどめておいてください。
このように (+ 3 5) は関数の実行であったものが '(+ 3 5) とすると(本来の)リストそのものとして扱われる、この変化自在なところがLispという代物です。
ファイル名を決める
さて、 ここで、 遊んだ…じゃなくて作成した Emacs Lisp プログラムを保存するファイルを用意するとしましょう。
emacs lisp の拡張子は通常 .el です。
ファイル名に規則なんて特にないのですけど、今回は po-mode 用に previous msgid の ediff をするコマンドを書きたいので
po-ediff-previous-msgid.el
というファイル名にします。
このファイルを開くまたは初回作る C-x C-f po-ediff-previous-msgid.el
バッファ scratch で保存したい内容はこちらへコピペしてファイルを保存します。
対象ファイル・参考ファイル
ここで対象ファイル、参考ファイルを整理しておきましょう。
- po-modeが必要です。
- po-modeのソースファイル
- ediffのソースファイル
- po-ediff-previous-msgid.el
- サンプルの処理対象ファイル rev-list-options.po の抜粋です。動作確認は抜粋じゃ無い方でやってますが、たぶん今回作るコマンドに関しては結果は一緒です。