emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

master 83b0f46a26: ecomplete: Try and avoid losing data


From: Stefan Monnier
Subject: master 83b0f46a26: ecomplete: Try and avoid losing data
Date: Mon, 28 Feb 2022 11:59:48 -0500 (EST)

branch: master
commit 83b0f46a268933eeb0fe9d5f5a69bb7dcfac54fd
Author: Stefan Monnier <monnier@iro.umontreal.ca>
Commit: Stefan Monnier <monnier@iro.umontreal.ca>

    ecomplete: Try and avoid losing data
    
    * 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 | 34 ++++++++++++++++++++--------------
 1 file changed, 20 insertions(+), 14 deletions(-)

diff --git a/lisp/ecomplete.el b/lisp/ecomplete.el
index 260657e0f7..c39c6c2ff9 100644
--- a/lisp/ecomplete.el
+++ b/lisp/ecomplete.el
@@ -65,10 +65,11 @@
   :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)))



reply via email to

[Prev in Thread] Current Thread [Next in Thread]