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