Hatena::ブログ(Diary)

日々、とんは語る。

この日記のはてなブックマーク数 はてなスターカウンター Peace この日記をあなたのはてなアンテナに追加する。 rss
お問い合わせ先 mailto

2009-04-15 鼻がむずむずする日。

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

| 00:33 |

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

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

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

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

簡単とは言え、Elisp とかの話がメインだった前回までとは、がらりと変って、今回はキーバインドの話をしたいと思います

なので、Lisp とかわからんちんな人も、今回は大丈夫なはずです。

キーバインドの調べ方。

Emacs と言えば、よくその特殊なキーバインドが覚えられない。という意見が多く聞かれます

逆に、Emacs をずっと使っている人は、キーバインドで何でも出来るからいいんじゃないか。という意見が多いです。

結局、Emacs はこのキーバインドを乗り越えてこその Emacs だという事には違いないのですが、最初カンペとか本で覚える感じになるでしょう。しかし、色々なメジャーモードを使いだすと、それも限界に逹っしてくるので、結局は Emacsキーバインドを調べるのが常識になってきます

Emacsキーバインドを調べるには、M-x describe-bindings で調べる事ができます

f:id:tomoya:20090416040329j:image

describe-bindings を実行すると、現在メジャーモードキーバインドや、あなたEmacs の全てのモード有効グローバルキーバインドなどを見る事ができます

describe-bindings は新しいモードを使うときは、もの凄い多様するので、デフォルトよりも便利にする必要があります

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

f:id:tomoya:20090416041304j:image

キーバインドの覚え方。

describe-bindings を見て使いながら覚えるのもありですが、操作の流れの中で覚える方法があります

キーバインド入力時にヘルプを表示させる one-key.el です。

導入から利用までしっかりと書いてある rubikitch さんの記事を見てもらえば分かりますが、何かしらのキーバインドを押したときに、続きのキーバインドの一覧を表示してくれるものです。

one-key.el では、テンプレート自分で作る必要がありますが、基本操作テンプレートを纏めてくれている one-key-default.el というのがあるので、こちらを試してみましょう。

例えば、one-key.elone-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 から続くキーバインドの一覧がポップアップされます

f:id:tomoya:20090416043534j:image:w450

僕のテーマでは色が微妙に見にくいですが、とりあえず気にしません。

M-x one-key くらいでタブを押すと、定義されているメニュー一覧が表示されます

f:id:tomoya:20090416072937j:image

先程の (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に詰っております

というわけで、長くなってきたので、今日はここまでにしておきます

rubikitchrubikitch 2009/04/17 16:19 俺はkbdが好みだな。ふつうのEmacs表記のままで内部表現に変換してくれるから。
しかもASCIIコードにないものもok。
(kbd "C-a") ; => "^A"
(kbd "C-:") ; => [67108922]

tomoyatomoya 2009/04/17 18:09 ふんむふんむ。関数ってところが分かりやすいですよね。

<< 2009/04 >>
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30