emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: local keymap patch for key-binding


From: David Kastrup
Subject: Re: local keymap patch for key-binding
Date: Thu, 14 Sep 2006 13:57:21 +0200
User-agent: Gnus/5.11 (Gnus v5.11) Emacs/22.0.50 (gnu/linux)

Richard Stallman <address@hidden> writes:

> Ok, I agree to adding the LOCATION arg.  But it needs to be documented.

Here is the latest patch iteration.  I think it should be fit for
checking in.  It might also seem reasonable to add the optional
`position' argument to `current-active-maps', but this has not been
done.

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        14 Sep 2006 11:49:06 -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        14 Sep 2006 11:49:09 -0000
***************
*** 33,38 ****
--- 33,39 ----
  #include "puresize.h"
  #include "intervals.h"
  #include "keymap.h"
+ #include "window.h"
  
  /* The number of elements in keymap vectors.  */
  #define DENSE_TABLE_SIZE (0200)
***************
*** 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,1239 ----
  
  /* 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 the optional argument POSITION is non-nil, it specifies a mouse
! position as returned by `event-start' and `event-end', and the
! remapping occurs in the keymaps associated with it.  It can also be a
! number or marker, in which case the keymap properties at the specified
! buffer position instead of point are used. */)
!      (command, position)
!      Lisp_Object command, position;
  {
    if (!SYMBOLP (command))
      return Qnil;
  
    ASET (command_remapping_vector, 1, command);
!   return Fkey_binding (command_remapping_vector, Qnil, Qt, position);
  }
  
  /* 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.
--- 1559,1565 ----
  
  /* 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))
--- 1573,1658 ----
  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 the optional argument POSITION is non-nil, it specifies a mouse
! position as returned by `event-start' and `event-end', and the lookup
! occurs in the keymaps associated with it instead of KEY.  It can also
! be a number or marker, in which case the keymap properties at the
! specified buffer position instead of point are used.
!   */)
!     (key, accept_default, no_remap, position)
!     Lisp_Object key, accept_default, no_remap, position;
  {
    Lisp_Object *maps, value;
    int nmaps, i;
!   struct gcpro gcpro1, gcpro2;
!   int count = SPECPDL_INDEX ();
  
!   GCPRO2 (key, position);
  
!   if (NILP (position))
      {
!       Lisp_Object event;
!       /* mouse events may have a symbolic prefix indicating the
!        scrollbar or mode line */
!       if (SYMBOLP (AREF (key, 0)) && ASIZE (key) > 1)
!       event = AREF (key, 1);
!       else
!       event = AREF (key, 0);
  
!       /* We are not interested in locations without event data */
  
!       if (EVENT_HAS_PARAMETERS (event)) {
!       Lisp_Object kind;
  
!       kind = EVENT_HEAD_KIND (EVENT_HEAD (event));
!       if (EQ (kind, Qmouse_click))
!         position = EVENT_START (event);
!       }
      }
  
!   /* 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 (CONSP (position))
!     {
!       Lisp_Object window;
!       
!       window = POSN_WINDOW (position);
!         
!       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
!            processing the key sequence.  We don't use
!            save_excursion_{save,restore} here, in analogy to
!            `read-key-sequence' to avoid saving point.  Maybe this
!            would not be a problem here, but it is easier to keep
!            things the same.
!         */
!             
!         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;
        }
