]> git.eshelyaron.com Git - emacs.git/commitdiff
ecomplete: Try and avoid losing data
authorStefan Monnier <monnier@iro.umontreal.ca>
Mon, 28 Feb 2022 16:59:38 +0000 (11:59 -0500)
committerStefan Monnier <monnier@iro.umontreal.ca>
Mon, 28 Feb 2022 16:59:38 +0000 (11:59 -0500)
* lisp/ecomplete.el (ecomplete-add-item): Make sure the database is
setup, so we don't risk overwriting it with a (mostly) empty one.
(ecomplete-save): Don't save an empty database.

lisp/ecomplete.el

index 260657e0f7a7b8e5e89a15c1feffd32e540974fe..c39c6c2ff9c1e5b9ef73360726839c3b716206e8 100644 (file)
   :type 'file)
 
 (defcustom ecomplete-database-file-coding-system 'iso-2022-7bit
+  ;; FIXME: We should transition to `utf-8-emacs-unix' somehow!
   "Coding system used for writing the ecomplete database file."
   :type '(symbol :tag "Coding system"))
 
-(defcustom ecomplete-sort-predicate 'ecomplete-decay
+(defcustom ecomplete-sort-predicate #'ecomplete-decay
   "Predicate to use when sorting matched.
 The predicate is called with two parameters that represent the
 completion.  Each parameter is a list where the first element is
@@ -95,6 +96,7 @@ string that was matched."
 
 (defun ecomplete-add-item (type key text)
   "Add item TEXT of TYPE to the database, using KEY as the identifier."
+  (unless ecomplete-database (ecomplete-setup))
   (let ((elems (assq type ecomplete-database))
        (now (time-convert nil 'integer))
        entry)
@@ -110,19 +112,23 @@ string that was matched."
 
 (defun ecomplete-save ()
   "Write the .ecompleterc file."
-  (with-temp-buffer
-    (let ((coding-system-for-write ecomplete-database-file-coding-system))
-      (insert "(")
-      (cl-loop for (type . elems) in ecomplete-database
-              do
-              (insert (format "(%s\n" type))
-              (dolist (entry elems)
-                (prin1 entry (current-buffer))
-                (insert "\n"))
-              (insert ")\n"))
-      (insert ")")
-      (write-region (point-min) (point-max)
-                   ecomplete-database-file nil 'silent))))
+  ;; If the database is empty, it might be because we haven't called
+  ;; `ecomplete-setup', so better not save at all, lest we lose the real
+  ;; database!
+  (when ecomplete-database
+    (with-temp-buffer
+      (let ((coding-system-for-write ecomplete-database-file-coding-system))
+        (insert "(")
+        (cl-loop for (type . elems) in ecomplete-database
+                do
+                (insert (format "(%s\n" type))
+                (dolist (entry elems)
+                  (prin1 entry (current-buffer))
+                  (insert "\n"))
+                (insert ")\n"))
+       (insert ")")
+       (write-region (point-min) (point-max)
+                     ecomplete-database-file nil 'silent)))))
 
 (defun ecomplete-get-matches (type match)
   (let* ((elems (cdr (assq type ecomplete-database)))