M-xしたときのミニバッファでもループしながら補完したい(その2)

無理やり治してみたら、一応望みどおり動いたのでそれでいい事にした。一応ループはする。

■具体的に何をするか
ループしながら補完って言われても、こっち側の気分の名前で、意味不明だと思うので何をするかを書くと。
感じとしてはインクリメンタルに検索しながら補完するかんじ。
キーを打つごとにマッチする補完候補を探しながら補完候補のリストを表示する。補完候補が一つの場合は自動的に補完候補が入力される。今回の奴は補完候補がminibufferのM-xしたときに打つ候補をそういう感じに補完する。

;キー設定
(define-key minibuffer-local-must-match-map #\TAB 'my-minibuffer-complete-loop)

(defun my-minibuffer-complete-loop (&optional word)
  (interactive "*p")
	(while
	  (minibuffer-complete word)
	  (refresh-screen)
	  (minibuffer-complete word)
	  (setq c (read-char ed:*keyboard*)) ;キーボードから一文字読み取る
	  (unless (and (eq (lookup-key-command c) 'self-insert-command)
				   ; もし、そのキーに割り当てられたコマンドが
				   ;'self-insert-command で
				   (or (syntax-word-p c)       ; word 文字か
					   (syntax-symbol-p c)))   ; symbol 文字でなかったら
		(unread-char c) ; キーボードを読んでないことにして
		(return))
	  (insert c) ; c をインサートして
	  (refresh-screen)))

どうもループしていると表示の更新が止まるようなので、無駄に補完を二回も入れてしまったから本当は無駄だらけな予感がするが、do-completionとかを自分で改造するのは果てしなく面倒そうなので、見なかったことにして、無理やり二回やって表示させればいいことにした。

パクリもとのdabbrevとかループする奴も少し見た感じ、「-」とかが入ると補完に多少問題があったので、その内みて変えるかも
ex add-historyを補完
add-hで補完するとadd-historyadd-hになってしまう様子。