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

 前の奴が基本的にdo-completionをすると動くhookだったようなので。機能を増やしていくと、なんだかポップアップ補完機能を車輪の再発明をしているような気がしてきたので、始めからminbufferに対応した感じの関数を元々ある関数を利用して作れば良いじゃんと思い直した。そこで、minibuffer-completeを改造したループバージョンを作れば、いいなと。勝手に思い込んで適当に改造。しかも前見た所のパクリ。

;;;;------------------------------------------------------------
ミニバッファの補完をループして
(defun my-minibuffer-complete (&optional word)
  (interactive "*p")
  (let (c)
	(loop ; 永久ループ
	  (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)))
	)
;キー設定
(define-key minibuffer-local-must-match-map #\TAB 'my-minibuffer-complete-loop)
;心配ならTAB以外のに

注意点、之を使うときは、その4これを先に入れておかないとどうなるか分からない。どちらか一つでも入れていれば特に問題はないと思うけど。入ってない場合に止めるとか、そんな気の聞いた機能はついてないので注意。ここに書いてあるのは、基本的に自分のメモなので使うのは推奨しないです。もし使うなら自己責任で。

■追記
ポップアップのとか、入れないとヤバイかなぁと思ったけど、後から入れない状態で実行するとどうなるか試したら意外と入れない奴も使えた。C-gで抜けれる様子なのでWindow分割するままでも結構良い感じ。

■もう少し改造するなら
その4と同時に使うときは、Solo matchと出たら何かキーを(C-fとか)押すと補完してくれるみたい。多分ループを抜けないと補完できないんだろう。Solo matchのときは自動でループを抜けて入力されるようにしたい感じ。
使ってみたら、どうも之はまずい所が沢山ある感じ。直すもたいへんそう。

■更に追記
何となく駄目になっている理由が表示だと気づいたので、試してみたら上手く動いた感じ。ループを試していたからループ中は上手く動作しないのかとか無駄に勘ぐっていたけど、単に表示が更新されていなかっただけの様子。
ミニバッファでもループしながら補完したい(その2)