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