]> git.eshelyaron.com Git - emacs.git/commitdiff
Add commands to edit/remove ecomplete entries
authorLars Ingebrigtsen <larsi@gnus.org>
Mon, 3 Oct 2022 18:27:17 +0000 (20:27 +0200)
committerLars Ingebrigtsen <larsi@gnus.org>
Mon, 3 Oct 2022 18:27:17 +0000 (20:27 +0200)
* lisp/ecomplete.el (ecomplete-add-item): Allow forcing new values.
(ecomplete--remove-item):
(ecomplete--prompt-type): New functions.
(ecomplete-edit, ecomplete-remove): New commands.

etc/NEWS
lisp/ecomplete.el

index dd048b9df39ea7798169b3a89021604d4f1ccced..05e05afc8ea579211dbce3f86a7797a2f111d856 100644 (file)
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -1341,6 +1341,11 @@ change the input method's translation rules, customize the user option
 
 ** ecomplete
 
+---
+*** New commands 'ecomplete-edit' and 'ecomplete-remove'.
+These allow you to (respectively) edit and bulk-remove entries from
+the ecomplete database.
+
 ---
 *** New user option 'ecomplete-auto-select'.
 If non-nil and there's only one matching option, auto-select that.
index 76438fd25a7eb340309e3f882bb428b59d89b1c4..6e40eb7456432fed0ed424fe47726281283762d3 100644 (file)
@@ -99,8 +99,10 @@ string that was matched."
        (insert-file-contents ecomplete-database-file)
        (setq ecomplete-database (read (current-buffer)))))))
 
-(defun ecomplete-add-item (type key text)
-  "Add item TEXT of TYPE to the database, using KEY as the identifier."
+(defun ecomplete-add-item (type key text &optional force)
+  "Add item TEXT of TYPE to the database, using KEY as the identifier.
+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))
@@ -111,10 +113,24 @@ string that was matched."
        (pcase-let ((`(,_key ,count ,_time ,oldtext) entry))
          (setcdr entry (list (1+ count) now
                              ;; Preserve the "more complete" text.
-                             (if (>= (length text) (length oldtext))
-                                 text oldtext))))
+                             (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."
+  (unless ecomplete-database
+    (ecomplete-setup))
+  (let ((elems (assq type ecomplete-database)))
+    (unless elems
+      (user-error "No elements of type %s" type))
+    (let ((entry (assoc key elems)))
+      (unless entry
+        (user-error "No entry with key %s" key))
+      (setcdr elems (delq entry (cdr elems))))))
+
 (defun ecomplete-get-item (type key)
   "Return the text for the item identified by KEY of the required TYPE."
   (assoc key (cdr (assq type ecomplete-database))))
@@ -263,6 +279,48 @@ non-nil and there is only a single completion option available."
                         ecomplete-sort-predicate))))
          (complete-with-action action candidates string pred))))))
 
+(defun ecomplete--prompt-type ()
+  (unless ecomplete-database
+    (ecomplete-setup))
+  (if (length= ecomplete-database 1)
+      (caar ecomplete-database)
+    (completing-read "Item type to edit: "
+                     (mapcar #'car ecomplete-database)
+                     nil t)))
+
+(defun ecomplete-edit ()
+  "Prompt for an item and allow editing it."
+  (interactive)
+  (let* ((type (ecomplete--prompt-type))
+         (data (cdr (assq type ecomplete-database)))
+         (key (completing-read "Key to edit: " data nil t))
+         (new (read-string "New value (empty to remove): "
+                           (nth 3 (assoc key data)))))
+    (if (zerop (length new))
+        (progn
+          (ecomplete--remove-item type key)
+          (message "Removed %s" key))
+      (ecomplete-add-item type key new t)
+      (message "Updated %s to %s" key new))
+    (ecomplete-save)))
+
+(defun ecomplete-remove ()
+  "Remove entries matching a regexp from the ecomplete database."
+  (interactive)
+  (let* ((type (ecomplete--prompt-type))
+         (data (cdr (assq type ecomplete-database)))
+         (match (read-regexp (format "Remove %s keys matching (regexp): "
+                                     type)))
+         (elems (seq-filter (lambda (elem)
+                              (string-match-p match (car elem)))
+                            data)))
+    (when (yes-or-no-p (format "Delete %s matching ecomplete entries? "
+                               (length elems)))
+      (dolist (elem elems)
+        (ecomplete--remove-item type (car elem)))
+      (ecomplete-save)
+      (message "Deleted entries"))))
+
 (provide 'ecomplete)
 
 ;;; ecomplete.el ends here