From: "Andreas Röhler" <andreas.roehler@easy-emacs.de>
To: bug-gnu-emacs@gnu.org
Subject: bug#5937: 23.1.95; why saving empty abbrev tables
Date: Sun, 27 Mar 2011 19:34:36 +0200 [thread overview]
Message-ID: <4D8F752C.2000605@easy-emacs.de> (raw)
In-Reply-To: <m17hbl6tex.fsf@gmail.com>
Am 27.03.2011 07:09, schrieb Leo:
> On 2010-04-27 11:49 +0800, Stefan Monnier wrote:
>> Actually, having tried it now for a while I do have an objection: it
>> makes it harder to add entries to an abbrev-table if that table
>> is empty.
>>
>> So I think a better option is to sort the tables such that empty tables
>> are pushed to the end.
>>
>>
>> Stefan
>
> Hello Stefan,
>
> I propose we allow C-u M-x edit-abbrevs to include all abbrev tables but
> default to include only nonempty tables.
>
> Here is an updated patch.
>
>
>
>
> === modified file 'lisp/abbrev.el'
> --- lisp/abbrev.el 2011-03-22 15:38:40 +0000
> +++ lisp/abbrev.el 2011-03-27 04:56:22 +0000
> @@ -104,7 +104,7 @@
> prefix arg, display only local, i.e. mode-specific, abbrevs.
> Otherwise display all abbrevs."
> (interactive "P")
> - (display-buffer (prepare-abbrev-list-buffer local)))
> + (display-buffer (prepare-abbrev-list-buffer (and local 'local))))
>
> (defun abbrev-table-name (table)
> "Value is the name of abbrev table TABLE."
> @@ -116,14 +116,28 @@
> (setq tables (cdr tables)))
> found))
>
> -(defun prepare-abbrev-list-buffer (&optional local)
> - (let ((local-table local-abbrev-table))
> +(defun abbrev-nonempty-table-names (&optional ignore-system)
> + "Return a list of nonempty abbrev table names.
> +If IGNORE-SYSTEM is non-nil, system definitions are ignored."
> + (delete nil
> + (mapcar (lambda (tn)
> + (unless (abbrev-table-empty-p
> + (symbol-value tn) ignore-system)
> + tn))
> + abbrev-table-name-list)))
> +
> +;; HOW takes value: nil, local or all.
> +(defun prepare-abbrev-list-buffer (&optional how)
> + (let ((local-table local-abbrev-table)
> + (tables (if (eq how 'all)
> + abbrev-table-name-list
> + (abbrev-nonempty-table-names))))
> (with-current-buffer (get-buffer-create "*Abbrevs*")
> (erase-buffer)
> - (if local
> + (if (eq how 'local)
> (insert-abbrev-table-description
> (abbrev-table-name local-table) t)
> - (dolist (table abbrev-table-name-list)
> + (dolist (table tables)
> (insert-abbrev-table-description table t)))
> (goto-char (point-min))
> (set-buffer-modified-p nil)
> @@ -140,10 +154,11 @@
> (use-local-map edit-abbrevs-map)
> (run-mode-hooks 'edit-abbrevs-mode-hook))
>
> -(defun edit-abbrevs ()
> +(defun edit-abbrevs (&optional all)
> "Alter abbrev definitions by editing a list of them.
> Selects a buffer containing a list of abbrev definitions.
> -You can edit them and type \\<edit-abbrevs-map>\\[edit-abbrevs-redefine] to redefine abbrevs
> +Use \\[universal-argument] to include empty abbrev tables. You can edit
> +them and type \\<edit-abbrevs-map>\\[edit-abbrevs-redefine] to redefine abbrevs
> according to your editing.
> Buffer contains a header line for each abbrev table,
> which is the abbrev table name in parentheses.
> @@ -152,8 +167,8 @@
> where NAME and EXPANSION are strings with quotes,
> USECOUNT is an integer, and HOOK is any valid function
> or may be omitted (it is usually omitted)."
> - (interactive)
> - (switch-to-buffer (prepare-abbrev-list-buffer)))
> + (interactive "P")
> + (switch-to-buffer (prepare-abbrev-list-buffer (and all 'all))))
>
> (defun edit-abbrevs-redefine ()
> "Redefine abbrevs according to current buffer contents."
> @@ -225,7 +240,8 @@
> abbrev-file-name)))
> (or (and file (> (length file) 0))
> (setq file abbrev-file-name))
> - (let ((coding-system-for-write 'utf-8))
> + (let ((coding-system-for-write 'utf-8)
> + (tables (abbrev-nonempty-table-names t)))
> (with-temp-buffer
> (dolist (table
> ;; We sort the table in order to ease the automatic
> @@ -234,10 +250,9 @@
> ;; user keeps their home directory in a revision
> ;; control system, and is therefore keeping multiple
> ;; slightly-differing copies loosely synchronized.
> - (sort (copy-sequence abbrev-table-name-list)
> - (lambda (s1 s2)
> - (string< (symbol-name s1)
> - (symbol-name s2)))))
> + (sort tables (lambda (s1 s2)
> + (string< (symbol-name s1)
> + (symbol-name s2)))))
> (insert-abbrev-table-description table nil))
> (when (unencodable-char-position (point-min) (point-max) 'utf-8)
> (setq coding-system-for-write
> @@ -420,6 +435,18 @@
> (and (vectorp object)
> (numberp (abbrev-table-get object :abbrev-table-modiff))))
>
> +(defun abbrev-table-empty-p (object&optional ignore-system)
> + "Return nil if there are no abbrev symbols in OBJECT.
> +If IGNORE-SYSTEM is non-nil, system definitions are ignored."
> + (unless (abbrev-table-p object)
> + (error "Non abbrev table object"))
> + (not (catch 'some
> + (mapatoms (lambda (abbrev)
> + (unless (or (zerop (length (symbol-name abbrev)))
> + (and ignore-system (abbrev-get abbrev :system)))
> + (throw 'some t)))
> + object))))
> +
> (defvar global-abbrev-table (make-abbrev-table)
> "The abbrev table whose abbrevs affect all buffers.
> Each buffer may also have a local abbrev table.
>
>
>
>
>
> Leo
Hi Leo,
just an abstract reasoning: don't change things you are not compelled
to. Or to say: unless there is a reason for it.
An empty table doesn't take considerable space nor time.
OTOH when changing a thing, always remains a certain risk to break
something.
As said, just abtract reasoning. Don't see a real danger here.
Cheers
Andreas
next prev parent reply other threads:[~2011-03-27 17:34 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-04-12 15:23 bug#5937: 23.1.95; why saving empty abbrev tables Leo
2010-04-12 18:32 ` Stefan Monnier
2010-04-15 10:26 ` Leo
2010-04-15 12:44 ` Stefan Monnier
2010-04-16 10:36 ` Leo
2010-04-27 3:49 ` Stefan Monnier
2010-04-27 8:46 ` Leo
2010-04-27 10:12 ` Leo
2010-04-27 10:32 ` Leo
2011-03-27 20:40 ` Stefan Monnier
2011-03-28 4:45 ` Leo
2011-03-28 13:58 ` Stefan Monnier
2011-03-28 14:26 ` Leo
2011-03-28 15:09 ` Stefan Monnier
2011-03-29 0:35 ` Leo
2011-03-29 3:31 ` Stefan Monnier
2011-03-29 4:41 ` Leo
2011-03-29 5:16 ` Leo
2011-03-29 13:49 ` Stefan Monnier
2011-03-29 15:42 ` Leo
2011-03-29 20:54 ` Stefan Monnier
2011-03-30 1:08 ` Leo
2011-03-27 5:09 ` Leo
2011-03-27 17:34 ` Andreas Röhler [this message]
2011-03-28 3:38 ` Leo
2011-03-27 20:35 ` Stefan Monnier
2011-03-28 4:03 ` Leo
2011-03-28 14:02 ` Stefan Monnier
2011-03-28 14:40 ` Leo
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4D8F752C.2000605@easy-emacs.de \
--to=andreas.roehler@easy-emacs.de \
--cc=bug-gnu-emacs@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.