From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: David Kastrup Newsgroups: gmane.emacs.devel Subject: Re: local keymap patch for key-binding Date: Thu, 14 Sep 2006 13:57:21 +0200 Message-ID: <85r6yeek4e.fsf@lola.goethe.zz> References: <87slj1hybl.fsf@stupidchicken.com> <85pse5cbqw.fsf@lola.goethe.zz> <87zmd7yjq4.fsf@furball.mit.edu> <85pse3n99c.fsf@lola.goethe.zz> <87r6yjxh7k.fsf@furball.mit.edu> <85venuc27c.fsf@lola.goethe.zz> <85r6yiivi7.fsf@lola.goethe.zz> <85hczdbdv2.fsf@lola.goethe.zz> <85mz959kkw.fsf@lola.goethe.zz> <854pvbiyax.fsf@lola.goethe.zz> NNTP-Posting-Host: main.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Trace: sea.gmane.org 1158235101 4303 80.91.229.2 (14 Sep 2006 11:58:21 GMT) X-Complaints-To: usenet@sea.gmane.org NNTP-Posting-Date: Thu, 14 Sep 2006 11:58:21 +0000 (UTC) Cc: cyd@stupidchicken.com, storm@cua.dk, emacs-devel@gnu.org Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Thu Sep 14 13:58:14 2006 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([199.232.76.165]) by ciao.gmane.org with esmtp (Exim 4.43) id 1GNpqr-000501-UL for ged-emacs-devel@m.gmane.org; Thu, 14 Sep 2006 13:57:56 +0200 Original-Received: from localhost ([127.0.0.1] helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1GNpqq-00073n-D1 for ged-emacs-devel@m.gmane.org; Thu, 14 Sep 2006 07:57:52 -0400 Original-Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1GNpqb-00073P-4X for emacs-devel@gnu.org; Thu, 14 Sep 2006 07:57:37 -0400 Original-Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1GNpqZ-00073A-0q for emacs-devel@gnu.org; Thu, 14 Sep 2006 07:57:35 -0400 Original-Received: from [199.232.76.173] (helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1GNpqY-000737-Ob for emacs-devel@gnu.org; Thu, 14 Sep 2006 07:57:34 -0400 Original-Received: from [199.232.76.164] (helo=fencepost.gnu.org) by monty-python.gnu.org with esmtp (Exim 4.52) id 1GNpsU-0008S3-J4 for emacs-devel@gnu.org; Thu, 14 Sep 2006 07:59:34 -0400 Original-Received: from localhost ([127.0.0.1] helo=lola.goethe.zz) by fencepost.gnu.org with esmtp (Exim 4.34) id 1GNpqP-000672-9H; Thu, 14 Sep 2006 07:57:26 -0400 Original-Received: by lola.goethe.zz (Postfix, from userid 1002) id 1A8C81C40B5C; Thu, 14 Sep 2006 13:57:21 +0200 (CEST) Original-To: rms@gnu.org In-Reply-To: (Richard Stallman's message of "Wed\, 13 Sep 2006 22\:34\:50 -0400") User-Agent: Gnus/5.11 (Gnus v5.11) Emacs/22.0.50 (gnu/linux) X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.devel:59832 Archived-At: --=-=-= Richard Stallman 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. --=-=-= Content-Type: text/x-patch Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Index: src/keymap.h =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D 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 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D 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" =20 /* The number of elements in keymap vectors. */ #define DENSE_TABLE_SIZE (0200) *************** *** 1216,1232 **** =20 /* This function may GC (it calls Fkey_binding). */ =20 ! DEFUN ("command-remapping", Fcommand_remapping, Scommand_remapping, 1, = 1, 0, doc: /* Return the remapping for command COMMAND in current keym= aps. ! Returns nil if COMMAND is not remapped (or not a symbol). */) ! (command) ! Lisp_Object command; { if (!SYMBOLP (command)) return Qnil; =20 ASET (command_remapping_vector, 1, command); ! return Fkey_binding (command_remapping_vector, Qnil, Qt); } =20 /* Value is number if KEY is too long; nil if valid but has no definiti= on. */ --- 1217,1239 ---- =20 /* This function may GC (it calls Fkey_binding). */ =20 ! DEFUN ("command-remapping", Fcommand_remapping, Scommand_remapping, 1, = 2, 0, doc: /* Return the remapping for command COMMAND in current keym= aps. ! Returns nil if COMMAND is not remapped (or not a symbol). !=20 ! 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; =20 ASET (command_remapping_vector, 1, command); ! return Fkey_binding (command_remapping_vector, Qnil, Qt, position); } =20 /* Value is number if KEY is too long; nil if valid but has no definiti= on. */ *************** *** 1552,1558 **** =20 /* GC is possible in this function if it autoloads a keymap. */ =20 ! 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 ---- =20 /* GC is possible in this function if it autoloads a keymap. */ =20 ! 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; =20 ! GCPRO1 (key); =20 ! #ifdef HAVE_MOUSE ! if (VECTORP (key) && ASIZE (key) > 0) { ! Lisp_Object ev, pos; ! if ((ev =3D AREF (key, 0), CONSP (ev)) ! && SYMBOLP (XCAR (ev)) ! && CONSP (XCDR (ev)) ! && (pos =3D XCAR (XCDR (ev)), CONSP (pos)) ! && XINT (Flength (pos)) =3D=3D 10 ! && INTEGERP (XCAR (XCDR (pos)))) ! { ! Lisp_Object map, object; =20 ! object =3D Fnth (make_number(4), pos); =20 ! if (CONSP (object)) ! map =3D Fget_char_property (XCDR (object), Qkeymap, XCAR (object))= ; ! else ! map =3D Fget_char_property (XCAR (XCDR (pos)), Qkeymap, ! Fwindow_buffer (XCAR (pos))); =20 ! if (!NILP (Fkeymapp (map))) ! { ! value =3D Flookup_key (map, key, accept_default); ! if (! NILP (value) && !INTEGERP (value)) ! goto done; ! } ! } } - #endif /* HAVE_MOUSE */ =20 ! if (!NILP (current_kboard->Voverriding_terminal_local_map)) { value =3D 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 =3D 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. !=20 ! 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. !=20 ! 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 =3D SPECPDL_INDEX (); =20 ! GCPRO2 (key, position); =20 ! 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 =3D AREF (key, 1); ! else ! event =3D AREF (key, 0); =20 ! /* We are not interested in locations without event data */ =20 ! if (EVENT_HAS_PARAMETERS (event)) { ! Lisp_Object kind; =20 ! kind =3D EVENT_HEAD_KIND (EVENT_HEAD (event)); ! if (EQ (kind, Qmouse_click)) ! position =3D EVENT_START (event); ! } } =20 ! /* 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. */ ! =20 ! if (CONSP (position)) ! { ! Lisp_Object window; ! =20 ! window =3D POSN_WINDOW (position); ! =20 ! if (WINDOWP (window) ! && BUFFERP (XWINDOW (window)->buffer) ! && XBUFFER (XWINDOW (window)->buffer) !=3D 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. ! */ ! =20 ! record_unwind_protect (Fset_buffer, Fcurrent_buffer ()); ! =20 ! set_buffer_internal (XBUFFER (XWINDOW (window)->buffer)); ! } ! } ! =20 ! if (! NILP (current_kboard->Voverriding_terminal_local_map)) { value =3D 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 =3D Flookup_key (Voverriding_local_map, key, accept_default= ); if (! NILP (value) && !INTEGERP (value)) *************** *** 1622,1633 **** } else { ! Lisp_Object local; =20 ! local =3D get_local_map (PT, current_buffer, Qkeymap); ! if (! NILP (local)) { ! value =3D Flookup_key (local, key, accept_default); if (! NILP (value) && !INTEGERP (value)) goto done; } --- 1660,1731 ---- } else { ! Lisp_Object keymap, local_map; ! EMACS_INT pt; =20 ! pt =3D INTEGERP (position) ? XINT (position) ! : MARKERP (position) ? marker_position (position) ! : PT; !=20 ! local_map =3D get_local_map (pt, current_buffer, Qlocal_map);=20 ! keymap =3D get_local_map (pt, current_buffer, Qkeymap);=20 !=20 ! if (CONSP (position)) ! { ! Lisp_Object string, window; !=20 ! window =3D POSN_WINDOW (position); !=20 ! /* For a mouse click, get the local text-property keymap ! of the place clicked on, rather than point. */ ! =20 ! if (POSN_INBUFFER_P (position)) ! { ! Lisp_Object pos; !=20 ! pos =3D POSN_BUFFER_POSN (position); ! if (INTEGERP (pos) ! && XINT (pos) >=3D BEG && XINT (pos) <=3D Z) ! { ! local_map =3D get_local_map (XINT (pos), ! current_buffer, Qlocal_map); ! =20 ! keymap =3D get_local_map (XINT (pos), ! current_buffer, Qkeymap); ! } ! } !=20 ! /* 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. */ ! =20 ! if (string =3D POSN_STRING (position), ! (CONSP (string) && STRINGP (XCAR (string)))) ! { ! Lisp_Object pos, map; ! =20 ! pos =3D XCDR (string); ! string =3D XCAR (string); ! if (XINT (pos) >=3D 0 ! && XINT (pos) < SCHARS (string)) ! { ! map =3D Fget_text_property (pos, Qlocal_map, string); ! if (!NILP (map)) ! local_map =3D map; !=20 ! map =3D Fget_text_property (pos, Qkeymap, string); ! if (!NILP (map)) ! keymap =3D map; ! } ! } ! =20 ! } !=20 ! if (! NILP (keymap)) { ! value =3D Flookup_key (keymap, key, accept_default); if (! NILP (value) && !INTEGERP (value)) goto done; } *************** *** 1644,1653 **** goto done; } =20 ! local =3D get_local_map (PT, current_buffer, Qlocal_map); ! if (! NILP (local)) { ! value =3D Flookup_key (local, key, accept_default); if (! NILP (value) && !INTEGERP (value)) goto done; } --- 1742,1750 ---- goto done; } =20 ! if (! NILP (local_map)) { ! value =3D Flookup_key (local_map, key, accept_default); if (! NILP (value) && !INTEGERP (value)) goto done; } *************** *** 1656,1661 **** --- 1753,1760 ---- value =3D Flookup_key (current_global_map, key, accept_default); =20 done: + unbind_to (count, Qnil); +=20 UNGCPRO; if (NILP (value) || INTEGERP (value)) return Qnil; *************** *** 1666,1672 **** if (NILP (no_remap) && SYMBOLP (value)) { Lisp_Object value1; ! if (value1 =3D Fcommand_remapping (value), !NILP (value1)) value =3D value1; } =20 --- 1765,1771 ---- if (NILP (no_remap) && SYMBOLP (value)) { Lisp_Object value1; ! if (value1 =3D Fcommand_remapping (value, position), !NILP (value= 1)) value =3D value1; } =20 *************** *** 2467,2473 **** if (NILP (no_remap) && SYMBOLP (definition)) { Lisp_Object tem; ! if (tem =3D Fcommand_remapping (definition), !NILP (tem)) return Qnil; } =20 --- 2566,2572 ---- if (NILP (no_remap) && SYMBOLP (definition)) { Lisp_Object tem; ! if (tem =3D Fcommand_remapping (definition, Qnil), !NILP (tem)) return Qnil; } =20 Index: src/keyboard.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D 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 =3D Fcommand_remapping (cmd), !NILP (cmd1)) cmd =3D cmd1; } =20 --- 1674,1680 ---- if (SYMBOLP (cmd)) { Lisp_Object cmd1; ! if (cmd1 =3D Fcommand_remapping (cmd, Qnil), !NILP (cmd1)) cmd =3D cmd1; } =20 *************** *** 7517,7523 **** Lisp_Object prefix; =20 if (!NILP (tem)) ! tem =3D Fkey_binding (tem, Qnil, Qnil); =20 prefix =3D AREF (item_properties, ITEM_PROPERTY_KEYEQ); if (CONSP (prefix)) --- 7517,7523 ---- Lisp_Object prefix; =20 if (!NILP (tem)) ! tem =3D Fkey_binding (tem, Qnil, Qnil, Qnil); =20 prefix =3D AREF (item_properties, ITEM_PROPERTY_KEYEQ); if (CONSP (prefix)) *************** *** 9134,9149 **** if (!EQ (map_here, orig_local_map)) { orig_local_map =3D map_here; ! keybuf[t] =3D key; ! mock_input =3D t + 1; !=20 ! goto replay_sequence; } map_here =3D get_local_map (XINT (pos), current_buffer, Qkeymap); if (!EQ (map_here, orig_keymap)) { orig_keymap =3D map_here; keybuf[t] =3D key; mock_input =3D t + 1; =20 --- 9134,9152 ---- if (!EQ (map_here, orig_local_map)) { orig_local_map =3D map_here; ! ++localized_local_map; } +=20 map_here =3D get_local_map (XINT (pos), current_buffer, Qkeymap); if (!EQ (map_here, orig_keymap)) { orig_keymap =3D map_here; + ++localized_local_map; + } +=20 + if (localized_local_map > 1) + { keybuf[t] =3D key; mock_input =3D t + 1; =20 Index: src/Makefile.in =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D 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 $(c= onfig_h) keymap.o: keymap.c buffer.h commands.h keyboard.h termhooks.h blockinpu= t.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 $(c= onfig_h) keymap.o: keymap.c buffer.h commands.h keyboard.h termhooks.h blockinpu= t.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 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D 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 +=20 + * Makefile.in (keymap.o): Add "keymap.h" and "window.h" + dependencies. +=20 + * 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. +=20 + * 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. +=20 + * keymap.h: Declare additional optional arguments of + `Fcommand_remapping' and `Fkey_binding'. +=20 2006-09-14 Kim F. Storm =20 * xdisp.c (produce_image_glyph): Automatically crop wide images at Index: lispref/keymaps.texi =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D 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}.) =20 + 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 non-@code{nil} maps + specified with text properties of this string are searched instead of + those of the buffer. +=20 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 **** non-@code{nil} then it pays attention to them. @end defun =20 ! @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. =20 @c Emacs 19 feature The argument @var{accept-defaults} controls checking for default bindings, as in @code{lookup-key} (above). =20 - 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. -=20 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 non-@code{nil}, @code{key-binding} ignores remappings and returns the binding directly specified for @var{key}. =20 An error is signaled if @var{key} is not a string or a vector. =20 @example --- 665,691 ---- non-@code{nil} then it pays attention to them. @end defun =20 ! @defun key-binding key &optional accept-defaults no-remap position ! This function returns the binding for @var{key} according to the curren= t ! 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, th= e ! consulted maps will be changed accordingly. =20 @c Emacs 19 feature The argument @var{accept-defaults} controls checking for default bindings, as in @code{lookup-key} (above). =20 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 non-@code{nil}, @code{key-binding} ignores remappings and returns the binding directly specified for @var{key}. =20 + If @var{position} is non-@code{nil}, 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. +=20 An error is signaled if @var{key} is not a string or a vector. =20 @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 =20 @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. =20 @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 =20 @noindent ! The @var{find-in} and @var{find-in-any} are pseudo functions that searc= h ! 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 vi= a ! display or overlay properties instead of those of the buffer when the ! former are non-@code{nil}. =20 @enumerate @item *************** *** 1470,1480 **** if an ordinary binding specifies @code{my-kill-line}, this keymap will remap it to @code{my-other-kill-line}. =20 ! @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 =20 @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}. =20 ! @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 =20 @node Translation Keymaps Index: lispref/ChangeLog =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D 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 +=20 + * 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'. +=20 2006-09-11 Richard Stallman =20 * display.texi (Display Table Format): Wording clarification. *************** *** 4859,4865 **** (info): Add target. (installall): Target removed. =20 ! 2001-10-31 Pavel Jan=1B,Bm=1B(Bk =20 * tips.texi (Coding Conventions): Fix typo. =20 --- 4868,4874 ---- (info): Add target. (installall): Target removed. =20 ! 2001-10-31 Pavel Jan=1B,Am=1B(Bk =20 * tips.texi (Coding Conventions): Fix typo. =20 Index: etc/NEWS =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D 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 i= t works with empty overlays. The same hold for the `local-map' property. =20 + *** `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. +=20 *** Dense keymaps now handle inheritance correctly. =20 Previously a dense keymap would hide all of the simple-char key Index: etc/ChangeLog =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D 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 +=20 + * NEWS: explain new behavior and arguments of `key-binding' and + `command-remapping'. +=20 2006-09-11 Paul Eggert =20 * NEWS: In terminal-oriented subshells, the EMACS environment *************** *** 102,108 **** =20 * PROBLEMS: Emacs now requires ws2_32.dll on Windows. =20 ! 2006-07-14 K=1B,Aa=1B(Broly L=1B,Bu=1B(Brentey =20 * HELLO: Update Hungarian sample. =20 --- 107,113 ---- =20 * PROBLEMS: Emacs now requires ws2_32.dll on Windows. =20 ! 2006-07-14 K=1B,Aa=1B(Broly L=1B$,1 q=1B(Brentey =20 * HELLO: Update Hungarian sample. =20 --=-=-= -- David Kastrup, Kriemhildstr. 15, 44793 Bochum --=-=-= Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ Emacs-devel mailing list Emacs-devel@gnu.org http://lists.gnu.org/mailman/listinfo/emacs-devel --=-=-=--