aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStefan Monnier2022-02-28 11:59:38 -0500
committerStefan Monnier2022-02-28 11:59:38 -0500
commit83b0f46a268933eeb0fe9d5f5a69bb7dcfac54fd (patch)
tree562b908c427288fd828f5b8f9cf5779f067ef0ce
parent0d123d602c68c3634f9d5d0260c1fea552825f06 (diff)
downloademacs-83b0f46a268933eeb0fe9d5f5a69bb7dcfac54fd.tar.gz
emacs-83b0f46a268933eeb0fe9d5f5a69bb7dcfac54fd.zip
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.
-rw-r--r--lisp/ecomplete.el34
1 files changed, 20 insertions, 14 deletions
diff --git a/lisp/ecomplete.el b/lisp/ecomplete.el
index 260657e0f7a..c39c6c2ff9c 100644
--- a/lisp/ecomplete.el
+++ b/lisp/ecomplete.el
@@ -65,10 +65,11 @@
65 :type 'file) 65 :type 'file)
66 66
67(defcustom ecomplete-database-file-coding-system 'iso-2022-7bit 67(defcustom ecomplete-database-file-coding-system 'iso-2022-7bit
68 ;; FIXME: We should transition to `utf-8-emacs-unix' somehow!
68 "Coding system used for writing the ecomplete database file." 69 "Coding system used for writing the ecomplete database file."
69 :type '(symbol :tag "Coding system")) 70 :type '(symbol :tag "Coding system"))
70 71
71(defcustom ecomplete-sort-predicate 'ecomplete-decay 72(defcustom ecomplete-sort-predicate #'ecomplete-decay
72 "Predicate to use when sorting matched. 73 "Predicate to use when sorting matched.
73The predicate is called with two parameters that represent the 74The predicate is called with two parameters that represent the
74completion. Each parameter is a list where the first element is 75completion. Each parameter is a list where the first element is
@@ -95,6 +96,7 @@ string that was matched."
95 96
96(defun ecomplete-add-item (type key text) 97(defun ecomplete-add-item (type key text)
97 "Add item TEXT of TYPE to the database, using KEY as the identifier." 98 "Add item TEXT of TYPE to the database, using KEY as the identifier."
99 (unless ecomplete-database (ecomplete-setup))
98 (let ((elems (assq type ecomplete-database)) 100 (let ((elems (assq type ecomplete-database))
99 (now (time-convert nil 'integer)) 101 (now (time-convert nil 'integer))
100 entry) 102 entry)
@@ -110,19 +112,23 @@ string that was matched."
110 112
111(defun ecomplete-save () 113(defun ecomplete-save ()
112 "Write the .ecompleterc file." 114 "Write the .ecompleterc file."
113 (with-temp-buffer 115 ;; If the database is empty, it might be because we haven't called
114 (let ((coding-system-for-write ecomplete-database-file-coding-system)) 116 ;; `ecomplete-setup', so better not save at all, lest we lose the real
115 (insert "(") 117 ;; database!
116 (cl-loop for (type . elems) in ecomplete-database 118 (when ecomplete-database
117 do 119 (with-temp-buffer
118 (insert (format "(%s\n" type)) 120 (let ((coding-system-for-write ecomplete-database-file-coding-system))
119 (dolist (entry elems) 121 (insert "(")
120 (prin1 entry (current-buffer)) 122 (cl-loop for (type . elems) in ecomplete-database
121 (insert "\n")) 123 do
122 (insert ")\n")) 124 (insert (format "(%s\n" type))
123 (insert ")") 125 (dolist (entry elems)
124 (write-region (point-min) (point-max) 126 (prin1 entry (current-buffer))
125 ecomplete-database-file nil 'silent)))) 127 (insert "\n"))
128 (insert ")\n"))
129 (insert ")")
130 (write-region (point-min) (point-max)
131 ecomplete-database-file nil 'silent)))))
126 132
127(defun ecomplete-get-matches (type match) 133(defun ecomplete-get-matches (type match)
128 (let* ((elems (cdr (assq type ecomplete-database))) 134 (let* ((elems (cdr (assq type ecomplete-database)))