2011/04/07

ミニバッファで入力するときのヒストリーの使い方



read-string とかのヘルプを見ても、:history には



minibuffer-history-variableプロパティを持つシンボルを指定します



としか書かれてなくて、どうしたらいいもんか分からなかった。


ココが参考になった。


下記のテストは転記だが、



(setq inserttest-history nil) ; 終了時に忘れさせたいならこちら
;(define-history-variable inserttest-history nil) ; 終了時に記憶させたいならこちら
(setf (get 'inserttest 'ed::minibuffer-history-variable)
'inserttest-history)
(defun inserttest (s)
(interactive "*sinsert string: " :history0 'inserttest)
(insert s))

;; test
(call-interactively 'inserttest)
bb ; 2回目
t

aa ; 1回目
t


call-interactively で呼び出すと、2回目以降は以前の入力を覚えていてくれて、C-p, C-n で履歴をたどれる。


矢印キーの↑↓も使える。


じゃあ、どんなふうに履歴が保存されているのか。



inserttest-history
("bb" "aa")


なんだ、cons されるだけか。そんな難しいもんじゃなかった。


重複するかどうかも、ちゃんと見てくれてるみたいで、



(call-interactively 'inserttest) ; aa, bb, cc, dd, bb の順に入力

inserttest-history
("dd" "cc" "bb" "aa") ; aa, bb, cc, dd まで入力したところ

("bb" "dd" "cc" "aa") ; aa, bb, cc, dd, bb まで入力したところ


となる。


自分でリストに追加したりとか、並べ替えしたりとか、そんなの不要。らくちんだ。





Related Posts Plugin for WordPress, Blogger...

0 コメント :

コメントを投稿