diff options
| author | Stefan Monnier | 2022-02-28 11:59:38 -0500 |
|---|---|---|
| committer | Stefan Monnier | 2022-02-28 11:59:38 -0500 |
| commit | 83b0f46a268933eeb0fe9d5f5a69bb7dcfac54fd (patch) | |
| tree | 562b908c427288fd828f5b8f9cf5779f067ef0ce | |
| parent | 0d123d602c68c3634f9d5d0260c1fea552825f06 (diff) | |
| download | emacs-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.el | 34 |
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. |
| 73 | The predicate is called with two parameters that represent the | 74 | The predicate is called with two parameters that represent the |
| 74 | completion. Each parameter is a list where the first element is | 75 | completion. 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))) |