mirror of
git://git.sv.gnu.org/emacs.git
synced 2025-12-05 22:20:24 -08:00
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.
This commit is contained in:
parent
5bd8cfc14d
commit
f5896e2cbf
4 changed files with 43 additions and 31 deletions
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue