zsh ライクな Emacs のミニバッファ補完が素晴らしすぎる件
id:mooz さんの zlc.el で Emacs のミニバッファ補完を zsh ライクに が素晴らしすぎるのでさっそく導入した。
http://d.hatena.ne.jp/mooz/20101003/p1
ただし、上記の elisp では Tab キーによる移動しかできない。ふだん zsh で候補一覧を移動するときに C-p C-n C-b C-f といういわゆる Emacs ライクなカーソル移動をしているのでこの動作には違和感があった。
そこで以下のパッチを書いた。
--- a/dot_emacs.d/elisp/3rd-party/zlc.el +++ b/dot_emacs.d/elisp/3rd-party/zlc.el @@ -171,8 +171,12 @@ select completion orderly." (let ((map minibuffer-local-map)) (define-key map (kbd "<backtab>") 'zlc-select-previous) (define-key map (kbd "S-<tab>") 'zlc-select-previous) + (define-key map (kbd "C-p") 'zlc-select-previous) + (define-key map (kbd "C-n") 'zlc-select-next) + (define-key map (kbd "C-b") 'zlc-select-previous) + (define-key map (kbd "C-f") 'zlc-select-next) ;; (define-key map (kbd "C-c") 'zlc-reset) )
これで Tab キーだけでなく C-n などの Emacs でおなじみのキーでもカーソル移動ができるようになった。
本当は physical-line.el のように C-n C-p で縦に物理行移動ができるようにしたくてソースを参考にしたのだが、少し手がかかりそうだったのでとりあえず前後移動で妥協した。誰か物理行移動を実装してください。
ダウンロード
パッチ適用後のファイルは以下の URL からダウンロードできます。どうぞご利用ください。
http://github.com/id774/dot_emacs/raw/master/dot_emacs.d/elisp/3rd-party/zlc.el
追記
id:mooz さんが対応してくれました!
http://d.hatena.ne.jp/mooz/20101003/p1
(let ((map minibuffer-local-map)) (define-key map (kbd "<backtab>") 'zlc-select-previous) (define-key map (kbd "S-<tab>") 'zlc-select-previous) (define-key map (kbd "C-p") 'zlc-select-previous-vertical) (define-key map (kbd "C-n") 'zlc-select-next-vertical) (define-key map (kbd "C-b") 'zlc-select-previous) (define-key map (kbd "C-f") 'zlc-select-next) )
ちなみに、このように普通に C-p C-n C-b C-f に割り当てて利用することにしました。
さらに追記
Emacs 22 以前 (Carbon Emacs とか Meadow) で動作しない。ロードするときにバージョンチェックしたほうが良いだろう。
(cond ((>= emacs-major-version '23) (progn (require 'zlc) (setq zlc-select-completion-immediately t))))