MySQL 5.6.14 Source Code Document
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
map.c
1 /* $NetBSD: map.c,v 1.30 2011/08/16 16:25:15 christos Exp $ */
2 
3 /*-
4  * Copyright (c) 1992, 1993
5  * The Regents of the University of California. All rights reserved.
6  *
7  * This code is derived from software contributed to Berkeley by
8  * Christos Zoulas of Cornell University.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  * notice, this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  * notice, this list of conditions and the following disclaimer in the
17  * documentation and/or other materials provided with the distribution.
18  * 3. Neither the name of the University nor the names of its contributors
19  * may be used to endorse or promote products derived from this software
20  * without specific prior written permission.
21  *
22  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
23  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25  * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
26  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32  * SUCH DAMAGE.
33  */
34 
35 #include "config.h"
36 #if !defined(lint) && !defined(SCCSID)
37 #if 0
38 static char sccsid[] = "@(#)map.c 8.1 (Berkeley) 6/4/93";
39 #else
40 #endif
41 #endif /* not lint && not SCCSID */
42 
43 /*
44  * map.c: Editor function definitions
45  */
46 #include <stdlib.h>
47 #include "el.h"
48 
49 private void map_print_key(EditLine *, el_action_t *, const Char *);
50 private void map_print_some_keys(EditLine *, el_action_t *, Int, Int);
51 private void map_print_all_keys(EditLine *);
52 private void map_init_nls(EditLine *);
53 private void map_init_meta(EditLine *);
54 
55 /* keymap tables ; should be N_KEYS*sizeof(KEYCMD) bytes long */
56 
57 
58 private const el_action_t el_map_emacs[] = {
59  /* 0 */ EM_SET_MARK, /* ^@ */
60  /* 1 */ ED_MOVE_TO_BEG, /* ^A */
61  /* 2 */ ED_PREV_CHAR, /* ^B */
62  /* 3 */ ED_TTY_SIGINT, /* ^C */
63  /* 4 */ EM_DELETE_OR_LIST, /* ^D */
64  /* 5 */ ED_MOVE_TO_END, /* ^E */
65  /* 6 */ ED_NEXT_CHAR, /* ^F */
66  /* 7 */ ED_UNASSIGNED, /* ^G */
67  /* 8 */ EM_DELETE_PREV_CHAR, /* ^H */
68  /* 9 */ ED_UNASSIGNED, /* ^I */
69  /* 10 */ ED_NEWLINE, /* ^J */
70  /* 11 */ ED_KILL_LINE, /* ^K */
71  /* 12 */ ED_CLEAR_SCREEN, /* ^L */
72  /* 13 */ ED_NEWLINE, /* ^M */
73  /* 14 */ ED_NEXT_HISTORY, /* ^N */
74  /* 15 */ ED_TTY_FLUSH_OUTPUT, /* ^O */
75  /* 16 */ ED_PREV_HISTORY, /* ^P */
76  /* 17 */ ED_TTY_START_OUTPUT, /* ^Q */
77  /* 18 */ ED_REDISPLAY, /* ^R */
78  /* 19 */ ED_TTY_STOP_OUTPUT, /* ^S */
79  /* 20 */ ED_TRANSPOSE_CHARS, /* ^T */
80  /* 21 */ EM_KILL_LINE, /* ^U */
81  /* 22 */ ED_QUOTED_INSERT, /* ^V */
82  /* 23 */ EM_KILL_REGION, /* ^W */
83  /* 24 */ ED_SEQUENCE_LEAD_IN, /* ^X */
84  /* 25 */ EM_YANK, /* ^Y */
85  /* 26 */ ED_TTY_SIGTSTP, /* ^Z */
86  /* 27 */ EM_META_NEXT, /* ^[ */
87  /* 28 */ ED_TTY_SIGQUIT, /* ^\ */
88  /* 29 */ ED_TTY_DSUSP, /* ^] */
89  /* 30 */ ED_UNASSIGNED, /* ^^ */
90  /* 31 */ ED_UNASSIGNED, /* ^_ */
91  /* 32 */ ED_INSERT, /* SPACE */
92  /* 33 */ ED_INSERT, /* ! */
93  /* 34 */ ED_INSERT, /* " */
94  /* 35 */ ED_INSERT, /* # */
95  /* 36 */ ED_INSERT, /* $ */
96  /* 37 */ ED_INSERT, /* % */
97  /* 38 */ ED_INSERT, /* & */
98  /* 39 */ ED_INSERT, /* ' */
99  /* 40 */ ED_INSERT, /* ( */
100  /* 41 */ ED_INSERT, /* ) */
101  /* 42 */ ED_INSERT, /* * */
102  /* 43 */ ED_INSERT, /* + */
103  /* 44 */ ED_INSERT, /* , */
104  /* 45 */ ED_INSERT, /* - */
105  /* 46 */ ED_INSERT, /* . */
106  /* 47 */ ED_INSERT, /* / */
107  /* 48 */ ED_DIGIT, /* 0 */
108  /* 49 */ ED_DIGIT, /* 1 */
109  /* 50 */ ED_DIGIT, /* 2 */
110  /* 51 */ ED_DIGIT, /* 3 */
111  /* 52 */ ED_DIGIT, /* 4 */
112  /* 53 */ ED_DIGIT, /* 5 */
113  /* 54 */ ED_DIGIT, /* 6 */
114  /* 55 */ ED_DIGIT, /* 7 */
115  /* 56 */ ED_DIGIT, /* 8 */
116  /* 57 */ ED_DIGIT, /* 9 */
117  /* 58 */ ED_INSERT, /* : */
118  /* 59 */ ED_INSERT, /* ; */
119  /* 60 */ ED_INSERT, /* < */
120  /* 61 */ ED_INSERT, /* = */
121  /* 62 */ ED_INSERT, /* > */
122  /* 63 */ ED_INSERT, /* ? */
123  /* 64 */ ED_INSERT, /* @ */
124  /* 65 */ ED_INSERT, /* A */
125  /* 66 */ ED_INSERT, /* B */
126  /* 67 */ ED_INSERT, /* C */
127  /* 68 */ ED_INSERT, /* D */
128  /* 69 */ ED_INSERT, /* E */
129  /* 70 */ ED_INSERT, /* F */
130  /* 71 */ ED_INSERT, /* G */
131  /* 72 */ ED_INSERT, /* H */
132  /* 73 */ ED_INSERT, /* I */
133  /* 74 */ ED_INSERT, /* J */
134  /* 75 */ ED_INSERT, /* K */
135  /* 76 */ ED_INSERT, /* L */
136  /* 77 */ ED_INSERT, /* M */
137  /* 78 */ ED_INSERT, /* N */
138  /* 79 */ ED_INSERT, /* O */
139  /* 80 */ ED_INSERT, /* P */
140  /* 81 */ ED_INSERT, /* Q */
141  /* 82 */ ED_INSERT, /* R */
142  /* 83 */ ED_INSERT, /* S */
143  /* 84 */ ED_INSERT, /* T */
144  /* 85 */ ED_INSERT, /* U */
145  /* 86 */ ED_INSERT, /* V */
146  /* 87 */ ED_INSERT, /* W */
147  /* 88 */ ED_INSERT, /* X */
148  /* 89 */ ED_INSERT, /* Y */
149  /* 90 */ ED_INSERT, /* Z */
150  /* 91 */ ED_INSERT, /* [ */
151  /* 92 */ ED_INSERT, /* \ */
152  /* 93 */ ED_INSERT, /* ] */
153  /* 94 */ ED_INSERT, /* ^ */
154  /* 95 */ ED_INSERT, /* _ */
155  /* 96 */ ED_INSERT, /* ` */
156  /* 97 */ ED_INSERT, /* a */
157  /* 98 */ ED_INSERT, /* b */
158  /* 99 */ ED_INSERT, /* c */
159  /* 100 */ ED_INSERT, /* d */
160  /* 101 */ ED_INSERT, /* e */
161  /* 102 */ ED_INSERT, /* f */
162  /* 103 */ ED_INSERT, /* g */
163  /* 104 */ ED_INSERT, /* h */
164  /* 105 */ ED_INSERT, /* i */
165  /* 106 */ ED_INSERT, /* j */
166  /* 107 */ ED_INSERT, /* k */
167  /* 108 */ ED_INSERT, /* l */
168  /* 109 */ ED_INSERT, /* m */
169  /* 110 */ ED_INSERT, /* n */
170  /* 111 */ ED_INSERT, /* o */
171  /* 112 */ ED_INSERT, /* p */
172  /* 113 */ ED_INSERT, /* q */
173  /* 114 */ ED_INSERT, /* r */
174  /* 115 */ ED_INSERT, /* s */
175  /* 116 */ ED_INSERT, /* t */
176  /* 117 */ ED_INSERT, /* u */
177  /* 118 */ ED_INSERT, /* v */
178  /* 119 */ ED_INSERT, /* w */
179  /* 120 */ ED_INSERT, /* x */
180  /* 121 */ ED_INSERT, /* y */
181  /* 122 */ ED_INSERT, /* z */
182  /* 123 */ ED_INSERT, /* { */
183  /* 124 */ ED_INSERT, /* | */
184  /* 125 */ ED_INSERT, /* } */
185  /* 126 */ ED_INSERT, /* ~ */
186  /* 127 */ EM_DELETE_PREV_CHAR, /* ^? */
187  /* 128 */ ED_UNASSIGNED, /* M-^@ */
188  /* 129 */ ED_UNASSIGNED, /* M-^A */
189  /* 130 */ ED_UNASSIGNED, /* M-^B */
190  /* 131 */ ED_UNASSIGNED, /* M-^C */
191  /* 132 */ ED_UNASSIGNED, /* M-^D */
192  /* 133 */ ED_UNASSIGNED, /* M-^E */
193  /* 134 */ ED_UNASSIGNED, /* M-^F */
194  /* 135 */ ED_UNASSIGNED, /* M-^G */
195  /* 136 */ ED_DELETE_PREV_WORD, /* M-^H */
196  /* 137 */ ED_UNASSIGNED, /* M-^I */
197  /* 138 */ ED_UNASSIGNED, /* M-^J */
198  /* 139 */ ED_UNASSIGNED, /* M-^K */
199  /* 140 */ ED_CLEAR_SCREEN, /* M-^L */
200  /* 141 */ ED_UNASSIGNED, /* M-^M */
201  /* 142 */ ED_UNASSIGNED, /* M-^N */
202  /* 143 */ ED_UNASSIGNED, /* M-^O */
203  /* 144 */ ED_UNASSIGNED, /* M-^P */
204  /* 145 */ ED_UNASSIGNED, /* M-^Q */
205  /* 146 */ ED_UNASSIGNED, /* M-^R */
206  /* 147 */ ED_UNASSIGNED, /* M-^S */
207  /* 148 */ ED_UNASSIGNED, /* M-^T */
208  /* 149 */ ED_UNASSIGNED, /* M-^U */
209  /* 150 */ ED_UNASSIGNED, /* M-^V */
210  /* 151 */ ED_UNASSIGNED, /* M-^W */
211  /* 152 */ ED_UNASSIGNED, /* M-^X */
212  /* 153 */ ED_UNASSIGNED, /* M-^Y */
213  /* 154 */ ED_UNASSIGNED, /* M-^Z */
214  /* 155 */ ED_UNASSIGNED, /* M-^[ */
215  /* 156 */ ED_UNASSIGNED, /* M-^\ */
216  /* 157 */ ED_UNASSIGNED, /* M-^] */
217  /* 158 */ ED_UNASSIGNED, /* M-^^ */
218  /* 159 */ EM_COPY_PREV_WORD, /* M-^_ */
219  /* 160 */ ED_UNASSIGNED, /* M-SPACE */
220  /* 161 */ ED_UNASSIGNED, /* M-! */
221  /* 162 */ ED_UNASSIGNED, /* M-" */
222  /* 163 */ ED_UNASSIGNED, /* M-# */
223  /* 164 */ ED_UNASSIGNED, /* M-$ */
224  /* 165 */ ED_UNASSIGNED, /* M-% */
225  /* 166 */ ED_UNASSIGNED, /* M-& */
226  /* 167 */ ED_UNASSIGNED, /* M-' */
227  /* 168 */ ED_UNASSIGNED, /* M-( */
228  /* 169 */ ED_UNASSIGNED, /* M-) */
229  /* 170 */ ED_UNASSIGNED, /* M-* */
230  /* 171 */ ED_UNASSIGNED, /* M-+ */
231  /* 172 */ ED_UNASSIGNED, /* M-, */
232  /* 173 */ ED_UNASSIGNED, /* M-- */
233  /* 174 */ ED_UNASSIGNED, /* M-. */
234  /* 175 */ ED_UNASSIGNED, /* M-/ */
235  /* 176 */ ED_ARGUMENT_DIGIT, /* M-0 */
236  /* 177 */ ED_ARGUMENT_DIGIT, /* M-1 */
237  /* 178 */ ED_ARGUMENT_DIGIT, /* M-2 */
238  /* 179 */ ED_ARGUMENT_DIGIT, /* M-3 */
239  /* 180 */ ED_ARGUMENT_DIGIT, /* M-4 */
240  /* 181 */ ED_ARGUMENT_DIGIT, /* M-5 */
241  /* 182 */ ED_ARGUMENT_DIGIT, /* M-6 */
242  /* 183 */ ED_ARGUMENT_DIGIT, /* M-7 */
243  /* 184 */ ED_ARGUMENT_DIGIT, /* M-8 */
244  /* 185 */ ED_ARGUMENT_DIGIT, /* M-9 */
245  /* 186 */ ED_UNASSIGNED, /* M-: */
246  /* 187 */ ED_UNASSIGNED, /* M-; */
247  /* 188 */ ED_UNASSIGNED, /* M-< */
248  /* 189 */ ED_UNASSIGNED, /* M-= */
249  /* 190 */ ED_UNASSIGNED, /* M-> */
250  /* 191 */ ED_UNASSIGNED, /* M-? */
251  /* 192 */ ED_UNASSIGNED, /* M-@ */
252  /* 193 */ ED_UNASSIGNED, /* M-A */
253  /* 194 */ ED_PREV_WORD, /* M-B */
254  /* 195 */ EM_CAPITOL_CASE, /* M-C */
255  /* 196 */ EM_DELETE_NEXT_WORD, /* M-D */
256  /* 197 */ ED_UNASSIGNED, /* M-E */
257  /* 198 */ EM_NEXT_WORD, /* M-F */
258  /* 199 */ ED_UNASSIGNED, /* M-G */
259  /* 200 */ ED_UNASSIGNED, /* M-H */
260  /* 201 */ ED_UNASSIGNED, /* M-I */
261  /* 202 */ ED_UNASSIGNED, /* M-J */
262  /* 203 */ ED_UNASSIGNED, /* M-K */
263  /* 204 */ EM_LOWER_CASE, /* M-L */
264  /* 205 */ ED_UNASSIGNED, /* M-M */
265  /* 206 */ ED_SEARCH_NEXT_HISTORY, /* M-N */
266  /* 207 */ ED_SEQUENCE_LEAD_IN, /* M-O */
267  /* 208 */ ED_SEARCH_PREV_HISTORY, /* M-P */
268  /* 209 */ ED_UNASSIGNED, /* M-Q */
269  /* 210 */ ED_UNASSIGNED, /* M-R */
270  /* 211 */ ED_UNASSIGNED, /* M-S */
271  /* 212 */ ED_UNASSIGNED, /* M-T */
272  /* 213 */ EM_UPPER_CASE, /* M-U */
273  /* 214 */ ED_UNASSIGNED, /* M-V */
274  /* 215 */ EM_COPY_REGION, /* M-W */
275  /* 216 */ ED_COMMAND, /* M-X */
276  /* 217 */ ED_UNASSIGNED, /* M-Y */
277  /* 218 */ ED_UNASSIGNED, /* M-Z */
278  /* 219 */ ED_SEQUENCE_LEAD_IN, /* M-[ */
279  /* 220 */ ED_UNASSIGNED, /* M-\ */
280  /* 221 */ ED_UNASSIGNED, /* M-] */
281  /* 222 */ ED_UNASSIGNED, /* M-^ */
282  /* 223 */ ED_UNASSIGNED, /* M-_ */
283  /* 223 */ ED_UNASSIGNED, /* M-` */
284  /* 224 */ ED_UNASSIGNED, /* M-a */
285  /* 225 */ ED_PREV_WORD, /* M-b */
286  /* 226 */ EM_CAPITOL_CASE, /* M-c */
287  /* 227 */ EM_DELETE_NEXT_WORD, /* M-d */
288  /* 228 */ ED_UNASSIGNED, /* M-e */
289  /* 229 */ EM_NEXT_WORD, /* M-f */
290  /* 230 */ ED_UNASSIGNED, /* M-g */
291  /* 231 */ ED_UNASSIGNED, /* M-h */
292  /* 232 */ ED_UNASSIGNED, /* M-i */
293  /* 233 */ ED_UNASSIGNED, /* M-j */
294  /* 234 */ ED_UNASSIGNED, /* M-k */
295  /* 235 */ EM_LOWER_CASE, /* M-l */
296  /* 236 */ ED_UNASSIGNED, /* M-m */
297  /* 237 */ ED_SEARCH_NEXT_HISTORY, /* M-n */
298  /* 238 */ ED_UNASSIGNED, /* M-o */
299  /* 239 */ ED_SEARCH_PREV_HISTORY, /* M-p */
300  /* 240 */ ED_UNASSIGNED, /* M-q */
301  /* 241 */ ED_UNASSIGNED, /* M-r */
302  /* 242 */ ED_UNASSIGNED, /* M-s */
303  /* 243 */ ED_UNASSIGNED, /* M-t */
304  /* 244 */ EM_UPPER_CASE, /* M-u */
305  /* 245 */ ED_UNASSIGNED, /* M-v */
306  /* 246 */ EM_COPY_REGION, /* M-w */
307  /* 247 */ ED_COMMAND, /* M-x */
308  /* 248 */ ED_UNASSIGNED, /* M-y */
309  /* 249 */ ED_UNASSIGNED, /* M-z */
310  /* 250 */ ED_UNASSIGNED, /* M-{ */
311  /* 251 */ ED_UNASSIGNED, /* M-| */
312  /* 252 */ ED_UNASSIGNED, /* M-} */
313  /* 253 */ ED_UNASSIGNED, /* M-~ */
314  /* 254 */ ED_DELETE_PREV_WORD /* M-^? */
315  /* 255 */
316 };
317 
318 
319 /*
320  * keymap table for vi. Each index into above tbl; should be
321  * N_KEYS entries long. Vi mode uses a sticky-extend to do command mode:
322  * insert mode characters are in the normal keymap, and command mode
323  * in the extended keymap.
324  */
325 private const el_action_t el_map_vi_insert[] = {
326 #ifdef KSHVI
327  /* 0 */ ED_UNASSIGNED, /* ^@ */
328  /* 1 */ ED_INSERT, /* ^A */
329  /* 2 */ ED_INSERT, /* ^B */
330  /* 3 */ ED_INSERT, /* ^C */
331  /* 4 */ VI_LIST_OR_EOF, /* ^D */
332  /* 5 */ ED_INSERT, /* ^E */
333  /* 6 */ ED_INSERT, /* ^F */
334  /* 7 */ ED_INSERT, /* ^G */
335  /* 8 */ VI_DELETE_PREV_CHAR, /* ^H */ /* BackSpace key */
336  /* 9 */ ED_INSERT, /* ^I */ /* Tab Key */
337  /* 10 */ ED_NEWLINE, /* ^J */
338  /* 11 */ ED_INSERT, /* ^K */
339  /* 12 */ ED_INSERT, /* ^L */
340  /* 13 */ ED_NEWLINE, /* ^M */
341  /* 14 */ ED_INSERT, /* ^N */
342  /* 15 */ ED_INSERT, /* ^O */
343  /* 16 */ ED_INSERT, /* ^P */
344  /* 17 */ ED_TTY_START_OUTPUT, /* ^Q */
345  /* 18 */ ED_INSERT, /* ^R */
346  /* 19 */ ED_TTY_STOP_OUTPUT, /* ^S */
347  /* 20 */ ED_INSERT, /* ^T */
348  /* 21 */ VI_KILL_LINE_PREV, /* ^U */
349  /* 22 */ ED_QUOTED_INSERT, /* ^V */
350  /* 23 */ ED_DELETE_PREV_WORD, /* ^W */
351  /* ED_DELETE_PREV_WORD: Only until strt edit pos */
352  /* 24 */ ED_INSERT, /* ^X */
353  /* 25 */ ED_INSERT, /* ^Y */
354  /* 26 */ ED_INSERT, /* ^Z */
355  /* 27 */ VI_COMMAND_MODE, /* ^[ */ /* [ Esc ] key */
356  /* 28 */ ED_TTY_SIGQUIT, /* ^\ */
357  /* 29 */ ED_INSERT, /* ^] */
358  /* 30 */ ED_INSERT, /* ^^ */
359  /* 31 */ ED_INSERT, /* ^_ */
360 #else /* !KSHVI */
361  /*
362  * NOTE: These mappings do NOT Correspond well
363  * to the KSH VI editing assignments.
364  * On the other and they are convenient and
365  * many people have have gotten used to them.
366  */
367  /* 0 */ ED_UNASSIGNED, /* ^@ */
368  /* 1 */ ED_MOVE_TO_BEG, /* ^A */
369  /* 2 */ ED_PREV_CHAR, /* ^B */
370  /* 3 */ ED_TTY_SIGINT, /* ^C */
371  /* 4 */ VI_LIST_OR_EOF, /* ^D */
372  /* 5 */ ED_MOVE_TO_END, /* ^E */
373  /* 6 */ ED_NEXT_CHAR, /* ^F */
374  /* 7 */ ED_UNASSIGNED, /* ^G */
375  /* 8 */ VI_DELETE_PREV_CHAR, /* ^H */ /* BackSpace key */
376  /* 9 */ ED_UNASSIGNED, /* ^I */ /* Tab Key */
377  /* 10 */ ED_NEWLINE, /* ^J */
378  /* 11 */ ED_KILL_LINE, /* ^K */
379  /* 12 */ ED_CLEAR_SCREEN, /* ^L */
380  /* 13 */ ED_NEWLINE, /* ^M */
381  /* 14 */ ED_NEXT_HISTORY, /* ^N */
382  /* 15 */ ED_TTY_FLUSH_OUTPUT, /* ^O */
383  /* 16 */ ED_PREV_HISTORY, /* ^P */
384  /* 17 */ ED_TTY_START_OUTPUT, /* ^Q */
385  /* 18 */ ED_REDISPLAY, /* ^R */
386  /* 19 */ ED_TTY_STOP_OUTPUT, /* ^S */
387  /* 20 */ ED_TRANSPOSE_CHARS, /* ^T */
388  /* 21 */ VI_KILL_LINE_PREV, /* ^U */
389  /* 22 */ ED_QUOTED_INSERT, /* ^V */
390  /* 23 */ ED_DELETE_PREV_WORD, /* ^W */
391  /* 24 */ ED_UNASSIGNED, /* ^X */
392  /* 25 */ ED_TTY_DSUSP, /* ^Y */
393  /* 26 */ ED_TTY_SIGTSTP, /* ^Z */
394  /* 27 */ VI_COMMAND_MODE, /* ^[ */
395  /* 28 */ ED_TTY_SIGQUIT, /* ^\ */
396  /* 29 */ ED_UNASSIGNED, /* ^] */
397  /* 30 */ ED_UNASSIGNED, /* ^^ */
398  /* 31 */ ED_UNASSIGNED, /* ^_ */
399 #endif /* KSHVI */
400  /* 32 */ ED_INSERT, /* SPACE */
401  /* 33 */ ED_INSERT, /* ! */
402  /* 34 */ ED_INSERT, /* " */
403  /* 35 */ ED_INSERT, /* # */
404  /* 36 */ ED_INSERT, /* $ */
405  /* 37 */ ED_INSERT, /* % */
406  /* 38 */ ED_INSERT, /* & */
407  /* 39 */ ED_INSERT, /* ' */
408  /* 40 */ ED_INSERT, /* ( */
409  /* 41 */ ED_INSERT, /* ) */
410  /* 42 */ ED_INSERT, /* * */
411  /* 43 */ ED_INSERT, /* + */
412  /* 44 */ ED_INSERT, /* , */
413  /* 45 */ ED_INSERT, /* - */
414  /* 46 */ ED_INSERT, /* . */
415  /* 47 */ ED_INSERT, /* / */
416  /* 48 */ ED_INSERT, /* 0 */
417  /* 49 */ ED_INSERT, /* 1 */
418  /* 50 */ ED_INSERT, /* 2 */
419  /* 51 */ ED_INSERT, /* 3 */
420  /* 52 */ ED_INSERT, /* 4 */
421  /* 53 */ ED_INSERT, /* 5 */
422  /* 54 */ ED_INSERT, /* 6 */
423  /* 55 */ ED_INSERT, /* 7 */
424  /* 56 */ ED_INSERT, /* 8 */
425  /* 57 */ ED_INSERT, /* 9 */
426  /* 58 */ ED_INSERT, /* : */
427  /* 59 */ ED_INSERT, /* ; */
428  /* 60 */ ED_INSERT, /* < */
429  /* 61 */ ED_INSERT, /* = */
430  /* 62 */ ED_INSERT, /* > */
431  /* 63 */ ED_INSERT, /* ? */
432  /* 64 */ ED_INSERT, /* @ */
433  /* 65 */ ED_INSERT, /* A */
434  /* 66 */ ED_INSERT, /* B */
435  /* 67 */ ED_INSERT, /* C */
436  /* 68 */ ED_INSERT, /* D */
437  /* 69 */ ED_INSERT, /* E */
438  /* 70 */ ED_INSERT, /* F */
439  /* 71 */ ED_INSERT, /* G */
440  /* 72 */ ED_INSERT, /* H */
441  /* 73 */ ED_INSERT, /* I */
442  /* 74 */ ED_INSERT, /* J */
443  /* 75 */ ED_INSERT, /* K */
444  /* 76 */ ED_INSERT, /* L */
445  /* 77 */ ED_INSERT, /* M */
446  /* 78 */ ED_INSERT, /* N */
447  /* 79 */ ED_INSERT, /* O */
448  /* 80 */ ED_INSERT, /* P */
449  /* 81 */ ED_INSERT, /* Q */
450  /* 82 */ ED_INSERT, /* R */
451  /* 83 */ ED_INSERT, /* S */
452  /* 84 */ ED_INSERT, /* T */
453  /* 85 */ ED_INSERT, /* U */
454  /* 86 */ ED_INSERT, /* V */
455  /* 87 */ ED_INSERT, /* W */
456  /* 88 */ ED_INSERT, /* X */
457  /* 89 */ ED_INSERT, /* Y */
458  /* 90 */ ED_INSERT, /* Z */
459  /* 91 */ ED_INSERT, /* [ */
460  /* 92 */ ED_INSERT, /* \ */
461  /* 93 */ ED_INSERT, /* ] */
462  /* 94 */ ED_INSERT, /* ^ */
463  /* 95 */ ED_INSERT, /* _ */
464  /* 96 */ ED_INSERT, /* ` */
465  /* 97 */ ED_INSERT, /* a */
466  /* 98 */ ED_INSERT, /* b */
467  /* 99 */ ED_INSERT, /* c */
468  /* 100 */ ED_INSERT, /* d */
469  /* 101 */ ED_INSERT, /* e */
470  /* 102 */ ED_INSERT, /* f */
471  /* 103 */ ED_INSERT, /* g */
472  /* 104 */ ED_INSERT, /* h */
473  /* 105 */ ED_INSERT, /* i */
474  /* 106 */ ED_INSERT, /* j */
475  /* 107 */ ED_INSERT, /* k */
476  /* 108 */ ED_INSERT, /* l */
477  /* 109 */ ED_INSERT, /* m */
478  /* 110 */ ED_INSERT, /* n */
479  /* 111 */ ED_INSERT, /* o */
480  /* 112 */ ED_INSERT, /* p */
481  /* 113 */ ED_INSERT, /* q */
482  /* 114 */ ED_INSERT, /* r */
483  /* 115 */ ED_INSERT, /* s */
484  /* 116 */ ED_INSERT, /* t */
485  /* 117 */ ED_INSERT, /* u */
486  /* 118 */ ED_INSERT, /* v */
487  /* 119 */ ED_INSERT, /* w */
488  /* 120 */ ED_INSERT, /* x */
489  /* 121 */ ED_INSERT, /* y */
490  /* 122 */ ED_INSERT, /* z */
491  /* 123 */ ED_INSERT, /* { */
492  /* 124 */ ED_INSERT, /* | */
493  /* 125 */ ED_INSERT, /* } */
494  /* 126 */ ED_INSERT, /* ~ */
495  /* 127 */ VI_DELETE_PREV_CHAR, /* ^? */
496  /* 128 */ ED_INSERT, /* M-^@ */
497  /* 129 */ ED_INSERT, /* M-^A */
498  /* 130 */ ED_INSERT, /* M-^B */
499  /* 131 */ ED_INSERT, /* M-^C */
500  /* 132 */ ED_INSERT, /* M-^D */
501  /* 133 */ ED_INSERT, /* M-^E */
502  /* 134 */ ED_INSERT, /* M-^F */
503  /* 135 */ ED_INSERT, /* M-^G */
504  /* 136 */ ED_INSERT, /* M-^H */
505  /* 137 */ ED_INSERT, /* M-^I */
506  /* 138 */ ED_INSERT, /* M-^J */
507  /* 139 */ ED_INSERT, /* M-^K */
508  /* 140 */ ED_INSERT, /* M-^L */
509  /* 141 */ ED_INSERT, /* M-^M */
510  /* 142 */ ED_INSERT, /* M-^N */
511  /* 143 */ ED_INSERT, /* M-^O */
512  /* 144 */ ED_INSERT, /* M-^P */
513  /* 145 */ ED_INSERT, /* M-^Q */
514  /* 146 */ ED_INSERT, /* M-^R */
515  /* 147 */ ED_INSERT, /* M-^S */
516  /* 148 */ ED_INSERT, /* M-^T */
517  /* 149 */ ED_INSERT, /* M-^U */
518  /* 150 */ ED_INSERT, /* M-^V */
519  /* 151 */ ED_INSERT, /* M-^W */
520  /* 152 */ ED_INSERT, /* M-^X */
521  /* 153 */ ED_INSERT, /* M-^Y */
522  /* 154 */ ED_INSERT, /* M-^Z */
523  /* 155 */ ED_INSERT, /* M-^[ */
524  /* 156 */ ED_INSERT, /* M-^\ */
525  /* 157 */ ED_INSERT, /* M-^] */
526  /* 158 */ ED_INSERT, /* M-^^ */
527  /* 159 */ ED_INSERT, /* M-^_ */
528  /* 160 */ ED_INSERT, /* M-SPACE */
529  /* 161 */ ED_INSERT, /* M-! */
530  /* 162 */ ED_INSERT, /* M-" */
531  /* 163 */ ED_INSERT, /* M-# */
532  /* 164 */ ED_INSERT, /* M-$ */
533  /* 165 */ ED_INSERT, /* M-% */
534  /* 166 */ ED_INSERT, /* M-& */
535  /* 167 */ ED_INSERT, /* M-' */
536  /* 168 */ ED_INSERT, /* M-( */
537  /* 169 */ ED_INSERT, /* M-) */
538  /* 170 */ ED_INSERT, /* M-* */
539  /* 171 */ ED_INSERT, /* M-+ */
540  /* 172 */ ED_INSERT, /* M-, */
541  /* 173 */ ED_INSERT, /* M-- */
542  /* 174 */ ED_INSERT, /* M-. */
543  /* 175 */ ED_INSERT, /* M-/ */
544  /* 176 */ ED_INSERT, /* M-0 */
545  /* 177 */ ED_INSERT, /* M-1 */
546  /* 178 */ ED_INSERT, /* M-2 */
547  /* 179 */ ED_INSERT, /* M-3 */
548  /* 180 */ ED_INSERT, /* M-4 */
549  /* 181 */ ED_INSERT, /* M-5 */
550  /* 182 */ ED_INSERT, /* M-6 */
551  /* 183 */ ED_INSERT, /* M-7 */
552  /* 184 */ ED_INSERT, /* M-8 */
553  /* 185 */ ED_INSERT, /* M-9 */
554  /* 186 */ ED_INSERT, /* M-: */
555  /* 187 */ ED_INSERT, /* M-; */
556  /* 188 */ ED_INSERT, /* M-< */
557  /* 189 */ ED_INSERT, /* M-= */
558  /* 190 */ ED_INSERT, /* M-> */
559  /* 191 */ ED_INSERT, /* M-? */
560  /* 192 */ ED_INSERT, /* M-@ */
561  /* 193 */ ED_INSERT, /* M-A */
562  /* 194 */ ED_INSERT, /* M-B */
563  /* 195 */ ED_INSERT, /* M-C */
564  /* 196 */ ED_INSERT, /* M-D */
565  /* 197 */ ED_INSERT, /* M-E */
566  /* 198 */ ED_INSERT, /* M-F */
567  /* 199 */ ED_INSERT, /* M-G */
568  /* 200 */ ED_INSERT, /* M-H */
569  /* 201 */ ED_INSERT, /* M-I */
570  /* 202 */ ED_INSERT, /* M-J */
571  /* 203 */ ED_INSERT, /* M-K */
572  /* 204 */ ED_INSERT, /* M-L */
573  /* 205 */ ED_INSERT, /* M-M */
574  /* 206 */ ED_INSERT, /* M-N */
575  /* 207 */ ED_INSERT, /* M-O */
576  /* 208 */ ED_INSERT, /* M-P */
577  /* 209 */ ED_INSERT, /* M-Q */
578  /* 210 */ ED_INSERT, /* M-R */
579  /* 211 */ ED_INSERT, /* M-S */
580  /* 212 */ ED_INSERT, /* M-T */
581  /* 213 */ ED_INSERT, /* M-U */
582  /* 214 */ ED_INSERT, /* M-V */
583  /* 215 */ ED_INSERT, /* M-W */
584  /* 216 */ ED_INSERT, /* M-X */
585  /* 217 */ ED_INSERT, /* M-Y */
586  /* 218 */ ED_INSERT, /* M-Z */
587  /* 219 */ ED_INSERT, /* M-[ */
588  /* 220 */ ED_INSERT, /* M-\ */
589  /* 221 */ ED_INSERT, /* M-] */
590  /* 222 */ ED_INSERT, /* M-^ */
591  /* 223 */ ED_INSERT, /* M-_ */
592  /* 224 */ ED_INSERT, /* M-` */
593  /* 225 */ ED_INSERT, /* M-a */
594  /* 226 */ ED_INSERT, /* M-b */
595  /* 227 */ ED_INSERT, /* M-c */
596  /* 228 */ ED_INSERT, /* M-d */
597  /* 229 */ ED_INSERT, /* M-e */
598  /* 230 */ ED_INSERT, /* M-f */
599  /* 231 */ ED_INSERT, /* M-g */
600  /* 232 */ ED_INSERT, /* M-h */
601  /* 233 */ ED_INSERT, /* M-i */
602  /* 234 */ ED_INSERT, /* M-j */
603  /* 235 */ ED_INSERT, /* M-k */
604  /* 236 */ ED_INSERT, /* M-l */
605  /* 237 */ ED_INSERT, /* M-m */
606  /* 238 */ ED_INSERT, /* M-n */
607  /* 239 */ ED_INSERT, /* M-o */
608  /* 240 */ ED_INSERT, /* M-p */
609  /* 241 */ ED_INSERT, /* M-q */
610  /* 242 */ ED_INSERT, /* M-r */
611  /* 243 */ ED_INSERT, /* M-s */
612  /* 244 */ ED_INSERT, /* M-t */
613  /* 245 */ ED_INSERT, /* M-u */
614  /* 246 */ ED_INSERT, /* M-v */
615  /* 247 */ ED_INSERT, /* M-w */
616  /* 248 */ ED_INSERT, /* M-x */
617  /* 249 */ ED_INSERT, /* M-y */
618  /* 250 */ ED_INSERT, /* M-z */
619  /* 251 */ ED_INSERT, /* M-{ */
620  /* 252 */ ED_INSERT, /* M-| */
621  /* 253 */ ED_INSERT, /* M-} */
622  /* 254 */ ED_INSERT, /* M-~ */
623  /* 255 */ ED_INSERT /* M-^? */
624 };
625 
626 private const el_action_t el_map_vi_command[] = {
627  /* 0 */ ED_UNASSIGNED, /* ^@ */
628  /* 1 */ ED_MOVE_TO_BEG, /* ^A */
629  /* 2 */ ED_UNASSIGNED, /* ^B */
630  /* 3 */ ED_TTY_SIGINT, /* ^C */
631  /* 4 */ ED_UNASSIGNED, /* ^D */
632  /* 5 */ ED_MOVE_TO_END, /* ^E */
633  /* 6 */ ED_UNASSIGNED, /* ^F */
634  /* 7 */ ED_UNASSIGNED, /* ^G */
635  /* 8 */ ED_DELETE_PREV_CHAR, /* ^H */
636  /* 9 */ ED_UNASSIGNED, /* ^I */
637  /* 10 */ ED_NEWLINE, /* ^J */
638  /* 11 */ ED_KILL_LINE, /* ^K */
639  /* 12 */ ED_CLEAR_SCREEN, /* ^L */
640  /* 13 */ ED_NEWLINE, /* ^M */
641  /* 14 */ ED_NEXT_HISTORY, /* ^N */
642  /* 15 */ ED_TTY_FLUSH_OUTPUT, /* ^O */
643  /* 16 */ ED_PREV_HISTORY, /* ^P */
644  /* 17 */ ED_TTY_START_OUTPUT, /* ^Q */
645  /* 18 */ ED_REDISPLAY, /* ^R */
646  /* 19 */ ED_TTY_STOP_OUTPUT, /* ^S */
647  /* 20 */ ED_UNASSIGNED, /* ^T */
648  /* 21 */ VI_KILL_LINE_PREV, /* ^U */
649  /* 22 */ ED_UNASSIGNED, /* ^V */
650  /* 23 */ ED_DELETE_PREV_WORD, /* ^W */
651  /* 24 */ ED_UNASSIGNED, /* ^X */
652  /* 25 */ ED_UNASSIGNED, /* ^Y */
653  /* 26 */ ED_UNASSIGNED, /* ^Z */
654  /* 27 */ EM_META_NEXT, /* ^[ */
655  /* 28 */ ED_TTY_SIGQUIT, /* ^\ */
656  /* 29 */ ED_UNASSIGNED, /* ^] */
657  /* 30 */ ED_UNASSIGNED, /* ^^ */
658  /* 31 */ ED_UNASSIGNED, /* ^_ */
659  /* 32 */ ED_NEXT_CHAR, /* SPACE */
660  /* 33 */ ED_UNASSIGNED, /* ! */
661  /* 34 */ ED_UNASSIGNED, /* " */
662  /* 35 */ VI_COMMENT_OUT, /* # */
663  /* 36 */ ED_MOVE_TO_END, /* $ */
664  /* 37 */ VI_MATCH, /* % */
665  /* 38 */ ED_UNASSIGNED, /* & */
666  /* 39 */ ED_UNASSIGNED, /* ' */
667  /* 40 */ ED_UNASSIGNED, /* ( */
668  /* 41 */ ED_UNASSIGNED, /* ) */
669  /* 42 */ ED_UNASSIGNED, /* * */
670  /* 43 */ ED_NEXT_HISTORY, /* + */
671  /* 44 */ VI_REPEAT_PREV_CHAR, /* , */
672  /* 45 */ ED_PREV_HISTORY, /* - */
673  /* 46 */ VI_REDO, /* . */
674  /* 47 */ VI_SEARCH_PREV, /* / */
675  /* 48 */ VI_ZERO, /* 0 */
676  /* 49 */ ED_ARGUMENT_DIGIT, /* 1 */
677  /* 50 */ ED_ARGUMENT_DIGIT, /* 2 */
678  /* 51 */ ED_ARGUMENT_DIGIT, /* 3 */
679  /* 52 */ ED_ARGUMENT_DIGIT, /* 4 */
680  /* 53 */ ED_ARGUMENT_DIGIT, /* 5 */
681  /* 54 */ ED_ARGUMENT_DIGIT, /* 6 */
682  /* 55 */ ED_ARGUMENT_DIGIT, /* 7 */
683  /* 56 */ ED_ARGUMENT_DIGIT, /* 8 */
684  /* 57 */ ED_ARGUMENT_DIGIT, /* 9 */
685  /* 58 */ ED_COMMAND, /* : */
686  /* 59 */ VI_REPEAT_NEXT_CHAR, /* ; */
687  /* 60 */ ED_UNASSIGNED, /* < */
688  /* 61 */ ED_UNASSIGNED, /* = */
689  /* 62 */ ED_UNASSIGNED, /* > */
690  /* 63 */ VI_SEARCH_NEXT, /* ? */
691  /* 64 */ VI_ALIAS, /* @ */
692  /* 65 */ VI_ADD_AT_EOL, /* A */
693  /* 66 */ VI_PREV_BIG_WORD, /* B */
694  /* 67 */ VI_CHANGE_TO_EOL, /* C */
695  /* 68 */ ED_KILL_LINE, /* D */
696  /* 69 */ VI_END_BIG_WORD, /* E */
697  /* 70 */ VI_PREV_CHAR, /* F */
698  /* 71 */ VI_TO_HISTORY_LINE, /* G */
699  /* 72 */ ED_UNASSIGNED, /* H */
700  /* 73 */ VI_INSERT_AT_BOL, /* I */
701  /* 74 */ ED_SEARCH_NEXT_HISTORY, /* J */
702  /* 75 */ ED_SEARCH_PREV_HISTORY, /* K */
703  /* 76 */ ED_UNASSIGNED, /* L */
704  /* 77 */ ED_UNASSIGNED, /* M */
705  /* 78 */ VI_REPEAT_SEARCH_PREV, /* N */
706  /* 79 */ ED_SEQUENCE_LEAD_IN, /* O */
707  /* 80 */ VI_PASTE_PREV, /* P */
708  /* 81 */ ED_UNASSIGNED, /* Q */
709  /* 82 */ VI_REPLACE_MODE, /* R */
710  /* 83 */ VI_SUBSTITUTE_LINE, /* S */
711  /* 84 */ VI_TO_PREV_CHAR, /* T */
712  /* 85 */ VI_UNDO_LINE, /* U */
713  /* 86 */ ED_UNASSIGNED, /* V */
714  /* 87 */ VI_NEXT_BIG_WORD, /* W */
715  /* 88 */ ED_DELETE_PREV_CHAR, /* X */
716  /* 89 */ VI_YANK_END, /* Y */
717  /* 90 */ ED_UNASSIGNED, /* Z */
718  /* 91 */ ED_SEQUENCE_LEAD_IN, /* [ */
719  /* 92 */ ED_UNASSIGNED, /* \ */
720  /* 93 */ ED_UNASSIGNED, /* ] */
721  /* 94 */ ED_MOVE_TO_BEG, /* ^ */
722  /* 95 */ VI_HISTORY_WORD, /* _ */
723  /* 96 */ ED_UNASSIGNED, /* ` */
724  /* 97 */ VI_ADD, /* a */
725  /* 98 */ VI_PREV_WORD, /* b */
726  /* 99 */ VI_CHANGE_META, /* c */
727  /* 100 */ VI_DELETE_META, /* d */
728  /* 101 */ VI_END_WORD, /* e */
729  /* 102 */ VI_NEXT_CHAR, /* f */
730  /* 103 */ ED_UNASSIGNED, /* g */
731  /* 104 */ ED_PREV_CHAR, /* h */
732  /* 105 */ VI_INSERT, /* i */
733  /* 106 */ ED_NEXT_HISTORY, /* j */
734  /* 107 */ ED_PREV_HISTORY, /* k */
735  /* 108 */ ED_NEXT_CHAR, /* l */
736  /* 109 */ ED_UNASSIGNED, /* m */
737  /* 110 */ VI_REPEAT_SEARCH_NEXT, /* n */
738  /* 111 */ ED_UNASSIGNED, /* o */
739  /* 112 */ VI_PASTE_NEXT, /* p */
740  /* 113 */ ED_UNASSIGNED, /* q */
741  /* 114 */ VI_REPLACE_CHAR, /* r */
742  /* 115 */ VI_SUBSTITUTE_CHAR, /* s */
743  /* 116 */ VI_TO_NEXT_CHAR, /* t */
744  /* 117 */ VI_UNDO, /* u */
745  /* 118 */ VI_HISTEDIT, /* v */
746  /* 119 */ VI_NEXT_WORD, /* w */
747  /* 120 */ ED_DELETE_NEXT_CHAR, /* x */
748  /* 121 */ VI_YANK, /* y */
749  /* 122 */ ED_UNASSIGNED, /* z */
750  /* 123 */ ED_UNASSIGNED, /* { */
751  /* 124 */ VI_TO_COLUMN, /* | */
752  /* 125 */ ED_UNASSIGNED, /* } */
753  /* 126 */ VI_CHANGE_CASE, /* ~ */
754  /* 127 */ ED_DELETE_PREV_CHAR, /* ^? */
755  /* 128 */ ED_UNASSIGNED, /* M-^@ */
756  /* 129 */ ED_UNASSIGNED, /* M-^A */
757  /* 130 */ ED_UNASSIGNED, /* M-^B */
758  /* 131 */ ED_UNASSIGNED, /* M-^C */
759  /* 132 */ ED_UNASSIGNED, /* M-^D */
760  /* 133 */ ED_UNASSIGNED, /* M-^E */
761  /* 134 */ ED_UNASSIGNED, /* M-^F */
762  /* 135 */ ED_UNASSIGNED, /* M-^G */
763  /* 136 */ ED_UNASSIGNED, /* M-^H */
764  /* 137 */ ED_UNASSIGNED, /* M-^I */
765  /* 138 */ ED_UNASSIGNED, /* M-^J */
766  /* 139 */ ED_UNASSIGNED, /* M-^K */
767  /* 140 */ ED_UNASSIGNED, /* M-^L */
768  /* 141 */ ED_UNASSIGNED, /* M-^M */
769  /* 142 */ ED_UNASSIGNED, /* M-^N */
770  /* 143 */ ED_UNASSIGNED, /* M-^O */
771  /* 144 */ ED_UNASSIGNED, /* M-^P */
772  /* 145 */ ED_UNASSIGNED, /* M-^Q */
773  /* 146 */ ED_UNASSIGNED, /* M-^R */
774  /* 147 */ ED_UNASSIGNED, /* M-^S */
775  /* 148 */ ED_UNASSIGNED, /* M-^T */
776  /* 149 */ ED_UNASSIGNED, /* M-^U */
777  /* 150 */ ED_UNASSIGNED, /* M-^V */
778  /* 151 */ ED_UNASSIGNED, /* M-^W */
779  /* 152 */ ED_UNASSIGNED, /* M-^X */
780  /* 153 */ ED_UNASSIGNED, /* M-^Y */
781  /* 154 */ ED_UNASSIGNED, /* M-^Z */
782  /* 155 */ ED_UNASSIGNED, /* M-^[ */
783  /* 156 */ ED_UNASSIGNED, /* M-^\ */
784  /* 157 */ ED_UNASSIGNED, /* M-^] */
785  /* 158 */ ED_UNASSIGNED, /* M-^^ */
786  /* 159 */ ED_UNASSIGNED, /* M-^_ */
787  /* 160 */ ED_UNASSIGNED, /* M-SPACE */
788  /* 161 */ ED_UNASSIGNED, /* M-! */
789  /* 162 */ ED_UNASSIGNED, /* M-" */
790  /* 163 */ ED_UNASSIGNED, /* M-# */
791  /* 164 */ ED_UNASSIGNED, /* M-$ */
792  /* 165 */ ED_UNASSIGNED, /* M-% */
793  /* 166 */ ED_UNASSIGNED, /* M-& */
794  /* 167 */ ED_UNASSIGNED, /* M-' */
795  /* 168 */ ED_UNASSIGNED, /* M-( */
796  /* 169 */ ED_UNASSIGNED, /* M-) */
797  /* 170 */ ED_UNASSIGNED, /* M-* */
798  /* 171 */ ED_UNASSIGNED, /* M-+ */
799  /* 172 */ ED_UNASSIGNED, /* M-, */
800  /* 173 */ ED_UNASSIGNED, /* M-- */
801  /* 174 */ ED_UNASSIGNED, /* M-. */
802  /* 175 */ ED_UNASSIGNED, /* M-/ */
803  /* 176 */ ED_UNASSIGNED, /* M-0 */
804  /* 177 */ ED_UNASSIGNED, /* M-1 */
805  /* 178 */ ED_UNASSIGNED, /* M-2 */
806  /* 179 */ ED_UNASSIGNED, /* M-3 */
807  /* 180 */ ED_UNASSIGNED, /* M-4 */
808  /* 181 */ ED_UNASSIGNED, /* M-5 */
809  /* 182 */ ED_UNASSIGNED, /* M-6 */
810  /* 183 */ ED_UNASSIGNED, /* M-7 */
811  /* 184 */ ED_UNASSIGNED, /* M-8 */
812  /* 185 */ ED_UNASSIGNED, /* M-9 */
813  /* 186 */ ED_UNASSIGNED, /* M-: */
814  /* 187 */ ED_UNASSIGNED, /* M-; */
815  /* 188 */ ED_UNASSIGNED, /* M-< */
816  /* 189 */ ED_UNASSIGNED, /* M-= */
817  /* 190 */ ED_UNASSIGNED, /* M-> */
818  /* 191 */ ED_UNASSIGNED, /* M-? */
819  /* 192 */ ED_UNASSIGNED, /* M-@ */
820  /* 193 */ ED_UNASSIGNED, /* M-A */
821  /* 194 */ ED_UNASSIGNED, /* M-B */
822  /* 195 */ ED_UNASSIGNED, /* M-C */
823  /* 196 */ ED_UNASSIGNED, /* M-D */
824  /* 197 */ ED_UNASSIGNED, /* M-E */
825  /* 198 */ ED_UNASSIGNED, /* M-F */
826  /* 199 */ ED_UNASSIGNED, /* M-G */
827  /* 200 */ ED_UNASSIGNED, /* M-H */
828  /* 201 */ ED_UNASSIGNED, /* M-I */
829  /* 202 */ ED_UNASSIGNED, /* M-J */
830  /* 203 */ ED_UNASSIGNED, /* M-K */
831  /* 204 */ ED_UNASSIGNED, /* M-L */
832  /* 205 */ ED_UNASSIGNED, /* M-M */
833  /* 206 */ ED_UNASSIGNED, /* M-N */
834  /* 207 */ ED_SEQUENCE_LEAD_IN, /* M-O */
835  /* 208 */ ED_UNASSIGNED, /* M-P */
836  /* 209 */ ED_UNASSIGNED, /* M-Q */
837  /* 210 */ ED_UNASSIGNED, /* M-R */
838  /* 211 */ ED_UNASSIGNED, /* M-S */
839  /* 212 */ ED_UNASSIGNED, /* M-T */
840  /* 213 */ ED_UNASSIGNED, /* M-U */
841  /* 214 */ ED_UNASSIGNED, /* M-V */
842  /* 215 */ ED_UNASSIGNED, /* M-W */
843  /* 216 */ ED_UNASSIGNED, /* M-X */
844  /* 217 */ ED_UNASSIGNED, /* M-Y */
845  /* 218 */ ED_UNASSIGNED, /* M-Z */
846  /* 219 */ ED_SEQUENCE_LEAD_IN, /* M-[ */
847  /* 220 */ ED_UNASSIGNED, /* M-\ */
848  /* 221 */ ED_UNASSIGNED, /* M-] */
849  /* 222 */ ED_UNASSIGNED, /* M-^ */
850  /* 223 */ ED_UNASSIGNED, /* M-_ */
851  /* 224 */ ED_UNASSIGNED, /* M-` */
852  /* 225 */ ED_UNASSIGNED, /* M-a */
853  /* 226 */ ED_UNASSIGNED, /* M-b */
854  /* 227 */ ED_UNASSIGNED, /* M-c */
855  /* 228 */ ED_UNASSIGNED, /* M-d */
856  /* 229 */ ED_UNASSIGNED, /* M-e */
857  /* 230 */ ED_UNASSIGNED, /* M-f */
858  /* 231 */ ED_UNASSIGNED, /* M-g */
859  /* 232 */ ED_UNASSIGNED, /* M-h */
860  /* 233 */ ED_UNASSIGNED, /* M-i */
861  /* 234 */ ED_UNASSIGNED, /* M-j */
862  /* 235 */ ED_UNASSIGNED, /* M-k */
863  /* 236 */ ED_UNASSIGNED, /* M-l */
864  /* 237 */ ED_UNASSIGNED, /* M-m */
865  /* 238 */ ED_UNASSIGNED, /* M-n */
866  /* 239 */ ED_UNASSIGNED, /* M-o */
867  /* 240 */ ED_UNASSIGNED, /* M-p */
868  /* 241 */ ED_UNASSIGNED, /* M-q */
869  /* 242 */ ED_UNASSIGNED, /* M-r */
870  /* 243 */ ED_UNASSIGNED, /* M-s */
871  /* 244 */ ED_UNASSIGNED, /* M-t */
872  /* 245 */ ED_UNASSIGNED, /* M-u */
873  /* 246 */ ED_UNASSIGNED, /* M-v */
874  /* 247 */ ED_UNASSIGNED, /* M-w */
875  /* 248 */ ED_UNASSIGNED, /* M-x */
876  /* 249 */ ED_UNASSIGNED, /* M-y */
877  /* 250 */ ED_UNASSIGNED, /* M-z */
878  /* 251 */ ED_UNASSIGNED, /* M-{ */
879  /* 252 */ ED_UNASSIGNED, /* M-| */
880  /* 253 */ ED_UNASSIGNED, /* M-} */
881  /* 254 */ ED_UNASSIGNED, /* M-~ */
882  /* 255 */ ED_UNASSIGNED /* M-^? */
883 };
884 
885 
886 /* map_init():
887  * Initialize and allocate the maps
888  */
889 protected int
890 map_init(EditLine *el)
891 {
892 
893  /*
894  * Make sure those are correct before starting.
895  */
896 #ifdef MAP_DEBUG
897  if (sizeof(el_map_emacs) != N_KEYS * sizeof(el_action_t))
898  EL_ABORT((el->errfile, "Emacs map incorrect\n"));
899  if (sizeof(el_map_vi_command) != N_KEYS * sizeof(el_action_t))
900  EL_ABORT((el->errfile, "Vi command map incorrect\n"));
901  if (sizeof(el_map_vi_insert) != N_KEYS * sizeof(el_action_t))
902  EL_ABORT((el->errfile, "Vi insert map incorrect\n"));
903 #endif
904 
905  el->el_map.alt = el_malloc(sizeof(*el->el_map.alt) * N_KEYS);
906  if (el->el_map.alt == NULL)
907  return -1;
908  el->el_map.key = el_malloc(sizeof(*el->el_map.key) * N_KEYS);
909  if (el->el_map.key == NULL)
910  return -1;
911  el->el_map.emacs = el_map_emacs;
912  el->el_map.vic = el_map_vi_command;
913  el->el_map.vii = el_map_vi_insert;
914  el->el_map.help = el_malloc(sizeof(*el->el_map.help) * EL_NUM_FCNS);
915  if (el->el_map.help == NULL)
916  return -1;
917  (void) memcpy(el->el_map.help, help__get(),
918  sizeof(*el->el_map.help) * EL_NUM_FCNS);
919  el->el_map.func = el_malloc(sizeof(*el->el_map.func) * EL_NUM_FCNS);
920  if (el->el_map.func == NULL)
921  return -1;
922  memcpy(el->el_map.func, func__get(), sizeof(*el->el_map.func)
923  * EL_NUM_FCNS);
924  el->el_map.nfunc = EL_NUM_FCNS;
925 
926 #ifdef VIDEFAULT
927  map_init_vi(el);
928 #else
929  map_init_emacs(el);
930 #endif /* VIDEFAULT */
931  return 0;
932 }
933 
934 
935 /* map_end():
936  * Free the space taken by the editor maps
937  */
938 protected void
939 map_end(EditLine *el)
940 {
941 
942  el_free(el->el_map.alt);
943  el->el_map.alt = NULL;
944  el_free(el->el_map.key);
945  el->el_map.key = NULL;
946  el->el_map.emacs = NULL;
947  el->el_map.vic = NULL;
948  el->el_map.vii = NULL;
949  el_free(el->el_map.help);
950  el->el_map.help = NULL;
951  el_free(el->el_map.func);
952  el->el_map.func = NULL;
953 }
954 
955 
956 /* map_init_nls():
957  * Find all the printable keys and bind them to self insert
958  */
959 private void
960 map_init_nls(EditLine *el)
961 {
962  int i;
963 
964  el_action_t *map = el->el_map.key;
965 
966  for (i = 0200; i <= 0377; i++)
967  if (Isprint(i))
968  map[i] = ED_INSERT;
969 }
970 
971 
972 /* map_init_meta():
973  * Bind all the meta keys to the appropriate ESC-<key> sequence
974  */
975 private void
976 map_init_meta(EditLine *el)
977 {
978  Char buf[3];
979  int i;
980  el_action_t *map = el->el_map.key;
981  el_action_t *alt = el->el_map.alt;
982 
983  for (i = 0; i <= 0377 && map[i] != EM_META_NEXT; i++)
984  continue;
985 
986  if (i > 0377) {
987  for (i = 0; i <= 0377 && alt[i] != EM_META_NEXT; i++)
988  continue;
989  if (i > 0377) {
990  i = 033;
991  if (el->el_map.type == MAP_VI)
992  map = alt;
993  } else
994  map = alt;
995  }
996  buf[0] = (Char) i;
997  buf[2] = 0;
998  for (i = 0200; i <= 0377; i++)
999  switch (map[i]) {
1000  case ED_INSERT:
1001  case ED_UNASSIGNED:
1002  case ED_SEQUENCE_LEAD_IN:
1003  break;
1004  default:
1005  buf[1] = i & 0177;
1006  keymacro_add(el, buf, keymacro_map_cmd(el, (int) map[i]), XK_CMD);
1007  break;
1008  }
1009  map[(int) buf[0]] = ED_SEQUENCE_LEAD_IN;
1010 }
1011 
1012 
1013 /* map_init_vi():
1014  * Initialize the vi bindings
1015  */
1016 protected void
1017 map_init_vi(EditLine *el)
1018 {
1019  int i;
1020  el_action_t *key = el->el_map.key;
1021  el_action_t *alt = el->el_map.alt;
1022  const el_action_t *vii = el->el_map.vii;
1023  const el_action_t *vic = el->el_map.vic;
1024 
1025  el->el_map.type = MAP_VI;
1026  el->el_map.current = el->el_map.key;
1027 
1028  keymacro_reset(el);
1029 
1030  for (i = 0; i < N_KEYS; i++) {
1031  key[i] = vii[i];
1032  alt[i] = vic[i];
1033  }
1034 
1035  map_init_meta(el);
1036  map_init_nls(el);
1037 
1038  tty_bind_char(el, 1);
1039  terminal_bind_arrow(el);
1040 }
1041 
1042 
1043 /* map_init_emacs():
1044  * Initialize the emacs bindings
1045  */
1046 protected void
1047 map_init_emacs(EditLine *el)
1048 {
1049  int i;
1050  Char buf[3];
1051  el_action_t *key = el->el_map.key;
1052  el_action_t *alt = el->el_map.alt;
1053  const el_action_t *emacs = el->el_map.emacs;
1054 
1055  el->el_map.type = MAP_EMACS;
1056  el->el_map.current = el->el_map.key;
1057  keymacro_reset(el);
1058 
1059  for (i = 0; i < N_KEYS; i++) {
1060  key[i] = emacs[i];
1061  alt[i] = ED_UNASSIGNED;
1062  }
1063 
1064  map_init_meta(el);
1065  map_init_nls(el);
1066 
1067  buf[0] = CONTROL('X');
1068  buf[1] = CONTROL('X');
1069  buf[2] = 0;
1070  keymacro_add(el, buf, keymacro_map_cmd(el, EM_EXCHANGE_MARK), XK_CMD);
1071 
1072  tty_bind_char(el, 1);
1073  terminal_bind_arrow(el);
1074 }
1075 
1076 
1077 /* map_set_editor():
1078  * Set the editor
1079  */
1080 protected int
1081 map_set_editor(EditLine *el, Char *editor)
1082 {
1083 
1084  if (Strcmp(editor, STR("emacs")) == 0) {
1085  map_init_emacs(el);
1086  return 0;
1087  }
1088  if (Strcmp(editor, STR("vi")) == 0) {
1089  map_init_vi(el);
1090  return 0;
1091  }
1092  return -1;
1093 }
1094 
1095 
1096 /* map_get_editor():
1097  * Retrieve the editor
1098  */
1099 protected int
1100 map_get_editor(EditLine *el, const Char **editor)
1101 {
1102 
1103  if (editor == NULL)
1104  return -1;
1105  switch (el->el_map.type) {
1106  case MAP_EMACS:
1107  *editor = STR("emacs");
1108  return 0;
1109  case MAP_VI:
1110  *editor = STR("vi");
1111  return 0;
1112  }
1113  return -1;
1114 }
1115 
1116 
1117 /* map_print_key():
1118  * Print the function description for 1 key
1119  */
1120 private void
1121 map_print_key(EditLine *el, el_action_t *map, const Char *in)
1122 {
1123  char outbuf[EL_BUFSIZ];
1124  el_bindings_t *bp, *ep;
1125 
1126  if (in[0] == '\0' || in[1] == '\0') {
1127  (void) keymacro__decode_str(in, outbuf, sizeof(outbuf), "");
1128  ep = &el->el_map.help[el->el_map.nfunc];
1129  for (bp = el->el_map.help; bp < ep; bp++)
1130  if (bp->func == map[(unsigned char) *in]) {
1131  (void) fprintf(el->el_outfile,
1132  "%s\t->\t" FSTR "\n", outbuf, bp->name);
1133  return;
1134  }
1135  } else
1136  keymacro_print(el, in);
1137 }
1138 
1139 
1140 /* map_print_some_keys():
1141  * Print keys from first to last
1142  */
1143 private void
1144 map_print_some_keys(EditLine *el, el_action_t *map, Int first, Int last)
1145 {
1146  el_bindings_t *bp, *ep;
1147  Char firstbuf[2], lastbuf[2];
1148  char unparsbuf[EL_BUFSIZ], extrabuf[EL_BUFSIZ];
1149 
1150  firstbuf[0] = first;
1151  firstbuf[1] = 0;
1152  lastbuf[0] = last;
1153  lastbuf[1] = 0;
1154  if (map[first] == ED_UNASSIGNED) {
1155  if (first == last) {
1156  (void) keymacro__decode_str(firstbuf, unparsbuf,
1157  sizeof(unparsbuf), STRQQ);
1158  (void) fprintf(el->el_outfile,
1159  "%-15s-> is undefined\n", unparsbuf);
1160  }
1161  return;
1162  }
1163  ep = &el->el_map.help[el->el_map.nfunc];
1164  for (bp = el->el_map.help; bp < ep; bp++) {
1165  if (bp->func == map[first]) {
1166  if (first == last) {
1167  (void) keymacro__decode_str(firstbuf, unparsbuf,
1168  sizeof(unparsbuf), STRQQ);
1169  (void) fprintf(el->el_outfile, "%-15s-> " FSTR "\n",
1170  unparsbuf, bp->name);
1171  } else {
1172  (void) keymacro__decode_str(firstbuf, unparsbuf,
1173  sizeof(unparsbuf), STRQQ);
1174  (void) keymacro__decode_str(lastbuf, extrabuf,
1175  sizeof(extrabuf), STRQQ);
1176  (void) fprintf(el->el_outfile,
1177  "%-4s to %-7s-> " FSTR "\n",
1178  unparsbuf, extrabuf, bp->name);
1179  }
1180  return;
1181  }
1182  }
1183 #ifdef MAP_DEBUG
1184  if (map == el->el_map.key) {
1185  (void) keymacro__decode_str(firstbuf, unparsbuf,
1186  sizeof(unparsbuf), STRQQ);
1187  (void) fprintf(el->el_outfile,
1188  "BUG!!! %s isn't bound to anything.\n", unparsbuf);
1189  (void) fprintf(el->el_outfile, "el->el_map.key[%d] == %d\n",
1190  first, el->el_map.key[first]);
1191  } else {
1192  (void) keymacro__decode_str(firstbuf, unparsbuf,
1193  sizeof(unparsbuf), STRQQ);
1194  (void) fprintf(el->el_outfile,
1195  "BUG!!! %s isn't bound to anything.\n", unparsbuf);
1196  (void) fprintf(el->el_outfile, "el->el_map.alt[%d] == %d\n",
1197  first, el->el_map.alt[first]);
1198  }
1199 #endif
1200  EL_ABORT((el->el_errfile, "Error printing keys\n"));
1201 }
1202 
1203 
1204 /* map_print_all_keys():
1205  * Print the function description for all keys.
1206  */
1207 private void
1208 map_print_all_keys(EditLine *el)
1209 {
1210  int prev, i;
1211 
1212  (void) fprintf(el->el_outfile, "Standard key bindings\n");
1213  prev = 0;
1214  for (i = 0; i < N_KEYS; i++) {
1215  if (el->el_map.key[prev] == el->el_map.key[i])
1216  continue;
1217  map_print_some_keys(el, el->el_map.key, prev, i - 1);
1218  prev = i;
1219  }
1220  map_print_some_keys(el, el->el_map.key, prev, i - 1);
1221 
1222  (void) fprintf(el->el_outfile, "Alternative key bindings\n");
1223  prev = 0;
1224  for (i = 0; i < N_KEYS; i++) {
1225  if (el->el_map.alt[prev] == el->el_map.alt[i])
1226  continue;
1227  map_print_some_keys(el, el->el_map.alt, prev, i - 1);
1228  prev = i;
1229  }
1230  map_print_some_keys(el, el->el_map.alt, prev, i - 1);
1231 
1232  (void) fprintf(el->el_outfile, "Multi-character bindings\n");
1233  keymacro_print(el, STR(""));
1234  (void) fprintf(el->el_outfile, "Arrow key bindings\n");
1235  terminal_print_arrow(el, STR(""));
1236 }
1237 
1238 
1239 /* map_bind():
1240  * Add/remove/change bindings
1241  */
1242 protected int
1243 map_bind(EditLine *el, int argc, const Char **argv)
1244 {
1245  el_action_t *map;
1246  int ntype, rem;
1247  const Char *p;
1248  Char inbuf[EL_BUFSIZ];
1249  Char outbuf[EL_BUFSIZ];
1250  const Char *in = NULL;
1251  Char *out = NULL;
1252  el_bindings_t *bp, *ep;
1253  int cmd;
1254  int key;
1255 
1256  if (argv == NULL)
1257  return -1;
1258 
1259  map = el->el_map.key;
1260  ntype = XK_CMD;
1261  key = rem = 0;
1262  for (argc = 1; (p = argv[argc]) != NULL; argc++)
1263  if (p[0] == '-')
1264  switch (p[1]) {
1265  case 'a':
1266  map = el->el_map.alt;
1267  break;
1268 
1269  case 's':
1270  ntype = XK_STR;
1271  break;
1272 #ifdef notyet
1273  case 'c':
1274  ntype = XK_EXE;
1275  break;
1276 #endif
1277  case 'k':
1278  key = 1;
1279  break;
1280 
1281  case 'r':
1282  rem = 1;
1283  break;
1284 
1285  case 'v':
1286  map_init_vi(el);
1287  return 0;
1288 
1289  case 'e':
1290  map_init_emacs(el);
1291  return 0;
1292 
1293  case 'l':
1294  ep = &el->el_map.help[el->el_map.nfunc];
1295  for (bp = el->el_map.help; bp < ep; bp++)
1296  (void) fprintf(el->el_outfile,
1297  "" FSTR "\n\t" FSTR "\n",
1298  bp->name, bp->description);
1299  return 0;
1300  default:
1301  (void) fprintf(el->el_errfile,
1302  "" FSTR ": Invalid switch `%c'.\n",
1303  argv[0], (int) p[1]);
1304  }
1305  else
1306  break;
1307 
1308  if (argv[argc] == NULL) {
1309  map_print_all_keys(el);
1310  return 0;
1311  }
1312  if (key)
1313  in = argv[argc++];
1314  else if ((in = parse__string(inbuf, argv[argc++])) == NULL) {
1315  (void) fprintf(el->el_errfile,
1316  "" FSTR ": Invalid \\ or ^ in instring.\n",
1317  argv[0]);
1318  return -1;
1319  }
1320  if (rem) {
1321  if (key) {
1322  (void) terminal_clear_arrow(el, in);
1323  return -1;
1324  }
1325  if (in[1])
1326  (void) keymacro_delete(el, in);
1327  else if (map[(unsigned char) *in] == ED_SEQUENCE_LEAD_IN)
1328  (void) keymacro_delete(el, in);
1329  else
1330  map[(unsigned char) *in] = ED_UNASSIGNED;
1331  return 0;
1332  }
1333  if (argv[argc] == NULL) {
1334  if (key)
1335  terminal_print_arrow(el, in);
1336  else
1337  map_print_key(el, map, in);
1338  return 0;
1339  }
1340 #ifdef notyet
1341  if (argv[argc + 1] != NULL) {
1342  bindkeymacro_usage();
1343  return -1;
1344  }
1345 #endif
1346 
1347  switch (ntype) {
1348  case XK_STR:
1349  case XK_EXE:
1350  if ((out = parse__string(outbuf, argv[argc])) == NULL) {
1351  (void) fprintf(el->el_errfile,
1352  "" FSTR ": Invalid \\ or ^ in outstring.\n", argv[0]);
1353  return -1;
1354  }
1355  if (key)
1356  terminal_set_arrow(el, in, keymacro_map_str(el, out), ntype);
1357  else
1358  keymacro_add(el, in, keymacro_map_str(el, out), ntype);
1359  map[(unsigned char) *in] = ED_SEQUENCE_LEAD_IN;
1360  break;
1361 
1362  case XK_CMD:
1363  if ((cmd = parse_cmd(el, argv[argc])) == -1) {
1364  (void) fprintf(el->el_errfile,
1365  "" FSTR ": Invalid command `" FSTR "'.\n",
1366  argv[0], argv[argc]);
1367  return -1;
1368  }
1369  if (key)
1370  terminal_set_arrow(el, in, keymacro_map_str(el, out), ntype);
1371  else {
1372  if (in[1]) {
1373  keymacro_add(el, in, keymacro_map_cmd(el, cmd), ntype);
1374  map[(unsigned char) *in] = ED_SEQUENCE_LEAD_IN;
1375  } else {
1376  keymacro_clear(el, map, in);
1377  map[(unsigned char) *in] = (el_action_t)cmd;
1378  }
1379  }
1380  break;
1381 
1382  default:
1383  EL_ABORT((el->el_errfile, "Bad XK_ type %d\n", ntype));
1384  break;
1385  }
1386  return 0;
1387 }
1388 
1389 
1390 /* map_addfunc():
1391  * add a user defined function
1392  */
1393 protected int
1394 map_addfunc(EditLine *el, const Char *name, const Char *help, el_func_t func)
1395 {
1396  void *p;
1397  size_t nf = (size_t)el->el_map.nfunc + 1;
1398 
1399  if (name == NULL || help == NULL || func == NULL)
1400  return -1;
1401 
1402  if ((p = el_realloc(el->el_map.func, nf *
1403  sizeof(*el->el_map.func))) == NULL)
1404  return -1;
1405  el->el_map.func = p;
1406  if ((p = el_realloc(el->el_map.help, nf * sizeof(*el->el_map.help)))
1407  == NULL)
1408  return -1;
1409  el->el_map.help = p;
1410 
1411  nf = (size_t)el->el_map.nfunc;
1412  el->el_map.func[nf] = func;
1413 
1414  el->el_map.help[nf].name = name;
1415  el->el_map.help[nf].func = (int)nf;
1416  el->el_map.help[nf].description = help;
1417  el->el_map.nfunc++;
1418 
1419  return 0;
1420 }