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