On 16.11.2017 20:51, Andreas Röhler wrote: > Feature request: > > Currently variable kill-do-not-save-duplicates checks only the (car > kill-ring) as docu explains: > > Do not add a new string to ‘kill-ring’ if it duplicates the last one. > The comparison is done using ‘equal-including-properties’. > > AFAIU it would be trivial replace this check by a call of "member", > thus checking the whole kill-ring. > > Thanks, > > Andreas > > This variant of kill-new should do it. Diff basically at comment " ;; delete string from kill-ring" (defun ar-kill-new (string &optional replace)   "Make STRING the latest kill in the kill ring. Set `kill-ring-yank-pointer' to point to it. If `interprogram-cut-function' is non-nil, apply it to STRING. Optional second argument REPLACE non-nil means that STRING will replace the front of the kill ring, rather than being added to the list. When `save-interprogram-paste-before-kill' and `interprogram-paste-function' are non-nil, saves the interprogram paste string(s) into `kill-ring' before STRING. When the yank handler has a non-nil PARAM element, the original STRING argument is not used by `insert-for-yank'.  However, since Lisp code may access and use elements from the kill ring directly, the STRING argument should still be a \"useful\" string for such uses."   (let (newring)     (unless (and kill-do-not-save-duplicates                  ;; Due to text properties such as 'yank-handler that                  ;; can alter the contents to yank, comparison using                  ;; `equal' is unsafe.                  (equal-including-properties string (car kill-ring)))       (if (fboundp 'menu-bar-update-yank-menu)           (menu-bar-update-yank-menu string (and replace (car kill-ring)))))     (when save-interprogram-paste-before-kill       (let ((interprogram-paste (and interprogram-paste-function                                      (funcall interprogram-paste-function))))         (when interprogram-paste           (dolist (s (if (listp interprogram-paste)                          (nreverse interprogram-paste)                        (list interprogram-paste)))             (unless (and kill-do-not-save-duplicates                          (equal-including-properties s (car kill-ring)))               (push s kill-ring))))))     (if (and kill-do-not-save-duplicates          (member string kill-ring))     (progn       ;; delete string from kill-ring       (dolist (ele kill-ring)         (unless (equal-including-properties string ele)           (push ele newring)))       ;; push the match at top       (push string newring)       (setq kill-ring newring))       (if (and replace kill-ring)           (setcar kill-ring string)         (push string kill-ring)         (if (> (length kill-ring) kill-ring-max)             (setcdr (nthcdr (1- kill-ring-max) kill-ring) nil))))     (setq kill-ring-yank-pointer kill-ring)     (if interprogram-cut-function         (funcall interprogram-cut-function string))))