--- 1660,1731 ----
      }
    else
      {
!       Lisp_Object keymap, local_map;
!       EMACS_INT pt;
  
!       pt = INTEGERP (position) ? XINT (position)
!       : MARKERP (position) ? marker_position (position)
!       : PT;
! 
!       local_map = get_local_map (pt, current_buffer, Qlocal_map); 
!       keymap = get_local_map (pt, current_buffer, Qkeymap); 
! 
!       if (CONSP (position))
!       {
!         Lisp_Object string, window;
! 
!         window = POSN_WINDOW (position);
! 
!         /* For a mouse click, get the local text-property keymap
!            of the place clicked on, rather than point.  */
!         
!         if (POSN_INBUFFER_P (position))
!           {
!             Lisp_Object pos;
! 
!             pos = POSN_BUFFER_POSN (position);
!             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 (position),
!             (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;
        }
--- 1742,1750 ----
              goto done;
          }
  
!       if (! NILP (local_map))
        {
!         value = Flookup_key (local_map, key, accept_default);
          if (! NILP (value) && !INTEGERP (value))
            goto done;
        }
***************
*** 1656,1661 ****
--- 1753,1760 ----
    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;
      }
  
--- 1765,1771 ----
    if (NILP (no_remap) && SYMBOLP (value))
      {
        Lisp_Object value1;
!       if (value1 = Fcommand_remapping (value, position), !NILP (value1))
        value = value1;
      }
  
***************
*** 2467,2473 ****
    if (NILP (no_remap) && SYMBOLP (definition))
      {
        Lisp_Object tem;
!       if (tem = Fcommand_remapping (definition), !NILP (tem))
        return Qnil;
      }
  
--- 2566,2572 ----
    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.876
diff -u -r1.876 keyboard.c
*** src/keyboard.c      13 Sep 2006 15:12:59 -0000      1.876
--- src/keyboard.c      14 Sep 2006 11:49:20 -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;
        }
  
***************
*** 7517,7523 ****
        Lisp_Object prefix;
  
        if (!NILP (tem))
!       tem = Fkey_binding (tem, Qnil, Qnil);
  
        prefix = AREF (item_properties, ITEM_PROPERTY_KEYEQ);
        if (CONSP (prefix))
--- 7517,7523 ----
        Lisp_Object prefix;
  
        if (!NILP (tem))
!       tem = Fkey_binding (tem, Qnil, Qnil, Qnil);
  
        prefix = AREF (item_properties, ITEM_PROPERTY_KEYEQ);
        if (CONSP (prefix))
***************
*** 9134,9149 ****
                          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;
  
--- 9134,9152 ----
                          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/Makefile.in
===================================================================
RCS file: /sources/emacs/emacs/src/Makefile.in,v
retrieving revision 1.330
diff -u -r1.330 Makefile.in
*** src/Makefile.in     6 Sep 2006 17:53:59 -0000       1.330
--- src/Makefile.in     14 Sep 2006 11:49:21 -0000
***************
*** 1146,1152 ****
     systty.h systime.h dispextern.h syntax.h $(INTERVAL_SRC) blockinput.h \
     atimer.h xterm.h puresize.h msdos.h keymap.h w32term.h macterm.h 
$(config_h)
  keymap.o: keymap.c buffer.h commands.h keyboard.h termhooks.h blockinput.h \
!    atimer.h systime.h puresize.h charset.h intervals.h $(config_h)
  lastfile.o: lastfile.c  $(config_h)
  macros.o: macros.c window.h buffer.h commands.h macros.h keyboard.h \
        dispextern.h $(config_h)
--- 1146,1153 ----
     systty.h systime.h dispextern.h syntax.h $(INTERVAL_SRC) blockinput.h \
     atimer.h xterm.h puresize.h msdos.h keymap.h w32term.h macterm.h 
$(config_h)
  keymap.o: keymap.c buffer.h commands.h keyboard.h termhooks.h blockinput.h \
!    atimer.h systime.h puresize.h charset.h intervals.h keymap.h window.h \
!    $(config_h)
  lastfile.o: lastfile.c  $(config_h)
  macros.o: macros.c window.h buffer.h commands.h macros.h keyboard.h \
        dispextern.h $(config_h)
