]> git.ipfire.org Git - thirdparty/gcc.git/blob - texinfo/info/infomap.c
Initial revision
[thirdparty/gcc.git] / texinfo / info / infomap.c
1 /* infomap.c -- Keymaps for Info. */
2
3 /* This file is part of GNU Info, a program for reading online documentation
4 stored in Info format.
5
6 Copyright (C) 1993 Free Software Foundation, Inc.
7
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2, or (at your option)
11 any later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
21
22 Written by Brian Fox (bfox@ai.mit.edu). */
23
24 #include "stdio.h"
25 #include "ctype.h"
26 #include "infomap.h"
27 #include "funs.h"
28
29 /* Return a new keymap which has all the uppercase letters mapped to run
30 the function info_do_lowercase_version (). */
31 Keymap
32 keymap_make_keymap ()
33 {
34 register int i;
35 Keymap keymap;
36
37 keymap = (Keymap)xmalloc (256 * sizeof (KEYMAP_ENTRY));
38
39 for (i = 0; i < 256; i++)
40 {
41 keymap[i].type = ISFUNC;
42 keymap[i].function = (VFunction *)NULL;
43 }
44
45 for (i = 'A'; i < ('Z' + 1); i++)
46 {
47 keymap[i].type = ISFUNC;
48 keymap[i].function = info_do_lowercase_version;
49 }
50
51 return (keymap);
52 }
53
54 /* Return a new keymap which is a copy of MAP. */
55 Keymap
56 keymap_copy_keymap (map)
57 Keymap map;
58 {
59 register int i;
60 Keymap keymap;
61
62 keymap = keymap_make_keymap ();
63
64 for (i = 0; i < 256; i++)
65 {
66 keymap[i].type = map[i].type;
67 keymap[i].function = map[i].function;
68 }
69 return (keymap);
70 }
71
72 /* Free the keymap and it's descendents. */
73 void
74 keymap_discard_keymap (map)
75 Keymap (map);
76 {
77 register int i;
78
79 if (!map)
80 return;
81
82 for (i = 0; i < 256; i++)
83 {
84 switch (map[i].type)
85 {
86 case ISFUNC:
87 break;
88
89 case ISKMAP:
90 keymap_discard_keymap ((Keymap)map[i].function);
91 break;
92
93 }
94 }
95 }
96
97 /* Initialize the standard info keymaps. */
98
99 Keymap info_keymap = (Keymap)NULL;
100 Keymap echo_area_keymap = (Keymap)NULL;
101
102 void
103 initialize_info_keymaps ()
104 {
105 register int i;
106 Keymap map;
107
108 if (!info_keymap)
109 {
110 info_keymap = keymap_make_keymap ();
111 info_keymap[ESC].type = ISKMAP;
112 info_keymap[ESC].function = (VFunction *)keymap_make_keymap ();
113 info_keymap[Control ('x')].type = ISKMAP;
114 info_keymap[Control ('x')].function = (VFunction *)keymap_make_keymap ();
115 echo_area_keymap = keymap_make_keymap ();
116 echo_area_keymap[ESC].type = ISKMAP;
117 echo_area_keymap[ESC].function = (VFunction *)keymap_make_keymap ();
118 echo_area_keymap[Control ('x')].type = ISKMAP;
119 echo_area_keymap[Control ('x')].function =
120 (VFunction *)keymap_make_keymap ();
121 }
122
123 /* Bind numeric arg functions for both echo area and info window maps. */
124 for (i = '0'; i < '9' + 1; i++)
125 {
126 ((Keymap) info_keymap[ESC].function)[i].function =
127 ((Keymap) echo_area_keymap[ESC].function)[i].function =
128 info_add_digit_to_numeric_arg;
129 }
130 ((Keymap) info_keymap[ESC].function)['-'].function =
131 ((Keymap) echo_area_keymap[ESC].function)['-'].function =
132 info_add_digit_to_numeric_arg;
133
134 /* Bind the echo area routines. */
135 map = echo_area_keymap;
136
137 /* Bind the echo area insert routines. */
138 for (i = 0; i < 160; i++)
139 if (isprint (i))
140 map[i].function = ea_insert;
141
142 map[Control ('a')].function = ea_beg_of_line;
143 map[Control ('b')].function = ea_backward;
144 map[Control ('d')].function = ea_delete;
145 map[Control ('e')].function = ea_end_of_line;
146 map[Control ('f')].function = ea_forward;
147 map[Control ('g')].function = ea_abort;
148 map[Control ('h')].function = ea_rubout;
149 map[Control ('k')].function = ea_kill_line;
150 map[Control ('l')].function = info_redraw_display;
151 map[Control ('q')].function = ea_quoted_insert;
152 map[Control ('t')].function = ea_transpose_chars;
153 map[Control ('u')].function = info_universal_argument;
154 map[Control ('y')].function = ea_yank;
155
156 map[LFD].function = ea_newline;
157 map[RET].function = ea_newline;
158 map[SPC].function = ea_complete;
159 map[TAB].function = ea_complete;
160 map['?'].function = ea_possible_completions;
161 map[DEL].function = ea_rubout;
162
163 /* Bind the echo area ESC keymap. */
164 map = (Keymap)echo_area_keymap[ESC].function;
165
166 map[Control ('g')].function = ea_abort;
167 map[Control ('v')].function = ea_scroll_completions_window;
168 map['b'].function = ea_backward_word;
169 map['d'].function = ea_kill_word;
170 map['f'].function = ea_forward_word;
171 #if defined (NAMED_FUNCTIONS)
172 /* map['x'].function = info_execute_command; */
173 #endif /* NAMED_FUNCTIONS */
174 map['y'].function = ea_yank_pop;
175 map['?'].function = ea_possible_completions;
176 map[TAB].function = ea_tab_insert;
177 map[DEL].function = ea_backward_kill_word;
178
179 /* Bind the echo area Control-x keymap. */
180 map = (Keymap)echo_area_keymap[Control ('x')].function;
181
182 map['o'].function = info_next_window;
183 map[DEL].function = ea_backward_kill_line;
184
185 /* Bind commands for Info window keymaps. */
186 map = info_keymap;
187 map[TAB].function = info_move_to_next_xref;
188 map[LFD].function = info_select_reference_this_line;
189 map[RET].function = info_select_reference_this_line;
190 map[SPC].function = info_scroll_forward;
191 map[Control ('a')].function = info_beginning_of_line;
192 map[Control ('b')].function = info_backward_char;
193 map[Control ('e')].function = info_end_of_line;
194 map[Control ('f')].function = info_forward_char;
195 map[Control ('g')].function = info_abort_key;
196 map[Control ('h')].function = info_get_help_window;
197 map[Control ('l')].function = info_redraw_display;
198 map[Control ('n')].function = info_next_line;
199 map[Control ('p')].function = info_prev_line;
200 map[Control ('r')].function = isearch_backward;
201 map[Control ('s')].function = isearch_forward;
202 map[Control ('u')].function = info_universal_argument;
203 map[Control ('v')].function = info_scroll_forward;
204 map[','].function = info_next_index_match;
205
206 for (i = '1'; i < '9' + 1; i++)
207 map[i].function = info_menu_digit;
208 map['0'].function = info_last_menu_item;
209
210 map['<'].function = info_first_node;
211 map['>'].function = info_last_node;
212 map['?'].function = info_get_help_window;
213 map['['].function = info_global_prev_node;
214 map[']'].function = info_global_next_node;
215
216 map['b'].function = info_beginning_of_node;
217 map['d'].function = info_dir_node;
218 map['e'].function = info_end_of_node;
219 map['f'].function = info_xref_item;
220 map['g'].function = info_goto_node;
221 map['h'].function = info_get_info_help_node;
222 map['i'].function = info_index_search;
223 map['l'].function = info_history_node;
224 map['m'].function = info_menu_item;
225 map['n'].function = info_next_node;
226 map['p'].function = info_prev_node;
227 map['q'].function = info_quit;
228 map['r'].function = info_xref_item;
229 map['s'].function = info_search;
230 map['t'].function = info_top_node;
231 map['u'].function = info_up_node;
232 map[DEL].function = info_scroll_backward;
233
234 /* Bind members in the ESC map for Info windows. */
235 map = (Keymap)info_keymap[ESC].function;
236 map[Control ('f')].function = info_show_footnotes;
237 map[Control ('g')].function = info_abort_key;
238 map[TAB].function = info_move_to_prev_xref;
239 map[Control ('v')].function = info_scroll_other_window;
240 map['<'].function = info_beginning_of_node;
241 map['>'].function = info_end_of_node;
242 map['b'].function = info_backward_word;
243 map['f'].function = info_forward_word;
244 map['r'].function = info_move_to_window_line;
245 map['v'].function = info_scroll_backward;
246 #if defined (NAMED_FUNCTIONS)
247 map['x'].function = info_execute_command;
248 #endif /* NAMED_FUNCTIONS */
249
250 /* Bind members in the Control-X map for Info windows. */
251 map = (Keymap)info_keymap[Control ('x')].function;
252
253 map[Control ('b')].function = list_visited_nodes;
254 map[Control ('c')].function = info_quit;
255 map[Control ('f')].function = info_view_file;
256 map[Control ('g')].function = info_abort_key;
257 map[Control ('v')].function = info_view_file;
258 map['0'].function = info_delete_window;
259 map['1'].function = info_keep_one_window;
260 map['2'].function = info_split_window;
261 map['^'].function = info_grow_window;
262 map['b'].function = select_visited_node;
263 map['k'].function = info_kill_node;
264 map['o'].function = info_next_window;
265 map['t'].function = info_tile_windows;
266 map['w'].function = info_toggle_wrap;
267 }
268
269 /* Strings which represent the sequence of characters that the arrow keys
270 produce. If these keys begin with ESC, and the second character of the
271 sequence does not conflict with an existing binding in the Meta keymap,
272 then bind the keys to do what C-p, C-n, C-f, and C-b do. */
273 extern char *term_ku, *term_kd, *term_kr, *term_kl;
274