D.

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))))