第2回 復習してみよう

前回色々と書きましたが、みなさんC-h fとかC-h kとかのヘルプ表示するコマンドも関数にバインドされてるの?とか、M-x my-lsは使えるようになったけど、これをC-h f my-lsとやったらどうなるの?とかglobal-mapって変数じゃないの?じゃぁその値は…?とかやってみたでしょうか?


まぁ何も言われなくてもついやってしまったなんて人には、これからも是非楽しんでいただけるような日記を書ければ幸いと思います(が、ここらへんはいろいろと好みがあると思うので一つの答えと言うのはないでしょうけど)。でもまぁ結果はやった人なら分かるでしょうから、特に書きませんがglobal-mapの値は意味が分からなくても当然ですので気にしなくても良いかと。ちなみに今、中央線沿線の某店で飲みながら書いてますので、あとで推敲しますんですぐ読んだ人はアレと言うか、とりあえず前回の復習だけ今は書こうと思います。


第1回で『Emacsのカスタマイズとは、まずは、すでにあるような機能を有効にするために既存の関数を呼び出す』と書きましたが、みなさんは.emacsに何か書いていますでしょうか。.emacsを開いた状態で、M-x occur[Enter]^([^( ]+) *$と打ってみてください([Enter]Enterキーを押すの意味です。普通[RET]と書く気もするけどとりあえず)。M-x occur[Enter]と打つと正規表現を入力するように求められます。正規表現については後で触れると第1回で書きましたが、ちょっとだけ書きたいと思います。『^([^( ]+) *$』と言う正規表現を先頭から読んでいくと、『^』は行頭を意味します。そのすぐ後に『(』があってそのあと『[^( ]』これは"("と" "(半角スペース)以外を意味します。『+』はそれが1つ以上連続し、そのあと『)』で『 *』半角スペースが0個以上連続で『$』で行末。


ようするに
(auto-image-file-mode)
(mw32-ime-initialize)
(auto-compression-mode)
(iswitchb-default-keybindings)
(delete-selection-mode)
(highline-mode)
(display-time-mode)


などにマッチします(Meadow-2.10の.emacs)。まぁ知らないものがあった場合はC-h fで調べて気にいったら使ってみてください。第1回で書いたとおり、.emacsの一番外の括弧のすぐ左に書かれているものは基本的に関数です。これらは呼び出すだけで機能を提供してくれる関数です。同じようにスペースを一個含む『^([^( ]+ [^( ]+) *$』もM-x occurしてみます。ありきたりな関数を除けば以下のような関数がヒットしますね。


(blink-cursor-mode nil)
(set-language-environment "Japanese")
(set-cursor-type 'box)
(show-paren-mode 1)
(global-font-lock-mode t)
(line-number-mode t)
(column-number-mode t)


まぁ第1回やここら辺で出てきた関数のC-h fを一通り読んでいけば.emacsもどれが関数でどれが引数でとか分かってくるんじゃないかと思います。

あとは前回書いた、


(defun my-ls ()
"Run \"ls -l (buffer-file-name)\""
(interactive)
(shell-command (concat "ls -l \"" (concat buffer-file-name "\""))))
ですが、*scratch*などでM-x my-lsなどと実行すると、
ls: : No such file or directory
と変なエラーが出ます。これを出ないようにしましょう。


まずEmacsではディスク上にあるものをファイルと呼び、それを一時的にバッファに読み込んで編集してセーブしたときに、バッファへの編集がファイルに反映されるという感じです。バッファには*scrach*のようなファイルと関連付けられてないものもあります。要はbuffer-file-nameはバッファがファイルを参照してないようなときにはnilです。だからnilのときは(shell-command…)を実行しないようにしましょう。ifを使ってbuffer-file-nameの値を見てnilの時はerror関数を使ってエラーメッセージを出しましょう。下のようになります。


(defun my-ls ()
"Run \"ls -l (buffer-file-name)\""
(interactive)
(if buffer-file-name
(shell-command (concat "ls -l \"" (concat buffer-file-name "\"")))
(error "Buffer is not associated with a file")))

あとはglobal-mapの説明をしてないですね。これはちょっと難しいですね…お茶を濁しましょう。(define-key global-map …)(global-set-key …)と同じです。もう分かってるとは思いますが、これらはキーバインドの設定をしています。そしてglobal-map以外のkeymapもあると言う事です。詳しくはメジャーモード(どうせならついでにマイナーモードも)を、知っておく必要があります。まぁそんな難しい事ではないです。c-mode、html-mode、perl-mode、fundamental-mode、text-modeなどがメジャーモードです(C-h mを今は何のモードかなと思ったバッファで使ってください)。mode lineに出てくるやつですね。これらはそれぞれkeymapを持っていてglobal-mapを部分的に上書きします。その結果が知りたければC-h bを見てください。これも結構見づらいもので、無理して見るほどのものでもないですが。

→■第3回 キー設定をするために
http://d.hatena.ne.jp/lightcyan/20061020/1161351083