unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
From: "Stefan Monnier" <monnier+gnu/emacs@rum.cs.yale.edu>
Cc: "David PONCE" <David.Ponce@wanadoo.fr>, emacs-devel@gnu.org
Subject: Re: Suggestion: Simple way to make conditional key bindings.
Date: Fri, 23 Aug 2002 13:22:00 -0400	[thread overview]
Message-ID: <200208231722.g7NHM0M02096@rum.cs.yale.edu> (raw)
In-Reply-To: 5xadnd3eck.fsf@kfs2.cua.dk

> > > (global-set-key "\C-y"
> > >         '(cond
> > >           ((and kill-ring (table-recognize-table (car kill-ring)))
> > >             yank-with-properties)
> > >           (t yank)))
> > > 
> > > 
> > 
> > It seems that you can do something similar this way:
> > 
> > (global-set-key "\C-y" '(menu-item "my-filter" :filter my-filter))
> > 
> > (defun my-filter (&rest ignore)
> >   (cond
> >    ((and kill-ring (table-recognize-table (car kill-ring)))
> >     'yank-with-properties)
> >    (t 'yank)))
> > 
> > Am I wrong?
> 
> Not at all [that's more or less how it is implemented].
> 
> 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' ?
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.

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').

> It will then be quite trivial to enhance `define-key' to handle
> conditional bindings:

But is it desirable ?

> (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 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 ?


	Stefan

  reply	other threads:[~2002-08-23 17:22 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 [this message]
2002-08-25 23:33     ` Kim F. Storm
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=200208231722.g7NHM0M02096@rum.cs.yale.edu \
    --to=monnier+gnu/emacs@rum.cs.yale.edu \
    --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).