Emacs設定講座「キーバインドよ、俺色に染まれ。ア!!」。

追記 この記事を元に書籍が出来ました!

時間と命を削って、より詳細に解説しましたので、Emacs に興味がある人はぜひ一度手に取ってみて下さい。

Emacs実践入門 ?思考を直感的にコード化し、開発を加速する (WEB+DB PRESS plus)

Emacs実践入門 ?思考を直感的にコード化し、開発を加速する (WEB+DB PRESS plus)

簡単とは言え、Elisp とかの話がメインだった前回までとは、がらりと変って、今回はキーバインドの話をしたいと思います。
なので、Lisp とかわからんちんな人も、今回は大丈夫なはずです。

キーバインドの調べ方。

Emacs と言えば、よくその特殊なキーバインドが覚えられない。という意見が多く聞かれます。
逆に、Emacs をずっと使っている人は、キーバインドで何でも出来るからいいんじゃないか。という意見が多いです。
結局、Emacs はこのキーバインドを乗り越えてこその Emacs だという事には違いないのですが、最初はカンペとか本で覚える感じになるでしょう。しかし、色々なメジャーモードを使いだすと、それも限界に逹っしてくるので、結局は Emacs でキーバインドを調べるのが常識になってきます。
Emacs でキーバインドを調べるには、M-x describe-bindings で調べる事ができます。

describe-bindings を実行すると、現在のメジャーモードのキーバインドや、あなたの Emacs の全てのモードで有効なグローバルキーバインドなどを見る事ができます。
describe-bindings は新しいモードを使うときは、もの凄い多様するので、デフォルトよりも便利にする必要があります。

というわけで、describe-bindings を anything インターフェイスに置き換える descbinds-anything.el はほぼ必須。key-chord.el を使って、df 同時押して、僕も rubikitch さんも呼び出して使っています。

キーバインドの覚え方。

describe-bindings を見て使いながら覚えるのもありですが、操作の流れの中で覚える方法があります。
キーバインド入力時にヘルプを表示させる one-key.el です。

導入から利用までしっかりと書いてある rubikitch さんの記事を見てもらえば分かりますが、何かしらのキーバインドを押したときに、続きのキーバインドの一覧を表示してくれるものです。
one-key.el では、テンプレートを自分で作る必要がありますが、基本操作のテンプレートを纏めてくれている one-key-default.el というのがあるので、こちらを試してみましょう。
例えば、one-key.el と one-key-default.el をインストールしている状態で、C-x でそれに続くキーバインドを表示させる設定をしてみましょう。
M-x install-elisp http://www.emacswiki.org/cgi-bin/wiki/download/one-key.el
M-x install-elisp http://www.emacswiki.org/cgi-bin/wiki/download/one-key-config.el
M-x install-elisp http://www.emacswiki.org/cgi-bin/wiki/download/one-key-default.el
.emacsの最後尾に

(require 'one-key-default) ; one-key.el も一緒に読み込んでくれる
(require 'one-key-config) ; one-key.el をより便利にする
(one-key-default-setup-keys) ; one-key- で始まるメニュー使える様になる
(define-key global-map "\C-x" 'one-key-menu-C-x) ;; C-x にコマンドを定義

C-x をタイプすると、C-x から続くキーバインドの一覧がポップアップされます。

僕のテーマでは色が微妙に見にくいですが、とりあえず気にしません。
M-x one-key くらいでタブを押すと、定義されているメニュー一覧が表示されます。

先程の (define-key global-map "\C-x" 'one-key-menu-C-x) は、C-x というキーバインドに、one-key-menu-C-x というコマンドを割り当てたというわけです。

キーバインドの割り当て方。

Emacs を使っていると、あのコマンドをこのキーバインド一発で実行したいと思ったりするものです。
Emacs で、キーバインドを変更、登録するのは日常茶飯事で、むしろ、自分のキーバインドをがんがん登録してカスタマイズするのが、Emacs の正しい使い方です。
Emacs のキーバインドは大きく分けると、2つに分けることができます。

全てのモードで使えるキーバインドというのは、正確にはモードに関係なく利用できるキーバインドで、グローバルキーマップ(global-map)と言います。
特定のモードだけで使えるキーバインドは、モードマップ(*-mode-map)と言います。
キーマップというは、Emacs の中でキーバインドを定義している表みたいなもので、そこにキーバインドを登録する事で、Emacs をあなた色に染める事ができるというわけです。
キーマップにキーバインドを追加するには、define-key 関数を使って登録します。

(define-key keymap keys definition)

keymap には登録したいキーマップを。モードに関係なく全てで利用したい場合は、global-map、ほかのモードであれば、通常 xxxx-mode-map という名前がつけられているので、emacs-lisp-mode-map, org-mode-map などになります。
keys の部分にキーバインド(キーバインドの書き方は、次に例を紹介します)を、definition の部分に実行したい何か(結構色々書けます。詳しくは、describe-function define-key をどうぞ)を書きます。通常、関数のシンボル(シングルクオートから始まる関数名 'function )を書く事で、コマンドを実行できる様になります。
例えば、C-x k でバッファを閉じますが、Ctr キーから指が離れるのを拒む場合でも C-x C-k で、同様にバッファを閉じたい人がいたとします。

(define-key global-map "\C-x\C-k" 'kill-buffer)

これで、C-x C-k でも C-x k と同じ kill-buffer が実行されます。
keys の部分のキーバインドの定義ですが、この書き方はちょっと古くて、しかもバックスラッシュエスケープを書くのが面倒なので、最近のEmacsでは以下の書き方のほうがオススメです。

(define-key global-map [(C x) (C k)] 'kill-buffer)
(define-key global-map [(control x) (control k)] 'kill-buffer)
(define-key global-map (kbd "C-x C-k") 'kill-buffer)

また、define-key の definition の部分には、シンボルじゃなく、キーボードマクロを記述することもできるので、

(define-key global-map [(control x) (control k)] "\C-xk")
(define-key global-map [(control x) (control k)] (kbd "C-x k"))

という風に、kill-buffer を実行するキーバインドを記述しても良いです。
ダブルクォートで、キーバインドを書くスタイルは、Ctr から始まるキーバインドを定義しやすいですが、Shift などが表現できないので、Shift を使う場合は、[()] のスタイルを利用した方が良いでしょう。
[()] スタイルのときは、control は大文字の C という風に省略できるので覚えておくとよいです。

control alt meta hyper shift
C A M H S

super を利用している人は、S で super じゃないので気をつけて下さい(笑)。
キーバインドについての、詳しい解説は keybindingsに詰っております。
というわけで、長くなってきたので、今日はここまでにしておきます。