[Top][All Lists]

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

Re: Get a command by its keybinding and also respecting key translation

From: Stefan Monnier
Subject: Re: Get a command by its keybinding and also respecting key translation
Date: Sat, 18 Dec 2010 11:23:10 -0500
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/24.0.50 (gnu/linux)

>> (define-key outline-minor-mode-map
>> (kdb "<tab>")
>> `(menu-item "dummy" org-cycle
>> :filter ,(lambda (cmd)
>> (if (th-outline-context-p) cmd))))

> This is cool, but sadly not equivalent, because I cannot add multiple
> binding for one key in the same keymap.

Very good point.  I bumped into the same problem a while ago for the
case where the "key" is the default [t] binding (where I wanted to have
a single binding cover a whole bunch of keys at a time).

You can hack around this limitation by using

  (setcdr outline-minor-mode-map
          (cons (cons 'tab `(menu-item "dummy" org-cycle
                             :filter ,(lambda (cmd)
                                        (if (th-outline-context-p) cmd))))
                (cdr outline-minor-mode-map)))

which might work.  But that's *really* ugly, and I wouldn't be surprised
if it didn't work right in some cases.

> So do I go to implement that behavior in a more standard way?

> The docs state, that the :filter may also switch the REAL-BINDING to
> some other command, so I could write a macro that expands according to
> your definition with a (cond ((PRED1) (CMD1)) ((PRED2) (CMD2))) instead
> of the if.

Yes, of course, that will work just fine.  The disadvantage being of
course that you lose modularity: you can't add PRED1/CMD1 and
PRED2/CMD2 separately.

> And is this approach not pretty slow?  I mean, my approach did the
> predicate checks only when that key was typed, but I think that your
> approach does the checks on any redisplay, right?

No, it'll do the check only when the key is pressed and will definitely
not interact with redisplay.


reply via email to

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