ミニバッファの履歴から補完候補を出すpushy.elを試してみた

昨日、ミニバッファの履歴から補完候補を自動的に出すpushy.elがリリースされたのでさっそく試した。作者はあのanything.elの原作者Tamas Patrovicsさん。彼は他にも履歴や補完関連のEmacs Lispをいろいろと出しているからかなりの履歴マニアのようだ。

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

ミニバッファで文字を入力をして、まごついている(デフォルトでは0.5秒間入力が止まったら)と、履歴から入力にマッチする候補を自動的にポップアップしてくれる。たとえばM-:で「recentf」と入力したとき、こんな感じになる。過去の入力を再利用したいときにはとても便利だろう。補完候補が一覧されるのでminibuf-isearch.elの強力版と考えていいかも。

http://www.rubyist.net/~rubikitch/archive/pushy.png

カーソル移動はCtrlを押しながら上下、確定はC-RET、候補を入力するのはM-RETでできる。なんだけど、いきなり確定されるよりも候補を入力したことを確認したいし、過去の入力を修正することもあるから、俺的にはC-RETで候補を入力にしている。

さて、設定。pushy-enable-globallyはデフォルトでnilになっているのでとりあえずtにしておいた。

;; (install-elisp-from-emacswiki "pushy.el")
(require 'pushy)
(setq pushy-keys
      (list (cons (kbd "C-<return>") 'pushy-insert-item)    ; 候補を入力
            ;; (cons (kbd "<ESC>") 'pushy-cleanup)  ; 通常の補完ができなくなるのでいらん
            (cons (kbd "C-<up>") 'pushy-previous-line)
            (cons (kbd "C-<down>") 'pushy-next-line)
            (cons (kbd "C-<prior>") 'pushy-previous-page)
            (cons (kbd "C-<next>") 'pushy-next-page)))
(setq pushy-enable-globally t)
(pushy-mode 1)

ただ、anything.elとはいまいち相性が悪いのでanything関連のコマンドではpushy-completionをoffにしておく。anythingの設定の後に入れておこう。

(dolist (cmd (all-completions "anything" obarray 'commandp))
  (put (intern cmd) 'pushy-completion 'disabled))

iswitchbを使っている人は以下の行を入れておこう。

(pushy-iswitchb-setup)

[2009/01/30]追記

anything-complete.elを使っている場合はめちゃくちゃ相性が悪いので、特定のコマンドで限定的にonにしてみるとよい。

(setq pushy-enable-globally nil)
(put 'eval-expression 'pushy-completion 'enabled)
(put 'shell-command 'pushy-completion 'enabled)
(put 'shell-command-on-region 'pushy-completion 'enabled)