From: Richard M. Stallman Date: Fri, 26 Dec 1997 10:38:56 +0000 (+0000) Subject: (Vminor_mode_overriding_map_alist): New variable. X-Git-Tag: emacs-20.3~2557 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=dd9cda060f2186a86728ef59909aa7f368e5be34;p=emacs.git (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 --git a/src/keymap.c b/src/keymap.c index 616ab1cbfe2..0ba367d29f8 100644 --- a/src/keymap.c +++ b/src/keymap.c @@ -71,6 +71,10 @@ Lisp_Object Vminibuffer_local_must_match_map; /* 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 @@ current_minor_maps (modeptr, mapptr) Lisp_Object **modeptr, **mapptr; { int i = 0; + int list_number = 0; Lisp_Object alist, assoc, var, val; + 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; - 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 (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 (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; - } + 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++; - } - } + /* 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 @@ If two active keymaps bind the same key, the keymap appearing earlier\n\ 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\