kbd でキーバインドを定義

オレオレ elisp のキーバインディングがいろんな表記でごっちゃになっていたので、kbd でまとめてみるって話。
基本的にはこんな感じ。

(define-key foo-mode-map (kbd "key") 'foo-fn)

emacs kbd」でググってみたら、最初に引っかかったページにしっかり書かれてた。
How to Define Keyboard Shortcuts in Emacs

特殊なキーの表記(Shift)

リンク先を読んでて気になったのが、Shift を使うときに、"S-a" と "A" のどっちで表記すればいいのかという問題。単独で使う場合は (kbd "A") が正解。他のキーと組み合わせる場合は、Shifted Key Combination という節で説明されてるように Meta+Shift+ なら (kbd "M-A")、Ctrl+Shift+ のときは (kbd "C-S-a") とするのが正しいらしい。ただ、このやり方だと、その下に書かれている (kbd "C-:") の説明がつかない。punctuation は例外ってことかな?

よくわからない場合

もうちょっとしっかり読んでみると、よく分からないときは C-h k (M-x describe-key) で調べろと書いてある。describe-key はキーにバインドされているコマンドを調べるときに使う関数で、その説明文に出てくるキーの表記に従うのが一番確実ってことらしい。例えば、

C-h k C-A

とタイプしてみると、

C-a (translated from C-S-a) runs the command move-beginning-of-line,
which is an interactive compiled Lisp function in `simple.el'.

... ...

と出てくるので、(kbd "C-S-a") と書くのが正解。

C-h k C-:

とタイプしてみると、

C-: is undefined

と message が出てくるので (kbd "C-:") が正解。ちなみに、うちの環境だと undefined なときに Cocoa Emacs だとメッセージが出たけど、Carbon Emacs だと出なかったので、環境によっては上手くいかないのかも。

まあ、そもそもリンク先には C-S- のコンビネーションは避けろ、と書いてあるけど。

マウスイベント

kbd って言うくらいだからマウスイベントは無理だと思っていたけど、しっかり解釈してくれる。例えば、Ctrl+<右クリック> は (kbd "") とか。