kill-ringの内部を常にユニークにする

最近はゲームばっかりで中々プログラミングが進みません。ううむ。

最近はanything-show-kill-ringをM-yにバインドして使うようになっていたんですが、これでやたらと気になることが一つ。

Emacsにはkill-ringという、killした文字列を溜めるリストがありますが、killしたものが重複していようとなんだろうと構わず先頭から突っ込んでいきます。なので、何回かkillを繰り返していると、同じkillが複数先頭から設定される、という光景を目にします。

これが個人的にひじょーに苛ついたので、こんなマクロを書いてみました。

(defmacro make-unique-kill-ring-advice (arg)
  "Set advice function of arg that always unique to kill-ring"
  `(defadvice ,arg (around unique-kill-ring activate)
     ad-do-it
     (let ((cur-kill-data (current-kill 0)))
       (setq kill-ring (append (list cur-kill-data)
                               (remove-if '(lambda (x) (string= x cur-kill-data)) (cdr kill-ring))))
       (setq kill-ring-yank-pointer kill-ring)
       )))

(make-unique-kill-ring-advice kill-ring-save)
(make-unique-kill-ring-advice kill-region)
(make-unique-kill-ring-advice kill-line)

色々間違ってるかもしれませんがとりあえず。で、とりあえずよく利用する C-k C-w M-w の関数にadviceを適用して、無理矢理ユニークにするようにしてみました。そういう設定があるのかもしれませんが、調べるよりかは書いた方が速かったので。

ちなみに毎回やると速度がー、ってなりかねませんが、日常利用している限りはとりあえず問題無さそうです。

追記

Twitterにてid:kitokitoki さんにこちらを教えて頂きました。ぶっちゃけこっちの方が速度絶対早い & 安全なのでこっちにすべきですね。

kill-newなんて関数あるなんて知らなんだ。