Index: src/ChangeLog
===================================================================
RCS file: /sources/emacs/emacs/src/ChangeLog,v
retrieving revision 1.5297
diff -u -r1.5297 ChangeLog
*** src/ChangeLog       14 Sep 2006 09:37:29 -0000      1.5297
--- src/ChangeLog       14 Sep 2006 11:49:51 -0000
***************
*** 1,3 ****
--- 1,25 ----
+ 2006-09-14  David Kastrup  <address@hidden>
+ 
+       * Makefile.in (keymap.o): Add "keymap.h" and "window.h"
+       dependencies.
+ 
+       * keymap.c: include "window.h".
+       (Fcommand_remapping): New optional POSITION argument.
+       (Fkey_binding): New optional POSITION argument.  Completely rework
+       handling of mouse clicks to get the same order of keymaps as
+       `read-key-sequence' and heed POSITION.  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 buffer position, heed both.
+ 
+       * keymap.h: Declare additional optional arguments of
+       `Fcommand_remapping' and `Fkey_binding'.
+ 
  2006-09-14  Kim F. Storm  <address@hidden>
  
        * xdisp.c (produce_image_glyph): Automatically crop wide images at
Index: lispref/keymaps.texi
===================================================================
RCS file: /sources/emacs/emacs/lispref/keymaps.texi,v
retrieving revision 1.86
diff -u -r1.86 keymaps.texi
*** lispref/keymaps.texi        11 Sep 2006 14:34:16 -0000      1.86
--- lispref/keymaps.texi        14 Sep 2006 11:49:54 -0000
***************
*** 583,594 ****
          (@var{find-in} overriding-terminal-local-map)
        (if overriding-local-map
            (@var{find-in} overriding-local-map)
!         (or (@var{find-in} (get-text-property (point) 'keymap))
              (@var{find-in-any} emulation-mode-map-alists)
              (@var{find-in-any} minor-mode-overriding-map-alist)
              (@var{find-in-any} minor-mode-map-alist)
!             (if (get-text-property (point) 'local-map)
!                 (@var{find-in} (get-text-property (point) 'local-map))
                (@var{find-in} (current-local-map))))))
      (@var{find-in} (current-global-map)))
  @end lisp
--- 583,594 ----
          (@var{find-in} overriding-terminal-local-map)
        (if overriding-local-map
            (@var{find-in} overriding-local-map)
!         (or (@var{find-in} (get-char-property (point) 'keymap))
              (@var{find-in-any} emulation-mode-map-alists)
              (@var{find-in-any} minor-mode-overriding-map-alist)
              (@var{find-in-any} minor-mode-map-alist)
!             (if (get-char-property (point) 'local-map)
!                 (@var{find-in} (get-char-property (point) 'local-map))
                (@var{find-in} (current-local-map))))))
      (@var{find-in} (current-global-map)))
  @end lisp
***************
*** 599,604 ****
--- 599,614 ----
  appropriate keymaps from an alist.  (Searching a single keymap for a
  binding is called @dfn{key lookup}; see @ref{Key Lookup}.)
  
+ This process is somewhat modified for mouse events: the local modes and
+ keymaps of the buffer corresponding to the mouse click position are
+ searched instead, text properties are taken from the mouse click
+ position in the buffer rather than point, and if the click happens on a
+ string embedded with a @code{display}, @code{before-string}, or
+ @code{after-string} text property (@pxref{Special Properties}) or
+ overlay property (@pxref{Overlay Properties}), any address@hidden maps
+ specified with text properties of this string are searched instead of
+ those of the buffer.
+ 
    The @dfn{global keymap} holds the bindings of keys that are defined
  regardless of the current buffer, such as @kbd{C-f}.  The variable
  @code{global-map} holds this keymap, which is always active.
***************
*** 655,679 ****
  address@hidden then it pays attention to them.
  @end defun
  
! @defun key-binding key &optional accept-defaults no-remap
! This function returns the binding for @var{key} according to the
! current active keymaps.  The result is @code{nil} if @var{key} is
! undefined in the keymaps.
  
  @c Emacs 19 feature
  The argument @var{accept-defaults} controls checking for default
  bindings, as in @code{lookup-key} (above).
  
- When @var{key} is a vector containing an input event, such as a mouse
- click, @code{key-binding} first looks for the binding in the keymaps
- that would be active at the position where the click was done.
- 
  When commands are remapped (@pxref{Remapping Commands}),
  @code{key-binding} normally processes command remappings so as to
  returns the remapped command that will actually be executed.  However,
  if @var{no-remap} is address@hidden, @code{key-binding} ignores
  remappings and returns the binding directly specified for @var{key}.
  
  An error is signaled if @var{key} is not a string or a vector.
  
  @example
--- 665,691 ----
  address@hidden then it pays attention to them.
  @end defun
  
! @defun key-binding key &optional accept-defaults no-remap position
! This function returns the binding for @var{key} according to the current
! active keymaps.  The result is @code{nil} if @var{key} is undefined in
! the keymaps.  If @var{key} is a key sequence started with the mouse, the
! consulted maps will be changed accordingly.
  
  @c Emacs 19 feature
  The argument @var{accept-defaults} controls checking for default
  bindings, as in @code{lookup-key} (above).
  
  When commands are remapped (@pxref{Remapping Commands}),
  @code{key-binding} normally processes command remappings so as to
  returns the remapped command that will actually be executed.  However,
  if @var{no-remap} is address@hidden, @code{key-binding} ignores
  remappings and returns the binding directly specified for @var{key}.
  
+ If @var{position} is address@hidden, it specifies either a buffer
+ position or a position like those returned from @code{event-start}.  In
+ this case, @var{position} instead of @var{key} determines the
+ click-specific maps.
+ 
  An error is signaled if @var{key} is not a string or a vector.
  
  @example
***************
*** 696,714 ****
          (@var{find-in} overriding-terminal-local-map)
        (if overriding-local-map
            (@var{find-in} overriding-local-map)
!         (or (@var{find-in} (get-text-property (point) 'keymap))
              (@var{find-in-any} emulation-mode-map-alists)
              (@var{find-in-any} minor-mode-overriding-map-alist)
              (@var{find-in-any} minor-mode-map-alist)
              (if (get-text-property (point) 'local-map)
!                 (@var{find-in} (get-text-property (point) 'local-map))
                (@var{find-in} (current-local-map))))))
      (@var{find-in} (current-global-map)))
  @end lisp
  
  @noindent
! The @var{find-in} and @var{find-in-any} are pseudo functions that
! search in one keymap and in an alist of keymaps, respectively.
  
  @enumerate
  @item
--- 708,730 ----
          (@var{find-in} overriding-terminal-local-map)
        (if overriding-local-map
            (@var{find-in} overriding-local-map)
!         (or (@var{find-in} (get-char-property (point) 'keymap))
              (@var{find-in-any} emulation-mode-map-alists)
              (@var{find-in-any} minor-mode-overriding-map-alist)
              (@var{find-in-any} minor-mode-map-alist)
              (if (get-text-property (point) 'local-map)
!                 (@var{find-in} (get-char-property (point) 'local-map))
                (@var{find-in} (current-local-map))))))
      (@var{find-in} (current-global-map)))
  @end lisp
  
  @noindent
! The @var{find-in} and @var{find-in-any} are pseudo functions that search
! in one keymap and in an alist of keymaps, respectively.  Mouse events
! will consult the maps and positions of the buffer where the event
! started, and will also consult text properties of a string displayed via
! display or overlay properties instead of those of the buffer when the
! former are address@hidden
  
  @enumerate
  @item
***************
*** 1470,1480 ****
  if an ordinary binding specifies @code{my-kill-line}, this keymap will
  remap it to @code{my-other-kill-line}.
  
! @defun command-remapping command
! This function returns the remapping for @var{command} (a symbol),
! given the current active keymaps.  If @var{command} is not remapped
! (which is the usual situation), or not a symbol, the function returns
! @code{nil}.
  @end defun
  
  @node Translation Keymaps
--- 1486,1498 ----
  if an ordinary binding specifies @code{my-kill-line}, this keymap will
  remap it to @code{my-other-kill-line}.
  
! @defun command-remapping command &optional position
! This function returns the remapping for @var{command} (a symbol), given
! the current active keymaps.  If @var{command} is not remapped (which is
! the usual situation), or not a symbol, the function returns @code{nil}.
! @code{position} can optionally specify a buffer position or a position
! like those returned from @code{event-start}: in that case, the active
! maps are changed like they are in @code{key-binding}.
  @end defun
  
  @node Translation Keymaps
Index: lispref/ChangeLog
===================================================================
RCS file: /sources/emacs/emacs/lispref/ChangeLog,v
retrieving revision 1.750
diff -u -r1.750 ChangeLog
*** lispref/ChangeLog   12 Sep 2006 01:43:17 -0000      1.750
--- lispref/ChangeLog   14 Sep 2006 11:50:00 -0000
***************
*** 1,3 ****
--- 1,12 ----
+ 2006-09-14  David Kastrup  <address@hidden>
+ 
+       * keymaps.texi (Active Keymaps): Adapt description to use
+       `get-char-property' instead `get-text-property'.  Explain how
+       mouse events change this.  Explain the new optional argument of
+       `key-binding' and its mouse-dependent lookup.
+       (Searching Keymaps): Adapt description similarly.  Explain the new
+       optional argument of `command-remapping'.
+ 
  2006-09-11  Richard Stallman  <address@hidden>
  
        * display.texi (Display Table Format): Wording clarification.
***************
*** 4859,4865 ****
        (info): Add target.
        (installall): Target removed.
  
! 2001-10-31  Pavel Jan,Bm(Bk  <address@hidden>
  
        * tips.texi (Coding Conventions): Fix typo.
  
--- 4868,4874 ----
        (info): Add target.
        (installall): Target removed.
  
! 2001-10-31  Pavel Jan,Am(Bk  <address@hidden>
  
        * tips.texi (Coding Conventions): Fix typo.
  
Index: etc/NEWS
===================================================================
RCS file: /sources/emacs/emacs/etc/NEWS,v
retrieving revision 1.1394
diff -u -r1.1394 NEWS
*** etc/NEWS    12 Sep 2006 16:43:23 -0000      1.1394
--- etc/NEWS    14 Sep 2006 11:50:07 -0000
***************
*** 4666,4671 ****
--- 4666,4677 ----
  text properties, according to their stickiness.  This also means that it
  works with empty overlays.  The same hold for the `local-map' property.
  
+ *** `key-binding' will now look up mouse-specific bindings.  The
+ keymaps consulted by `key-binding' will get adapted if the key
+ sequence is started with a mouse event.  Instead of letting the click
+ position be determined from the key sequence itself, it is also
+ possible to specify it with an optional argument explicitly.
+ 
  *** Dense keymaps now handle inheritance correctly.
  
  Previously a dense keymap would hide all of the simple-char key
Index: etc/ChangeLog
===================================================================
RCS file: /sources/emacs/emacs/etc/ChangeLog,v
retrieving revision 1.452
diff -u -r1.452 ChangeLog
*** etc/ChangeLog       12 Sep 2006 16:43:23 -0000      1.452
--- etc/ChangeLog       14 Sep 2006 11:50:09 -0000
***************
*** 1,3 ****
--- 1,8 ----
+ 2006-09-14  David Kastrup  <address@hidden>
+ 
+       * NEWS: explain new behavior and arguments of `key-binding' and
+       `command-remapping'.
+ 
  2006-09-11  Paul Eggert  <address@hidden>
  
        * NEWS: In terminal-oriented subshells, the EMACS environment
***************
*** 102,108 ****
  
        * PROBLEMS: Emacs now requires ws2_32.dll on Windows.
  
! 2006-07-14  K,Aa(Broly L,Bu(Brentey  <address@hidden>
  
        * HELLO: Update Hungarian sample.
  
--- 107,113 ----
  
        * PROBLEMS: Emacs now requires ws2_32.dll on Windows.
  
! 2006-07-14  K,Aa(Broly L$,1 q(Brentey  <address@hidden>
  
        * HELLO: Update Hungarian sample.
  

-- 
David Kastrup, Kriemhildstr. 15, 44793 Bochum

reply via email to

[Prev in Thread] Current Thread [Next in Thread]