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