From e03fb00267171fe995f8487043446df18f1f96cf Mon Sep 17 00:00:00 2001 From: Philip Kaludercic Date: Thu, 13 Oct 2022 12:02:02 +0200 Subject: [PATCH] Allow filtering what items are added to Ecomplete * etc/NEWS: Mention new option. * lisp/ecomplete.el (ecomplete-filter-regexp): Add new option. (ecomplete-add-item): Respect new option. --- etc/NEWS | 5 +++++ lisp/ecomplete.el | 35 +++++++++++++++++++++-------------- 2 files changed, 26 insertions(+), 14 deletions(-) diff --git a/etc/NEWS b/etc/NEWS index ca857056fd..1357e82810 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -1376,6 +1376,11 @@ the ecomplete database. *** New user option 'ecomplete-auto-select'. If non-nil and there's only one matching option, auto-select that. +--- +*** New user option 'ecomplete-filter-regexp'. +If non-nil this user option describes what email addresses to ignore +and not add to the database. + ** Dired +++ diff --git a/lisp/ecomplete.el b/lisp/ecomplete.el index 6ff67d46d2..21f5f456ea 100644 --- a/lisp/ecomplete.el +++ b/lisp/ecomplete.el @@ -86,6 +86,11 @@ ecomplete-auto-select :type 'boolean :version "29.1") +(defcustom ecomplete-filter-regexp nil + "Regular expression of addresses to not store." + :type 'regexp + :version "29.1") + ;;; Internal variables. (defvar ecomplete-database nil) @@ -104,20 +109,22 @@ ecomplete-add-item By default, the longest version of TEXT will be preserved, but if FORCE is non-nil, use TEXT exactly as is." (unless ecomplete-database (ecomplete-setup)) - (let ((elems (assq type ecomplete-database)) - (now (time-convert nil 'integer)) - entry) - (unless elems - (push (setq elems (list type)) ecomplete-database)) - (if (setq entry (assoc key (cdr elems))) - (pcase-let ((`(,_key ,count ,_time ,oldtext) entry)) - (setcdr entry (list (1+ count) now - ;; Preserve the "more complete" text. - (if (or force - (>= (length text) (length oldtext))) - text - oldtext)))) - (nconc elems (list (list key 1 now text)))))) + (unless (and ecomplete-filter-regexp + (string-match-p ecomplete-filter-regexp key)) + (let ((elems (assq type ecomplete-database)) + (now (time-convert nil 'integer)) + entry) + (unless elems + (push (setq elems (list type)) ecomplete-database)) + (if (setq entry (assoc key (cdr elems))) + (pcase-let ((`(,_key ,count ,_time ,oldtext) entry)) + (setcdr entry (list (1+ count) now + ;; Preserve the "more complete" text. + (if (or force + (>= (length text) (length oldtext))) + text + oldtext)))) + (nconc elems (list (list key 1 now text))))))) (defun ecomplete--remove-item (type key) "Remove the element of TYPE and KEY from the ecomplete database." -- 2.37.3