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

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 まで入力したところ

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