From: storm@cua.dk (Kim F. Storm)
Cc: "David PONCE" <David.Ponce@wanadoo.fr>, emacs-devel@gnu.org
Subject: Re: Suggestion: Simple way to make conditional key bindings.
Date: 26 Aug 2002 01:33:12 +0200 [thread overview]
Message-ID: <5xptw6wm2v.fsf@kfs2.cua.dk> (raw)
In-Reply-To: <200208231722.g7NHM0M02096@rum.cs.yale.edu>
"Stefan Monnier" <monnier+gnu/emacs@rum.cs.yale.edu> writes:
> >
> > But IMO, the `menu-item' syntax is awful, and using a
>
> If the problem is only syntax, feel free to create an appropriate macro.
>
> > filter function is an added complexity which is pretty
> > unflexible.
>
> What do you mean by `complexity' ?
Using code is not "self-contained"; in contrast, key bindings made by
one elisp package is typically independent of the key bindings made by
other packages. So using code is more complex than key bindings.
> You want to have a code. That's what functions are for. I think `eval'
> should generally be avoided, and `funcall' used instead.
> This is especially true if we care about lexical scoping.
I don't quite follow, but I take your word for it :-)
>
> One problem with your change is "what binding do we use when we don't want
> to run code?". The `menu-item' syntax provides a binding (in the example
> above it's "my-filter" which is not very useful indeed) for the case
> where code should not be evalled (for example in `where-is').
Who said we don't want to run code :-)
Ok, I can see that could be a problem if we cache the result.
But I guess we can just use the "default" binding, i.e. the last
element (t ...) in the cond [and nil if no such element is present].
>
> > It will then be quite trivial to enhance `define-key' to handle
> > conditional bindings:
>
> But is it desirable ?
Don't really know... It seems like a simple approach to allow
packages to hook into "standard bindings".
>
> > (define-key global-map "\C-y" 'yank) ; this sets the default
> >
> > (define-key global-map "\C-y" 'yank-with-properties
> > '(and kill-ring (table-recognize-table (car kill-ring))))
> >
> > The second call would automatically changes the non-cond binding into
> > a cond binding with the previous binding as default.
>
> Why not
>
> (define-key global-map "\C-y" 'yank-careful)
> (defun yank-careful (...)
> "Reinsert the last stretch of killed text, like `yank'.
> Contrary to `yank' this function is careful to preserve some important
> text properties when yanking tables."
> ...)
The point is that you can install a package - like table.el - which is
then able to install its own conditional binding on C-y *without*
interferring with (or even knowning) the standard binding.
Suppose we have a conditional binding like this
(define-key global-map "\C-y" 'yank-rectangle
'(rectangle-p (car kill-ring)))
to be able to insert rectangles from the kill-ring using C-y.
Then table.el would still be able to install its own conditional
binding on C-y.
>
> The advantage is that C-h k C-y doesn't just give you one of the two
> bindings but a docstring that describes both. Of course we could also
> improve C-h k to recognize your `cond' construct, etc... but is it
> really worth the trouble ?
I didn't think about that, but it would be a nice way to report such
"multiple" bindings on a key...
But you may also consider this as a different approach than using a
minor-mode-keymap, and in that case, I think C-h k doesn't report all
possible bindings for a key -- only the "currently active" binding, so
why does `cond' have to behave differently?
--
Kim F. Storm <storm@cua.dk> http://www.cua.dk
next prev parent reply other threads:[~2002-08-25 23:33 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <3D49FF140074EFAE@mel-rta7.wanadoo.fr>
2002-08-23 13:16 ` Suggestion: Simple way to make conditional key bindings Kim F. Storm
2002-08-23 17:22 ` Stefan Monnier
2002-08-25 23:33 ` Kim F. Storm [this message]
2002-08-26 15:47 ` Stefan Monnier
2002-08-26 19:33 ` Miles Bader
2002-08-27 19:05 ` Richard Stallman
2002-08-27 22:58 ` Kim F. Storm
2002-08-28 23:32 ` Richard Stallman
2002-08-29 8:54 ` Kim F. Storm
2002-08-28 1:00 ` Miles Bader
2002-08-28 1:22 ` Stefan Monnier
2002-08-27 11:23 ` Kim F. Storm
2002-08-23 12:52 David PONCE
-- strict thread matches above, loose matches on Subject: below --
2002-08-23 12:05 Kim F. Storm
2002-08-26 0:36 ` Richard Stallman
2002-08-26 16:21 ` Stefan Monnier
2002-08-30 10:27 ` Robert J. Chassell
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
List information: https://www.gnu.org/software/emacs/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=5xptw6wm2v.fsf@kfs2.cua.dk \
--to=storm@cua.dk \
--cc=David.Ponce@wanadoo.fr \
--cc=emacs-devel@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 public inbox
https://git.savannah.gnu.org/cgit/emacs.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).