summaryrefslogtreecommitdiff
path: root/lisp/abbrev.el
diff options
context:
space:
mode:
authorAllen Li <darkfeline@felesatra.moe>2018-09-29 15:19:04 -0700
committerEli Zaretskii <eliz@gnu.org>2018-10-12 11:44:15 +0300
commitf5896e2cbf0e537ec6b79ba139220239f934c840 (patch)
tree51604349e1190449caf75043d689694a84212441 /lisp/abbrev.el
parent5bd8cfc14d4b0c78c07e65a583f42a10c4cbc06d (diff)
downloademacs-f5896e2cbf0e537ec6b79ba139220239f934c840.tar.gz
Rework empty abbrev table omitting
There were two problems with the original implementation: 1. It changed the behavior of insert-abbrev-table-description when READABLE is nil to sometimes insert one Emacs Lisp expression and sometimes insert nothing. 2. It broke the tests. This commit reworks this so that insert-abbrev-table-description always inserts an expressions even if no abbrevs need to be saved and making only write-abbrev-file check that a table has any abbrevs to save before calling insert-abbrev-table-description. This duplicates the work of filtering the table for savable abbrevs, but the benefit of keeping the API is worth it. * doc/lispref/abbrevs.texi (Abbrev Tables): Update documentation. * lisp/abbrev.el (write-abbrev-file): Skip tables without user abbrevs (insert-abbrev-table-description): Always insert the define expression. (abbrev--table-symbols): New function. * test/lisp/abbrev-tests.el (abbrev--table-symbols-test): Add test for abbrev--table-symbols.
Diffstat (limited to 'lisp/abbrev.el')
-rw-r--r--lisp/abbrev.el52
1 files changed, 29 insertions, 23 deletions
diff --git a/lisp/abbrev.el b/lisp/abbrev.el
index e1fd366ba9e..20a967d7d61 100644
--- a/lisp/abbrev.el
+++ b/lisp/abbrev.el
@@ -251,7 +251,8 @@ have been saved."
(lambda (s1 s2)
(string< (symbol-name s1)
(symbol-name s2)))))
- (insert-abbrev-table-description table nil))
+ (if (abbrev--table-symbols table)
+ (insert-abbrev-table-description table nil)))
(when (unencodable-char-position (point-min) (point-max) 'utf-8)
(setq coding-system-for-write
(if (> emacs-major-version 24)
@@ -937,33 +938,38 @@ is inserted.
If READABLE is nil, an expression is inserted. The expression is
a call to `define-abbrev-table' that when evaluated will define
the abbrev table NAME exactly as it is currently defined.
-Abbrevs marked as \"system abbrevs\" are ignored. If the
-resulting expression would not define any abbrevs, nothing is
-inserted."
+Abbrevs marked as \"system abbrevs\" are ignored."
+ (let ((table (symbol-value name))
+ (symbols (abbrev--table-symbols name readable)))
+ (setq symbols (sort symbols 'string-lessp))
+ (let ((standard-output (current-buffer)))
+ (if readable
+ (progn
+ (insert "(")
+ (prin1 name)
+ (insert ")\n\n")
+ (mapc 'abbrev--describe symbols)
+ (insert "\n\n"))
+ (insert "(define-abbrev-table '")
+ (prin1 name)
+ (if (null symbols)
+ (insert " '())\n\n")
+ (insert "\n '(\n")
+ (mapc 'abbrev--write symbols)
+ (insert " ))\n\n")))
+ nil)))
+
+(defun abbrev--table-symbols (name &optional system)
+ "Return the user abbrev symbols in the abbrev table named NAME.
+NAME is a symbol whose value is an abbrev table. System abbrevs
+are omitted unless SYSTEM is non-nil."
(let ((table (symbol-value name))
(symbols ()))
(mapatoms (lambda (sym)
- (if (and (symbol-value sym) (or readable (not (abbrev-get sym :system))))
+ (if (and (symbol-value sym) (or system (not (abbrev-get sym :system))))
(push sym symbols)))
table)
- (when symbols
- (setq symbols (sort symbols 'string-lessp))
- (let ((standard-output (current-buffer)))
- (if readable
- (progn
- (insert "(")
- (prin1 name)
- (insert ")\n\n")
- (mapc 'abbrev--describe symbols)
- (insert "\n\n"))
- (insert "(define-abbrev-table '")
- (prin1 name)
- (if (null symbols)
- (insert " '())\n\n")
- (insert "\n '(\n")
- (mapc 'abbrev--write symbols)
- (insert " ))\n\n")))
- nil))))
+ symbols))
(defun define-abbrev-table (tablename definitions
&optional docstring &rest props)