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: Sat, 16 Sep 2006 01:47:58 +0200 Message-ID: <853bas3d5d.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> <85r6yeek4e.fsf@lola.goethe.zz> NNTP-Posting-Host: main.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Trace: sea.gmane.org 1158364156 6245 80.91.229.2 (15 Sep 2006 23:49:16 GMT) X-Complaints-To: usenet@sea.gmane.org NNTP-Posting-Date: Fri, 15 Sep 2006 23:49:16 +0000 (UTC) Cc: cyd@stupidchicken.com, emacs-devel@gnu.org, storm@cua.dk Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Sat Sep 16 01:49:15 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 1GONQk-0003GC-3Y for ged-emacs-devel@m.gmane.org; Sat, 16 Sep 2006 01:49:10 +0200 Original-Received: from localhost ([127.0.0.1] helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1GONQj-0004cf-Hy for ged-emacs-devel@m.gmane.org; Fri, 15 Sep 2006 19:49:09 -0400 Original-Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1GONQX-0004ca-NE for emacs-devel@gnu.org; Fri, 15 Sep 2006 19:48:57 -0400 Original-Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1GONQV-0004c0-JQ for emacs-devel@gnu.org; Fri, 15 Sep 2006 19:48:57 -0400 Original-Received: from [199.232.76.173] (helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1GONQV-0004bx-EZ for emacs-devel@gnu.org; Fri, 15 Sep 2006 19:48:55 -0400 Original-Received: from [199.232.76.164] (helo=fencepost.gnu.org) by monty-python.gnu.org with esmtp (Exim 4.52) id 1GONSm-0004g5-8D for emacs-devel@gnu.org; Fri, 15 Sep 2006 19:51:16 -0400 Original-Received: from localhost ([127.0.0.1] helo=lola.goethe.zz) by fencepost.gnu.org with esmtp (Exim 4.34) id 1GONQN-00015J-0q; Fri, 15 Sep 2006 19:48:47 -0400 Original-Received: by lola.goethe.zz (Postfix, from userid 1002) id F2CFE1C40B5C; Sat, 16 Sep 2006 01:47:58 +0200 (CEST) Original-To: rms@gnu.org In-Reply-To: <85r6yeek4e.fsf@lola.goethe.zz> (David Kastrup's message of "Thu\, 14 Sep 2006 13\:57\:21 +0200") 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:59900 Archived-At: --=-=-= David Kastrup writes: > 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. Here is a patch that would achieve that. After scanning through keymap.c, I believe that this should be the last change required to provide APIs to the keymap access on overlays and display strings, thus making manual simulation of keymap search order for whatever purpose unnecessary. At a cursory glance through callers, I don't see code within Emacs itself which would really require this at the current point of time. I remember some stuff by now implemented with unread-command-events that went through hoops in order to repeat a key lookup with one keymap excluded. This kind of thing would be more reliably achieved by using `current-active-maps' with a position argument, removing the non-needed keymap from the list, and repeating the lookup. While I don't think we should change any of the existing callers right now, it might be a good idea to have this API available in future. The implementation is reasonably simple. I don't think a GCPRO is needed here, but I can't say that I know garbage collection inside out. If there is agreement to put this in in order to complete the accessor functions to mouse-dependent keymaps, I would add this to the manual and NEWS file, too. What do you think? --=-=-= Content-Type: text/x-patch Content-Disposition: attachment Index: src/keymap.h =================================================================== RCS file: /sources/emacs/emacs/src/keymap.h,v retrieving revision 1.15 diff -u -r1.15 keymap.h *** src/keymap.h 15 Sep 2006 07:19:14 -0000 1.15 --- src/keymap.h 15 Sep 2006 23:46:07 -0000 *************** *** 34,40 **** EXFUN (Fkey_description, 2); EXFUN (Fsingle_key_description, 2); EXFUN (Fwhere_is_internal, 5); ! EXFUN (Fcurrent_active_maps, 1); extern Lisp_Object access_keymap P_ ((Lisp_Object, Lisp_Object, int, int, int)); extern Lisp_Object get_keyelt P_ ((Lisp_Object, int)); extern Lisp_Object get_keymap P_ ((Lisp_Object, int, int)); --- 34,40 ---- EXFUN (Fkey_description, 2); EXFUN (Fsingle_key_description, 2); EXFUN (Fwhere_is_internal, 5); ! EXFUN (Fcurrent_active_maps, 2); extern Lisp_Object access_keymap P_ ((Lisp_Object, Lisp_Object, int, int, int)); extern Lisp_Object get_keyelt P_ ((Lisp_Object, int)); extern Lisp_Object get_keymap P_ ((Lisp_Object, int, int)); Index: src/keymap.c =================================================================== RCS file: /sources/emacs/emacs/src/keymap.c,v retrieving revision 1.334 diff -u -r1.334 keymap.c *** src/keymap.c 15 Sep 2006 07:19:14 -0000 1.334 --- src/keymap.c 15 Sep 2006 23:46:10 -0000 *************** *** 1510,1523 **** } DEFUN ("current-active-maps", Fcurrent_active_maps, Scurrent_active_maps, ! 0, 1, 0, doc: /* Return a list of the currently active keymaps. OLP if non-nil indicates that we should obey `overriding-local-map' and ! `overriding-terminal-local-map'. */) ! (olp) ! Lisp_Object olp; { ! Lisp_Object keymaps = Fcons (current_global_map, Qnil); if (!NILP (olp)) { --- 1510,1556 ---- } DEFUN ("current-active-maps", Fcurrent_active_maps, Scurrent_active_maps, ! 0, 2, 0, doc: /* Return a list of the currently active keymaps. OLP if non-nil indicates that we should obey `overriding-local-map' and ! `overriding-terminal-local-map'. POSITION can specify a click position ! like in the respective argument of `key-binding'. */) ! (olp, position) ! Lisp_Object olp, position; { ! int count = SPECPDL_INDEX (); ! ! Lisp_Object keymaps; ! ! /* If a mouse click position is given, our variables are based on ! 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)); ! } ! } ! ! keymaps = Fcons (current_global_map, Qnil); if (!NILP (olp)) { *************** *** 1531,1545 **** } if (NILP (XCDR (keymaps))) { - Lisp_Object local; Lisp_Object *maps; int nmaps, i; ! /* This usually returns the buffer's local map, ! but that can be overridden by a `local-map' property. */ ! local = get_local_map (PT, current_buffer, Qlocal_map); ! if (!NILP (local)) ! keymaps = Fcons (local, keymaps); /* Now put all the minor mode keymaps on the list. */ nmaps = current_minor_maps (0, &maps); --- 1564,1640 ---- } if (NILP (XCDR (keymaps))) { Lisp_Object *maps; int nmaps, i; ! Lisp_Object keymap, local_map; ! EMACS_INT pt; ! ! pt = INTEGERP (position) ? XINT (position) ! : MARKERP (position) ? marker_position (position) ! : PT; ! ! /* Get the buffer local maps, possibly overriden by text or ! overlay properties */ ! ! 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 (local_map)) ! keymaps = Fcons (local_map, keymaps); /* Now put all the minor mode keymaps on the list. */ nmaps = current_minor_maps (0, &maps); *************** *** 1548,1559 **** if (!NILP (maps[i])) keymaps = Fcons (maps[i], keymaps); ! /* This returns nil unless there is a `keymap' property. */ ! local = get_local_map (PT, current_buffer, Qkeymap); ! if (!NILP (local)) ! keymaps = Fcons (local, keymaps); } return keymaps; } --- 1643,1654 ---- if (!NILP (maps[i])) keymaps = Fcons (maps[i], keymaps); ! if (!NILP (keymap)) ! keymaps = Fcons (keymap, keymaps); } + unbind_to (count, Qnil); + return keymaps; } *************** *** 2805,2811 **** else if (!NILP (keymap)) keymaps = Fcons (keymap, Fcons (current_global_map, Qnil)); else ! keymaps = Fcurrent_active_maps (Qnil); /* Only use caching for the menubar (i.e. called with (def nil t nil). We don't really need to check `keymap'. */ --- 2900,2906 ---- else if (!NILP (keymap)) keymaps = Fcons (keymap, Fcons (current_global_map, Qnil)); else ! keymaps = Fcurrent_active_maps (Qnil, Qnil); /* Only use caching for the menubar (i.e. called with (def nil t nil). We don't really need to check `keymap'. */ Index: src/doc.c =================================================================== RCS file: /sources/emacs/emacs/src/doc.c,v retrieving revision 1.120 diff -u -r1.120 doc.c *** src/doc.c 18 Jul 2006 13:26:24 -0000 1.120 --- src/doc.c 15 Sep 2006 23:46:12 -0000 *************** *** 883,889 **** struct buffer *oldbuf; int start_idx; /* This is for computing the SHADOWS arg for describe_map_tree. */ ! Lisp_Object active_maps = Fcurrent_active_maps (Qnil); Lisp_Object earlier_maps; changed = 1; --- 883,889 ---- struct buffer *oldbuf; int start_idx; /* This is for computing the SHADOWS arg for describe_map_tree. */ ! Lisp_Object active_maps = Fcurrent_active_maps (Qnil, Qnil); Lisp_Object earlier_maps; changed = 1; Index: src/ChangeLog =================================================================== RCS file: /sources/emacs/emacs/src/ChangeLog,v retrieving revision 1.5302 diff -u -r1.5302 ChangeLog *** src/ChangeLog 15 Sep 2006 21:01:03 -0000 1.5302 --- src/ChangeLog 15 Sep 2006 23:46:40 -0000 *************** *** 1,3 **** --- 1,14 ---- + 2006-09-16 David Kastrup + + * keymap.c (Fcurrent_active_maps): Add `position' argument. + (Fwhere_is_internal): Adjust call to `current-active-maps' to + cater for additional parameter. + + * keymap.h: Adjust number of parameters to `current-active-maps'. + + * doc.c (Fsubstitute_command_keys): Adjust call of + `current-active-maps'. + 2006-09-15 Kim F. Storm * window.c (Fwindow_line_visibility): New defun for line-move-partial. --=-=-= -- 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 --=-=-=--