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