Emacs 初心者必見! one-key.el はキーバインドが覚えられない人への特効薬だ

Emacs 初心者向け記事がアツい ので、負けじと俺もっ。

Emacs には無数にキーバインドがあるから覚えきれない人が大多数だろう。 10 年以上使っている俺でさえもだ。ましてやどんどん Emacs Lisp を導入する人にとってはキーバインド習得コストは大問題となる。

その問題に対処しようと今年新星のごとく登場したのが one-key.el だ。キーボードからメニュー形式でコマンドを実行する Emacs Lisp だ。導入記は id:grandVin さんに 先越されちゃった

http://www.emacswiki.org/emacs/OneKey

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

インストールは

(require 'one-key)

のみ。

開発者は今 EmacsWiki で勢いづいている Andy Stewart さん。 Emacs 歴がまだ 1 年ちょっとだというのに開発している Emacs Lisp の多いこと多いこと。
http://www.emacswiki.org/emacs/AndyStewart

たとえば、俺は C-x r から始まる register ・ rectangle 系のコマンドには慣れていない。 register 関連は anything-c-source-kill-ring ( kill-summary.el とかでもいいけど)に置き換えられているからだ。 rectangle 系はめったに使わないし。だからキーバインド覚えられない。こんな場合こそ one-key.el の出番となるわけ。

激しく気に入ったので既存のキーマップから one-key.el のメニューを生成するコードジェネレータを作ってしまった。取り込まれているのですぐに使えるよ。

M-x one-key-show-template を押すとキーバインドを聞いてくるので「 C-x r 」と文字通り( C とハイフンと x みたいに)入力する。キーマップの名前(*-map )を入力してもよい。そして、メニューの名前を聞いてくるので「 Register and Rectangle 」と入力する。すると、*One-Key-Template*というバッファが出てきて、こんな内容になるはず。

(defvar one-key-menu-Register-and-Rectangle-alist nil
  "The `one-key' menu list for REGISTER-AND-RECTANGLE.")

(setq one-key-menu-Register-and-Rectangle-alist
      '(
	(("C-@" . "point-to-register") . point-to-register)
	(("SPC" . "point-to-register") . point-to-register)
	(("+" . "increment-register") . increment-register)
	(("b" . "bookmark-jump") . bookmark-jump)
	(("c" . "clear-rectangle") . clear-rectangle)
	(("d" . "delete-rectangle") . delete-rectangle)
	(("f" . "frame-configuration-to-register") . frame-configuration-to-register)
	(("g" . "insert-register") . insert-register)
	(("i" . "insert-register") . insert-register)
	(("j" . "jump-to-register") . jump-to-register)
	(("k" . "kill-rectangle") . kill-rectangle)
	(("l" . "bookmark-bmenu-list") . bookmark-bmenu-list)
	(("m" . "bookmark-set") . bookmark-set)
	(("n" . "number-to-register") . number-to-register)
	(("o" . "open-rectangle") . open-rectangle)
	(("r" . "copy-rectangle-to-register") . copy-rectangle-to-register)
	(("s" . "copy-to-register") . copy-to-register)
	(("t" . "string-rectangle") . string-rectangle)
	(("w" . "window-configuration-to-register") . window-configuration-to-register)
	(("x" . "copy-to-register") . copy-to-register)
	(("y" . "yank-rectangle") . yank-rectangle)
	(("C-SPC" . "point-to-register") . point-to-register)
	))

(defun one-key-menu-Register-and-Rectangle ()
  "The `one-key' menu for REGISTER-AND-RECTANGLE"
  (interactive)
  (one-key-menu "REGISTER-AND-RECTANGLE" one-key-menu-Register-and-Rectangle-alist))

内容を確認したら C-x h M-w でバッファの内容をまるごとコピーし、.emacs に貼り付ける。それから、

(define-key global-map "\C-xr" 'one-key-menu-Register-and-Rectangle)

と割り当てるとよい。

ぁ、メニュー名でスペースがハイフンになってら(^^;バグも見つけちゃったよ。あとで修正しとこ。→直した

さて、ここでさっそく C-x r で実行してみると、以下のようなスクリーンショットになる。

http://www.rubyist.net/~rubikitch/archive/one-key-C-xr.png

あとはメニューに出てくるように、たとえば「 s 」と押せば copy-to-register が実行されるというわけ。素早くコマンドが実行できて、しかもキーバインドが覚えられるんだから一石二鳥だ。 one-key.el のすごいところは、 one-key.el のない通常環境と同じように操作できることだ。さあ、使ってみよう。

なお、インストール時に

(require 'one-key-config)

も入れておくと、すでに定義されているメニューにアクセスできる。 M-x の後で「 one-key-menu-」まで入力して Tab を押せば、どんなメニューが定義されているかわかるので試してみよう。

似たようなものに 123-menu.el がある。そっちはエコーエリアでメニューを構成するやつ。
http://www.emacswiki.org/emacs/OneTwoThreeMenu

追記 [2009/02/12]

わわ、ごめんなさい。 typo ですね。修正しました。指摘ありがとうございます。
なお、 one-key-default.el はデフォルトのキーバインド( C-x 系など)を one-key 化したものです。

M-x install-elisp http://www.emacswiki.org/cgi-bin/wiki/download/one-key-default.el

.emacs の最後尾に

(require 'one-key-default)
(one-key-default-setup-keys)

と設定すれば使えます。どうぞ。