Emacs で最も簡単なコマンドの作り方。

Emacs でつくる JavaScript と ActionScript の環境 という記事を書きました。
という宣伝ポストで終わると面白くないので、簡単だけどあまり知られてない Emacs の使い方を紹介します。

よく使う操作のコマンドを作成する。

例えば、カーソル行を切り取りたくなった場合、行頭へ移動してカットします。つまり、C-a C-k というキーバインドを使って操作します。改行も切り取りたければ、C-k を連続で行なえば良いので、C-a C-k C-k となります。
こういった操作を頻繁に行なうので、コマンドを定義してキーバインドに登録したいと思います。

(define-key global-map (kbd "C-S-k")
  (lambda ()
	(interactive)
	(move-beginning-of-line 1)
	(kill-line)))

move-beginning-of-line に引数を指定しないとエラーが出るのに嵌ったのは内緒です。
これで、C-S-k (Ctr + Shift + k) で現在の行をカットできます。
ですが、コマンドをいちいち調べるのは面倒ですし、実際問題、引数を正しく指定しないと動作しない場合があったりするので、こういう簡単なものは、思いついたらパパッと登録したいもんです。
そこで使えるのが kbd 関数です。

キーバインドが定義されているコマンドは、kbd で組み合せてコマンドが作れる。

Emacs設定講座「キーバインドよ、俺色に染まれ。ア!!」。でもちょっぴり登場しましたが、kbd はマクロとして使えます。
ですので、kbd を利用すると先程の lambda を書く必要もなく、

(define-key global-map (kbd "C-S-k") (kbd "C-a C-k"))

だけで、同様のコマンドが作成できるのです。超便利ですね。
ちなみに、誤解のないように言っておくと、現在の行をカットする操作は、実は kill-whole-line という、それ用の関数があり、C-S-backspace にキーバインドが定義されています。なので、

(define-key global-map (kbd "C-S-k") 'kill-whole-line)

でも良いわけですね。というか、こっちの方が前置引数が使えますので、10行カットしたいとかも C-u 10 C-S-k で実現できますので、ぜったい便利です。

まとめ。

kbd 関数を利用すると、簡単にコマンドが作成できますが、関数が定義されている場合は、そちらを使った方が機能的に便利だったりします。
でも、kbd を使うと lambda って何?な人でもコマンドが作れるので、Lisp わからないって人はぜひ使いましょう!