emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Function for deleting a key binding in a sparse keymap


From: Stefan Monnier
Subject: Re: Function for deleting a key binding in a sparse keymap
Date: Tue, 06 Dec 2005 20:56:11 -0500
User-agent: Gnus/5.11 (Gnus v5.11) Emacs/22.0.50 (gnu/linux)

> I feel a bit stupid because this example is not terribly important. However
> this is what I do. There is a minor mode where I use this,
> bw-window-resize-mode. When entering this mode I do:

>         (mapc (lambda(key)
>                 (define-key bw-keymap (vector key) nil))
>               help-event-list)

> I set the "help keys" to nil so that the help is still available during
> resizing. Those are the keys I want to remove afterwards. The default value
> in the sparse keymap bw-keymap is:

>        (define-key bw-keymap [t]  'bw-exit-resize-mode)

I see.  Coming from a functional programming background, I'd use anoter
approach based on the idea of reusing the original value rather than using
side-effects to try and coerce it back to the same shape it had originally:

       (defvar bw-keymap
           (let ((map (make-sparse-keymap)))
             (define-key map [t]  'bw-exit-resize-mode)
             map))

then when adding help-event-list bindings:

       (setq bw-keymap (let ((map (make-sparse-keymap)))
                         (set-keymap-parent map bw-keymap)
                         map))
       ;; dolist is more efficient than mapc.
       (dolist (key help-event-list)
         (define-key bw-keymap (vector key) nil))

and when you want to remove those keys, just do

       (setq bw-keymap (keymap-parent bw-keymap))

Of course, you can use variants of it, e.g. introduce a "bw-basic-map"
variable to keep the original map, rather than rely on (keymap-parent
bw-keymap) holding that original map.


        Stefan




reply via email to

[Prev in Thread] Current Thread [Next in Thread]