diff options
| author | Richard M. Stallman | 1997-12-26 10:38:56 +0000 |
|---|---|---|
| committer | Richard M. Stallman | 1997-12-26 10:38:56 +0000 |
| commit | dd9cda060f2186a86728ef59909aa7f368e5be34 (patch) | |
| tree | 2e5b579e694e0b51f3053ceb38935257c1ca0c5a /src/keymap.c | |
| parent | 857686a6d3eb18738ede4b7152332f7ef2d98e5b (diff) | |
| download | emacs-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.c | 125 |
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. */ |
| 72 | Lisp_Object Vminor_mode_map_alist; | 72 | Lisp_Object Vminor_mode_map_alist; |
| 73 | 73 | ||
| 74 | /* Alist of major-mode-specific overrides for | ||
| 75 | minor mode variables and keymaps. */ | ||
| 76 | Lisp_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\ | |||
| 3113 | in the list takes precedence."); | 3123 | in 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\ | ||
| 3128 | This variable is a alist just like `minor-mode-map-alist', and it is\n\ | ||
| 3129 | used the same way (and before `minor-mode-map-alist'); however,\n\ | ||
| 3130 | it 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\ |
| 3118 | This allows Emacs to recognize function keys sent from ASCII\n\ | 3135 | This allows Emacs to recognize function keys sent from ASCII\n\ |