# HG changeset patch # User Richard M. Stallman # Date 883132736 0 # Node ID 40bfe766d355e83c5f6508a7ee30061835dedd0a # Parent d33438261904a259eb522c20b12f298c94eb1cb8 (Vminor_mode_overriding_map_alist): New variable. (syms_of_keymap): Set up Lisp var. (current_minor_maps): Use Vminor_mode_overriding_map_alist first, then Vminor_mode_map_alist. diff -r d33438261904 -r 40bfe766d355 src/keymap.c --- a/src/keymap.c Thu Dec 25 18:33:52 1997 +0000 +++ b/src/keymap.c Fri Dec 26 10:38:56 1997 +0000 @@ -71,6 +71,10 @@ /* Alist of minor mode variables and keymaps. */ Lisp_Object Vminor_mode_map_alist; +/* Alist of major-mode-specific overrides for + minor mode variables and keymaps. */ +Lisp_Object Vminor_mode_overriding_map_alist; + /* Keymap mapping ASCII function key sequences onto their preferred forms. Initialized by the terminal-specific lisp files. See DEFVAR for more documentation. */ @@ -1055,65 +1059,71 @@ Lisp_Object **modeptr, **mapptr; { int i = 0; + int list_number = 0; Lisp_Object alist, assoc, var, val; - - for (alist = Vminor_mode_map_alist; - CONSP (alist); - alist = XCONS (alist)->cdr) - if ((assoc = XCONS (alist)->car, CONSP (assoc)) - && (var = XCONS (assoc)->car, SYMBOLP (var)) - && (val = find_symbol_value (var), ! EQ (val, Qunbound)) - && ! NILP (val)) - { - Lisp_Object temp; - - if (i >= cmm_size) - { - Lisp_Object *newmodes, *newmaps; - - if (cmm_maps) - { - BLOCK_INPUT; - cmm_size *= 2; - newmodes - = (Lisp_Object *) realloc (cmm_modes, - cmm_size * sizeof (Lisp_Object)); - newmaps - = (Lisp_Object *) realloc (cmm_maps, - cmm_size * sizeof (Lisp_Object)); - UNBLOCK_INPUT; - } - else - { - BLOCK_INPUT; - cmm_size = 30; - newmodes - = (Lisp_Object *) malloc (cmm_size * sizeof (Lisp_Object)); - newmaps - = (Lisp_Object *) malloc (cmm_size * sizeof (Lisp_Object)); - UNBLOCK_INPUT; - } - - if (newmaps && newmodes) - { - cmm_modes = newmodes; - cmm_maps = newmaps; - } - else - break; - } - - /* Get the keymap definition--or nil if it is not defined. */ - temp = internal_condition_case_1 (Findirect_function, - XCONS (assoc)->cdr, - Qerror, current_minor_maps_error); - if (!NILP (temp)) - { - cmm_modes[i] = var; - cmm_maps [i] = temp; - i++; - } - } + Lisp_Object lists[2]; + + lists[0] = Vminor_mode_overriding_map_alist; + lists[1] = Vminor_mode_map_alist; + + for (list_number = 0; list_number < 2; list_number++) + for (alist = lists[list_number]; + CONSP (alist); + alist = XCONS (alist)->cdr) + if ((assoc = XCONS (alist)->car, CONSP (assoc)) + && (var = XCONS (assoc)->car, SYMBOLP (var)) + && (val = find_symbol_value (var), ! EQ (val, Qunbound)) + && ! NILP (val)) + { + Lisp_Object temp; + + if (i >= cmm_size) + { + Lisp_Object *newmodes, *newmaps; + + if (cmm_maps) + { + BLOCK_INPUT; + cmm_size *= 2; + newmodes + = (Lisp_Object *) realloc (cmm_modes, + cmm_size * sizeof (Lisp_Object)); + newmaps + = (Lisp_Object *) realloc (cmm_maps, + cmm_size * sizeof (Lisp_Object)); + UNBLOCK_INPUT; + } + else + { + BLOCK_INPUT; + cmm_size = 30; + newmodes + = (Lisp_Object *) malloc (cmm_size * sizeof (Lisp_Object)); + newmaps + = (Lisp_Object *) malloc (cmm_size * sizeof (Lisp_Object)); + UNBLOCK_INPUT; + } + + if (newmaps && newmodes) + { + cmm_modes = newmodes; + cmm_maps = newmaps; + } + else + break; + } + + /* Get the keymap definition--or nil if it is not defined. */ + temp = internal_condition_case_1 (Findirect_function, + XCONS (assoc)->cdr, + Qerror, current_minor_maps_error); + if (!NILP (temp)) + { + cmm_modes[i] = var; + cmm_maps [i] = temp; + i++; + } + } if (modeptr) *modeptr = cmm_modes; if (mapptr) *mapptr = cmm_maps; @@ -3113,6 +3123,13 @@ in the list takes precedence."); Vminor_mode_map_alist = Qnil; + DEFVAR_LISP ("minor-mode-overriding-map-alist", &Vminor_mode_overriding_map_alist, + "Alist of keymaps to use for minor modes, in current major mode.\n\ +This variable is a alist just like `minor-mode-map-alist', and it is\n\ +used the same way (and before `minor-mode-map-alist'); however,\n\ +it is provided for major modes to bind locally."); + Vminor_mode_overriding_map_alist = Qnil; + DEFVAR_LISP ("function-key-map", &Vfunction_key_map, "Keymap mapping ASCII function key sequences onto their preferred forms.\n\ This allows Emacs to recognize function keys sent from ASCII\n\