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