all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: David Kastrup <dak@gnu.org>
Cc: cyd@stupidchicken.com, rms@gnu.org, emacs-devel@gnu.org
Subject: Re: local keymap patch for key-binding
Date: Wed, 13 Sep 2006 10:11:28 +0200	[thread overview]
Message-ID: <85k648kwy7.fsf@lola.goethe.zz> (raw)
In-Reply-To: <m3odtkfbv0.fsf@kfs-l.imdomain.dk> (Kim F. Storm's message of "Wed\, 13 Sep 2006 09\:45\:55 +0200")

[-- Attachment #1: Type: text/plain, Size: 633 bytes --]

storm@cua.dk (Kim F. Storm) writes:

> David Kastrup <dak@gnu.org> writes:
>
>> Ok, here is the complete patch.  
>
> Well, you forgot to include patches for keyboard.c, lisp.h and the
> ChangeLog.

I don't get it.  I used Stefan's instructions, and I _checked_ that
the diff covered all files.  Sigh.  But I can't deny that this info is
missing in my mail.

[Checking, rechecking, retrying, previewing the mail]

Oh wow.  I included "*vc-diff*" instead of "*cvs-diff*".  Who would've
thunk?

Sorry for the confusion.  I suppose that the included diff is the
relevant version, since I likely used it to cook up the ChangeLog
entry.


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: Type: text/x-patch, Size: 15624 bytes --]

Index: src/keymap.h
===================================================================
RCS file: /sources/emacs/emacs/src/keymap.h,v
retrieving revision 1.14
diff -u -r1.14 keymap.h
*** src/keymap.h	6 Feb 2006 15:23:21 -0000	1.14
--- src/keymap.h	13 Sep 2006 08:02:42 -0000
***************
*** 29,36 ****
  EXFUN (Fkeymap_prompt, 1);
  EXFUN (Fdefine_key, 3);
  EXFUN (Flookup_key, 3);
! EXFUN (Fcommand_remapping, 1);
! EXFUN (Fkey_binding, 3);
  EXFUN (Fkey_description, 2);
  EXFUN (Fsingle_key_description, 2);
  EXFUN (Fwhere_is_internal, 5);
--- 29,36 ----
  EXFUN (Fkeymap_prompt, 1);
  EXFUN (Fdefine_key, 3);
  EXFUN (Flookup_key, 3);
! EXFUN (Fcommand_remapping, 2);
! EXFUN (Fkey_binding, 4);
  EXFUN (Fkey_description, 2);
  EXFUN (Fsingle_key_description, 2);
  EXFUN (Fwhere_is_internal, 5);
Index: src/keymap.c
===================================================================
RCS file: /sources/emacs/emacs/src/keymap.c,v
retrieving revision 1.333
diff -u -r1.333 keymap.c
*** src/keymap.c	11 Sep 2006 13:03:40 -0000	1.333
--- src/keymap.c	13 Sep 2006 08:02:44 -0000
***************
*** 28,33 ****
--- 28,34 ----
  #include "buffer.h"
  #include "charset.h"
  #include "keyboard.h"
+ #include "window.h"
  #include "termhooks.h"
  #include "blockinput.h"
  #include "puresize.h"
***************
*** 1216,1232 ****
  
  /* This function may GC (it calls Fkey_binding).  */
  
! DEFUN ("command-remapping", Fcommand_remapping, Scommand_remapping, 1, 1, 0,
         doc: /* Return the remapping for command COMMAND in current keymaps.
! Returns nil if COMMAND is not remapped (or not a symbol).  */)
!      (command)
!      Lisp_Object command;
  {
    if (!SYMBOLP (command))
      return Qnil;
  
    ASET (command_remapping_vector, 1, command);
!   return Fkey_binding (command_remapping_vector, Qnil, Qt);
  }
  
  /* Value is number if KEY is too long; nil if valid but has no definition. */
--- 1217,1236 ----
  
  /* This function may GC (it calls Fkey_binding).  */
  
! DEFUN ("command-remapping", Fcommand_remapping, Scommand_remapping, 1, 2, 0,
         doc: /* Return the remapping for command COMMAND in current keymaps.
! Returns nil if COMMAND is not remapped (or not a symbol).
! 
! If optional argument LOCATION is a mouse event based key sequence,
! the remapping occurs in the keymaps corresponding to the click. */)
!      (command, location)
!      Lisp_Object command, location;
  {
    if (!SYMBOLP (command))
      return Qnil;
  
    ASET (command_remapping_vector, 1, command);
!   return Fkey_binding (command_remapping_vector, Qnil, Qt, location);
  }
  
  /* Value is number if KEY is too long; nil if valid but has no definition. */
***************
*** 1552,1558 ****
  
  /* GC is possible in this function if it autoloads a keymap.  */
  
! DEFUN ("key-binding", Fkey_binding, Skey_binding, 1, 3, 0,
         doc: /* Return the binding for command KEY in current keymaps.
  KEY is a string or vector, a sequence of keystrokes.
  The binding is probably a symbol with a function definition.
--- 1556,1562 ----
  
  /* GC is possible in this function if it autoloads a keymap.  */
  
! DEFUN ("key-binding", Fkey_binding, Skey_binding, 1, 4, 0,
         doc: /* Return the binding for command KEY in current keymaps.
  KEY is a string or vector, a sequence of keystrokes.
  The binding is probably a symbol with a function definition.
***************
*** 1566,1620 ****
  Like the normal command loop, `key-binding' will remap the command
  resulting from looking up KEY by looking up the command in the
  current keymaps.  However, if the optional third argument NO-REMAP
! is non-nil, `key-binding' returns the unmapped command.  */)
!      (key, accept_default, no_remap)
!      Lisp_Object key, accept_default, no_remap;
  {
!   Lisp_Object *maps, value;
    int nmaps, i;
!   struct gcpro gcpro1;
  
!   GCPRO1 (key);
  
! #ifdef HAVE_MOUSE
!   if (VECTORP (key) && ASIZE (key) > 0)
      {
!       Lisp_Object ev, pos;
!       if ((ev = AREF (key, 0), CONSP (ev))
! 	  && SYMBOLP (XCAR (ev))
! 	  && CONSP (XCDR (ev))
! 	  && (pos = XCAR (XCDR (ev)), CONSP (pos))
! 	  && XINT (Flength (pos)) == 10
! 	  && INTEGERP (XCAR (XCDR (pos))))
! 	{
! 	  Lisp_Object map, object;
  
! 	  object = Fnth (make_number(4), pos);
  
! 	  if (CONSP (object))
! 	    map = Fget_char_property (XCDR (object), Qkeymap, XCAR (object));
! 	  else
! 	    map = Fget_char_property (XCAR (XCDR (pos)), Qkeymap,
! 				      Fwindow_buffer (XCAR (pos)));
  
! 	  if (!NILP (Fkeymapp (map)))
  	    {
! 	      value = Flookup_key (map, key, accept_default);
! 	      if (! NILP (value) && !INTEGERP (value))
! 		goto done;
  	    }
  	}
      }
! #endif /* HAVE_MOUSE  */
! 
!   if (!NILP (current_kboard->Voverriding_terminal_local_map))
      {
        value = Flookup_key (current_kboard->Voverriding_terminal_local_map,
  			   key, accept_default);
        if (! NILP (value) && !INTEGERP (value))
  	goto done;
      }
!   else if (!NILP (Voverriding_local_map))
      {
        value = Flookup_key (Voverriding_local_map, key, accept_default);
        if (! NILP (value) && !INTEGERP (value))
--- 1570,1663 ----
  Like the normal command loop, `key-binding' will remap the command
  resulting from looking up KEY by looking up the command in the
  current keymaps.  However, if the optional third argument NO-REMAP
! is non-nil, `key-binding' returns the unmapped command.
! 
! If KEY is a key sequence initiated with the mouse, the used keymaps
! will depend on the clicked mouse position with regard to the buffer
! and possible local keymaps on strings.  If LOCATION is non-nil, it
! will used in place of KEY for determining mouse-dependent keymaps, but
! it will still be KEY that is looked up.
!   */)
! (key, accept_default, no_remap, location)
!   Lisp_Object key, accept_default, no_remap, location;
  {
!   Lisp_Object *maps, value, event;
    int nmaps, i;
!   struct gcpro gcpro1, gcpro2;
!   int count = SPECPDL_INDEX ();
! 
!   GCPRO2 (key, location);
  
!   if (NILP (location))
!     location = key;
  
!   if (VECTORP(location) && ASIZE(location) > 0)
      {
!       /* mouse events may have a symbolic prefix indicating the
! 	 scrollbar or mode line */
!       if (SYMBOLP (AREF(location,0)) && ASIZE(location) > 1)
! 	event = AREF(location,1);
!       else
! 	event = AREF(location,0);
  
!       /* We are not interested in locations without event data */
  
!       if (! EVENT_HAS_PARAMETERS (event))
! 	event = Qnil;
!     }
!   else
!     event = Qnil;
  
!   /* Key sequences beginning with mouse clicks
!      are read using the keymaps of the buffer clicked on, not
!      the current buffer.  So we may have to switch the buffer
!      here. */
! 
!   if (! NILP (event))
!     {
!       Lisp_Object kind;
!       Lisp_Object string;
!       
!       kind = EVENT_HEAD_KIND (EVENT_HEAD (event));
!       if (EQ (kind, Qmouse_click))
! 	{
! 	  Lisp_Object window, posn;
! 	  
! 	  window = POSN_WINDOW (EVENT_START (event));
! 	  posn   = POSN_POSN (EVENT_START (event));
! 	  
! 	  /* Key sequences beginning with mouse clicks are
! 	     read using the keymaps in the buffer clicked on,
! 	     not the current buffer.  If we're at the
! 	     beginning of a key sequence, switch buffers.  */
! 	  if (WINDOWP (window)
! 	      && BUFFERP (XWINDOW (window)->buffer)
! 	      && XBUFFER (XWINDOW (window)->buffer) != current_buffer)
  	    {
! 	      /* Arrange to go back to the original buffer once we're
! 		 done reading the key sequence.  Note that we can't
! 		 use save_excursion_{save,restore} here, because they
! 		 save point as well as the current buffer; we don't
! 		 want to save point, because redisplay may change it,
! 		 to accommodate a Fset_window_start or something.
! 	      */
! 	      
! 	      record_unwind_protect (Fset_buffer, Fcurrent_buffer ());
! 
! 	      set_buffer_internal (XBUFFER (XWINDOW (window)->buffer));
! 	      
  	    }
  	}
      }
!   
!   if (! NILP (current_kboard->Voverriding_terminal_local_map))
      {
        value = Flookup_key (current_kboard->Voverriding_terminal_local_map,
  			   key, accept_default);
        if (! NILP (value) && !INTEGERP (value))
  	goto done;
      }
!   else if (! NILP (Voverriding_local_map))
      {
        value = Flookup_key (Voverriding_local_map, key, accept_default);
        if (! NILP (value) && !INTEGERP (value))
***************
*** 1622,1633 ****
      }
    else
      {
!       Lisp_Object local;
  
!       local = get_local_map (PT, current_buffer, Qkeymap);
!       if (! NILP (local))
  	{
! 	  value = Flookup_key (local, key, accept_default);
  	  if (! NILP (value) && !INTEGERP (value))
  	    goto done;
  	}
--- 1665,1744 ----
      }
    else
      {
!       Lisp_Object keymap, local_map;
  
!       local_map = get_local_map (PT, current_buffer, Qlocal_map); 
!       keymap = get_local_map (PT, current_buffer, Qkeymap); 
! 
!       if (! NILP(event))
! 	{
! 	  Lisp_Object kind;
! 	  Lisp_Object string;
! 
! 	  kind = EVENT_HEAD_KIND (EVENT_HEAD (event));
! 	  if (EQ (kind, Qmouse_click))
! 	    {
! 	      Lisp_Object window, posn;
! 
! 	      window = POSN_WINDOW      (EVENT_START (event));
! 	      posn   = POSN_POSN (EVENT_START (event));
! 
! 	      /* For a mouse click, get the local text-property keymap
! 		 of the place clicked on, rather than point.  */
! 
! 	      if (CONSP (XCDR (event)))
! 		{
! 		  Lisp_Object start, pos;
! 
! 		  start = EVENT_START (event);
! 
! 		  if (CONSP (start) && POSN_INBUFFER_P (start))
! 		    {
! 		      pos = POSN_BUFFER_POSN (start);
! 		      if (INTEGERP (pos)
! 			  && XINT (pos) >= BEG && XINT (pos) <= Z)
! 			{
! 			  local_map =
! 			    get_local_map (XINT (pos),
! 					   current_buffer, Qlocal_map);
! 
! 			  keymap = get_local_map (XINT (pos),
! 						  current_buffer, Qkeymap);
! 			}
! 		    }
! 		}
! 
! 	      /* If on a mode line string with a local keymap,
! 		 or for a click on a string, i.e. overlay string or a
! 		 string displayed via the `display' property,
! 		 consider `local-map' and `keymap' properties of
! 		 that string.  */
! 
! 	      if (string = POSN_STRING (EVENT_START (event)),
! 		  (CONSP (string) && STRINGP (XCAR (string))))
! 		{
! 		  Lisp_Object pos, map;
! 		  
! 		  pos = XCDR (string);
! 		  string = XCAR (string);
! 		  if (XINT (pos) >= 0
! 		      && XINT (pos) < SCHARS (string))
! 		    {
! 		      map = Fget_text_property (pos, Qlocal_map, string);
! 		      if (!NILP (map))
! 			local_map = map;
! 		      map = Fget_text_property (pos, Qkeymap, string);
! 		      if (!NILP (map))
! 			keymap = map;
! 		    }
! 		}
! 	      
! 	    }
! 	}
! 
!       if (! NILP (keymap))
  	{
! 	  value = Flookup_key (keymap, key, accept_default);
  	  if (! NILP (value) && !INTEGERP (value))
  	    goto done;
  	}
***************
*** 1644,1653 ****
  	      goto done;
  	  }
  
!       local = get_local_map (PT, current_buffer, Qlocal_map);
!       if (! NILP (local))
  	{
! 	  value = Flookup_key (local, key, accept_default);
  	  if (! NILP (value) && !INTEGERP (value))
  	    goto done;
  	}
--- 1755,1763 ----
  	      goto done;
  	  }
  
!       if (! NILP (local_map))
  	{
! 	  value = Flookup_key (local_map, key, accept_default);
  	  if (! NILP (value) && !INTEGERP (value))
  	    goto done;
  	}
***************
*** 1656,1661 ****
--- 1766,1773 ----
    value = Flookup_key (current_global_map, key, accept_default);
  
   done:
+   unbind_to (count, Qnil);
+ 
    UNGCPRO;
    if (NILP (value) || INTEGERP (value))
      return Qnil;
***************
*** 1666,1672 ****
    if (NILP (no_remap) && SYMBOLP (value))
      {
        Lisp_Object value1;
!       if (value1 = Fcommand_remapping (value), !NILP (value1))
  	value = value1;
      }
  
--- 1778,1784 ----
    if (NILP (no_remap) && SYMBOLP (value))
      {
        Lisp_Object value1;
!       if (value1 = Fcommand_remapping (value, location), !NILP (value1))
  	value = value1;
      }
  
***************
*** 2467,2473 ****
    if (NILP (no_remap) && SYMBOLP (definition))
      {
        Lisp_Object tem;
!       if (tem = Fcommand_remapping (definition), !NILP (tem))
  	return Qnil;
      }
  
--- 2579,2585 ----
    if (NILP (no_remap) && SYMBOLP (definition))
      {
        Lisp_Object tem;
!       if (tem = Fcommand_remapping (definition, Qnil), !NILP (tem))
  	return Qnil;
      }
  
Index: src/keyboard.c
===================================================================
RCS file: /sources/emacs/emacs/src/keyboard.c,v
retrieving revision 1.875
diff -u -r1.875 keyboard.c
*** src/keyboard.c	10 Sep 2006 21:10:50 -0000	1.875
--- src/keyboard.c	13 Sep 2006 08:02:56 -0000
***************
*** 1674,1680 ****
        if (SYMBOLP (cmd))
  	{
  	  Lisp_Object cmd1;
! 	  if (cmd1 = Fcommand_remapping (cmd), !NILP (cmd1))
  	    cmd = cmd1;
  	}
  
--- 1674,1680 ----
        if (SYMBOLP (cmd))
  	{
  	  Lisp_Object cmd1;
! 	  if (cmd1 = Fcommand_remapping (cmd, Qnil), !NILP (cmd1))
  	    cmd = cmd1;
  	}
  
***************
*** 7516,7522 ****
        Lisp_Object prefix;
  
        if (!NILP (tem))
! 	tem = Fkey_binding (tem, Qnil, Qnil);
  
        prefix = AREF (item_properties, ITEM_PROPERTY_KEYEQ);
        if (CONSP (prefix))
--- 7516,7522 ----
        Lisp_Object prefix;
  
        if (!NILP (tem))
! 	tem = Fkey_binding (tem, Qnil, Qnil, Qnil);
  
        prefix = AREF (item_properties, ITEM_PROPERTY_KEYEQ);
        if (CONSP (prefix))
***************
*** 9125,9140 ****
  			  if (!EQ (map_here, orig_local_map))
  			    {
  			      orig_local_map = map_here;
! 			      keybuf[t] = key;
! 			      mock_input = t + 1;
! 
! 			      goto replay_sequence;
  			    }
  			  map_here = get_local_map (XINT (pos),
  						     current_buffer, Qkeymap);
  			  if (!EQ (map_here, orig_keymap))
  			    {
  			      orig_keymap = map_here;
  			      keybuf[t] = key;
  			      mock_input = t + 1;
  
--- 9125,9143 ----
  			  if (!EQ (map_here, orig_local_map))
  			    {
  			      orig_local_map = map_here;
! 			      ++localized_local_map;
  			    }
+ 
  			  map_here = get_local_map (XINT (pos),
  						     current_buffer, Qkeymap);
  			  if (!EQ (map_here, orig_keymap))
  			    {
  			      orig_keymap = map_here;
+ 			      ++localized_local_map;
+ 			    }
+ 
+ 			  if (localized_local_map > 1)
+ 			    {
  			      keybuf[t] = key;
  			      mock_input = t + 1;
  
Index: src/ChangeLog
===================================================================
RCS file: /sources/emacs/emacs/src/ChangeLog,v
retrieving revision 1.5293
diff -u -r1.5293 ChangeLog
*** src/ChangeLog	12 Sep 2006 16:47:50 -0000	1.5293
--- src/ChangeLog	13 Sep 2006 08:03:25 -0000
***************
*** 1,3 ****
--- 1,22 ----
+ 2006-09-13  David Kastrup  <dak@gnu.org>
+ 
+ 	* keymap.c: include "window.h".
+ 	(Fcommand_remapping): New optional LOCATION argument.
+ 	(Fkey_binding): New optional LOCATION argument.  Completely rework
+ 	handling of mouse clicks to get the same order of keymaps as
+ 	`read-key-sequence' and heed LOCATION.  Also temporarily switch
+ 	buffers to location of mouse click and back.
+ 
+ 	* keyboard.c (command_loop_1): Adjust call of `Fcommand_remapping'
+ 	for additional argument.
+ 	(parse_menu_item): Adjust call of `Fkey_binding' for additional
+ 	argument.
+ 	(read_key_sequence): If there are both `local-map' and `keymap'
+ 	text properties at some location, heed both.
+ 
+ 	* keymap.h: Declare additional optional arguments of
+ 	`Fcommand_remapping and `Fkey_binding'.
+ 
  2006-09-12  Stefan Monnier  <monnier@iro.umontreal.ca>
  
  	* textprop.c (Fnext_property_change, Fnext_single_property_change)

[-- Attachment #3: Type: text/plain, Size: 166 bytes --]


By the way: don't ask me why the diff is in reverse order.  Seems like
that is what T = does in a PCL-CVS buffer.

-- 
David Kastrup, Kriemhildstr. 15, 44793 Bochum

[-- Attachment #4: Type: text/plain, Size: 142 bytes --]

_______________________________________________
Emacs-devel mailing list
Emacs-devel@gnu.org
http://lists.gnu.org/mailman/listinfo/emacs-devel

  reply	other threads:[~2006-09-13  8:11 UTC|newest]

Thread overview: 55+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-02-10  9:34 longlines-mode doesn't seem to work with some non-english text Miles Bader
2006-02-11  4:35 ` Chong Yidong
2006-02-13  0:32   ` Kevin Ryde
2006-09-09 15:08 ` local keymap patch for key-binding Chong Yidong
2006-09-09 15:15   ` David Kastrup
2006-09-09 15:26     ` Chong Yidong
2006-09-10 12:44     ` Chong Yidong
2006-09-10 13:25       ` David Kastrup
2006-09-11  2:36         ` Chong Yidong
2006-09-11  6:25           ` David Kastrup
2006-09-11  7:05           ` David Kastrup
2006-09-11  8:52             ` Kim F. Storm
2006-09-11  9:48               ` David Kastrup
2006-09-11 10:11                 ` David Kastrup
2006-09-11 12:53                   ` Kim F. Storm
2006-09-11 13:04                     ` David Kastrup
2006-09-11 13:07                   ` Chong Yidong
2006-09-11 19:58                 ` Richard Stallman
2006-09-12 10:04                   ` David Kastrup
2006-09-12 15:21                     ` David Kastrup
2006-09-12 15:39                       ` PCL-CVS's diff and marks (was: local keymap patch for key-binding) Stefan Monnier
2006-09-12 15:42                         ` PCL-CVS's diff and marks David Kastrup
2006-09-12 15:54                           ` Stefan Monnier
2006-09-12 21:45                       ` local keymap patch for key-binding Richard Stallman
2006-09-12 22:23                         ` David Kastrup
2006-09-12 23:44                           ` David Kastrup
2006-09-13  7:45                             ` Kim F. Storm
2006-09-13  8:11                               ` David Kastrup [this message]
2006-09-13 11:05                                 ` Kim F. Storm
2006-09-13 11:38                                   ` David Kastrup
2006-09-13 12:23                                     ` Kim F. Storm
2006-09-13 12:32                                       ` David Kastrup
2006-09-13 13:45                                         ` Kim F. Storm
2006-09-13 19:25                                     ` Richard Stallman
2006-09-13 19:49                                       ` David Kastrup
2006-09-13 19:25                                 ` Richard Stallman
2006-09-13 20:02                                   ` David Kastrup
2006-09-13 19:24                           ` Richard Stallman
2006-09-13 15:10                       ` Richard Stallman
2006-09-13 15:25                         ` David Kastrup
2006-09-14  2:34                           ` Richard Stallman
2006-09-14 11:57                             ` David Kastrup
2006-09-14 22:34                               ` David Kastrup
2006-09-14 22:36                                 ` David Kastrup
2006-09-15  3:14                               ` Richard Stallman
2006-09-15  8:20                                 ` David Kastrup
2006-09-15 23:47                               ` David Kastrup
2006-09-16  0:14                                 ` Kim F. Storm
2006-09-16 19:05                                   ` Richard Stallman
2006-09-18 15:43                                     ` David Kastrup
2006-09-18 20:34                                       ` Kim F. Storm
2006-09-18 23:39                                       ` Richard Stallman
2006-09-16 16:41                                 ` Stefan Monnier
2006-09-10 18:52       ` Richard Stallman
2006-09-11  2:39         ` Chong Yidong

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=85k648kwy7.fsf@lola.goethe.zz \
    --to=dak@gnu.org \
    --cc=cyd@stupidchicken.com \
    --cc=emacs-devel@gnu.org \
    --cc=rms@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 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.