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