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 まで入力したところ
となる。
自分でリストに追加したりとか、並べ替えしたりとか、そんなの不要。らくちんだ。
0 コメント :
コメントを投稿