unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
* New input translation map
@ 2007-10-03 21:44 Stefan Monnier
  2007-10-08 18:03 ` Richard Stallman
  0 siblings, 1 reply; 3+ messages in thread
From: Stefan Monnier @ 2007-10-03 21:44 UTC (permalink / raw)
  To: emacs-devel


In some past discussion we reached an agreement that most of the
escape-sequence processing as well as the keyboard-coding-system processing
should not take place in function-key-map (because the processing should not
depend on whether the sequence is bound in the main keymaps) nor in
key-translation-map (because that's too late and prevents the decoded event
from passing through function-key-map and key-translation-map) but in some
earlier step instead.

So the patch below implements just that: a new input translation map, which
I called `input-decode-map' which takes place before function-key-map and
applies the translations regardless of whether the untranslated events
correspond to a binding in the global maps.

encoded-kb.el is changed to use that feature, and since encoded-kb was the
only one to use the new local-key-translation-map, I think it's a good
opportunity to remove the new local-key-translation-map that was introduced
in multi-tty specifically for encoded-kb.el (I'd also happily mark
key-translation-map as obsolete, but let's concentrate on the more serious
issue for now).

Any objection?


        Stefan


--- keyboard.h	29 aoû 2007 22:33:12 -0400	1.78
+++ keyboard.h	03 oct 2007 17:30:59 -0400	
@@ -127,13 +127,14 @@
     /* Cache for modify_event_symbol.  */
     Lisp_Object system_key_syms;
 
-    /* Keymap mapping ASCII function key sequences onto their
-       preferred forms.  Initialized by the terminal-specific lisp
-       files.  See the DEFVAR for more documentation.  */
+    /* Keymap mapping keys to alternative preferred forms.
+       See the DEFVAR for more documentation.  */
     Lisp_Object Vlocal_function_key_map;
     
-    /* Keymap of key translations that can override keymaps.  */
-    Lisp_Object Vlocal_key_translation_map;
+    /* Keymap mapping ASCII function key sequences onto their preferred
+       forms.  Initialized by the terminal-specific lisp files.  See the
+       DEFVAR for more documentation.  */
+    Lisp_Object Vinput_decode_map;
 
     /* Minibufferless frames on this display use this frame's minibuffer.  */
     Lisp_Object Vdefault_minibuffer_frame;
@@ -314,7 +315,7 @@
 /* Parent keymap of terminal-local function-key-map instances.  */
 extern Lisp_Object Vfunction_key_map;
 
-/* Parent keymap of terminal-local key-translation-map instances.  */
+/* Keymap of key translations that can override keymaps.  */
 extern Lisp_Object Vkey_translation_map;
 
 extern int parse_menu_item P_ ((Lisp_Object, int, int));

--- keyboard.c	27 sep 2007 14:23:39 -0400	1.916
+++ keyboard.c	03 oct 2007 17:39:06 -0400	
@@ -445,7 +445,7 @@
 /* Parent keymap of terminal-local function-key-map instances.  */
 Lisp_Object Vfunction_key_map;
 
-/* Parent keymap of terminal-local key-translation-map instances.  */
+/* Keymap of key translations that can override keymaps.  */
 Lisp_Object Vkey_translation_map;
 
 /* List of deferred actions to be performed at a later time.
@@ -9131,8 +9131,8 @@
      key's again in Vfunction_key_map.  */
   volatile keyremap fkey;
 
-  /* Likewise, for key_translation_map.  */
-  volatile keyremap keytran;
+  /* Likewise, for key_translation_map and input-decode-map.  */
+  volatile keyremap keytran, indec;
 
   /* If we receive a `switch-frame' or `select-window' event in the middle of
      a key sequence, we put it off for later.
@@ -9209,8 +9209,10 @@
 
   /* We may switch keyboards between rescans, so we need to
      reinitialize fkey and keytran before each replay.  */
+  indec.map = indec.parent = current_kboard->Vinput_decode_map;
   fkey.map = fkey.parent = current_kboard->Vlocal_function_key_map;
-  keytran.map = keytran.parent = current_kboard->Vlocal_key_translation_map;
+  keytran.map = keytran.parent = Vkey_translation_map;
+  indec.start = indec.end = 0;
   fkey.start = fkey.end = 0;
   keytran.start = keytran.end = 0;
 
