lispをループしながら補完。

さて、言い訳もしたので、何事もなかったことにして。さっそく、lisp-complete-symbolをループするようにしてみた。ええ、懲りずにパクリループ。

■具体的に之は何をするか
lisp-modeのときに、タブでインデントと補完をする。補完するときは補完候補のリストをインクリメンタルっぽく絞りながら補完。

(defun lisp-indent-line-and-complete-symbol-loop()
  (interactive "*")
  (lisp-indent-line)
  (if (looking-at "\\_>")
	  (let (key)
		(while (lisp-complete-symbol)
		  (refresh-screen)
		  (lisp-complete-symbol)
		  (setq key (read-char ed:*keyboard*))
		  (unless (and (eq (lookup-key-command key) 'self-insert-command)
					   (or (syntax-word-p key)
						   (syntax-symbol-p key)))
			(unread-char key)
			(return))
		  (insert key)
		  (refresh-screen)))))

(define-key ed::*lisp-mode-map*
			#\TAB  'lisp-indent-line-and-complete-symbol-loop)
(define-key ed::*lisp-interaction-mode-map*
			#\TAB  'lisp-indent-line-and-complete-symbol-loop)

これもlisp-complete-symbolが二度出てきてしまう効率の悪さがチョット気になるけど。面倒なのでパス。戻り値とかで補完したとか分かればいいんだけど、lispの関数で返ってくるのを取るのを良く知らないので、引数とかを追加して、補完された場合に引数が変化するとかそういうのを埋め込めばいいかもしれない。do-completionとか少し引数らしきものをとってメッセージ出しているので、頑張って眺めれば出るかもしれないけど、かなりめんどくさそう。なので、気が向いたときまで之でいい事にした。

これをポップアップストリングにして、引数とか簡単な説明もポップアップさせれば、書くときに引数のエラーは減らせそうな気がした。