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