aboutsummaryrefslogtreecommitdiffstats
path: root/src/keymap.c
diff options
context:
space:
mode:
authorRichard M. Stallman1997-12-26 10:38:56 +0000
committerRichard M. Stallman1997-12-26 10:38:56 +0000
commitdd9cda060f2186a86728ef59909aa7f368e5be34 (patch)
tree2e5b579e694e0b51f3053ceb38935257c1ca0c5a /src/keymap.c
parent857686a6d3eb18738ede4b7152332f7ef2d98e5b (diff)
downloademacs-dd9cda060f2186a86728ef59909aa7f368e5be34.tar.gz
emacs-dd9cda060f2186a86728ef59909aa7f368e5be34.zip
(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.
Diffstat (limited to 'src/keymap.c')
-rw-r--r--src/keymap.c125
1 files changed, 71 insertions, 54 deletions
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;
71/* Alist of minor mode variables and keymaps. */ 71/* Alist of minor mode variables and keymaps. */
72Lisp_Object Vminor_mode_map_alist; 72Lisp_Object Vminor_mode_map_alist;
73 73
74/* Alist of major-mode-specific overrides for
75 minor mode variables and keymaps. */
76Lisp_Object Vminor_mode_overriding_map_alist;
77
74/* Keymap mapping ASCII function key sequences onto their preferred forms. 78/* Keymap mapping ASCII function key sequences onto their preferred forms.
75 Initialized by the terminal-specific lisp files. See DEFVAR for more 79 Initialized by the terminal-specific lisp files. See DEFVAR for more
76 documentation. */ 80 documentation. */
@@ -1055,65 +1059,71 @@ current_minor_maps (modeptr, mapptr)
1055 Lisp_Object **modeptr, **mapptr; 1059 Lisp_Object **modeptr, **mapptr;
1056{ 1060{
1057 int i = 0; 1061 int i = 0;
1062 int list_number = 0;
1058 Lisp_Object alist, assoc, var, val; 1063 Lisp_Object alist, assoc, var, val;
1064 Lisp_Object lists[2];
1065
1066 lists[0] = Vminor_mode_overriding_map_alist;
1067 lists[1] = Vminor_mode_map_alist;
1068
1069 for (list_number = 0; list_number < 2; list_number++)
1070 for (alist = lists[list_number];
1071 CONSP (alist);
1072 alist = XCONS (alist)->cdr)
1073 if ((assoc = XCONS (alist)->car, CONSP (assoc))
1074 && (var = XCONS (assoc)->car, SYMBOLP (var))
1075 && (val = find_symbol_value (var), ! EQ (val, Qunbound))
1076 && ! NILP (val))
1077 {
1078 Lisp_Object temp;
1059 1079
1060 for (alist = Vminor_mode_map_alist; 1080 if (i >= cmm_size)
1061 CONSP (alist); 1081 {
1062 alist = XCONS (alist)->cdr) 1082 Lisp_Object *newmodes, *newmaps;
1063 if ((assoc = XCONS (alist)->car, CONSP (assoc))
1064 && (var = XCONS (assoc)->car, SYMBOLP (var))
1065 && (val = find_symbol_value (var), ! EQ (val, Qunbound))
1066 && ! NILP (val))
1067 {
1068 Lisp_Object temp;
1069
1070 if (i >= cmm_size)
1071 {
1072 Lisp_Object *newmodes, *newmaps;
1073 1083
1074 if (cmm_maps) 1084 if (cmm_maps)
1075 { 1085 {
1076 BLOCK_INPUT; 1086 BLOCK_INPUT;
1077 cmm_size *= 2; 1087 cmm_size *= 2;
1078 newmodes 1088 newmodes
1079 = (Lisp_Object *) realloc (cmm_modes, 1089 = (Lisp_Object *) realloc (cmm_modes,
1080 cmm_size * sizeof (Lisp_Object)); 1090 cmm_size * sizeof (Lisp_Object));
1081 newmaps 1091 newmaps
1082 = (Lisp_Object *) realloc (cmm_maps, 1092 = (Lisp_Object *) realloc (cmm_maps,
1083 cmm_size * sizeof (Lisp_Object)); 1093 cmm_size * sizeof (Lisp_Object));
1084 UNBLOCK_INPUT; 1094 UNBLOCK_INPUT;
1085 } 1095 }
1086 else 1096 else
1087 { 1097 {
1088 BLOCK_INPUT; 1098 BLOCK_INPUT;
1089 cmm_size = 30; 1099 cmm_size = 30;
1090 newmodes 1100 newmodes
1091 = (Lisp_Object *) malloc (cmm_size * sizeof (Lisp_Object)); 1101 = (Lisp_Object *) malloc (cmm_size * sizeof (Lisp_Object));
1092 newmaps 1102 newmaps
1093 = (Lisp_Object *) malloc (cmm_size * sizeof (Lisp_Object)); 1103 = (Lisp_Object *) malloc (cmm_size * sizeof (Lisp_Object));
1094 UNBLOCK_INPUT; 1104 UNBLOCK_INPUT;
1095 } 1105 }
1096 1106
1097 if (newmaps && newmodes) 1107 if (newmaps && newmodes)
1098 { 1108 {
1099 cmm_modes = newmodes; 1109 cmm_modes = newmodes;
1100 cmm_maps = newmaps; 1110 cmm_maps = newmaps;
1101 } 1111 }
1102 else 1112 else
1103 break; 1113 break;
1104 } 1114 }
1105 1115
1106 /* Get the keymap definition--or nil if it is not defined. */ 1116 /* Get the keymap definition--or nil if it is not defined. */
1107 temp = internal_condition_case_1 (Findirect_function, 1117 temp = internal_condition_case_1 (Findirect_function,
1108 XCONS (assoc)->cdr, 1118 XCONS (assoc)->cdr,
1109 Qerror, current_minor_maps_error); 1119 Qerror, current_minor_maps_error);
1110 if (!NILP (temp)) 1120 if (!NILP (temp))
1111 { 1121 {
1112 cmm_modes[i] = var; 1122 cmm_modes[i] = var;
1113 cmm_maps [i] = temp; 1123 cmm_maps [i] = temp;
1114 i++; 1124 i++;
1115 } 1125 }
1116 } 1126 }
1117 1127
1118 if (modeptr) *modeptr = cmm_modes; 1128 if (modeptr) *modeptr = cmm_modes;
1119 if (mapptr) *mapptr = cmm_maps; 1129 if (mapptr) *mapptr = cmm_maps;
@@ -3113,6 +3123,13 @@ If two active keymaps bind the same key, the keymap appearing earlier\n\
3113in the list takes precedence."); 3123in the list takes precedence.");
3114 Vminor_mode_map_alist = Qnil; 3124 Vminor_mode_map_alist = Qnil;
3115 3125
3126 DEFVAR_LISP ("minor-mode-overriding-map-alist", &Vminor_mode_overriding_map_alist,
3127 "Alist of keymaps to use for minor modes, in current major mode.\n\
3128This variable is a alist just like `minor-mode-map-alist', and it is\n\
3129used the same way (and before `minor-mode-map-alist'); however,\n\
3130it is provided for major modes to bind locally.");
3131 Vminor_mode_overriding_map_alist = Qnil;
3132
3116 DEFVAR_LISP ("function-key-map", &Vfunction_key_map, 3133 DEFVAR_LISP ("function-key-map", &Vfunction_key_map,
3117 "Keymap mapping ASCII function key sequences onto their preferred forms.\n\ 3134 "Keymap mapping ASCII function key sequences onto their preferred forms.\n\
3118This allows Emacs to recognize function keys sent from ASCII\n\ 3135This allows Emacs to recognize function keys sent from ASCII\n\