読者です 読者をやめる 読者になる 読者になる

ぐるっとぐりっど

日曜プログラマがいろいろ試してみたことを、後の自分のためにまとめておく場所

emacsのキーバインドが表示されるwhich-keyを導入した

emacs

はじめに

この前、メタキープラス何かで使えるキーバインドを調べた。

grugrut.hatenablog.jp

しかし、複数のキーを使うキーバインド(C-x C-cとか)を含めると、キーバインドは無数にある。ためしにscratchバッファで、C-h bして出てきたバッファの行数をカウントしてみると、1282行あった。空白行等キーバインドではない行があるにしても、軽く1000はキーバインドが定義されているだろう。メジャーモードによってはもっともっと多いはず。

そこで便利なマイナーモードにguide-keyがある。キーバインドをもっと覚えるためにカスタマイズしないとな、と思って調べていたら、るびきちさんのところで、which-keyというのが紹介されていたので導入してみた。

emacs which-key.el : 【guide-key改】次のキー操作をよりわかりやすく教えてくれるぞ! | MELPA Emacs Lisp Elisp パッケージ インストール 設定 使い方 スクリーンショット | るびきち「日刊Emacs」

which-keyとは

下記に配置されている。package.elで簡単に導入できる。

github.com

which-key started as a rewrite of guide-key-mode, but the feature sets have diverged to a certain extent.

ということなので、guide-keyをもとに作られたものらしい。

ひとまず使うなら、package.elでゲットしたあと、

(require 'which-key)
(which-key-mode)

だけで簡単に使える。

guide-keyとの違い

表示するキーバインドのプリフィックスを指定しなくてよい

guide-keyだと、

(require 'guide-key)
(setq guide-key/guide-key-sequence '("C-c" "C-z" "C-x"))
(guide-key-mode 1)

のように、どのプリフィックスの場合にキーバインドを表示するか指定しておく必要があったけど、which-keyは不要。デフォルトですべてのキーバインドが表示される。例えば、C-xを入力したあと、1秒程度入力しないでいると、下のスクリーンショットのように、ポップアップしてキーバインドが表示される。

f:id:grugrut:20160211113330p:plain

表示方法も、Windowsの分割(デフォルト設定、デフォルトでは上下に分割して、下側に表示されるけれど、設定すれば左右に分割することも可能)、ミニバッファ、新規フレーム、ユーザカスタムの4種類から選ぶことができる。ミニバッファと新規フレームはちょっと触ってみた限り使いにくかったので、最初はデフォルト設定でよいのではないかと。カスタムで設定すれば、auto-complete/companyのように表示することもできるようだ。

複数ページにまたがった表示

例えばC-xから始まるキーバインドなんてめちゃくちゃ多い。guide-keyの説明にも収まらないから絞って設定することをお勧めされている。では、全部表示してしまうwhich-keyはどうしているかというと、複数ページに分けて表示するというある意味暴挙に出ている。上のスクリーンショットでも、(1 of 5)と5ページ中の1ページ目を表示していることがわかる。デフォルトでは、C-hでメニューが表示されて次ページを表示することができる。ただこれはちょっと問題点が個人的にはある。

which-keyの使いにくいところ、今後調べたいところ

複数ページにまたがった場合のページ送りに、C-hを使うんだけれど、C-hは<DEL>に置き換えている人が多いと思う。そうすると、C-hで次のページって表示されているので、C-hを押すと、<DEL>が入力されたことになってしまう。

ためしに、C-xで動作を試していたので、しばしば C-x <DEL> (backward-kill-sentense)が発動してしまい、設定消失、僕呆然。とすることがしばしばあった。

また、C-hだけでページ送りができず、C-h nとしないと次のページが見れない。僕の場合は<F1> nとなる。これはちょっとめんどくさい。

README.mdを見る限り、当たり前だけどこの辺はカスタマイズできそう(which-key-use-C-h-for-pagingやらその辺いじってみたけど、期待する動作とならず)。きちんと設定すれば便利に使えそうなのでもうちょっと調べてみよう。