@@ -9299,7 +9301,7 @@
 	    Thus, if ESC O a has a function-key-map translation
 	    and ESC o has a binding, don't return after ESC O,
 	    so that we can translate ESC O plus the next character.  */
-	 : (fkey.start < t || keytran.start < t))
+	 : (/* indec.start < t || fkey.start < t || */ keytran.start < t))
     {
       Lisp_Object key;
       int used_mouse_menu = 0;
@@ -9317,13 +9319,17 @@
 	 just one key.  */
       volatile int echo_local_start, keys_local_start, local_first_binding;
 
-      eassert (fkey.end == t || (fkey.end > t && fkey.end <= mock_input));
+      eassert (indec.end == t || (indec.end > t && indec.end <= mock_input));
+      eassert (indec.start <= indec.end);
       eassert (fkey.start <= fkey.end);
       eassert (keytran.start <= keytran.end);
-      /* key-translation-map is applied *after* function-key-map.  */
+      /* key-translation-map is applied *after* function-key-map
+	 which is itself applied *after* input-decode-map.  */
+      eassert (fkey.end <= indec.start);
       eassert (keytran.end <= fkey.start);
 
-      if (first_unbound < fkey.start && first_unbound < keytran.start)
+      if (/* first_unbound < indec.start && first_unbound < fkey.start && */
+	  first_unbound < keytran.start)
 	{ /* The prefix upto first_unbound has no binding and has
 	     no translation left to do either, so we know it's unbound.
 	     If we don't stop now, we risk staying here indefinitely
@@ -9333,6 +9339,8 @@
 	  for (i = first_unbound + 1; i < t; i++)
 	    keybuf[i - first_unbound - 1] = keybuf[i];
 	  mock_input = t - first_unbound - 1;
+	  indec.end = indec.start -= first_unbound + 1;
+	  indec.map = indec.parent;
 	  fkey.end = fkey.start -= first_unbound + 1;
 	  fkey.map = fkey.parent;
 	  keytran.end = keytran.start -= first_unbound + 1;
@@ -9758,15 +9766,15 @@
 	/* This is needed for the following scenario:
 	   event 0: a down-event that gets dropped by calling replay_key.
 	   event 1: some normal prefix like C-h.
-	   After event 0, first_unbound is 0, after event 1 fkey.start
-	   and keytran.start are both 1, so when we see that C-h is bound,
-	   we need to update first_unbound.  */
+	   After event 0, first_unbound is 0, after event 1 indec.start,
+	   fkey.start, and keytran.start are all 1, so when we see that
+	   C-h is bound, we need to update first_unbound.  */
 	first_unbound = max (t + 1, first_unbound);
       else
 	{
 	  Lisp_Object head;
 
-	  /* Remember the position to put an upper bound on fkey.start.  */
+	  /* Remember the position to put an upper bound on indec.start.  */
 	  first_unbound = min (t, first_unbound);
 
 	  head = EVENT_HEAD (key);
@@ -9851,11 +9859,16 @@
 			  /* If mock_input > t + 1, the above simplification
 			     will actually end up dropping keys on the floor.
 			     This is probably OK for now, but even
-			     if mock_input <= t + 1, we need to adjust fkey
-			     and keytran.
+			     if mock_input <= t + 1, we need to adjust indec,
+			     fkey, and keytran.
 			     Typical case [header-line down-mouse-N]:
 			     mock_input = 2, t = 1, fkey.end = 1,
 			     last_real_key_start = 0.  */
+			  if (indec.end > last_real_key_start)
+			    {
+			      indec.end = indec.start
+				= min (last_real_key_start, indec.start);
+			      indec.map = indec.parent;
 			  if (fkey.end > last_real_key_start)
 			    {
 			      fkey.end = fkey.start
@@ -9868,6 +9881,7 @@
 				  keytran.map = keytran.parent;
 				}
 			    }
+			    }
 			  if (t == last_real_key_start)
 			    {
 			      mock_input = 0;
@@ -9919,8 +9933,28 @@
       /* Record what part of this_command_keys is the current key sequence.  */
       this_single_command_key_start = this_command_key_count - t;
 
-      if (first_binding < nmaps && NILP (submaps[first_binding]))
+      /* Look for this sequence in input-decode-map.
+	 Scan from indec.end until we find a bound suffix.  */
+      while (indec.end < t)
+	{
+	  struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
+	  int done, diff;
+
+	  GCPRO4 (indec.map, fkey.map, keytran.map, delayed_switch_frame);
+	  done = keyremap_step (keybuf, bufsize, &indec, max (t, mock_input),
+				1, &diff, prompt);
+	  UNGCPRO;
+	  if (done)
+	    {
+	      mock_input = diff + max (t, mock_input);
+	      goto replay_sequence;
+	    }
+	}
+
+      if (first_binding < nmaps && NILP (submaps[first_binding])
+	  && indec.start >= t)
 	/* There is a binding and it's not a prefix.
+	   (and it doesn't have any input-decode-map translation pending).
 	   There is thus no function-key in this sequence.
 	   Moving fkey.start is important in this case to allow keytran.start
 	   to go over the sequence before we return (since we keep the
@@ -9933,12 +9967,12 @@
 	/* If the sequence is unbound, see if we can hang a function key
 	   off the end of it.  */
 	/* Continue scan from fkey.end until we find a bound suffix.  */
-	while (fkey.end < t)
+	while (fkey.end < indec.start)
 	  {
-	    struct gcpro gcpro1, gcpro2, gcpro3;
+	    struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
 	    int done, diff;
 
-	    GCPRO3 (fkey.map, keytran.map, delayed_switch_frame);
+	    GCPRO4 (indec.map, fkey.map, keytran.map, delayed_switch_frame);
 	    done = keyremap_step (keybuf, bufsize, &fkey,
 				  max (t, mock_input),
 				  /* If there's a binding (i.e.
@@ -9950,6 +9984,10 @@
 	    if (done)
 	      {
 		mock_input = diff + max (t, mock_input);
+		/* Adjust the input-decode-map counters.  */
+		indec.end += diff;
+		indec.start += diff;
+
 		goto replay_sequence;
 	      }
 	  }
@@ -9958,17 +9996,19 @@
 	 Scan from keytran.end until we find a bound suffix.  */
       while (keytran.end < fkey.start)
 	{
-	  struct gcpro gcpro1, gcpro2, gcpro3;
+	  struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
 	  int done, diff;
 
-	  GCPRO3 (fkey.map, keytran.map, delayed_switch_frame);
+	  GCPRO4 (indec.map, fkey.map, keytran.map, delayed_switch_frame);
 	  done = keyremap_step (keybuf, bufsize, &keytran, max (t, mock_input),
 				1, &diff, prompt);
 	  UNGCPRO;
 	  if (done)
 	    {
 	      mock_input = diff + max (t, mock_input);
-	      /* Adjust the function-key-map counters.  */
+	      /* Adjust the function-key-map and input-decode-map counters.  */
+	      indec.end += diff;
+	      indec.start += diff;
 	      fkey.end += diff;
 	      fkey.start += diff;
 
@@ -9981,7 +10021,7 @@
 	 and is an upper case letter
 	 use the corresponding lower-case letter instead.  */
       if (first_binding >= nmaps
-	  && fkey.start >= t && keytran.start >= t
+	  && /* indec.start >= t && fkey.start >= t && */ keytran.start >= t
 	  && INTEGERP (key)
 	  && ((((XINT (key) & 0x3ffff)
 		< XCHAR_TABLE (current_buffer->downcase_table)->size)
@@ -10012,7 +10052,7 @@
 	 and is a shifted function key,
 	 use the corresponding unshifted function key instead.  */
       if (first_binding >= nmaps
-	  && fkey.start >= t && keytran.start >= t
+	  && /* indec.start >= t && fkey.start >= t && */ keytran.start >= t
 	  && SYMBOLP (key))
 	{
 	  Lisp_Object breakdown;
@@ -10033,9 +10073,6 @@
 
 	      keybuf[t - 1] = new_key;
 	      mock_input = max (t, mock_input);
-	      fkey.start = fkey.end = 0;
-	      keytran.start = keytran.end = 0;
-
 	      goto replay_sequence;
 	    }
 	}
@@ -11460,10 +11497,9 @@
   kb->reference_count = 0;
   kb->Vsystem_key_alist = Qnil;
   kb->system_key_syms = Qnil;
+  kb->Vinput_decode_map = Fmake_sparse_keymap (Qnil);
   kb->Vlocal_function_key_map = Fmake_sparse_keymap (Qnil);
   Fset_keymap_parent (kb->Vlocal_function_key_map, Vfunction_key_map);
-  kb->Vlocal_key_translation_map = Fmake_sparse_keymap (Qnil);
-  Fset_keymap_parent (kb->Vlocal_key_translation_map, Vkey_translation_map);
   kb->Vdefault_minibuffer_frame = Qnil;
 }
 
@@ -12196,8 +12232,8 @@
 
   DEFVAR_KBOARD ("local-function-key-map", Vlocal_function_key_map,
                  doc: /* Keymap that translates key sequences to key sequences during input.
-This is used mainly for mapping ASCII function key sequences into
-real Emacs function key events (symbols).
+This is used mainly for mapping key sequences into some preferred
+key events (symbols).
 
 The `read-key-sequence' function replaces any subsequence bound by
 `local-function-key-map' with its binding.  More precisely, when the
@@ -12223,6 +12259,25 @@
 instead.  Initially, `local-function-key-map' is an empty keymap that
 has `function-key-map' as its parent on all terminal devices.  */);
 
+  DEFVAR_KBOARD ("input-decode-map", Vinput_decode_map,
+		 doc: /* Keymap that decodes input escape sequences.
+This is used mainly for mapping ASCII function key sequences into
+real Emacs function key events (symbols).
+
+The `read-key-sequence' function replaces any subsequence bound by
+`local-function-key-map' with its binding.  Contrary to `function-key-map',
+this map applies its rebinding regardless of the presence of an ordinary
+binding.  So it is more like `key-translation-map' except that it applies
+before `function-key-map' rather than after.
+
+If the binding is a function, it is called with one argument (the prompt)
+and its return value (a key sequence) is used.
+
+The events that come from bindings in `input-decode-map' are not
+themselves looked up in `input-decode-map'.
+
+This variable is keyboard-local.  */);
+
   DEFVAR_LISP ("function-key-map", &Vfunction_key_map,
                doc: /* The parent keymap of all `local-function-key-map' instances.
 Function key definitions that apply to all terminal devices should go
@@ -12231,18 +12286,11 @@
 definition will take precendence.  */);
   Vfunction_key_map = Fmake_sparse_keymap (Qnil);
                     
-  DEFVAR_KBOARD ("local-key-translation-map", Vlocal_key_translation_map,
+  DEFVAR_LISP ("key-translation-map", &Vkey_translation_map,
 	       doc: /* Keymap of key translations that can override keymaps.
 This keymap works like `function-key-map', but comes after that,
 and its non-prefix bindings override ordinary bindings.
-
-`key-translation-map' has a separate binding for each terminal device.
-(See Info node `(elisp)Multiple displays'.)  If you need to set a key
-translation on all terminals, change `global-key-translation-map' instead.  */);
-
-  DEFVAR_LISP ("key-translation-map", &Vkey_translation_map,
-               doc: /* The parent keymap of all `local-key-translation-map' instances.
-Key translations that apply to all terminal devices should go here.  */);
+Another difference is that it is global rather than keyboard-local.  */);
   Vkey_translation_map = Fmake_sparse_keymap (Qnil);
 
   DEFVAR_LISP ("deferred-action-list", &Vdeferred_action_list,
@@ -12420,8 +12468,8 @@
       mark_object (kb->Vlast_kbd_macro);
       mark_object (kb->Vsystem_key_alist);
       mark_object (kb->system_key_syms);
+      mark_object (kb->Vinput_decode_map);
       mark_object (kb->Vlocal_function_key_map);
-      mark_object (kb->Vlocal_key_translation_map);
       mark_object (kb->Vdefault_minibuffer_frame);
       mark_object (kb->echo_string);
     }

--- keymap.c	29 aoû 2007 22:33:12 -0400	1.361
+++ keymap.c	03 oct 2007 06:56:58 -0400	
@@ -3027,8 +3027,8 @@
       insert ("\n", 1);
     }
 
-  if (!NILP (current_kboard->Vlocal_key_translation_map))
-    describe_map_tree (current_kboard->Vlocal_key_translation_map, 0, Qnil, prefix,
+  if (!NILP (Vkey_translation_map))
+    describe_map_tree (Vkey_translation_map, 0, Qnil, prefix,
 		       "Key translations", nomenu, 1, 0, 0);
 
 
@@ -3121,6 +3121,11 @@
     describe_map_tree (current_kboard->Vlocal_function_key_map, 0, Qnil, prefix,
 		       "\f\nFunction key map translations", nomenu, 1, 0, 0);
 
+  /* Print the input-decode-map translations under this prefix.  */
+  if (!NILP (current_kboard->Vinput_decode_map))
+    describe_map_tree (current_kboard->Vinput_decode_map, 0, Qnil, prefix,
+		       "\f\nInput decoding map translations", nomenu, 1, 0, 0);
+
   UNGCPRO;
   return Qnil;
 }

--- term.c	29 sep 2007 16:37:53 -0400	1.207
+++ term.c	03 oct 2007 07:25:16 -0400	
@@ -1274,9 +1274,9 @@
 static KBOARD *term_get_fkeys_kboard;
 static Lisp_Object term_get_fkeys_1 ();
 
-/* Find the escape codes sent by the function keys for Vfunction_key_map.
+/* Find the escape codes sent by the function keys for Vinput_decode_map.
    This function scans the termcap function key sequence entries, and
-   adds entries to Vfunction_key_map for each function key it finds.  */
+   adds entries to Vinput_decode_map for each function key it finds.  */
 
 static void
 term_get_fkeys (address, kboard)
@@ -1306,14 +1306,14 @@
   KBOARD *kboard = term_get_fkeys_kboard;
   
   /* This can happen if CANNOT_DUMP or with strange options.  */
-  if (!initialized)
-    kboard->Vlocal_function_key_map = Fmake_sparse_keymap (Qnil);
+  if (!KEYMAPP (kboard->Vinput_decode_map))
+    kboard->Vinput_decode_map = Fmake_sparse_keymap (Qnil);
 
   for (i = 0; i < (sizeof (keys)/sizeof (keys[0])); i++)
     {
       char *sequence = tgetstr (keys[i].cap, address);
       if (sequence)
-	Fdefine_key (kboard->Vlocal_function_key_map, build_string (sequence),
+	Fdefine_key (kboard->Vinput_decode_map, build_string (sequence),
 		     Fmake_vector (make_number (1),
 				   intern (keys[i].name)));
     }
@@ -1333,13 +1333,13 @@
 	if (k0)
 	  /* Define f0 first, so that f10 takes precedence in case the
 	     key sequences happens to be the same.  */
-	  Fdefine_key (kboard->Vlocal_function_key_map, build_string (k0),
+	  Fdefine_key (kboard->Vinput_decode_map, build_string (k0),
 		       Fmake_vector (make_number (1), intern ("f0")));
-	Fdefine_key (kboard->Vlocal_function_key_map, build_string (k_semi),
+	Fdefine_key (kboard->Vinput_decode_map, build_string (k_semi),
 		     Fmake_vector (make_number (1), intern ("f10")));
       }
     else if (k0)
-      Fdefine_key (kboard->Vlocal_function_key_map, build_string (k0),
+      Fdefine_key (kboard->Vinput_decode_map, build_string (k0),
 		   Fmake_vector (make_number (1), intern (k0_name)));
   }
 
@@ -1362,7 +1362,7 @@
 	  if (sequence)
 	    {
 	      sprintf (fkey, "f%d", i);
-	      Fdefine_key (kboard->Vlocal_function_key_map, build_string (sequence),
+	      Fdefine_key (kboard->Vinput_decode_map, build_string (sequence),
 			   Fmake_vector (make_number (1),
 					 intern (fkey)));
 	    }
@@ -1379,7 +1379,7 @@
 	{								\
 	  char *sequence = tgetstr (cap2, address);			\
 	  if (sequence)                                                 \
-	    Fdefine_key (kboard->Vlocal_function_key_map, build_string (sequence), \
+	    Fdefine_key (kboard->Vinput_decode_map, build_string (sequence), \
 			 Fmake_vector (make_number (1),                 \
 				       intern (sym)));                  \
 	}

--- xterm.el	16 sep 2007 18:05:52 -0400	1.49
+++ xterm.el	03 oct 2007 17:10:35 -0400	
@@ -375,6 +375,72 @@
     map)
   "Function key map overrides for xterm.")
 
+(defvar xterm-alternatives-map
+  (let ((map (make-sparse-keymap)))
+    ;; The terminal initialization C code file might have initialized
+    ;; function keys F13->F60 from the termcap/terminfo information.
+    ;; On a PC-style keyboard these keys correspond to
+    ;; MODIFIER-FUNCTION_KEY, where modifier is S-, C, A-, C-S-.  The code
+    ;; here substitutes the corresponding definitions in function-key-map.
+    ;; The mapping from escape sequences to Fn is done in input-decode-map
+    ;; whereas this here mapping is done in local-function-key-map so that
+    ;; bindings to f45 still work, in case your keyboard really has an f45
+    ;; key rather than C-S-f9.
+    (define-key map [f13] [S-f1])
+    (define-key map [f14] [S-f2])
+    (define-key map [f15] [S-f3])
+    (define-key map [f16] [S-f4])
+    (define-key map [f17] [S-f5])
+    (define-key map [f18] [S-f6])
+    (define-key map [f19] [S-f7])
+    (define-key map [f20] [S-f8])
+    (define-key map [f21] [S-f9])
+    (define-key map [f22] [S-f10])
+    (define-key map [f23] [S-f11])
+    (define-key map [f24] [S-f12])
+
+    (define-key map [f25] [C-f1])
+    (define-key map [f26] [C-f2])
+    (define-key map [f27] [C-f3])
+    (define-key map [f28] [C-f4])
+    (define-key map [f29] [C-f5])
+    (define-key map [f30] [C-f6])
+    (define-key map [f31] [C-f7])
+    (define-key map [f32] [C-f8])
+    (define-key map [f33] [C-f9])
+    (define-key map [f34] [C-f10])
+    (define-key map [f35] [C-f11])
+    (define-key map [f36] [C-f12])
+
+    (define-key map [f37] [C-S-f1])
+    (define-key map [f38] [C-S-f2])
+    (define-key map [f39] [C-S-f3])
+    (define-key map [f40] [C-S-f4])
+    (define-key map [f41] [C-S-f5])
+    (define-key map [f42] [C-S-f6])
+    (define-key map [f43] [C-S-f7])
+    (define-key map [f44] [C-S-f8])
+    (define-key map [f45] [C-S-f9])
+    (define-key map [f46] [C-S-f10])
+    (define-key map [f47] [C-S-f11])
+    (define-key map [f48] [C-S-f12])
+
+    (define-key map [f49] [A-f1])
+    (define-key map [f50] [A-f2])
+    (define-key map [f51] [A-f3])
+    (define-key map [f52] [A-f4])
+    (define-key map [f53] [A-f5])
+    (define-key map [f54] [A-f6])
+    (define-key map [f55] [A-f7])
+    (define-key map [f56] [A-f8])
+    (define-key map [f57] [A-f9])
+    (define-key map [f58] [A-f10])
+    (define-key map [f59] [A-f11])
+    (define-key map [f60] [A-f12])
+
+    map)
+  "Keymap of possible alternative meanings for some keys.")
+
 ;; List of terminals for which modify-other-keys has been turned on.
 (defvar xterm-modify-other-keys-terminal-list nil)
 
@@ -387,72 +462,17 @@
 	   (string-match "\\`rxvt" (getenv "COLORTERM" (selected-frame))))
       (tty-run-terminal-initialization (selected-frame) "rxvt")
 
-    ;; The terminal initialization C code file might have initialized
-    ;; function keys F13->F60 from the termcap/terminfo information.
-    ;; On a PC-style keyboard these keys correspond to
-    ;; MODIFIER-FUNCTION_KEY, where modifier is S-, C, A-, C-S-.  The code
-    ;; here substitutes the corresponding definitions in function-key-map.
-    ;; This substitution is needed because if a key definition is found in
-    ;; function-key-map, there are no further lookups in other keymaps.
-    (substitute-key-definition [f13] [S-f1] local-function-key-map)
-    (substitute-key-definition [f14] [S-f2] local-function-key-map)
-    (substitute-key-definition [f15] [S-f3] local-function-key-map)
-    (substitute-key-definition [f16] [S-f4] local-function-key-map)
-    (substitute-key-definition [f17] [S-f5] local-function-key-map)
-    (substitute-key-definition [f18] [S-f6] local-function-key-map)
-    (substitute-key-definition [f19] [S-f7] local-function-key-map)
-    (substitute-key-definition [f20] [S-f8] local-function-key-map)
-    (substitute-key-definition [f21] [S-f9] local-function-key-map)
-    (substitute-key-definition [f22] [S-f10] local-function-key-map)
-    (substitute-key-definition [f23] [S-f11] local-function-key-map)
-    (substitute-key-definition [f24] [S-f12] local-function-key-map)
-
-    (substitute-key-definition [f25] [C-f1] local-function-key-map)
-    (substitute-key-definition [f26] [C-f2] local-function-key-map)
-    (substitute-key-definition [f27] [C-f3] local-function-key-map)
-    (substitute-key-definition [f28] [C-f4] local-function-key-map)
-    (substitute-key-definition [f29] [C-f5] local-function-key-map)
-    (substitute-key-definition [f30] [C-f6] local-function-key-map)
-    (substitute-key-definition [f31] [C-f7] local-function-key-map)
-    (substitute-key-definition [f32] [C-f8] local-function-key-map)
-    (substitute-key-definition [f33] [C-f9] local-function-key-map)
-    (substitute-key-definition [f34] [C-f10] local-function-key-map)
-    (substitute-key-definition [f35] [C-f11] local-function-key-map)
-    (substitute-key-definition [f36] [C-f12] local-function-key-map)
-
-    (substitute-key-definition [f37] [C-S-f1] local-function-key-map)
-    (substitute-key-definition [f38] [C-S-f2] local-function-key-map)
-    (substitute-key-definition [f39] [C-S-f3] local-function-key-map)
-    (substitute-key-definition [f40] [C-S-f4] local-function-key-map)
-    (substitute-key-definition [f41] [C-S-f5] local-function-key-map)
-    (substitute-key-definition [f42] [C-S-f6] local-function-key-map)
-    (substitute-key-definition [f43] [C-S-f7] local-function-key-map)
-    (substitute-key-definition [f44] [C-S-f8] local-function-key-map)
-    (substitute-key-definition [f45] [C-S-f9] local-function-key-map)
-    (substitute-key-definition [f46] [C-S-f10] local-function-key-map)
-    (substitute-key-definition [f47] [C-S-f11] local-function-key-map)
-    (substitute-key-definition [f48] [C-S-f12] local-function-key-map)
-
-    (substitute-key-definition [f49] [A-f1] local-function-key-map)
-    (substitute-key-definition [f50] [A-f2] local-function-key-map)
-    (substitute-key-definition [f51] [A-f3] local-function-key-map)
-    (substitute-key-definition [f52] [A-f4] local-function-key-map)
-    (substitute-key-definition [f53] [A-f5] local-function-key-map)
-    (substitute-key-definition [f54] [A-f6] local-function-key-map)
-    (substitute-key-definition [f55] [A-f7] local-function-key-map)
-    (substitute-key-definition [f56] [A-f8] local-function-key-map)
-    (substitute-key-definition [f57] [A-f9] local-function-key-map)
-    (substitute-key-definition [f58] [A-f10] local-function-key-map)
-    (substitute-key-definition [f59] [A-f11] local-function-key-map)
-    (substitute-key-definition [f60] [A-f12] local-function-key-map)
+    (let ((map (copy-keymap xterm-alternatives-map)))
+      (set-keymap-parent map (keymap-parent) local-function-key-map)
+      (set-keymap-parent local-function-key-map map))
 
     (let ((map (copy-keymap xterm-function-map)))
 
       ;; Use inheritance to let the main keymap override those defaults.
       ;; This way we don't override terminfo-derived settings or settings
       ;; made in the .emacs file.
-      (set-keymap-parent map (keymap-parent local-function-key-map))
-      (set-keymap-parent local-function-key-map map)))
+      (set-keymap-parent map (keymap-parent input-decode-map))
+      (set-keymap-parent input-decode map)))
 
     (xterm-register-default-colors)
     ;; This recomputes all the default faces given the colors we've just set up.

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2007-10-09  5:18 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-10-03 21:44 New input translation map Stefan Monnier
2007-10-08 18:03 ` Richard Stallman
2007-10-09  5:18   ` Stefan Monnier

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).