xref: /original-bsd/lib/libedit/map.c (revision 7c7c9d58)
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.4 (Berkeley) 07/19/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_PREV,		/* / */
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_NEXT,		/* ? */
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     tty_bind_char(el, 1);
1004     term_bind_arrow(el);
1005 }
1006 
1007 
1008 /* map_init_emacs():
1009  *	Initialize the emacs bindings
1010  */
1011 protected void
1012 map_init_emacs(el)
1013     EditLine *el;
1014 {
1015     int i;
1016     char    buf[3];
1017     el_action_t *key   = el->el_map.key;
1018     el_action_t *alt   = el->el_map.alt;
1019     el_action_t *emacs = el->el_map.emacs;
1020 
1021     el->el_map.type = MAP_EMACS;
1022     el->el_map.current = el->el_map.key;
1023     key_reset(el);
1024 
1025     for (i = 0; i < N_KEYS; i++) {
1026 	key[i] = emacs[i];
1027 	alt[i] = ED_UNASSIGNED;
1028     }
1029 
1030     map_init_meta(el);
1031 #ifdef notyet
1032     if (0 /* XXX: USER has set LC_CTYPE */)
1033 	map_init_nls(el);
1034 #endif
1035     map_init_nls(el);
1036 
1037     buf[0] = CONTROL('X');
1038     buf[2] = 0;
1039     buf[1] = CONTROL('X');
1040     key_add(el, buf, key_map_cmd(el, EM_EXCHANGE_MARK), XK_CMD);
1041 
1042     tty_bind_char(el, 1);
1043     term_bind_arrow(el);
1044 }
1045 
1046 
1047 /* map_set_editor():
1048  *	Set the editor
1049  */
1050 protected int
1051 map_set_editor(el, editor)
1052     EditLine *el;
1053     char *editor;
1054 {
1055     if (strcmp(editor, "emacs") == 0) {
1056 	map_init_emacs(el);
1057 	return 0;
1058     }
1059     if (strcmp(editor, "vi") == 0) {
1060 	map_init_vi(el);
1061 	return 0;
1062     }
1063     return -1;
1064 }
1065 
1066 
1067 /* map_print_key():
1068  *	Print the function description for 1 key
1069  */
1070 private void
1071 map_print_key(el, map, in)
1072     EditLine *el;
1073     el_action_t *map;
1074     char *in;
1075 {
1076     char outbuf[EL_BUFSIZ];
1077     el_bindings_t *bp;
1078 
1079     if (in[0] == '\0' || in[1] == '\0') {
1080 	(void) key__decode_str(in, outbuf, "");
1081 	for (bp = el->el_map.help; bp->name != NULL; bp++)
1082 	    if (bp->func == map[(unsigned char) *in]) {
1083 		(void) fprintf(el->el_outfile,
1084 			       "%s\t->\t%s\n", outbuf, bp->name);
1085 		return;
1086 	    }
1087     }
1088     else
1089 	key_print(el, in);
1090 }
1091 
1092 
1093 /* map_print_some_keys():
1094  *	Print keys from first to last
1095  */
1096 private void
1097 map_print_some_keys(el, map, first, last)
1098     EditLine *el;
1099     el_action_t *map;
1100     int     first, last;
1101 {
1102     el_bindings_t *bp;
1103     char    firstbuf[2], lastbuf[2];
1104     char unparsbuf[EL_BUFSIZ], extrabuf[EL_BUFSIZ];
1105 
1106     firstbuf[0] = first;
1107     firstbuf[1] = 0;
1108     lastbuf[0] = last;
1109     lastbuf[1] = 0;
1110     if (map[first] == ED_UNASSIGNED) {
1111 	if (first == last)
1112 	    (void) fprintf(el->el_outfile, "%-15s->  is undefined\n",
1113 		    key__decode_str(firstbuf, unparsbuf, STRQQ));
1114 	return;
1115     }
1116 
1117     for (bp = el->el_map.help; bp->name != NULL; bp++) {
1118 	if (bp->func == map[first]) {
1119 	    if (first == last) {
1120 		(void) fprintf(el->el_outfile, "%-15s->  %s\n",
1121 			       key__decode_str(firstbuf, unparsbuf, STRQQ),
1122 			       bp->name);
1123 	    }
1124 	    else {
1125 		(void) fprintf(el->el_outfile, "%-4s to %-7s->  %s\n",
1126 			       key__decode_str(firstbuf, unparsbuf, STRQQ),
1127 			       key__decode_str(lastbuf, extrabuf, STRQQ),
1128 			       bp->name);
1129 	    }
1130 	    return;
1131 	}
1132     }
1133 #ifdef MAP_DEBUG
1134     if (map == el->el_map.key) {
1135 	(void) fprintf(el->el_outfile, "BUG!!! %s isn't bound to anything.\n",
1136 		       key__decode_str(firstbuf, unparsbuf, STRQQ));
1137 	(void) fprintf(el->el_outfile, "el->el_map.key[%d] == %d\n",
1138 		       first, el->el_map.key[first]);
1139     }
1140     else {
1141 	(void) fprintf(el->el_outfile, "BUG!!! %s isn't bound to anything.\n",
1142 		       key__decode_str(firstbuf, unparsbuf, STRQQ));
1143 	(void) fprintf(el->el_outfile, "el->el_map.alt[%d] == %d\n",
1144 		       first, el->el_map.alt[first]);
1145     }
1146 #endif
1147     abort();
1148 }
1149 
1150 
1151 /* map_print_all_keys():
1152  *	Print the function description for all keys.
1153  */
1154 private void
1155 map_print_all_keys(el)
1156     EditLine *el;
1157 {
1158     int     prev, i;
1159 
1160     (void) fprintf(el->el_outfile, "Standard key bindings\n");
1161     prev = 0;
1162     for (i = 0; i < N_KEYS; i++) {
1163 	if (el->el_map.key[prev] == el->el_map.key[i])
1164 	    continue;
1165 	map_print_some_keys(el, el->el_map.key, prev, i - 1);
1166 	prev = i;
1167     }
1168     map_print_some_keys(el, el->el_map.key, prev, i - 1);
1169 
1170     (void) fprintf(el->el_outfile, "Alternative key bindings\n");
1171     prev = 0;
1172     for (i = 0; i < N_KEYS; i++) {
1173 	if (el->el_map.alt[prev] == el->el_map.alt[i])
1174 	    continue;
1175 	map_print_some_keys(el, el->el_map.alt, prev, i - 1);
1176 	prev = i;
1177     }
1178     map_print_some_keys(el, el->el_map.alt, prev, i - 1);
1179 
1180     (void) fprintf(el->el_outfile, "Multi-character bindings\n");
1181     key_print(el, "");
1182     (void) fprintf(el->el_outfile, "Arrow key bindings\n");
1183     term_print_arrow(el, "");
1184 }
1185 
1186 
1187 /* map_bind():
1188  *	Add/remove/change bindings
1189  */
1190 protected int
1191 map_bind(el, argc, argv)
1192     EditLine *el;
1193     int argc;
1194     char **argv;
1195 {
1196     el_action_t *map;
1197     int     ntype, remove;
1198     char   *p;
1199     char    inbuf[EL_BUFSIZ];
1200     char    outbuf[EL_BUFSIZ];
1201     char   *in = NULL;
1202     char   *out = NULL;
1203     el_bindings_t *bp;
1204     int     cmd;
1205     int	    key;
1206 
1207     if (argv == NULL)
1208 	return -1;
1209 
1210     map = el->el_map.key;
1211     ntype = XK_CMD;
1212     key = remove = 0;
1213     for (argc = 1; (p = argv[argc]) != NULL; argc++)
1214 	if (p[0] == '-')
1215 	    switch (p[1]) {
1216 	    case 'a':
1217 		map = el->el_map.alt;
1218 		break;
1219 
1220 	    case 's':
1221 		ntype = XK_STR;
1222 		break;
1223 #ifdef notyet
1224 	    case 'c':
1225 		ntype = XK_EXE;
1226 		break;
1227 #endif
1228 	    case 'k':
1229 		key = 1;
1230 		break;
1231 
1232 	    case 'r':
1233 		remove = 1;
1234 		break;
1235 
1236 	    case 'v':
1237 		map_init_vi(el);
1238 		return 0;
1239 
1240 	    case 'e':
1241 		map_init_emacs(el);
1242 		return 0;
1243 
1244 	    case 'l':
1245 		for (bp = el->el_map.help; bp->name != NULL; bp++)
1246 		    (void) fprintf(el->el_outfile, "%s\n\t%s\n",
1247 				   bp->name, bp->description);
1248 		return 0;
1249 	    default:
1250 		(void) fprintf(el->el_errfile, "%s: Invalid switch `%c'.\n",
1251 			       argv[0], p[1]);
1252 	    }
1253 	else
1254 	    break;
1255 
1256     if (argv[argc] == NULL) {
1257 	map_print_all_keys(el);
1258 	return 0;
1259     }
1260 
1261     if (key)
1262 	in = argv[argc++];
1263     else
1264 	if ((in = parse__string(inbuf, argv[argc++])) == NULL) {
1265 	    (void) fprintf(el->el_errfile, "%s: Invalid \\ or ^ in instring.\n",
1266 			   argv[0]);
1267 	    return -1;
1268 	}
1269 
1270     if (remove) {
1271 	if (key) {
1272 	    (void) term_clear_arrow(el, in);
1273 	    return -1;
1274 	}
1275 	if (in[1])
1276 	    (void) key_delete(el, in);
1277 	else if (map[(unsigned char) *in] == ED_SEQUENCE_LEAD_IN)
1278 	    (void) key_delete(el, in);
1279 	else
1280 	    map[(unsigned char) *in] = ED_UNASSIGNED;
1281 	return 0;
1282     }
1283 
1284     if (argv[argc] == NULL) {
1285 	if (key)
1286 	    term_print_arrow(el, in);
1287 	else
1288 	    map_print_key(el, map, in);
1289 	return 0;
1290     }
1291 
1292 #ifdef notyet
1293     if (argv[argc + 1] != NULL) {
1294 	bindkey_usage();
1295 	return -1;
1296     }
1297 #endif
1298 
1299     switch (ntype) {
1300     case XK_STR:
1301     case XK_EXE:
1302 	if ((out = parse__string(outbuf, argv[argc])) == NULL) {
1303 	    (void) fprintf(el->el_errfile,
1304 			   "%s: Invalid \\ or ^ in outstring.\n", argv[0]);
1305 	    return -1;
1306 	}
1307 	if (key)
1308 	    term_set_arrow(el, in, key_map_str(el, out), ntype);
1309 	else
1310 	    key_add(el, in, key_map_str(el, out), ntype);
1311 	map[(unsigned char) *in] = ED_SEQUENCE_LEAD_IN;
1312 	break;
1313 
1314     case XK_CMD:
1315 	if ((cmd = parse_cmd(el, argv[argc])) == -1) {
1316 	    (void) fprintf(el->el_errfile,
1317 			   "%s: Invalid command `%s'.\n", argv[0], argv[argc]);
1318 	    return -1;
1319 	}
1320 	if (key)
1321 	    term_set_arrow(el, in, key_map_str(el, out), ntype);
1322 	else {
1323 	    if (in[1]) {
1324 		key_add(el, in, key_map_cmd(el, cmd), ntype);
1325 		map[(unsigned char) *in] = ED_SEQUENCE_LEAD_IN;
1326 	    }
1327 	    else  {
1328 		key_clear(el, map, in);
1329 		map[(unsigned char) *in] = cmd;
1330 	    }
1331 	}
1332 	break;
1333 
1334     default:
1335 	abort();
1336 	break;
1337     }
1338     return 0;
1339 }
1340 
1341 
1342 /* map_addfunc():
1343  *	add a user defined function
1344  */
1345 protected int
1346 map_addfunc(el, name, help, func)
1347     EditLine *el;
1348     const char *name;
1349     const char *help;
1350     el_func_t func;
1351 {
1352     int nf = el->el_map.nfunc + 2;
1353     if (name == NULL || help == NULL || func == NULL)
1354 	return -1;
1355 
1356     el->el_map.func = (el_func_t *)
1357 		el_realloc(el->el_map.func, nf * sizeof(el_func_t));
1358     el->el_map.help = (el_bindings_t *)
1359 		el_realloc(el->el_map.help, nf * sizeof(el_bindings_t));
1360 
1361     nf = el->el_map.nfunc;
1362     el->el_map.func[nf] = func;
1363 
1364     el->el_map.help[nf].name = name;
1365     el->el_map.help[nf].func = nf;
1366     el->el_map.help[nf].description = help;
1367     el->el_map.help[++nf].name = NULL;
1368     el->el_map.nfunc++;
1369 
1370     return 0;
1371 }
1372