all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
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 ----

  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.