Mercurial > emacs
changeset 85106:fd282fb888de
Add new `input-decode-map' keymap and use it for temrinal
escape sequences.
* keyboard.h (struct kboard): Add Vinput_decode_map.
Remove Vlocal_key_translation_map.
* keyboard.c (read_key_sequence): Add support for input-decode-map.
(init_kboard): Init input-decode-map.
Replace local-key-translation-map back with key-translation-map.
(syms_of_keyboard): Declare input-decode-map.
Remove local-key-translation-map. Update docstrings.
(mark_kboards): Mark Vinput_decode_map.
Don't mark Vlocal_key_translation_map.
* keymap.c (Fdescribe_buffer_bindings): Describe input-decode-map.
Replace local-key-translation-map back with key-translation-map.
* term.c (term_get_fkeys_1, CONDITIONAL_REASSIGN):
Bind in input-decode-map rather than function-key-map.
author | Stefan Monnier <monnier@iro.umontreal.ca> |
---|---|
date | Tue, 09 Oct 2007 05:05:39 +0000 |
parents | ba4f1a829f83 |
children | 1d6428311f66 |
files | doc/emacs/custom.texi doc/lispref/keymaps.texi doc/lispref/maps.texi doc/lispref/os.texi doc/misc/viper.texi etc/NEWS src/ChangeLog src/keyboard.c src/keyboard.h src/keymap.c src/term.c |
diffstat | 11 files changed, 197 insertions(+), 116 deletions(-) [+] |
line wrap: on
line diff
--- a/doc/emacs/custom.texi Tue Oct 09 04:28:00 2007 +0000 +++ b/doc/emacs/custom.texi Tue Oct 09 05:05:39 2007 +0000 @@ -2419,7 +2419,8 @@ The usual purpose of the terminal-specific library is to map the escape sequences used by the terminal's function keys onto more -meaningful names, using @code{function-key-map}. See the file +meaningful names, using @code{input-decode-map} (or +@code{function-key-map} before it). See the file @file{term/lk201.el} for an example of how this is done. Many function keys are mapped automatically according to the information in the Termcap data base; the terminal-specific library needs to map only the
--- a/doc/lispref/keymaps.texi Tue Oct 09 04:28:00 2007 +0000 +++ b/doc/lispref/keymaps.texi Tue Oct 09 05:05:39 2007 +0000 @@ -1512,17 +1512,18 @@ This section describes keymaps that are used during reading a key sequence, to translate certain event sequences into others. @code{read-key-sequence} checks every subsequence of the key sequence -being read, as it is read, against @code{function-key-map} and then -against @code{key-translation-map}. - -@defvar function-key-map +being read, as it is read, against @code{input-decode-map}, then +@code{function-key-map}, and then against @code{key-translation-map}. + +@defvar input-decode-map + This variable holds a keymap that describes the character sequences sent by function keys on an ordinary character terminal. This keymap has the same structure as other keymaps, but is used differently: it specifies translations to make while reading key sequences, rather than bindings for key sequences. -If @code{function-key-map} ``binds'' a key sequence @var{k} to a vector +If @code{input-decode-map} ``binds'' a key sequence @var{k} to a vector @var{v}, then when @var{k} appears as a subsequence @emph{anywhere} in a key sequence, it is replaced with the events in @var{v}. @@ -1530,50 +1531,49 @@ keypad @key{PF1} key is pressed. Therefore, we want Emacs to translate that sequence of events into the single event @code{pf1}. We accomplish this by ``binding'' @kbd{@key{ESC} O P} to @code{[pf1]} in -@code{function-key-map}, when using a VT100. +@code{input-decode-map}, when using a VT100. Thus, typing @kbd{C-c @key{PF1}} sends the character sequence @kbd{C-c @key{ESC} O P}; later the function @code{read-key-sequence} translates this back into @kbd{C-c @key{PF1}}, which it returns as the vector @code{[?\C-c pf1]}. -Entries in @code{function-key-map} are ignored if they conflict with -bindings made in the minor mode, local, or global keymaps. The intent -is that the character sequences that function keys send should not have -command bindings in their own right---but if they do, the ordinary -bindings take priority. - -The value of @code{function-key-map} is usually set up automatically +The value of @code{input-decode-map} is usually set up automatically according to the terminal's Terminfo or Termcap entry, but sometimes those need help from terminal-specific Lisp files. Emacs comes with terminal-specific files for many common terminals; their main purpose is -to make entries in @code{function-key-map} beyond those that can be +to make entries in @code{input-decode-map} beyond those that can be deduced from Termcap and Terminfo. @xref{Terminal-Specific}. @end defvar +@defvar function-key-map + +This variable holds a keymap similar to @code{input-decode-map} except +that it describes key sequences which should be translated to +alternative interpretations that are usually preferred. It applies +after @code{input-decode-map} and before @code{key-translation-map}. + +Entries in @code{function-key-map} are ignored if they conflict with +bindings made in the minor mode, local, or global keymaps. I.e. +the remapping only applies if the original key sequence would +otherwise not have any binding. +@end defvar + @defvar key-translation-map -This variable is another keymap used just like @code{function-key-map} +This variable is another keymap used just like @code{input-decode-map} to translate input events into other events. It differs from -@code{function-key-map} in two ways: - -@itemize @bullet -@item -@code{key-translation-map} goes to work after @code{function-key-map} is -finished; it receives the results of translation by -@code{function-key-map}. - -@item -Non-prefix bindings in @code{key-translation-map} override actual key -bindings. For example, if @kbd{C-x f} has a non-prefix binding in -@code{key-translation-map}, that translation takes effect even though -@kbd{C-x f} also has a key binding in the global map. -@end itemize - -Note however that actual key bindings can have an effect on -@code{key-translation-map}, even though they are overridden by it. -Indeed, actual key bindings override @code{function-key-map} and thus -may alter the key sequence that @code{key-translation-map} receives. -Clearly, it is better to avoid this type of situation. +@code{input-decode-map} in that it goes to work after +@code{function-key-map} is finished rather than before; it receives +the results of translation by @code{function-key-map}. + +Just like @code{input-decode-map}, but unlike @code{function-key-map}, +this keymap is applied regardless of whether the input key-sequence +has a normal binding. Note however that actual key bindings can have +an effect on @code{key-translation-map}, even though they are +overridden by it. Indeed, actual key bindings override +@code{function-key-map} and thus may alter the key sequence that +@code{key-translation-map} receives. Clearly, it is better to avoid +this type of situation. The intent of @code{key-translation-map} is for users to map one character set to another, including ordinary characters normally bound @@ -1581,7 +1581,8 @@ @end defvar @cindex key translation function -You can use @code{function-key-map} or @code{key-translation-map} for +You can use @code{input-decode-map}, @code{function-key-map}, or +@code{key-translation-map} for more than simple aliases, by using a function, instead of a key sequence, as the ``translation'' of a key. Then this function is called to compute the translation of that key.
--- a/doc/lispref/maps.texi Tue Oct 09 04:28:00 2007 +0000 +++ b/doc/lispref/maps.texi Tue Oct 09 05:05:39 2007 +0000 @@ -113,7 +113,7 @@ Properties menu. @item function-key-map -The keymap for translating keypad and function keys.@* +The keymap for translating key sequences to preferred alternatives.@* If there are none, then it contains an empty sparse keymap. @xref{Translation Keymaps}. @@ -151,6 +151,11 @@ @vindex Info-mode-map A sparse keymap containing Info commands. +@item input-decode-map +The keymap for translating keypad and function keys.@* +If there are none, then it contains an empty sparse keymap. +@xref{Translation Keymaps}. + @item isearch-mode-map @vindex isearch-mode-map A keymap that defines the characters you can type within incremental
--- a/doc/lispref/os.texi Tue Oct 09 04:28:00 2007 +0000 +++ b/doc/lispref/os.texi Tue Oct 09 05:05:39 2007 +0000 @@ -279,7 +279,7 @@ @cindex Termcap The usual function of a terminal-specific library is to enable special keys to send sequences that Emacs can recognize. It may also -need to set or add to @code{function-key-map} if the Termcap or +need to set or add to @code{input-decode-map} if the Termcap or Terminfo entry does not specify all the terminal's function keys. @xref{Terminal Input}.
--- a/doc/misc/viper.texi Tue Oct 09 04:28:00 2007 +0000 +++ b/doc/misc/viper.texi Tue Oct 09 05:05:39 2007 +0000 @@ -1745,7 +1745,8 @@ low may make it hard to type macros quickly enough. @item viper-translate-all-ESC-keysequences @code{t} on tty, @code{nil} on windowing display Normally, Viper lets Emacs translate only those ESC key sequences that are -defined in the low-level key-translation-map or function-key-map, such as those +defined in the low-level @code{input-decode-map}, @code{key-translation-map} +or @code{function-key-map}, such as those emitted by the arrow and function keys. Other sequences, e.g., @kbd{\\e/}, are treated as @kbd{ESC} command followed by a @kbd{/}. This is good for people who type fast and tend to hit other characters right after they hit @@ -2009,12 +2010,12 @@ those keys, you will have to find out which key sequences they emit by typing @kbd{C-q} and then the key (you should switch to Emacs state first). Then you can bind those sequences to their preferred forms using -@code{function-key-map} as follows: +@code{input-decode-map} as follows: @lisp (cond ((string= (getenv "TERM") "xterm") -(define-key function-key-map "\e[192z" [f11]) ; L1 -(define-key function-key-map "\e[195z" [f14]) ; L4, Undo +(define-key input-decode-map "\e[192z" [f11]) ; L1 +(define-key input-decode-map "\e[195z" [f14]) ; L4, Undo @end lisp The above illustrates how to do this for Xterm. On VT100, you would have to @@ -2206,6 +2207,7 @@ Manual}, and the Emacs quick reference card for the general info on key bindings in Emacs. +@vindex @code{input-decode-map} @vindex @code{function-key-map} @vindex @code{viper-vi-global-user-map} @vindex @code{viper-insert-global-user-map}
--- a/etc/NEWS Tue Oct 09 04:28:00 2007 +0000 +++ b/etc/NEWS Tue Oct 09 05:05:39 2007 +0000 @@ -257,6 +257,11 @@ * Lisp Changes in Emacs 23.1 +** New keymap `input-decode-map' overrides like key-translation-map, but +applies before function-key-map. Also it is terminal-local contrary to +key-translation-map. Terminal-specific key-sequences are generally added to +this map rather than to function-key-map now. + ** Changes related to multiple tty support. *** $TERM is now set to `dumb' for subprocesses. If you want to know the @@ -289,11 +294,8 @@ *** New functions: `environment', `let-environment'. -*** New variables: `local-key-translation-map', `local-function-key-map'. -These are in addition to the global key-translation-map and -function-key-map variables that already existed. - -??? How do the new variables relate to the old ones? +*** New variable: `local-function-key-map'. +This in addition to the global function-key-map variable that already existed. *** `initial-environment' holds the environment inherited from Emacs's parent.
--- a/src/ChangeLog Tue Oct 09 04:28:00 2007 +0000 +++ b/src/ChangeLog Tue Oct 09 05:05:39 2007 +0000 @@ -1,5 +1,21 @@ 2007-10-09 Stefan Monnier <monnier@iro.umontreal.ca> + Add new `input-decode-map' keymap and use it for temrinal + escape sequences. + * keyboard.h (struct kboard): Add Vinput_decode_map. + Remove Vlocal_key_translation_map. + * keyboard.c (read_key_sequence): Add support for input-decode-map. + (init_kboard): Init input-decode-map. + Replace local-key-translation-map back with key-translation-map. + (syms_of_keyboard): Declare input-decode-map. + Remove local-key-translation-map. Update docstrings. + (mark_kboards): Mark Vinput_decode_map. + Don't mark Vlocal_key_translation_map. + * keymap.c (Fdescribe_buffer_bindings): Describe input-decode-map. + Replace local-key-translation-map back with key-translation-map. + * term.c (term_get_fkeys_1, CONDITIONAL_REASSIGN): + Bind in input-decode-map rather than function-key-map. + * lisp.h (XSETPSEUDOVECTOR): Don't set the tag anymore. This was made redundant by the previous introduction of XSETPVECTYPE.
--- a/src/keyboard.c Tue Oct 09 04:28:00 2007 +0000 +++ b/src/keyboard.c Tue Oct 09 05:05:39 2007 +0000 @@ -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,21 +9859,27 @@ /* 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 (fkey.end > last_real_key_start) + if (indec.end > last_real_key_start) { - fkey.end = fkey.start - = min (last_real_key_start, fkey.start); - fkey.map = fkey.parent; - if (keytran.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) { - keytran.end = keytran.start - = min (last_real_key_start, keytran.start); - keytran.map = keytran.parent; + fkey.end = fkey.start + = min (last_real_key_start, fkey.start); + fkey.map = fkey.parent; + if (keytran.end > last_real_key_start) + { + keytran.end = keytran.start + = min (last_real_key_start, keytran.start); + keytran.map = keytran.parent; + } } } if (t == last_real_key_start) @@ -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, - doc: /* Keymap of key translations that can override keymaps. + 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); }
--- a/src/keyboard.h Tue Oct 09 04:28:00 2007 +0000 +++ b/src/keyboard.h Tue Oct 09 05:05:39 2007 +0000 @@ -127,14 +127,15 @@ /* 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));
--- a/src/keymap.c Tue Oct 09 04:28:00 2007 +0000 +++ b/src/keymap.c Tue Oct 09 05:05:39 2007 +0000 @@ -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; }
--- a/src/term.c Tue Oct 09 04:28:00 2007 +0000 +++ b/src/term.c Tue Oct 09 05:05:39 2007 +0000 @@ -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))); \ }