From: "Stefan Monnier" <monnier+gnu/emacs@rum.cs.yale.edu>
Cc: Stefan Monnier <monnier+gnu/emacs@rum.cs.yale.edu>
Subject: Re: bug/feature - emacs doesn't tell you about keys with multiple prefixes
Date: Mon, 17 Mar 2003 11:35:28 -0500 [thread overview]
Message-ID: <200303171635.h2HGZSJw013765@rum.cs.yale.edu> (raw)
In-Reply-To: E18umbf-0003vw-00@fencepost.gnu.org
> In accessible-keymaps (used by where-is-internal), there is an explicit check
> to remove any duplicate keymaps (i.e. the same keymap appearing under another
> prefix).
>
> I don't remember the reason for this. Perhaps the idea was that it is
> supposed to tell you all the keymaps, not all the prefixes.
> Preventing cycles is also necessary.
>
> There could be an optional 3rd arg ALLOW-DUPLICATES which, if non-nil,
> means that it only rejects actual cycles (where the prefix already
> recorded for the same keymap is an initial segment of the new prefix).
Grepping through Emacs' code I discovered that accessible-keymap
is never called from elisp and that it's only ever called from
where-is-internal, so I think we can safely change its
behavior without adding a new argument.
How about the patch below ?
Stefan
Index: src/keymap.c
===================================================================
RCS file: /cvsroot/emacs/emacs/src/keymap.c,v
retrieving revision 1.277
diff -c -b -r1.277 keymap.c
*** src/keymap.c 16 Mar 2003 00:06:59 -0000 1.277
--- src/keymap.c 17 Mar 2003 16:32:29 -0000
***************
*** 1659,1676 ****
{
Lisp_Object tem;
! cmd = get_keyelt (cmd, 0);
if (NILP (cmd))
return;
! tem = get_keymap (cmd, 0, 0);
! if (CONSP (tem))
! {
! cmd = tem;
! /* Ignore keymaps that are already added to maps. */
! tem = Frassq (cmd, maps);
! if (NILP (tem))
{
/* If the last key in thisseq is meta-prefix-char,
turn it into a meta-ized keystroke. We know
that the event we're about to append is an
--- 1659,1689 ----
{
Lisp_Object tem;
! cmd = get_keymap (get_keyelt (cmd, 0), 0, 0);
if (NILP (cmd))
return;
! /* Look for and break cycles. */
! while (!NILP (tem = Frassq (cmd, maps)))
{
+ Lisp_Object prefix = XCAR (tem);
+ int lim = XINT (Flength (XCAR (tem)));
+ if (lim <= XINT (Flength (thisseq)))
+ { /* This keymap was already seen with a smaller prefix. */
+ int i = 0;
+ while (i < lim && EQ (Faref (prefix, make_number (i)),
+ Faref (thisseq, make_number (i))))
+ i++;
+ if (i >= lim)
+ /* `prefix' is a prefix of `thisseq' => there's a cycle. */
+ return;
+ }
+ /* This occurrence of `cmd' in `maps' does not correspond to a cycle,
+ but maybe `cmd' occurs again further down in `maps', so keep
+ looking. */
+ maps = XCDR (Fmemq (tem, maps));
+ }
+
/* If the last key in thisseq is meta-prefix-char,
turn it into a meta-ized keystroke. We know
that the event we're about to append is an
***************
*** 1694,1701 ****
{
tem = append_key (thisseq, key);
nconc2 (tail, Fcons (Fcons (tem, cmd), Qnil));
- }
- }
}
}
--- 1707,1712 ----
next prev parent reply other threads:[~2003-03-17 16:35 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2003-02-02 8:59 bug/feature - emacs doesn't tell you about keys with multiple prefixes Karl Chen
2003-03-16 10:14 ` Stefan Monnier
2003-03-17 4:52 ` Richard Stallman
2003-03-17 16:35 ` Stefan Monnier [this message]
2003-03-18 13:21 ` Richard Stallman
2003-03-18 16:16 ` Stefan Monnier
2003-03-20 8:45 ` Richard Stallman
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=200303171635.h2HGZSJw013765@rum.cs.yale.edu \
--to=monnier+gnu/emacs@rum.cs.yale.edu \
/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.