11573Srgrimes/*-
21573Srgrimes * Copyright (c) 1992, 1993
31573Srgrimes *	The Regents of the University of California.  All rights reserved.
41573Srgrimes *
51573Srgrimes * This code is derived from software contributed to Berkeley by
61573Srgrimes * Christos Zoulas of Cornell University.
71573Srgrimes *
81573Srgrimes * Redistribution and use in source and binary forms, with or without
91573Srgrimes * modification, are permitted provided that the following conditions
101573Srgrimes * are met:
111573Srgrimes * 1. Redistributions of source code must retain the above copyright
121573Srgrimes *    notice, this list of conditions and the following disclaimer.
131573Srgrimes * 2. Redistributions in binary form must reproduce the above copyright
141573Srgrimes *    notice, this list of conditions and the following disclaimer in the
151573Srgrimes *    documentation and/or other materials provided with the distribution.
16148834Sstefanf * 3. Neither the name of the University nor the names of its contributors
171573Srgrimes *    may be used to endorse or promote products derived from this software
181573Srgrimes *    without specific prior written permission.
191573Srgrimes *
201573Srgrimes * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
211573Srgrimes * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
221573Srgrimes * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
231573Srgrimes * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
241573Srgrimes * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
251573Srgrimes * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
261573Srgrimes * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
271573Srgrimes * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
281573Srgrimes * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
291573Srgrimes * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
301573Srgrimes * SUCH DAMAGE.
3184260Sobrien *
32167464Sstefanf *	$NetBSD: map.c,v 1.24 2006/04/09 01:36:51 christos Exp $
331573Srgrimes */
341573Srgrimes
351573Srgrimes#if !defined(lint) && !defined(SCCSID)
361573Srgrimesstatic char sccsid[] = "@(#)map.c	8.1 (Berkeley) 6/4/93";
371573Srgrimes#endif /* not lint && not SCCSID */
3884260Sobrien#include <sys/cdefs.h>
3984260Sobrien__FBSDID("$FreeBSD$");
401573Srgrimes
411573Srgrimes/*
428870Srgrimes * map.c: Editor function definitions
431573Srgrimes */
441573Srgrimes#include "sys.h"
451573Srgrimes#include <stdlib.h>
461573Srgrimes#include "el.h"
471573Srgrimes
4884260Sobrien#define	N_KEYS 256
491573Srgrimes
50148834Sstefanfprivate void	map_print_key(EditLine *, el_action_t *, const char *);
5184260Sobrienprivate void	map_print_some_keys(EditLine *, el_action_t *, int, int);
5284260Sobrienprivate void	map_print_all_keys(EditLine *);
5384260Sobrienprivate void	map_init_nls(EditLine *);
5484260Sobrienprivate void	map_init_meta(EditLine *);
551573Srgrimes
561573Srgrimes/* keymap tables ; should be N_KEYS*sizeof(KEYCMD) bytes long */
571573Srgrimes
5884260Sobrien
5984260Sobrienprivate const el_action_t  el_map_emacs[] = {
6084260Sobrien	/*   0 */	EM_SET_MARK,		/* ^@ */
6184260Sobrien	/*   1 */	ED_MOVE_TO_BEG,		/* ^A */
6284260Sobrien	/*   2 */	ED_PREV_CHAR,		/* ^B */
6384260Sobrien	/*   3 */	ED_TTY_SIGINT,		/* ^C */
6484260Sobrien	/*   4 */	EM_DELETE_OR_LIST,	/* ^D */
6584260Sobrien	/*   5 */	ED_MOVE_TO_END,		/* ^E */
6684260Sobrien	/*   6 */	ED_NEXT_CHAR,		/* ^F */
6784260Sobrien	/*   7 */	ED_UNASSIGNED,		/* ^G */
68148834Sstefanf	/*   8 */	EM_DELETE_PREV_CHAR,	/* ^H */
6984260Sobrien	/*   9 */	ED_UNASSIGNED,		/* ^I */
7084260Sobrien	/*  10 */	ED_NEWLINE,		/* ^J */
7184260Sobrien	/*  11 */	ED_KILL_LINE,		/* ^K */
7284260Sobrien	/*  12 */	ED_CLEAR_SCREEN,	/* ^L */
7384260Sobrien	/*  13 */	ED_NEWLINE,		/* ^M */
7484260Sobrien	/*  14 */	ED_NEXT_HISTORY,	/* ^N */
7584260Sobrien	/*  15 */	ED_TTY_FLUSH_OUTPUT,	/* ^O */
7684260Sobrien	/*  16 */	ED_PREV_HISTORY,	/* ^P */
7784260Sobrien	/*  17 */	ED_TTY_START_OUTPUT,	/* ^Q */
7884260Sobrien	/*  18 */	ED_REDISPLAY,		/* ^R */
7984260Sobrien	/*  19 */	ED_TTY_STOP_OUTPUT,	/* ^S */
8084260Sobrien	/*  20 */	ED_TRANSPOSE_CHARS,	/* ^T */
8184260Sobrien	/*  21 */	EM_KILL_LINE,		/* ^U */
8284260Sobrien	/*  22 */	ED_QUOTED_INSERT,	/* ^V */
8384260Sobrien	/*  23 */	EM_KILL_REGION,		/* ^W */
8484260Sobrien	/*  24 */	ED_SEQUENCE_LEAD_IN,	/* ^X */
8584260Sobrien	/*  25 */	EM_YANK,		/* ^Y */
8684260Sobrien	/*  26 */	ED_TTY_SIGTSTP,		/* ^Z */
8784260Sobrien	/*  27 */	EM_META_NEXT,		/* ^[ */
8884260Sobrien	/*  28 */	ED_TTY_SIGQUIT,		/* ^\ */
8984260Sobrien	/*  29 */	ED_TTY_DSUSP,		/* ^] */
9084260Sobrien	/*  30 */	ED_UNASSIGNED,		/* ^^ */
9184260Sobrien	/*  31 */	ED_UNASSIGNED,		/* ^_ */
9284260Sobrien	/*  32 */	ED_INSERT,		/* SPACE */
9384260Sobrien	/*  33 */	ED_INSERT,		/* ! */
9484260Sobrien	/*  34 */	ED_INSERT,		/* " */
9584260Sobrien	/*  35 */	ED_INSERT,		/* # */
9684260Sobrien	/*  36 */	ED_INSERT,		/* $ */
9784260Sobrien	/*  37 */	ED_INSERT,		/* % */
9884260Sobrien	/*  38 */	ED_INSERT,		/* & */
9984260Sobrien	/*  39 */	ED_INSERT,		/* ' */
10084260Sobrien	/*  40 */	ED_INSERT,		/* ( */
10184260Sobrien	/*  41 */	ED_INSERT,		/* ) */
10284260Sobrien	/*  42 */	ED_INSERT,		/* * */
10384260Sobrien	/*  43 */	ED_INSERT,		/* + */
10484260Sobrien	/*  44 */	ED_INSERT,		/* , */
10584260Sobrien	/*  45 */	ED_INSERT,		/* - */
10684260Sobrien	/*  46 */	ED_INSERT,		/* . */
10784260Sobrien	/*  47 */	ED_INSERT,		/* / */
10884260Sobrien	/*  48 */	ED_DIGIT,		/* 0 */
10984260Sobrien	/*  49 */	ED_DIGIT,		/* 1 */
11084260Sobrien	/*  50 */	ED_DIGIT,		/* 2 */
11184260Sobrien	/*  51 */	ED_DIGIT,		/* 3 */
11284260Sobrien	/*  52 */	ED_DIGIT,		/* 4 */
11384260Sobrien	/*  53 */	ED_DIGIT,		/* 5 */
11484260Sobrien	/*  54 */	ED_DIGIT,		/* 6 */
11584260Sobrien	/*  55 */	ED_DIGIT,		/* 7 */
11684260Sobrien	/*  56 */	ED_DIGIT,		/* 8 */
11784260Sobrien	/*  57 */	ED_DIGIT,		/* 9 */
11884260Sobrien	/*  58 */	ED_INSERT,		/* : */
11984260Sobrien	/*  59 */	ED_INSERT,		/* ; */
12084260Sobrien	/*  60 */	ED_INSERT,		/* < */
12184260Sobrien	/*  61 */	ED_INSERT,		/* = */
12284260Sobrien	/*  62 */	ED_INSERT,		/* > */
12384260Sobrien	/*  63 */	ED_INSERT,		/* ? */
12484260Sobrien	/*  64 */	ED_INSERT,		/* @ */
12584260Sobrien	/*  65 */	ED_INSERT,		/* A */
12684260Sobrien	/*  66 */	ED_INSERT,		/* B */
12784260Sobrien	/*  67 */	ED_INSERT,		/* C */
12884260Sobrien	/*  68 */	ED_INSERT,		/* D */
12984260Sobrien	/*  69 */	ED_INSERT,		/* E */
13084260Sobrien	/*  70 */	ED_INSERT,		/* F */
13184260Sobrien	/*  71 */	ED_INSERT,		/* G */
13284260Sobrien	/*  72 */	ED_INSERT,		/* H */
13384260Sobrien	/*  73 */	ED_INSERT,		/* I */
13484260Sobrien	/*  74 */	ED_INSERT,		/* J */
13584260Sobrien	/*  75 */	ED_INSERT,		/* K */
13684260Sobrien	/*  76 */	ED_INSERT,		/* L */
13784260Sobrien	/*  77 */	ED_INSERT,		/* M */
13884260Sobrien	/*  78 */	ED_INSERT,		/* N */
13984260Sobrien	/*  79 */	ED_INSERT,		/* O */
14084260Sobrien	/*  80 */	ED_INSERT,		/* P */
14184260Sobrien	/*  81 */	ED_INSERT,		/* Q */
14284260Sobrien	/*  82 */	ED_INSERT,		/* R */
14384260Sobrien	/*  83 */	ED_INSERT,		/* S */
14484260Sobrien	/*  84 */	ED_INSERT,		/* T */
14584260Sobrien	/*  85 */	ED_INSERT,		/* U */
14684260Sobrien	/*  86 */	ED_INSERT,		/* V */
14784260Sobrien	/*  87 */	ED_INSERT,		/* W */
14884260Sobrien	/*  88 */	ED_INSERT,		/* X */
14984260Sobrien	/*  89 */	ED_INSERT,		/* Y */
15084260Sobrien	/*  90 */	ED_INSERT,		/* Z */
15184260Sobrien	/*  91 */	ED_INSERT,		/* [ */
15284260Sobrien	/*  92 */	ED_INSERT,		/* \ */
15384260Sobrien	/*  93 */	ED_INSERT,		/* ] */
15484260Sobrien	/*  94 */	ED_INSERT,		/* ^ */
15584260Sobrien	/*  95 */	ED_INSERT,		/* _ */
15684260Sobrien	/*  96 */	ED_INSERT,		/* ` */
15784260Sobrien	/*  97 */	ED_INSERT,		/* a */
15884260Sobrien	/*  98 */	ED_INSERT,		/* b */
15984260Sobrien	/*  99 */	ED_INSERT,		/* c */
16084260Sobrien	/* 100 */	ED_INSERT,		/* d */
16184260Sobrien	/* 101 */	ED_INSERT,		/* e */
16284260Sobrien	/* 102 */	ED_INSERT,		/* f */
16384260Sobrien	/* 103 */	ED_INSERT,		/* g */
16484260Sobrien	/* 104 */	ED_INSERT,		/* h */
16584260Sobrien	/* 105 */	ED_INSERT,		/* i */
16684260Sobrien	/* 106 */	ED_INSERT,		/* j */
16784260Sobrien	/* 107 */	ED_INSERT,		/* k */
16884260Sobrien	/* 108 */	ED_INSERT,		/* l */
16984260Sobrien	/* 109 */	ED_INSERT,		/* m */
17084260Sobrien	/* 110 */	ED_INSERT,		/* n */
17184260Sobrien	/* 111 */	ED_INSERT,		/* o */
17284260Sobrien	/* 112 */	ED_INSERT,		/* p */
17384260Sobrien	/* 113 */	ED_INSERT,		/* q */
17484260Sobrien	/* 114 */	ED_INSERT,		/* r */
17584260Sobrien	/* 115 */	ED_INSERT,		/* s */
17684260Sobrien	/* 116 */	ED_INSERT,		/* t */
17784260Sobrien	/* 117 */	ED_INSERT,		/* u */
17884260Sobrien	/* 118 */	ED_INSERT,		/* v */
17984260Sobrien	/* 119 */	ED_INSERT,		/* w */
18084260Sobrien	/* 120 */	ED_INSERT,		/* x */
18184260Sobrien	/* 121 */	ED_INSERT,		/* y */
18284260Sobrien	/* 122 */	ED_INSERT,		/* z */
18384260Sobrien	/* 123 */	ED_INSERT,		/* { */
18484260Sobrien	/* 124 */	ED_INSERT,		/* | */
18584260Sobrien	/* 125 */	ED_INSERT,		/* } */
18684260Sobrien	/* 126 */	ED_INSERT,		/* ~ */
187148834Sstefanf	/* 127 */	EM_DELETE_PREV_CHAR,	/* ^? */
18884260Sobrien	/* 128 */	ED_UNASSIGNED,		/* M-^@ */
18984260Sobrien	/* 129 */	ED_UNASSIGNED,		/* M-^A */
19084260Sobrien	/* 130 */	ED_UNASSIGNED,		/* M-^B */
19184260Sobrien	/* 131 */	ED_UNASSIGNED,		/* M-^C */
19284260Sobrien	/* 132 */	ED_UNASSIGNED,		/* M-^D */
19384260Sobrien	/* 133 */	ED_UNASSIGNED,		/* M-^E */
19484260Sobrien	/* 134 */	ED_UNASSIGNED,		/* M-^F */
19584260Sobrien	/* 135 */	ED_UNASSIGNED,		/* M-^G */
19684260Sobrien	/* 136 */	ED_DELETE_PREV_WORD,	/* M-^H */
19784260Sobrien	/* 137 */	ED_UNASSIGNED,		/* M-^I */
19884260Sobrien	/* 138 */	ED_UNASSIGNED,		/* M-^J */
19984260Sobrien	/* 139 */	ED_UNASSIGNED,		/* M-^K */
20084260Sobrien	/* 140 */	ED_CLEAR_SCREEN,	/* M-^L */
20184260Sobrien	/* 141 */	ED_UNASSIGNED,		/* M-^M */
20284260Sobrien	/* 142 */	ED_UNASSIGNED,		/* M-^N */
20384260Sobrien	/* 143 */	ED_UNASSIGNED,		/* M-^O */
20484260Sobrien	/* 144 */	ED_UNASSIGNED,		/* M-^P */
20584260Sobrien	/* 145 */	ED_UNASSIGNED,		/* M-^Q */
20684260Sobrien	/* 146 */	ED_UNASSIGNED,		/* M-^R */
20784260Sobrien	/* 147 */	ED_UNASSIGNED,		/* M-^S */
20884260Sobrien	/* 148 */	ED_UNASSIGNED,		/* M-^T */
20984260Sobrien	/* 149 */	ED_UNASSIGNED,		/* M-^U */
21084260Sobrien	/* 150 */	ED_UNASSIGNED,		/* M-^V */
21184260Sobrien	/* 151 */	ED_UNASSIGNED,		/* M-^W */
21284260Sobrien	/* 152 */	ED_UNASSIGNED,		/* M-^X */
21384260Sobrien	/* 153 */	ED_UNASSIGNED,		/* M-^Y */
21484260Sobrien	/* 154 */	ED_UNASSIGNED,		/* M-^Z */
21584260Sobrien	/* 155 */	ED_UNASSIGNED,		/* M-^[ */
21684260Sobrien	/* 156 */	ED_UNASSIGNED,		/* M-^\ */
21784260Sobrien	/* 157 */	ED_UNASSIGNED,		/* M-^] */
21884260Sobrien	/* 158 */	ED_UNASSIGNED,		/* M-^^ */
21984260Sobrien	/* 159 */	EM_COPY_PREV_WORD,	/* M-^_ */
22084260Sobrien	/* 160 */	ED_UNASSIGNED,		/* M-SPACE */
22184260Sobrien	/* 161 */	ED_UNASSIGNED,		/* M-! */
22284260Sobrien	/* 162 */	ED_UNASSIGNED,		/* M-" */
22384260Sobrien	/* 163 */	ED_UNASSIGNED,		/* M-# */
22484260Sobrien	/* 164 */	ED_UNASSIGNED,		/* M-$ */
22584260Sobrien	/* 165 */	ED_UNASSIGNED,		/* M-% */
22684260Sobrien	/* 166 */	ED_UNASSIGNED,		/* M-& */
22784260Sobrien	/* 167 */	ED_UNASSIGNED,		/* M-' */
22884260Sobrien	/* 168 */	ED_UNASSIGNED,		/* M-( */
22984260Sobrien	/* 169 */	ED_UNASSIGNED,		/* M-) */
23084260Sobrien	/* 170 */	ED_UNASSIGNED,		/* M-* */
23184260Sobrien	/* 171 */	ED_UNASSIGNED,		/* M-+ */
23284260Sobrien	/* 172 */	ED_UNASSIGNED,		/* M-, */
23384260Sobrien	/* 173 */	ED_UNASSIGNED,		/* M-- */
23484260Sobrien	/* 174 */	ED_UNASSIGNED,		/* M-. */
23584260Sobrien	/* 175 */	ED_UNASSIGNED,		/* M-/ */
23684260Sobrien	/* 176 */	ED_ARGUMENT_DIGIT,	/* M-0 */
23784260Sobrien	/* 177 */	ED_ARGUMENT_DIGIT,	/* M-1 */
23884260Sobrien	/* 178 */	ED_ARGUMENT_DIGIT,	/* M-2 */
23984260Sobrien	/* 179 */	ED_ARGUMENT_DIGIT,	/* M-3 */
24084260Sobrien	/* 180 */	ED_ARGUMENT_DIGIT,	/* M-4 */
24184260Sobrien	/* 181 */	ED_ARGUMENT_DIGIT,	/* M-5 */
24284260Sobrien	/* 182 */	ED_ARGUMENT_DIGIT,	/* M-6 */
24384260Sobrien	/* 183 */	ED_ARGUMENT_DIGIT,	/* M-7 */
24484260Sobrien	/* 184 */	ED_ARGUMENT_DIGIT,	/* M-8 */
24584260Sobrien	/* 185 */	ED_ARGUMENT_DIGIT,	/* M-9 */
24684260Sobrien	/* 186 */	ED_UNASSIGNED,		/* M-: */
24784260Sobrien	/* 187 */	ED_UNASSIGNED,		/* M-; */
24884260Sobrien	/* 188 */	ED_UNASSIGNED,		/* M-< */
24984260Sobrien	/* 189 */	ED_UNASSIGNED,		/* M-= */
25084260Sobrien	/* 190 */	ED_UNASSIGNED,		/* M-> */
25184260Sobrien	/* 191 */	ED_UNASSIGNED,		/* M-? */
25284260Sobrien	/* 192 */	ED_UNASSIGNED,		/* M-@ */
25384260Sobrien	/* 193 */	ED_UNASSIGNED,		/* M-A */
25484260Sobrien	/* 194 */	ED_PREV_WORD,		/* M-B */
25584260Sobrien	/* 195 */	EM_CAPITOL_CASE,	/* M-C */
25684260Sobrien	/* 196 */	EM_DELETE_NEXT_WORD,	/* M-D */
25784260Sobrien	/* 197 */	ED_UNASSIGNED,		/* M-E */
25884260Sobrien	/* 198 */	EM_NEXT_WORD,		/* M-F */
25984260Sobrien	/* 199 */	ED_UNASSIGNED,		/* M-G */
26084260Sobrien	/* 200 */	ED_UNASSIGNED,		/* M-H */
26184260Sobrien	/* 201 */	ED_UNASSIGNED,		/* M-I */
26284260Sobrien	/* 202 */	ED_UNASSIGNED,		/* M-J */
26384260Sobrien	/* 203 */	ED_UNASSIGNED,		/* M-K */
26484260Sobrien	/* 204 */	EM_LOWER_CASE,		/* M-L */
26584260Sobrien	/* 205 */	ED_UNASSIGNED,		/* M-M */
26684260Sobrien	/* 206 */	ED_SEARCH_NEXT_HISTORY,	/* M-N */
26784260Sobrien	/* 207 */	ED_SEQUENCE_LEAD_IN,	/* M-O */
26884260Sobrien	/* 208 */	ED_SEARCH_PREV_HISTORY,	/* M-P */
26984260Sobrien	/* 209 */	ED_UNASSIGNED,		/* M-Q */
27084260Sobrien	/* 210 */	ED_UNASSIGNED,		/* M-R */
27184260Sobrien	/* 211 */	ED_UNASSIGNED,		/* M-S */
27284260Sobrien	/* 212 */	ED_UNASSIGNED,		/* M-T */
27384260Sobrien	/* 213 */	EM_UPPER_CASE,		/* M-U */
27484260Sobrien	/* 214 */	ED_UNASSIGNED,		/* M-V */
27584260Sobrien	/* 215 */	EM_COPY_REGION,		/* M-W */
27684260Sobrien	/* 216 */	ED_COMMAND,		/* M-X */
27784260Sobrien	/* 217 */	ED_UNASSIGNED,		/* M-Y */
27884260Sobrien	/* 218 */	ED_UNASSIGNED,		/* M-Z */
27984260Sobrien	/* 219 */	ED_SEQUENCE_LEAD_IN,	/* M-[ */
28084260Sobrien	/* 220 */	ED_UNASSIGNED,		/* M-\ */
28184260Sobrien	/* 221 */	ED_UNASSIGNED,		/* M-] */
28284260Sobrien	/* 222 */	ED_UNASSIGNED,		/* M-^ */
28384260Sobrien	/* 223 */	ED_UNASSIGNED,		/* M-_ */
28484260Sobrien	/* 223 */	ED_UNASSIGNED,		/* M-` */
28584260Sobrien	/* 224 */	ED_UNASSIGNED,		/* M-a */
28684260Sobrien	/* 225 */	ED_PREV_WORD,		/* M-b */
28784260Sobrien	/* 226 */	EM_CAPITOL_CASE,	/* M-c */
28884260Sobrien	/* 227 */	EM_DELETE_NEXT_WORD,	/* M-d */
28984260Sobrien	/* 228 */	ED_UNASSIGNED,		/* M-e */
29084260Sobrien	/* 229 */	EM_NEXT_WORD,		/* M-f */
29184260Sobrien	/* 230 */	ED_UNASSIGNED,		/* M-g */
29284260Sobrien	/* 231 */	ED_UNASSIGNED,		/* M-h */
29384260Sobrien	/* 232 */	ED_UNASSIGNED,		/* M-i */
29484260Sobrien	/* 233 */	ED_UNASSIGNED,		/* M-j */
29584260Sobrien	/* 234 */	ED_UNASSIGNED,		/* M-k */
29684260Sobrien	/* 235 */	EM_LOWER_CASE,		/* M-l */
29784260Sobrien	/* 236 */	ED_UNASSIGNED,		/* M-m */
29884260Sobrien	/* 237 */	ED_SEARCH_NEXT_HISTORY,	/* M-n */
29984260Sobrien	/* 238 */	ED_UNASSIGNED,		/* M-o */
30084260Sobrien	/* 239 */	ED_SEARCH_PREV_HISTORY,	/* M-p */
30184260Sobrien	/* 240 */	ED_UNASSIGNED,		/* M-q */
30284260Sobrien	/* 241 */	ED_UNASSIGNED,		/* M-r */
30384260Sobrien	/* 242 */	ED_UNASSIGNED,		/* M-s */
30484260Sobrien	/* 243 */	ED_UNASSIGNED,		/* M-t */
30584260Sobrien	/* 244 */	EM_UPPER_CASE,		/* M-u */
30684260Sobrien	/* 245 */	ED_UNASSIGNED,		/* M-v */
30784260Sobrien	/* 246 */	EM_COPY_REGION,		/* M-w */
30884260Sobrien	/* 247 */	ED_COMMAND,		/* M-x */
30984260Sobrien	/* 248 */	ED_UNASSIGNED,		/* M-y */
31084260Sobrien	/* 249 */	ED_UNASSIGNED,		/* M-z */
31184260Sobrien	/* 250 */	ED_UNASSIGNED,		/* M-{ */
31284260Sobrien	/* 251 */	ED_UNASSIGNED,		/* M-| */
31384260Sobrien	/* 252 */	ED_UNASSIGNED,		/* M-} */
31484260Sobrien	/* 253 */	ED_UNASSIGNED,		/* M-~ */
31584260Sobrien	/* 254 */	ED_DELETE_PREV_WORD	/* M-^? */
31684260Sobrien	/* 255 */
3171573Srgrimes};
3181573Srgrimes
31984260Sobrien
3201573Srgrimes/*
3211573Srgrimes * keymap table for vi.  Each index into above tbl; should be
3221573Srgrimes * N_KEYS entries long.  Vi mode uses a sticky-extend to do command mode:
3231573Srgrimes * insert mode characters are in the normal keymap, and command mode
3241573Srgrimes * in the extended keymap.
3251573Srgrimes */
32684260Sobrienprivate const el_action_t  el_map_vi_insert[] = {
3271573Srgrimes#ifdef KSHVI
32884260Sobrien	/*   0 */	ED_UNASSIGNED,		/* ^@ */
32984260Sobrien	/*   1 */	ED_INSERT,		/* ^A */
33084260Sobrien	/*   2 */	ED_INSERT,		/* ^B */
33184260Sobrien	/*   3 */	ED_INSERT,		/* ^C */
33284260Sobrien	/*   4 */	VI_LIST_OR_EOF,		/* ^D */
33384260Sobrien	/*   5 */	ED_INSERT,		/* ^E */
33484260Sobrien	/*   6 */	ED_INSERT,		/* ^F */
33584260Sobrien	/*   7 */	ED_INSERT,		/* ^G */
33684260Sobrien	/*   8 */	VI_DELETE_PREV_CHAR,	/* ^H */   /* BackSpace key */
33784260Sobrien	/*   9 */	ED_INSERT,		/* ^I */   /* Tab Key  */
33884260Sobrien	/*  10 */	ED_NEWLINE,		/* ^J */
33984260Sobrien	/*  11 */	ED_INSERT,		/* ^K */
34084260Sobrien	/*  12 */	ED_INSERT,		/* ^L */
34184260Sobrien	/*  13 */	ED_NEWLINE,		/* ^M */
34284260Sobrien	/*  14 */	ED_INSERT,		/* ^N */
34384260Sobrien	/*  15 */	ED_INSERT,		/* ^O */
34484260Sobrien	/*  16 */	ED_INSERT,		/* ^P */
34584260Sobrien	/*  17 */	ED_TTY_START_OUTPUT,	/* ^Q */
34684260Sobrien	/*  18 */	ED_INSERT,		/* ^R */
34784260Sobrien	/*  19 */	ED_TTY_STOP_OUTPUT,	/* ^S */
34884260Sobrien	/*  20 */	ED_INSERT,		/* ^T */
34984260Sobrien	/*  21 */	VI_KILL_LINE_PREV,	/* ^U */
35084260Sobrien	/*  22 */	ED_QUOTED_INSERT,	/* ^V */
35184260Sobrien	/*  23 */	ED_DELETE_PREV_WORD,	/* ^W */
35284260Sobrien		/* ED_DELETE_PREV_WORD: Only until strt edit pos */
35384260Sobrien	/*  24 */	ED_INSERT,		/* ^X */
35484260Sobrien	/*  25 */	ED_INSERT,		/* ^Y */
35584260Sobrien	/*  26 */	ED_INSERT,		/* ^Z */
35684260Sobrien	/*  27 */	VI_COMMAND_MODE,	/* ^[ */  /* [ Esc ] key */
35784260Sobrien	/*  28 */	ED_TTY_SIGQUIT,		/* ^\ */
35884260Sobrien	/*  29 */	ED_INSERT,		/* ^] */
35984260Sobrien	/*  30 */	ED_INSERT,		/* ^^ */
36084260Sobrien	/*  31 */	ED_INSERT,		/* ^_ */
3611573Srgrimes#else /* !KSHVI */
36284260Sobrien				/*
36384260Sobrien				 * NOTE: These mappings do NOT Correspond well
36484260Sobrien				 * to the KSH VI editing assignments.
36584260Sobrien				 * On the other and they are convenient and
36684260Sobrien				 * many people have have gotten used to them.
36784260Sobrien				 */
36884260Sobrien	/*   0 */	ED_UNASSIGNED,		/* ^@ */
36984260Sobrien	/*   1 */	ED_MOVE_TO_BEG,		/* ^A */
37084260Sobrien	/*   2 */	ED_PREV_CHAR,		/* ^B */
37184260Sobrien	/*   3 */	ED_TTY_SIGINT,		/* ^C */
37284260Sobrien	/*   4 */	VI_LIST_OR_EOF,		/* ^D */
37384260Sobrien	/*   5 */	ED_MOVE_TO_END,		/* ^E */
37484260Sobrien	/*   6 */	ED_NEXT_CHAR,		/* ^F */
37584260Sobrien	/*   7 */	ED_UNASSIGNED,		/* ^G */
376148834Sstefanf	/*   8 */	VI_DELETE_PREV_CHAR,	/* ^H */   /* BackSpace key */
37784260Sobrien	/*   9 */	ED_UNASSIGNED,		/* ^I */   /* Tab Key */
37884260Sobrien	/*  10 */	ED_NEWLINE,		/* ^J */
37984260Sobrien	/*  11 */	ED_KILL_LINE,		/* ^K */
38084260Sobrien	/*  12 */	ED_CLEAR_SCREEN,	/* ^L */
38184260Sobrien	/*  13 */	ED_NEWLINE,		/* ^M */
38284260Sobrien	/*  14 */	ED_NEXT_HISTORY,	/* ^N */
38384260Sobrien	/*  15 */	ED_TTY_FLUSH_OUTPUT,	/* ^O */
38484260Sobrien	/*  16 */	ED_PREV_HISTORY,	/* ^P */
38584260Sobrien	/*  17 */	ED_TTY_START_OUTPUT,	/* ^Q */
38684260Sobrien	/*  18 */	ED_REDISPLAY,		/* ^R */
38784260Sobrien	/*  19 */	ED_TTY_STOP_OUTPUT,	/* ^S */
38884260Sobrien	/*  20 */	ED_TRANSPOSE_CHARS,	/* ^T */
38984260Sobrien	/*  21 */	VI_KILL_LINE_PREV,	/* ^U */
39084260Sobrien	/*  22 */	ED_QUOTED_INSERT,	/* ^V */
39184260Sobrien	/*  23 */	ED_DELETE_PREV_WORD,	/* ^W */
39284260Sobrien	/*  24 */	ED_UNASSIGNED,		/* ^X */
39384260Sobrien	/*  25 */	ED_TTY_DSUSP,		/* ^Y */
39484260Sobrien	/*  26 */	ED_TTY_SIGTSTP,		/* ^Z */
39584260Sobrien	/*  27 */	VI_COMMAND_MODE,	/* ^[ */
39684260Sobrien	/*  28 */	ED_TTY_SIGQUIT,		/* ^\ */
39784260Sobrien	/*  29 */	ED_UNASSIGNED,		/* ^] */
39884260Sobrien	/*  30 */	ED_UNASSIGNED,		/* ^^ */
39984260Sobrien	/*  31 */	ED_UNASSIGNED,		/* ^_ */
4001573Srgrimes#endif  /* KSHVI */
40184260Sobrien	/*  32 */	ED_INSERT,		/* SPACE */
40284260Sobrien	/*  33 */	ED_INSERT,		/* ! */
40384260Sobrien	/*  34 */	ED_INSERT,		/* " */
40484260Sobrien	/*  35 */	ED_INSERT,		/* # */
40584260Sobrien	/*  36 */	ED_INSERT,		/* $ */
40684260Sobrien	/*  37 */	ED_INSERT,		/* % */
40784260Sobrien	/*  38 */	ED_INSERT,		/* & */
40884260Sobrien	/*  39 */	ED_INSERT,		/* ' */
40984260Sobrien	/*  40 */	ED_INSERT,		/* ( */
41084260Sobrien	/*  41 */	ED_INSERT,		/* ) */
41184260Sobrien	/*  42 */	ED_INSERT,		/* * */
41284260Sobrien	/*  43 */	ED_INSERT,		/* + */
41384260Sobrien	/*  44 */	ED_INSERT,		/* , */
41484260Sobrien	/*  45 */	ED_INSERT,		/* - */
41584260Sobrien	/*  46 */	ED_INSERT,		/* . */
41684260Sobrien	/*  47 */	ED_INSERT,		/* / */
41784260Sobrien	/*  48 */	ED_INSERT,		/* 0 */
41884260Sobrien	/*  49 */	ED_INSERT,		/* 1 */
41984260Sobrien	/*  50 */	ED_INSERT,		/* 2 */
42084260Sobrien	/*  51 */	ED_INSERT,		/* 3 */
42184260Sobrien	/*  52 */	ED_INSERT,		/* 4 */
42284260Sobrien	/*  53 */	ED_INSERT,		/* 5 */
42384260Sobrien	/*  54 */	ED_INSERT,		/* 6 */
42484260Sobrien	/*  55 */	ED_INSERT,		/* 7 */
42584260Sobrien	/*  56 */	ED_INSERT,		/* 8 */
42684260Sobrien	/*  57 */	ED_INSERT,		/* 9 */
42784260Sobrien	/*  58 */	ED_INSERT,		/* : */
42884260Sobrien	/*  59 */	ED_INSERT,		/* ; */
42984260Sobrien	/*  60 */	ED_INSERT,		/* < */
43084260Sobrien	/*  61 */	ED_INSERT,		/* = */
43184260Sobrien	/*  62 */	ED_INSERT,		/* > */
43284260Sobrien	/*  63 */	ED_INSERT,		/* ? */
43384260Sobrien	/*  64 */	ED_INSERT,		/* @ */
43484260Sobrien	/*  65 */	ED_INSERT,		/* A */
43584260Sobrien	/*  66 */	ED_INSERT,		/* B */
43684260Sobrien	/*  67 */	ED_INSERT,		/* C */
43784260Sobrien	/*  68 */	ED_INSERT,		/* D */
43884260Sobrien	/*  69 */	ED_INSERT,		/* E */
43984260Sobrien	/*  70 */	ED_INSERT,		/* F */
44084260Sobrien	/*  71 */	ED_INSERT,		/* G */
44184260Sobrien	/*  72 */	ED_INSERT,		/* H */
44284260Sobrien	/*  73 */	ED_INSERT,		/* I */
44384260Sobrien	/*  74 */	ED_INSERT,		/* J */
44484260Sobrien	/*  75 */	ED_INSERT,		/* K */
44584260Sobrien	/*  76 */	ED_INSERT,		/* L */
44684260Sobrien	/*  77 */	ED_INSERT,		/* M */
44784260Sobrien	/*  78 */	ED_INSERT,		/* N */
44884260Sobrien	/*  79 */	ED_INSERT,		/* O */
44984260Sobrien	/*  80 */	ED_INSERT,		/* P */
45084260Sobrien	/*  81 */	ED_INSERT,		/* Q */
45184260Sobrien	/*  82 */	ED_INSERT,		/* R */
45284260Sobrien	/*  83 */	ED_INSERT,		/* S */
45384260Sobrien	/*  84 */	ED_INSERT,		/* T */
45484260Sobrien	/*  85 */	ED_INSERT,		/* U */
45584260Sobrien	/*  86 */	ED_INSERT,		/* V */
45684260Sobrien	/*  87 */	ED_INSERT,		/* W */
45784260Sobrien	/*  88 */	ED_INSERT,		/* X */
45884260Sobrien	/*  89 */	ED_INSERT,		/* Y */
45984260Sobrien	/*  90 */	ED_INSERT,		/* Z */
46084260Sobrien	/*  91 */	ED_INSERT,		/* [ */
46184260Sobrien	/*  92 */	ED_INSERT,		/* \ */
46284260Sobrien	/*  93 */	ED_INSERT,		/* ] */
46384260Sobrien	/*  94 */	ED_INSERT,		/* ^ */
46484260Sobrien	/*  95 */	ED_INSERT,		/* _ */
46584260Sobrien	/*  96 */	ED_INSERT,		/* ` */
46684260Sobrien	/*  97 */	ED_INSERT,		/* a */
46784260Sobrien	/*  98 */	ED_INSERT,		/* b */
46884260Sobrien	/*  99 */	ED_INSERT,		/* c */
46984260Sobrien	/* 100 */	ED_INSERT,		/* d */
47084260Sobrien	/* 101 */	ED_INSERT,		/* e */
47184260Sobrien	/* 102 */	ED_INSERT,		/* f */
47284260Sobrien	/* 103 */	ED_INSERT,		/* g */
47384260Sobrien	/* 104 */	ED_INSERT,		/* h */
47484260Sobrien	/* 105 */	ED_INSERT,		/* i */
47584260Sobrien	/* 106 */	ED_INSERT,		/* j */
47684260Sobrien	/* 107 */	ED_INSERT,		/* k */
47784260Sobrien	/* 108 */	ED_INSERT,		/* l */
47884260Sobrien	/* 109 */	ED_INSERT,		/* m */
47984260Sobrien	/* 110 */	ED_INSERT,		/* n */
48084260Sobrien	/* 111 */	ED_INSERT,		/* o */
48184260Sobrien	/* 112 */	ED_INSERT,		/* p */
48284260Sobrien	/* 113 */	ED_INSERT,		/* q */
48384260Sobrien	/* 114 */	ED_INSERT,		/* r */
48484260Sobrien	/* 115 */	ED_INSERT,		/* s */
48584260Sobrien	/* 116 */	ED_INSERT,		/* t */
48684260Sobrien	/* 117 */	ED_INSERT,		/* u */
48784260Sobrien	/* 118 */	ED_INSERT,		/* v */
48884260Sobrien	/* 119 */	ED_INSERT,		/* w */
48984260Sobrien	/* 120 */	ED_INSERT,		/* x */
49084260Sobrien	/* 121 */	ED_INSERT,		/* y */
49184260Sobrien	/* 122 */	ED_INSERT,		/* z */
49284260Sobrien	/* 123 */	ED_INSERT,		/* { */
49384260Sobrien	/* 124 */	ED_INSERT,		/* | */
49484260Sobrien	/* 125 */	ED_INSERT,		/* } */
49584260Sobrien	/* 126 */	ED_INSERT,		/* ~ */
496148834Sstefanf	/* 127 */	VI_DELETE_PREV_CHAR,	/* ^? */
497148834Sstefanf	/* 128 */	ED_INSERT,		/* M-^@ */
498148834Sstefanf	/* 129 */	ED_INSERT,		/* M-^A */
499148834Sstefanf	/* 130 */	ED_INSERT,		/* M-^B */
500148834Sstefanf	/* 131 */	ED_INSERT,		/* M-^C */
501148834Sstefanf	/* 132 */	ED_INSERT,		/* M-^D */
502148834Sstefanf	/* 133 */	ED_INSERT,		/* M-^E */
503148834Sstefanf	/* 134 */	ED_INSERT,		/* M-^F */
504148834Sstefanf	/* 135 */	ED_INSERT,		/* M-^G */
505148834Sstefanf	/* 136 */	ED_INSERT,		/* M-^H */
506148834Sstefanf	/* 137 */	ED_INSERT,		/* M-^I */
507148834Sstefanf	/* 138 */	ED_INSERT,		/* M-^J */
508148834Sstefanf	/* 139 */	ED_INSERT,		/* M-^K */
509148834Sstefanf	/* 140 */	ED_INSERT,		/* M-^L */
510148834Sstefanf	/* 141 */	ED_INSERT,		/* M-^M */
511148834Sstefanf	/* 142 */	ED_INSERT,		/* M-^N */
512148834Sstefanf	/* 143 */	ED_INSERT,		/* M-^O */
513148834Sstefanf	/* 144 */	ED_INSERT,		/* M-^P */
514148834Sstefanf	/* 145 */	ED_INSERT,		/* M-^Q */
515148834Sstefanf	/* 146 */	ED_INSERT,		/* M-^R */
516148834Sstefanf	/* 147 */	ED_INSERT,		/* M-^S */
517148834Sstefanf	/* 148 */	ED_INSERT,		/* M-^T */
518148834Sstefanf	/* 149 */	ED_INSERT,		/* M-^U */
519148834Sstefanf	/* 150 */	ED_INSERT,		/* M-^V */
520148834Sstefanf	/* 151 */	ED_INSERT,		/* M-^W */
521148834Sstefanf	/* 152 */	ED_INSERT,		/* M-^X */
522148834Sstefanf	/* 153 */	ED_INSERT,		/* M-^Y */
523148834Sstefanf	/* 154 */	ED_INSERT,		/* M-^Z */
524148834Sstefanf	/* 155 */	ED_INSERT,		/* M-^[ */
525148834Sstefanf	/* 156 */	ED_INSERT,		/* M-^\ */
526148834Sstefanf	/* 157 */	ED_INSERT,		/* M-^] */
527148834Sstefanf	/* 158 */	ED_INSERT,		/* M-^^ */
528148834Sstefanf	/* 159 */	ED_INSERT,		/* M-^_ */
529148834Sstefanf	/* 160 */	ED_INSERT,		/* M-SPACE */
530148834Sstefanf	/* 161 */	ED_INSERT,		/* M-! */
531148834Sstefanf	/* 162 */	ED_INSERT,		/* M-" */
532148834Sstefanf	/* 163 */	ED_INSERT,		/* M-# */
533148834Sstefanf	/* 164 */	ED_INSERT,		/* M-$ */
534148834Sstefanf	/* 165 */	ED_INSERT,		/* M-% */
535148834Sstefanf	/* 166 */	ED_INSERT,		/* M-& */
536148834Sstefanf	/* 167 */	ED_INSERT,		/* M-' */
537148834Sstefanf	/* 168 */	ED_INSERT,		/* M-( */
538148834Sstefanf	/* 169 */	ED_INSERT,		/* M-) */
539148834Sstefanf	/* 170 */	ED_INSERT,		/* M-* */
540148834Sstefanf	/* 171 */	ED_INSERT,		/* M-+ */
541148834Sstefanf	/* 172 */	ED_INSERT,		/* M-, */
542148834Sstefanf	/* 173 */	ED_INSERT,		/* M-- */
543148834Sstefanf	/* 174 */	ED_INSERT,		/* M-. */
544148834Sstefanf	/* 175 */	ED_INSERT,		/* M-/ */
545148834Sstefanf	/* 176 */	ED_INSERT,		/* M-0 */
546148834Sstefanf	/* 177 */	ED_INSERT,		/* M-1 */
547148834Sstefanf	/* 178 */	ED_INSERT,		/* M-2 */
548148834Sstefanf	/* 179 */	ED_INSERT,		/* M-3 */
549148834Sstefanf	/* 180 */	ED_INSERT,		/* M-4 */
550148834Sstefanf	/* 181 */	ED_INSERT,		/* M-5 */
551148834Sstefanf	/* 182 */	ED_INSERT,		/* M-6 */
552148834Sstefanf	/* 183 */	ED_INSERT,		/* M-7 */
553148834Sstefanf	/* 184 */	ED_INSERT,		/* M-8 */
554148834Sstefanf	/* 185 */	ED_INSERT,		/* M-9 */
555148834Sstefanf	/* 186 */	ED_INSERT,		/* M-: */
556148834Sstefanf	/* 187 */	ED_INSERT,		/* M-; */
557148834Sstefanf	/* 188 */	ED_INSERT,		/* M-< */
558148834Sstefanf	/* 189 */	ED_INSERT,		/* M-= */
559148834Sstefanf	/* 190 */	ED_INSERT,		/* M-> */
560148834Sstefanf	/* 191 */	ED_INSERT,		/* M-? */
561148834Sstefanf	/* 192 */	ED_INSERT,		/* M-@ */
562148834Sstefanf	/* 193 */	ED_INSERT,		/* M-A */
563148834Sstefanf	/* 194 */	ED_INSERT,		/* M-B */
564148834Sstefanf	/* 195 */	ED_INSERT,		/* M-C */
565148834Sstefanf	/* 196 */	ED_INSERT,		/* M-D */
566148834Sstefanf	/* 197 */	ED_INSERT,		/* M-E */
567148834Sstefanf	/* 198 */	ED_INSERT,		/* M-F */
568148834Sstefanf	/* 199 */	ED_INSERT,		/* M-G */
569148834Sstefanf	/* 200 */	ED_INSERT,		/* M-H */
570148834Sstefanf	/* 201 */	ED_INSERT,		/* M-I */
571148834Sstefanf	/* 202 */	ED_INSERT,		/* M-J */
572148834Sstefanf	/* 203 */	ED_INSERT,		/* M-K */
573148834Sstefanf	/* 204 */	ED_INSERT,		/* M-L */
574148834Sstefanf	/* 205 */	ED_INSERT,		/* M-M */
575148834Sstefanf	/* 206 */	ED_INSERT,		/* M-N */
576148834Sstefanf	/* 207 */	ED_INSERT,		/* M-O */
577148834Sstefanf	/* 208 */	ED_INSERT,		/* M-P */
578148834Sstefanf	/* 209 */	ED_INSERT,		/* M-Q */
579148834Sstefanf	/* 210 */	ED_INSERT,		/* M-R */
580148834Sstefanf	/* 211 */	ED_INSERT,		/* M-S */
581148834Sstefanf	/* 212 */	ED_INSERT,		/* M-T */
582148834Sstefanf	/* 213 */	ED_INSERT,		/* M-U */
583148834Sstefanf	/* 214 */	ED_INSERT,		/* M-V */
584148834Sstefanf	/* 215 */	ED_INSERT,		/* M-W */
585148834Sstefanf	/* 216 */	ED_INSERT,		/* M-X */
586148834Sstefanf	/* 217 */	ED_INSERT,		/* M-Y */
587148834Sstefanf	/* 218 */	ED_INSERT,		/* M-Z */
588148834Sstefanf	/* 219 */	ED_INSERT,		/* M-[ */
589148834Sstefanf	/* 220 */	ED_INSERT,		/* M-\ */
590148834Sstefanf	/* 221 */	ED_INSERT,		/* M-] */
591148834Sstefanf	/* 222 */	ED_INSERT,		/* M-^ */
592148834Sstefanf	/* 223 */	ED_INSERT,		/* M-_ */
593148834Sstefanf	/* 224 */	ED_INSERT,		/* M-` */
594148834Sstefanf	/* 225 */	ED_INSERT,		/* M-a */
595148834Sstefanf	/* 226 */	ED_INSERT,		/* M-b */
596148834Sstefanf	/* 227 */	ED_INSERT,		/* M-c */
597148834Sstefanf	/* 228 */	ED_INSERT,		/* M-d */
598148834Sstefanf	/* 229 */	ED_INSERT,		/* M-e */
599148834Sstefanf	/* 230 */	ED_INSERT,		/* M-f */
600148834Sstefanf	/* 231 */	ED_INSERT,		/* M-g */
601148834Sstefanf	/* 232 */	ED_INSERT,		/* M-h */
602148834Sstefanf	/* 233 */	ED_INSERT,		/* M-i */
603148834Sstefanf	/* 234 */	ED_INSERT,		/* M-j */
604148834Sstefanf	/* 235 */	ED_INSERT,		/* M-k */
605148834Sstefanf	/* 236 */	ED_INSERT,		/* M-l */
606148834Sstefanf	/* 237 */	ED_INSERT,		/* M-m */
607148834Sstefanf	/* 238 */	ED_INSERT,		/* M-n */
608148834Sstefanf	/* 239 */	ED_INSERT,		/* M-o */
609148834Sstefanf	/* 240 */	ED_INSERT,		/* M-p */
610148834Sstefanf	/* 241 */	ED_INSERT,		/* M-q */
611148834Sstefanf	/* 242 */	ED_INSERT,		/* M-r */
612148834Sstefanf	/* 243 */	ED_INSERT,		/* M-s */
613148834Sstefanf	/* 244 */	ED_INSERT,		/* M-t */
614148834Sstefanf	/* 245 */	ED_INSERT,		/* M-u */
615148834Sstefanf	/* 246 */	ED_INSERT,		/* M-v */
616148834Sstefanf	/* 247 */	ED_INSERT,		/* M-w */
617148834Sstefanf	/* 248 */	ED_INSERT,		/* M-x */
618148834Sstefanf	/* 249 */	ED_INSERT,		/* M-y */
619148834Sstefanf	/* 250 */	ED_INSERT,		/* M-z */
620148834Sstefanf	/* 251 */	ED_INSERT,		/* M-{ */
621148834Sstefanf	/* 252 */	ED_INSERT,		/* M-| */
622148834Sstefanf	/* 253 */	ED_INSERT,		/* M-} */
623148834Sstefanf	/* 254 */	ED_INSERT,		/* M-~ */
624148834Sstefanf	/* 255 */	ED_INSERT		/* M-^? */
6251573Srgrimes};
6261573Srgrimes
62784260Sobrienprivate const el_action_t el_map_vi_command[] = {
62884260Sobrien	/*   0 */	ED_UNASSIGNED,		/* ^@ */
62984260Sobrien	/*   1 */	ED_MOVE_TO_BEG,		/* ^A */
63084260Sobrien	/*   2 */	ED_UNASSIGNED,		/* ^B */
63184260Sobrien	/*   3 */	ED_TTY_SIGINT,		/* ^C */
63284260Sobrien	/*   4 */	ED_UNASSIGNED,		/* ^D */
63384260Sobrien	/*   5 */	ED_MOVE_TO_END,		/* ^E */
63484260Sobrien	/*   6 */	ED_UNASSIGNED,		/* ^F */
63584260Sobrien	/*   7 */	ED_UNASSIGNED,		/* ^G */
636148834Sstefanf	/*   8 */	ED_DELETE_PREV_CHAR,	/* ^H */
63784260Sobrien	/*   9 */	ED_UNASSIGNED,		/* ^I */
63884260Sobrien	/*  10 */	ED_NEWLINE,		/* ^J */
63984260Sobrien	/*  11 */	ED_KILL_LINE,		/* ^K */
64084260Sobrien	/*  12 */	ED_CLEAR_SCREEN,	/* ^L */
64184260Sobrien	/*  13 */	ED_NEWLINE,		/* ^M */
64284260Sobrien	/*  14 */	ED_NEXT_HISTORY,	/* ^N */
64384260Sobrien	/*  15 */	ED_TTY_FLUSH_OUTPUT,	/* ^O */
64484260Sobrien	/*  16 */	ED_PREV_HISTORY,	/* ^P */
64584260Sobrien	/*  17 */	ED_TTY_START_OUTPUT,	/* ^Q */
64684260Sobrien	/*  18 */	ED_REDISPLAY,		/* ^R */
64784260Sobrien	/*  19 */	ED_TTY_STOP_OUTPUT,	/* ^S */
64884260Sobrien	/*  20 */	ED_UNASSIGNED,		/* ^T */
64984260Sobrien	/*  21 */	VI_KILL_LINE_PREV,	/* ^U */
65084260Sobrien	/*  22 */	ED_UNASSIGNED,		/* ^V */
65184260Sobrien	/*  23 */	ED_DELETE_PREV_WORD,	/* ^W */
65284260Sobrien	/*  24 */	ED_UNASSIGNED,		/* ^X */
65384260Sobrien	/*  25 */	ED_UNASSIGNED,		/* ^Y */
65484260Sobrien	/*  26 */	ED_UNASSIGNED,		/* ^Z */
65584260Sobrien	/*  27 */	EM_META_NEXT,		/* ^[ */
65684260Sobrien	/*  28 */	ED_TTY_SIGQUIT,		/* ^\ */
65784260Sobrien	/*  29 */	ED_UNASSIGNED,		/* ^] */
65884260Sobrien	/*  30 */	ED_UNASSIGNED,		/* ^^ */
65984260Sobrien	/*  31 */	ED_UNASSIGNED,		/* ^_ */
66084260Sobrien	/*  32 */	ED_NEXT_CHAR,		/* SPACE */
66184260Sobrien	/*  33 */	ED_UNASSIGNED,		/* ! */
66284260Sobrien	/*  34 */	ED_UNASSIGNED,		/* " */
663148834Sstefanf	/*  35 */	VI_COMMENT_OUT,		/* # */
66484260Sobrien	/*  36 */	ED_MOVE_TO_END,		/* $ */
665148834Sstefanf	/*  37 */	VI_MATCH,		/* % */
66684260Sobrien	/*  38 */	ED_UNASSIGNED,		/* & */
66784260Sobrien	/*  39 */	ED_UNASSIGNED,		/* ' */
66884260Sobrien	/*  40 */	ED_UNASSIGNED,		/* ( */
66984260Sobrien	/*  41 */	ED_UNASSIGNED,		/* ) */
67084260Sobrien	/*  42 */	ED_UNASSIGNED,		/* * */
67184260Sobrien	/*  43 */	ED_NEXT_HISTORY,	/* + */
67284260Sobrien	/*  44 */	VI_REPEAT_PREV_CHAR,	/* , */
67384260Sobrien	/*  45 */	ED_PREV_HISTORY,	/* - */
674148834Sstefanf	/*  46 */	VI_REDO,		/* . */
67584260Sobrien	/*  47 */	VI_SEARCH_PREV,		/* / */
67684260Sobrien	/*  48 */	VI_ZERO,		/* 0 */
67784260Sobrien	/*  49 */	ED_ARGUMENT_DIGIT,	/* 1 */
67884260Sobrien	/*  50 */	ED_ARGUMENT_DIGIT,	/* 2 */
67984260Sobrien	/*  51 */	ED_ARGUMENT_DIGIT,	/* 3 */
68084260Sobrien	/*  52 */	ED_ARGUMENT_DIGIT,	/* 4 */
68184260Sobrien	/*  53 */	ED_ARGUMENT_DIGIT,	/* 5 */
68284260Sobrien	/*  54 */	ED_ARGUMENT_DIGIT,	/* 6 */
68384260Sobrien	/*  55 */	ED_ARGUMENT_DIGIT,	/* 7 */
68484260Sobrien	/*  56 */	ED_ARGUMENT_DIGIT,	/* 8 */
68584260Sobrien	/*  57 */	ED_ARGUMENT_DIGIT,	/* 9 */
68684260Sobrien	/*  58 */	ED_COMMAND,		/* : */
68784260Sobrien	/*  59 */	VI_REPEAT_NEXT_CHAR,	/* ; */
68884260Sobrien	/*  60 */	ED_UNASSIGNED,		/* < */
68984260Sobrien	/*  61 */	ED_UNASSIGNED,		/* = */
69084260Sobrien	/*  62 */	ED_UNASSIGNED,		/* > */
69184260Sobrien	/*  63 */	VI_SEARCH_NEXT,		/* ? */
692148834Sstefanf	/*  64 */	VI_ALIAS,		/* @ */
69384260Sobrien	/*  65 */	VI_ADD_AT_EOL,		/* A */
694148834Sstefanf	/*  66 */	VI_PREV_BIG_WORD,	/* B */
69584260Sobrien	/*  67 */	VI_CHANGE_TO_EOL,	/* C */
69684260Sobrien	/*  68 */	ED_KILL_LINE,		/* D */
697148834Sstefanf	/*  69 */	VI_END_BIG_WORD,	/* E */
69884260Sobrien	/*  70 */	VI_PREV_CHAR,		/* F */
699148834Sstefanf	/*  71 */	VI_TO_HISTORY_LINE,	/* G */
70084260Sobrien	/*  72 */	ED_UNASSIGNED,		/* H */
70184260Sobrien	/*  73 */	VI_INSERT_AT_BOL,	/* I */
70284260Sobrien	/*  74 */	ED_SEARCH_NEXT_HISTORY,	/* J */
70384260Sobrien	/*  75 */	ED_SEARCH_PREV_HISTORY,	/* K */
70484260Sobrien	/*  76 */	ED_UNASSIGNED,		/* L */
70584260Sobrien	/*  77 */	ED_UNASSIGNED,		/* M */
70684260Sobrien	/*  78 */	VI_REPEAT_SEARCH_PREV,	/* N */
70784260Sobrien	/*  79 */	ED_SEQUENCE_LEAD_IN,	/* O */
70884260Sobrien	/*  80 */	VI_PASTE_PREV,		/* P */
70984260Sobrien	/*  81 */	ED_UNASSIGNED,		/* Q */
71084260Sobrien	/*  82 */	VI_REPLACE_MODE,	/* R */
71184260Sobrien	/*  83 */	VI_SUBSTITUTE_LINE,	/* S */
71284260Sobrien	/*  84 */	VI_TO_PREV_CHAR,	/* T */
71384260Sobrien	/*  85 */	VI_UNDO_LINE,		/* U */
71484260Sobrien	/*  86 */	ED_UNASSIGNED,		/* V */
715148834Sstefanf	/*  87 */	VI_NEXT_BIG_WORD,	/* W */
71684260Sobrien	/*  88 */	ED_DELETE_PREV_CHAR,	/* X */
717148834Sstefanf	/*  89 */	VI_YANK_END,		/* Y */
71884260Sobrien	/*  90 */	ED_UNASSIGNED,		/* Z */
71984260Sobrien	/*  91 */	ED_SEQUENCE_LEAD_IN,	/* [ */
72084260Sobrien	/*  92 */	ED_UNASSIGNED,		/* \ */
72184260Sobrien	/*  93 */	ED_UNASSIGNED,		/* ] */
72284260Sobrien	/*  94 */	ED_MOVE_TO_BEG,		/* ^ */
723148834Sstefanf	/*  95 */	VI_HISTORY_WORD,	/* _ */
72484260Sobrien	/*  96 */	ED_UNASSIGNED,		/* ` */
72584260Sobrien	/*  97 */	VI_ADD,			/* a */
72684260Sobrien	/*  98 */	VI_PREV_WORD,		/* b */
72784260Sobrien	/*  99 */	VI_CHANGE_META,		/* c */
72884260Sobrien	/* 100 */	VI_DELETE_META,		/* d */
72984260Sobrien	/* 101 */	VI_END_WORD,		/* e */
73084260Sobrien	/* 102 */	VI_NEXT_CHAR,		/* f */
73184260Sobrien	/* 103 */	ED_UNASSIGNED,		/* g */
73284260Sobrien	/* 104 */	ED_PREV_CHAR,		/* h */
73384260Sobrien	/* 105 */	VI_INSERT,		/* i */
73484260Sobrien	/* 106 */	ED_NEXT_HISTORY,	/* j */
73584260Sobrien	/* 107 */	ED_PREV_HISTORY,	/* k */
73684260Sobrien	/* 108 */	ED_NEXT_CHAR,		/* l */
73784260Sobrien	/* 109 */	ED_UNASSIGNED,		/* m */
73884260Sobrien	/* 110 */	VI_REPEAT_SEARCH_NEXT,	/* n */
73984260Sobrien	/* 111 */	ED_UNASSIGNED,		/* o */
74084260Sobrien	/* 112 */	VI_PASTE_NEXT,		/* p */
74184260Sobrien	/* 113 */	ED_UNASSIGNED,		/* q */
74284260Sobrien	/* 114 */	VI_REPLACE_CHAR,	/* r */
74384260Sobrien	/* 115 */	VI_SUBSTITUTE_CHAR,	/* s */
74484260Sobrien	/* 116 */	VI_TO_NEXT_CHAR,	/* t */
74584260Sobrien	/* 117 */	VI_UNDO,		/* u */
746148834Sstefanf	/* 118 */	VI_HISTEDIT,		/* v */
74784260Sobrien	/* 119 */	VI_NEXT_WORD,		/* w */
74884260Sobrien	/* 120 */	ED_DELETE_NEXT_CHAR,	/* x */
749148834Sstefanf	/* 121 */	VI_YANK,		/* y */
75084260Sobrien	/* 122 */	ED_UNASSIGNED,		/* z */
75184260Sobrien	/* 123 */	ED_UNASSIGNED,		/* { */
752148834Sstefanf	/* 124 */	VI_TO_COLUMN,		/* | */
75384260Sobrien	/* 125 */	ED_UNASSIGNED,		/* } */
75484260Sobrien	/* 126 */	VI_CHANGE_CASE,		/* ~ */
75584260Sobrien	/* 127 */	ED_DELETE_PREV_CHAR,	/* ^? */
75684260Sobrien	/* 128 */	ED_UNASSIGNED,		/* M-^@ */
75784260Sobrien	/* 129 */	ED_UNASSIGNED,		/* M-^A */
75884260Sobrien	/* 130 */	ED_UNASSIGNED,		/* M-^B */
75984260Sobrien	/* 131 */	ED_UNASSIGNED,		/* M-^C */
76084260Sobrien	/* 132 */	ED_UNASSIGNED,		/* M-^D */
76184260Sobrien	/* 133 */	ED_UNASSIGNED,		/* M-^E */
76284260Sobrien	/* 134 */	ED_UNASSIGNED,		/* M-^F */
76384260Sobrien	/* 135 */	ED_UNASSIGNED,		/* M-^G */
76484260Sobrien	/* 136 */	ED_UNASSIGNED,		/* M-^H */
76584260Sobrien	/* 137 */	ED_UNASSIGNED,		/* M-^I */
76684260Sobrien	/* 138 */	ED_UNASSIGNED,		/* M-^J */
76784260Sobrien	/* 139 */	ED_UNASSIGNED,		/* M-^K */
76884260Sobrien	/* 140 */	ED_UNASSIGNED,		/* M-^L */
76984260Sobrien	/* 141 */	ED_UNASSIGNED,		/* M-^M */
77084260Sobrien	/* 142 */	ED_UNASSIGNED,		/* M-^N */
77184260Sobrien	/* 143 */	ED_UNASSIGNED,		/* M-^O */
77284260Sobrien	/* 144 */	ED_UNASSIGNED,		/* M-^P */
77384260Sobrien	/* 145 */	ED_UNASSIGNED,		/* M-^Q */
77484260Sobrien	/* 146 */	ED_UNASSIGNED,		/* M-^R */
77584260Sobrien	/* 147 */	ED_UNASSIGNED,		/* M-^S */
77684260Sobrien	/* 148 */	ED_UNASSIGNED,		/* M-^T */
77784260Sobrien	/* 149 */	ED_UNASSIGNED,		/* M-^U */
77884260Sobrien	/* 150 */	ED_UNASSIGNED,		/* M-^V */
77984260Sobrien	/* 151 */	ED_UNASSIGNED,		/* M-^W */
78084260Sobrien	/* 152 */	ED_UNASSIGNED,		/* M-^X */
78184260Sobrien	/* 153 */	ED_UNASSIGNED,		/* M-^Y */
78284260Sobrien	/* 154 */	ED_UNASSIGNED,		/* M-^Z */
78384260Sobrien	/* 155 */	ED_UNASSIGNED,		/* M-^[ */
78484260Sobrien	/* 156 */	ED_UNASSIGNED,		/* M-^\ */
78584260Sobrien	/* 157 */	ED_UNASSIGNED,		/* M-^] */
78684260Sobrien	/* 158 */	ED_UNASSIGNED,		/* M-^^ */
78784260Sobrien	/* 159 */	ED_UNASSIGNED,		/* M-^_ */
78884260Sobrien	/* 160 */	ED_UNASSIGNED,		/* M-SPACE */
78984260Sobrien	/* 161 */	ED_UNASSIGNED,		/* M-! */
79084260Sobrien	/* 162 */	ED_UNASSIGNED,		/* M-" */
79184260Sobrien	/* 163 */	ED_UNASSIGNED,		/* M-# */
79284260Sobrien	/* 164 */	ED_UNASSIGNED,		/* M-$ */
79384260Sobrien	/* 165 */	ED_UNASSIGNED,		/* M-% */
79484260Sobrien	/* 166 */	ED_UNASSIGNED,		/* M-& */
79584260Sobrien	/* 167 */	ED_UNASSIGNED,		/* M-' */
79684260Sobrien	/* 168 */	ED_UNASSIGNED,		/* M-( */
79784260Sobrien	/* 169 */	ED_UNASSIGNED,		/* M-) */
79884260Sobrien	/* 170 */	ED_UNASSIGNED,		/* M-* */
79984260Sobrien	/* 171 */	ED_UNASSIGNED,		/* M-+ */
80084260Sobrien	/* 172 */	ED_UNASSIGNED,		/* M-, */
80184260Sobrien	/* 173 */	ED_UNASSIGNED,		/* M-- */
80284260Sobrien	/* 174 */	ED_UNASSIGNED,		/* M-. */
80384260Sobrien	/* 175 */	ED_UNASSIGNED,		/* M-/ */
80484260Sobrien	/* 176 */	ED_UNASSIGNED,		/* M-0 */
80584260Sobrien	/* 177 */	ED_UNASSIGNED,		/* M-1 */
80684260Sobrien	/* 178 */	ED_UNASSIGNED,		/* M-2 */
80784260Sobrien	/* 179 */	ED_UNASSIGNED,		/* M-3 */
80884260Sobrien	/* 180 */	ED_UNASSIGNED,		/* M-4 */
80984260Sobrien	/* 181 */	ED_UNASSIGNED,		/* M-5 */
81084260Sobrien	/* 182 */	ED_UNASSIGNED,		/* M-6 */
81184260Sobrien	/* 183 */	ED_UNASSIGNED,		/* M-7 */
81284260Sobrien	/* 184 */	ED_UNASSIGNED,		/* M-8 */
81384260Sobrien	/* 185 */	ED_UNASSIGNED,		/* M-9 */
81484260Sobrien	/* 186 */	ED_UNASSIGNED,		/* M-: */
81584260Sobrien	/* 187 */	ED_UNASSIGNED,		/* M-; */
81684260Sobrien	/* 188 */	ED_UNASSIGNED,		/* M-< */
81784260Sobrien	/* 189 */	ED_UNASSIGNED,		/* M-= */
81884260Sobrien	/* 190 */	ED_UNASSIGNED,		/* M-> */
81984260Sobrien	/* 191 */	ED_UNASSIGNED,		/* M-? */
82084260Sobrien	/* 192 */	ED_UNASSIGNED,		/* M-@ */
82184260Sobrien	/* 193 */	ED_UNASSIGNED,		/* M-A */
82284260Sobrien	/* 194 */	ED_UNASSIGNED,		/* M-B */
82384260Sobrien	/* 195 */	ED_UNASSIGNED,		/* M-C */
82484260Sobrien	/* 196 */	ED_UNASSIGNED,		/* M-D */
82584260Sobrien	/* 197 */	ED_UNASSIGNED,		/* M-E */
82684260Sobrien	/* 198 */	ED_UNASSIGNED,		/* M-F */
82784260Sobrien	/* 199 */	ED_UNASSIGNED,		/* M-G */
82884260Sobrien	/* 200 */	ED_UNASSIGNED,		/* M-H */
82984260Sobrien	/* 201 */	ED_UNASSIGNED,		/* M-I */
83084260Sobrien	/* 202 */	ED_UNASSIGNED,		/* M-J */
83184260Sobrien	/* 203 */	ED_UNASSIGNED,		/* M-K */
83284260Sobrien	/* 204 */	ED_UNASSIGNED,		/* M-L */
83384260Sobrien	/* 205 */	ED_UNASSIGNED,		/* M-M */
83484260Sobrien	/* 206 */	ED_UNASSIGNED,		/* M-N */
83584260Sobrien	/* 207 */	ED_SEQUENCE_LEAD_IN,	/* M-O */
83684260Sobrien	/* 208 */	ED_UNASSIGNED,		/* M-P */
83784260Sobrien	/* 209 */	ED_UNASSIGNED,		/* M-Q */
83884260Sobrien	/* 210 */	ED_UNASSIGNED,		/* M-R */
83984260Sobrien	/* 211 */	ED_UNASSIGNED,		/* M-S */
84084260Sobrien	/* 212 */	ED_UNASSIGNED,		/* M-T */
84184260Sobrien	/* 213 */	ED_UNASSIGNED,		/* M-U */
84284260Sobrien	/* 214 */	ED_UNASSIGNED,		/* M-V */
84384260Sobrien	/* 215 */	ED_UNASSIGNED,		/* M-W */
84484260Sobrien	/* 216 */	ED_UNASSIGNED,		/* M-X */
84584260Sobrien	/* 217 */	ED_UNASSIGNED,		/* M-Y */
84684260Sobrien	/* 218 */	ED_UNASSIGNED,		/* M-Z */
84784260Sobrien	/* 219 */	ED_SEQUENCE_LEAD_IN,	/* M-[ */
84884260Sobrien	/* 220 */	ED_UNASSIGNED,		/* M-\ */
84984260Sobrien	/* 221 */	ED_UNASSIGNED,		/* M-] */
85084260Sobrien	/* 222 */	ED_UNASSIGNED,		/* M-^ */
85184260Sobrien	/* 223 */	ED_UNASSIGNED,		/* M-_ */
85284260Sobrien	/* 224 */	ED_UNASSIGNED,		/* M-` */
85384260Sobrien	/* 225 */	ED_UNASSIGNED,		/* M-a */
85484260Sobrien	/* 226 */	ED_UNASSIGNED,		/* M-b */
85584260Sobrien	/* 227 */	ED_UNASSIGNED,		/* M-c */
85684260Sobrien	/* 228 */	ED_UNASSIGNED,		/* M-d */
85784260Sobrien	/* 229 */	ED_UNASSIGNED,		/* M-e */
85884260Sobrien	/* 230 */	ED_UNASSIGNED,		/* M-f */
85984260Sobrien	/* 231 */	ED_UNASSIGNED,		/* M-g */
86084260Sobrien	/* 232 */	ED_UNASSIGNED,		/* M-h */
86184260Sobrien	/* 233 */	ED_UNASSIGNED,		/* M-i */
86284260Sobrien	/* 234 */	ED_UNASSIGNED,		/* M-j */
86384260Sobrien	/* 235 */	ED_UNASSIGNED,		/* M-k */
86484260Sobrien	/* 236 */	ED_UNASSIGNED,		/* M-l */
86584260Sobrien	/* 237 */	ED_UNASSIGNED,		/* M-m */
86684260Sobrien	/* 238 */	ED_UNASSIGNED,		/* M-n */
86784260Sobrien	/* 239 */	ED_UNASSIGNED,		/* M-o */
86884260Sobrien	/* 240 */	ED_UNASSIGNED,		/* M-p */
86984260Sobrien	/* 241 */	ED_UNASSIGNED,		/* M-q */
87084260Sobrien	/* 242 */	ED_UNASSIGNED,		/* M-r */
87184260Sobrien	/* 243 */	ED_UNASSIGNED,		/* M-s */
87284260Sobrien	/* 244 */	ED_UNASSIGNED,		/* M-t */
87384260Sobrien	/* 245 */	ED_UNASSIGNED,		/* M-u */
87484260Sobrien	/* 246 */	ED_UNASSIGNED,		/* M-v */
87584260Sobrien	/* 247 */	ED_UNASSIGNED,		/* M-w */
87684260Sobrien	/* 248 */	ED_UNASSIGNED,		/* M-x */
87784260Sobrien	/* 249 */	ED_UNASSIGNED,		/* M-y */
87884260Sobrien	/* 250 */	ED_UNASSIGNED,		/* M-z */
87984260Sobrien	/* 251 */	ED_UNASSIGNED,		/* M-{ */
88084260Sobrien	/* 252 */	ED_UNASSIGNED,		/* M-| */
88184260Sobrien	/* 253 */	ED_UNASSIGNED,		/* M-} */
88284260Sobrien	/* 254 */	ED_UNASSIGNED,		/* M-~ */
88384260Sobrien	/* 255 */	ED_UNASSIGNED		/* M-^? */
8841573Srgrimes};
8851573Srgrimes
8861573Srgrimes
8871573Srgrimes/* map_init():
8881573Srgrimes *	Initialize and allocate the maps
8891573Srgrimes */
8901573Srgrimesprotected int
89184260Sobrienmap_init(EditLine *el)
8921573Srgrimes{
8938870Srgrimes
89484260Sobrien	/*
89584260Sobrien         * Make sure those are correct before starting.
89684260Sobrien         */
8971573Srgrimes#ifdef MAP_DEBUG
89884260Sobrien	if (sizeof(el_map_emacs) != N_KEYS * sizeof(el_action_t))
89984260Sobrien		EL_ABORT((el->errfile, "Emacs map incorrect\n"));
90084260Sobrien	if (sizeof(el_map_vi_command) != N_KEYS * sizeof(el_action_t))
90184260Sobrien		EL_ABORT((el->errfile, "Vi command map incorrect\n"));
90284260Sobrien	if (sizeof(el_map_vi_insert) != N_KEYS * sizeof(el_action_t))
90384260Sobrien		EL_ABORT((el->errfile, "Vi insert map incorrect\n"));
9041573Srgrimes#endif
9051573Srgrimes
90684260Sobrien	el->el_map.alt = (el_action_t *)el_malloc(sizeof(el_action_t) * N_KEYS);
90784260Sobrien	if (el->el_map.alt == NULL)
90884260Sobrien		return (-1);
90984260Sobrien	el->el_map.key = (el_action_t *)el_malloc(sizeof(el_action_t) * N_KEYS);
91084260Sobrien	if (el->el_map.key == NULL)
91184260Sobrien		return (-1);
91284260Sobrien	el->el_map.emacs = el_map_emacs;
91384260Sobrien	el->el_map.vic = el_map_vi_command;
91484260Sobrien	el->el_map.vii = el_map_vi_insert;
91584260Sobrien	el->el_map.help = (el_bindings_t *) el_malloc(sizeof(el_bindings_t) *
916150947Sstefanf	    EL_NUM_FCNS);
91784260Sobrien	if (el->el_map.help == NULL)
91884260Sobrien		return (-1);
91984260Sobrien	(void) memcpy(el->el_map.help, help__get(),
920150947Sstefanf	    sizeof(el_bindings_t) * EL_NUM_FCNS);
92184260Sobrien	el->el_map.func = (el_func_t *)el_malloc(sizeof(el_func_t) *
92284260Sobrien	    EL_NUM_FCNS);
92384260Sobrien	if (el->el_map.func == NULL)
92484260Sobrien		return (-1);
92584260Sobrien	memcpy(el->el_map.func, func__get(), sizeof(el_func_t) * EL_NUM_FCNS);
92684260Sobrien	el->el_map.nfunc = EL_NUM_FCNS;
9271573Srgrimes
9281573Srgrimes#ifdef VIDEFAULT
92984260Sobrien	map_init_vi(el);
9301573Srgrimes#else
93184260Sobrien	map_init_emacs(el);
9321573Srgrimes#endif /* VIDEFAULT */
93384260Sobrien	return (0);
9341573Srgrimes}
9351573Srgrimes
9361573Srgrimes
9371573Srgrimes/* map_end():
9381573Srgrimes *	Free the space taken by the editor maps
9391573Srgrimes */
9401573Srgrimesprotected void
94184260Sobrienmap_end(EditLine *el)
9421573Srgrimes{
94384260Sobrien
94484260Sobrien	el_free((ptr_t) el->el_map.alt);
94584260Sobrien	el->el_map.alt = NULL;
94684260Sobrien	el_free((ptr_t) el->el_map.key);
94784260Sobrien	el->el_map.key = NULL;
94884260Sobrien	el->el_map.emacs = NULL;
94984260Sobrien	el->el_map.vic = NULL;
95084260Sobrien	el->el_map.vii = NULL;
95184260Sobrien	el_free((ptr_t) el->el_map.help);
95284260Sobrien	el->el_map.help = NULL;
95384260Sobrien	el_free((ptr_t) el->el_map.func);
95484260Sobrien	el->el_map.func = NULL;
9551573Srgrimes}
9561573Srgrimes
9571573Srgrimes
9581573Srgrimes/* map_init_nls():
9591573Srgrimes *	Find all the printable keys and bind them to self insert
9601573Srgrimes */
9611573Srgrimesprivate void
96284260Sobrienmap_init_nls(EditLine *el)
9631573Srgrimes{
96484260Sobrien	int i;
9651573Srgrimes
96684260Sobrien	el_action_t *map = el->el_map.key;
96784260Sobrien
96884260Sobrien	for (i = 0200; i <= 0377; i++)
96984260Sobrien		if (isprint(i))
97084260Sobrien			map[i] = ED_INSERT;
9711573Srgrimes}
9721573Srgrimes
9731573Srgrimes
9741573Srgrimes/* map_init_meta():
9751573Srgrimes *	Bind all the meta keys to the appropriate ESC-<key> sequence
9761573Srgrimes */
9771573Srgrimesprivate void
97884260Sobrienmap_init_meta(EditLine *el)
9791573Srgrimes{
98084260Sobrien	char buf[3];
98184260Sobrien	int i;
98284260Sobrien	el_action_t *map = el->el_map.key;
98384260Sobrien	el_action_t *alt = el->el_map.alt;
9841573Srgrimes
98584260Sobrien	for (i = 0; i <= 0377 && map[i] != EM_META_NEXT; i++)
98684260Sobrien		continue;
9871573Srgrimes
9881573Srgrimes	if (i > 0377) {
98984260Sobrien		for (i = 0; i <= 0377 && alt[i] != EM_META_NEXT; i++)
99084260Sobrien			continue;
99184260Sobrien		if (i > 0377) {
99284260Sobrien			i = 033;
99384260Sobrien			if (el->el_map.type == MAP_VI)
99484260Sobrien				map = alt;
99584260Sobrien		} else
99684260Sobrien			map = alt;
9971573Srgrimes	}
99884260Sobrien	buf[0] = (char) i;
99984260Sobrien	buf[2] = 0;
100084260Sobrien	for (i = 0200; i <= 0377; i++)
100184260Sobrien		switch (map[i]) {
100284260Sobrien		case ED_INSERT:
100384260Sobrien		case ED_UNASSIGNED:
100484260Sobrien		case ED_SEQUENCE_LEAD_IN:
100584260Sobrien			break;
100684260Sobrien		default:
100784260Sobrien			buf[1] = i & 0177;
100884260Sobrien			key_add(el, buf, key_map_cmd(el, (int) map[i]), XK_CMD);
100984260Sobrien			break;
101084260Sobrien		}
101184260Sobrien	map[(int) buf[0]] = ED_SEQUENCE_LEAD_IN;
10121573Srgrimes}
10131573Srgrimes
10141573Srgrimes
10151573Srgrimes/* map_init_vi():
10161573Srgrimes *	Initialize the vi bindings
10171573Srgrimes */
10181573Srgrimesprotected void
101984260Sobrienmap_init_vi(EditLine *el)
10201573Srgrimes{
102184260Sobrien	int i;
102284260Sobrien	el_action_t *key = el->el_map.key;
102384260Sobrien	el_action_t *alt = el->el_map.alt;
102484260Sobrien	const el_action_t *vii = el->el_map.vii;
102584260Sobrien	const el_action_t *vic = el->el_map.vic;
10261573Srgrimes
102784260Sobrien	el->el_map.type = MAP_VI;
102884260Sobrien	el->el_map.current = el->el_map.key;
10291573Srgrimes
103084260Sobrien	key_reset(el);
10311573Srgrimes
103284260Sobrien	for (i = 0; i < N_KEYS; i++) {
103384260Sobrien		key[i] = vii[i];
103484260Sobrien		alt[i] = vic[i];
103584260Sobrien	}
10361573Srgrimes
103784260Sobrien	map_init_meta(el);
10381573Srgrimes	map_init_nls(el);
10391573Srgrimes
104084260Sobrien	tty_bind_char(el, 1);
104184260Sobrien	term_bind_arrow(el);
10421573Srgrimes}
10431573Srgrimes
10441573Srgrimes
10451573Srgrimes/* map_init_emacs():
10461573Srgrimes *	Initialize the emacs bindings
10471573Srgrimes */
10481573Srgrimesprotected void
104984260Sobrienmap_init_emacs(EditLine *el)
10501573Srgrimes{
105184260Sobrien	int i;
105284260Sobrien	char buf[3];
105384260Sobrien	el_action_t *key = el->el_map.key;
105484260Sobrien	el_action_t *alt = el->el_map.alt;
105584260Sobrien	const el_action_t *emacs = el->el_map.emacs;
10561573Srgrimes
105784260Sobrien	el->el_map.type = MAP_EMACS;
105884260Sobrien	el->el_map.current = el->el_map.key;
105984260Sobrien	key_reset(el);
10601573Srgrimes
106184260Sobrien	for (i = 0; i < N_KEYS; i++) {
106284260Sobrien		key[i] = emacs[i];
106384260Sobrien		alt[i] = ED_UNASSIGNED;
106484260Sobrien	}
10651573Srgrimes
106684260Sobrien	map_init_meta(el);
10671573Srgrimes	map_init_nls(el);
10681573Srgrimes
106984260Sobrien	buf[0] = CONTROL('X');
107084260Sobrien	buf[1] = CONTROL('X');
107184260Sobrien	buf[2] = 0;
107284260Sobrien	key_add(el, buf, key_map_cmd(el, EM_EXCHANGE_MARK), XK_CMD);
10738870Srgrimes
107484260Sobrien	tty_bind_char(el, 1);
107584260Sobrien	term_bind_arrow(el);
10761573Srgrimes}
10771573Srgrimes
10781573Srgrimes
10791573Srgrimes/* map_set_editor():
10808870Srgrimes *	Set the editor
10811573Srgrimes */
10821573Srgrimesprotected int
108384260Sobrienmap_set_editor(EditLine *el, char *editor)
10841573Srgrimes{
108584260Sobrien
108684260Sobrien	if (strcmp(editor, "emacs") == 0) {
108784260Sobrien		map_init_emacs(el);
108884260Sobrien		return (0);
108984260Sobrien	}
109084260Sobrien	if (strcmp(editor, "vi") == 0) {
109184260Sobrien		map_init_vi(el);
109284260Sobrien		return (0);
109384260Sobrien	}
109484260Sobrien	return (-1);
10951573Srgrimes}
10961573Srgrimes
10971573Srgrimes
109884260Sobrien/* map_get_editor():
109984260Sobrien *	Retrieve the editor
110084260Sobrien */
110184260Sobrienprotected int
110284260Sobrienmap_get_editor(EditLine *el, const char **editor)
110384260Sobrien{
110484260Sobrien
110584260Sobrien	if (editor == NULL)
110684260Sobrien		return (-1);
110784260Sobrien	switch (el->el_map.type) {
110884260Sobrien	case MAP_EMACS:
110984260Sobrien		*editor = "emacs";
111084260Sobrien		return (0);
111184260Sobrien	case MAP_VI:
111284260Sobrien		*editor = "vi";
111384260Sobrien		return (0);
111484260Sobrien	}
111584260Sobrien	return (-1);
111684260Sobrien}
111784260Sobrien
111884260Sobrien
11191573Srgrimes/* map_print_key():
11201573Srgrimes *	Print the function description for 1 key
11211573Srgrimes */
11221573Srgrimesprivate void
1123148834Sstefanfmap_print_key(EditLine *el, el_action_t *map, const char *in)
11241573Srgrimes{
112584260Sobrien	char outbuf[EL_BUFSIZ];
1126150947Sstefanf	el_bindings_t *bp, *ep;
11271573Srgrimes
112884260Sobrien	if (in[0] == '\0' || in[1] == '\0') {
1129167457Sstefanf		(void) key__decode_str(in, outbuf, sizeof(outbuf), "");
1130150947Sstefanf		ep = &el->el_map.help[el->el_map.nfunc];
1131150947Sstefanf		for (bp = el->el_map.help; bp < ep; bp++)
113284260Sobrien			if (bp->func == map[(unsigned char) *in]) {
113384260Sobrien				(void) fprintf(el->el_outfile,
113484260Sobrien				    "%s\t->\t%s\n", outbuf, bp->name);
113584260Sobrien				return;
113684260Sobrien			}
113784260Sobrien	} else
113884260Sobrien		key_print(el, in);
11391573Srgrimes}
11401573Srgrimes
11411573Srgrimes
11421573Srgrimes/* map_print_some_keys():
11431573Srgrimes *	Print keys from first to last
11441573Srgrimes */
11451573Srgrimesprivate void
114684260Sobrienmap_print_some_keys(EditLine *el, el_action_t *map, int first, int last)
11471573Srgrimes{
1148150947Sstefanf	el_bindings_t *bp, *ep;
114984260Sobrien	char firstbuf[2], lastbuf[2];
115084260Sobrien	char unparsbuf[EL_BUFSIZ], extrabuf[EL_BUFSIZ];
11511573Srgrimes
115284260Sobrien	firstbuf[0] = first;
115384260Sobrien	firstbuf[1] = 0;
115484260Sobrien	lastbuf[0] = last;
115584260Sobrien	lastbuf[1] = 0;
115684260Sobrien	if (map[first] == ED_UNASSIGNED) {
1157167457Sstefanf		if (first == last) {
1158167457Sstefanf			(void) key__decode_str(firstbuf, unparsbuf,
1159167457Sstefanf			    sizeof(unparsbuf), STRQQ);
116084260Sobrien			(void) fprintf(el->el_outfile,
1161167457Sstefanf			    "%-15s->  is undefined\n", unparsbuf);
1162167457Sstefanf		}
116384260Sobrien		return;
116484260Sobrien	}
1165150947Sstefanf	ep = &el->el_map.help[el->el_map.nfunc];
1166150947Sstefanf	for (bp = el->el_map.help; bp < ep; bp++) {
116784260Sobrien		if (bp->func == map[first]) {
116884260Sobrien			if (first == last) {
1169167457Sstefanf				(void) key__decode_str(firstbuf, unparsbuf,
1170167457Sstefanf				    sizeof(unparsbuf), STRQQ);
117184260Sobrien				(void) fprintf(el->el_outfile, "%-15s->  %s\n",
1172167457Sstefanf				    unparsbuf, bp->name);
117384260Sobrien			} else {
1174167457Sstefanf				(void) key__decode_str(firstbuf, unparsbuf,
1175167457Sstefanf				    sizeof(unparsbuf), STRQQ);
1176167457Sstefanf				(void) key__decode_str(lastbuf, extrabuf,
1177167457Sstefanf				    sizeof(extrabuf), STRQQ);
117884260Sobrien				(void) fprintf(el->el_outfile,
117984260Sobrien				    "%-4s to %-7s->  %s\n",
1180167457Sstefanf				    unparsbuf, extrabuf, bp->name);
118184260Sobrien			}
118284260Sobrien			return;
118384260Sobrien		}
118484260Sobrien	}
118584260Sobrien#ifdef MAP_DEBUG
118684260Sobrien	if (map == el->el_map.key) {
1187167457Sstefanf		(void) key__decode_str(firstbuf, unparsbuf,
1188167457Sstefanf		    sizeof(unparsbuf), STRQQ);
118984260Sobrien		(void) fprintf(el->el_outfile,
1190167457Sstefanf		    "BUG!!! %s isn't bound to anything.\n", unparsbuf);
119184260Sobrien		(void) fprintf(el->el_outfile, "el->el_map.key[%d] == %d\n",
119284260Sobrien		    first, el->el_map.key[first]);
119384260Sobrien	} else {
1194167457Sstefanf		(void) key__decode_str(firstbuf, unparsbuf,
1195167457Sstefanf		    sizeof(unparsbuf), STRQQ);
119684260Sobrien		(void) fprintf(el->el_outfile,
1197167457Sstefanf		    "BUG!!! %s isn't bound to anything.\n", unparsbuf);
119884260Sobrien		(void) fprintf(el->el_outfile, "el->el_map.alt[%d] == %d\n",
119984260Sobrien		    first, el->el_map.alt[first]);
12001573Srgrimes	}
12011573Srgrimes#endif
120284260Sobrien	EL_ABORT((el->el_errfile, "Error printing keys\n"));
12031573Srgrimes}
12041573Srgrimes
12051573Srgrimes
12061573Srgrimes/* map_print_all_keys():
12071573Srgrimes *	Print the function description for all keys.
12081573Srgrimes */
12091573Srgrimesprivate void
121084260Sobrienmap_print_all_keys(EditLine *el)
12111573Srgrimes{
121284260Sobrien	int prev, i;
12131573Srgrimes
121484260Sobrien	(void) fprintf(el->el_outfile, "Standard key bindings\n");
121584260Sobrien	prev = 0;
121684260Sobrien	for (i = 0; i < N_KEYS; i++) {
121784260Sobrien		if (el->el_map.key[prev] == el->el_map.key[i])
121884260Sobrien			continue;
121984260Sobrien		map_print_some_keys(el, el->el_map.key, prev, i - 1);
122084260Sobrien		prev = i;
122184260Sobrien	}
12221573Srgrimes	map_print_some_keys(el, el->el_map.key, prev, i - 1);
12231573Srgrimes
122484260Sobrien	(void) fprintf(el->el_outfile, "Alternative key bindings\n");
122584260Sobrien	prev = 0;
122684260Sobrien	for (i = 0; i < N_KEYS; i++) {
122784260Sobrien		if (el->el_map.alt[prev] == el->el_map.alt[i])
122884260Sobrien			continue;
122984260Sobrien		map_print_some_keys(el, el->el_map.alt, prev, i - 1);
123084260Sobrien		prev = i;
123184260Sobrien	}
12321573Srgrimes	map_print_some_keys(el, el->el_map.alt, prev, i - 1);
12331573Srgrimes
123484260Sobrien	(void) fprintf(el->el_outfile, "Multi-character bindings\n");
123584260Sobrien	key_print(el, "");
123684260Sobrien	(void) fprintf(el->el_outfile, "Arrow key bindings\n");
123784260Sobrien	term_print_arrow(el, "");
12381573Srgrimes}
12391573Srgrimes
12401573Srgrimes
12411573Srgrimes/* map_bind():
12421573Srgrimes *	Add/remove/change bindings
12431573Srgrimes */
12441573Srgrimesprotected int
1245148834Sstefanfmap_bind(EditLine *el, int argc, const char **argv)
12461573Srgrimes{
124784260Sobrien	el_action_t *map;
124884260Sobrien	int ntype, rem;
1249148834Sstefanf	const char *p;
125084260Sobrien	char inbuf[EL_BUFSIZ];
125184260Sobrien	char outbuf[EL_BUFSIZ];
1252148834Sstefanf	const char *in = NULL;
1253244941Spfg	char *out;
1254150947Sstefanf	el_bindings_t *bp, *ep;
125584260Sobrien	int cmd;
125684260Sobrien	int key;
12571573Srgrimes
125884260Sobrien	if (argv == NULL)
125984260Sobrien		return (-1);
12601573Srgrimes
126184260Sobrien	map = el->el_map.key;
126284260Sobrien	ntype = XK_CMD;
126384260Sobrien	key = rem = 0;
126484260Sobrien	for (argc = 1; (p = argv[argc]) != NULL; argc++)
126584260Sobrien		if (p[0] == '-')
126684260Sobrien			switch (p[1]) {
126784260Sobrien			case 'a':
126884260Sobrien				map = el->el_map.alt;
126984260Sobrien				break;
12701573Srgrimes
127184260Sobrien			case 's':
127284260Sobrien				ntype = XK_STR;
127384260Sobrien				break;
12741573Srgrimes#ifdef notyet
127584260Sobrien			case 'c':
127684260Sobrien				ntype = XK_EXE;
127784260Sobrien				break;
12781573Srgrimes#endif
127984260Sobrien			case 'k':
128084260Sobrien				key = 1;
128184260Sobrien				break;
12821573Srgrimes
128384260Sobrien			case 'r':
128484260Sobrien				rem = 1;
128584260Sobrien				break;
12861573Srgrimes
128784260Sobrien			case 'v':
128884260Sobrien				map_init_vi(el);
128984260Sobrien				return (0);
12901573Srgrimes
129184260Sobrien			case 'e':
129284260Sobrien				map_init_emacs(el);
129384260Sobrien				return (0);
12941573Srgrimes
129584260Sobrien			case 'l':
1296150947Sstefanf				ep = &el->el_map.help[el->el_map.nfunc];
1297150947Sstefanf				for (bp = el->el_map.help; bp < ep; bp++)
129884260Sobrien					(void) fprintf(el->el_outfile,
129984260Sobrien					    "%s\n\t%s\n",
130084260Sobrien					    bp->name, bp->description);
130184260Sobrien				return (0);
130284260Sobrien			default:
130384260Sobrien				(void) fprintf(el->el_errfile,
130484260Sobrien				    "%s: Invalid switch `%c'.\n",
130584260Sobrien				    argv[0], p[1]);
130684260Sobrien			}
130784260Sobrien		else
130884260Sobrien			break;
13091573Srgrimes
131084260Sobrien	if (argv[argc] == NULL) {
131184260Sobrien		map_print_all_keys(el);
131284260Sobrien		return (0);
13131573Srgrimes	}
131484260Sobrien	if (key)
131584260Sobrien		in = argv[argc++];
131684260Sobrien	else if ((in = parse__string(inbuf, argv[argc++])) == NULL) {
131784260Sobrien		(void) fprintf(el->el_errfile,
131884260Sobrien		    "%s: Invalid \\ or ^ in instring.\n",
131984260Sobrien		    argv[0]);
132084260Sobrien		return (-1);
13211573Srgrimes	}
132284260Sobrien	if (rem) {
132384260Sobrien		if (key) {
132484260Sobrien			(void) term_clear_arrow(el, in);
132584260Sobrien			return (-1);
132684260Sobrien		}
132784260Sobrien		if (in[1])
132884260Sobrien			(void) key_delete(el, in);
132984260Sobrien		else if (map[(unsigned char) *in] == ED_SEQUENCE_LEAD_IN)
133084260Sobrien			(void) key_delete(el, in);
133184260Sobrien		else
133284260Sobrien			map[(unsigned char) *in] = ED_UNASSIGNED;
133384260Sobrien		return (0);
133484260Sobrien	}
133584260Sobrien	if (argv[argc] == NULL) {
133684260Sobrien		if (key)
133784260Sobrien			term_print_arrow(el, in);
133884260Sobrien		else
133984260Sobrien			map_print_key(el, map, in);
134084260Sobrien		return (0);
134184260Sobrien	}
13421573Srgrimes#ifdef notyet
134384260Sobrien	if (argv[argc + 1] != NULL) {
134484260Sobrien		bindkey_usage();
134584260Sobrien		return (-1);
134684260Sobrien	}
13471573Srgrimes#endif
13481573Srgrimes
134984260Sobrien	switch (ntype) {
135084260Sobrien	case XK_STR:
135184260Sobrien	case XK_EXE:
135284260Sobrien		if ((out = parse__string(outbuf, argv[argc])) == NULL) {
135384260Sobrien			(void) fprintf(el->el_errfile,
135484260Sobrien			    "%s: Invalid \\ or ^ in outstring.\n", argv[0]);
135584260Sobrien			return (-1);
135684260Sobrien		}
135784260Sobrien		if (key)
135884260Sobrien			term_set_arrow(el, in, key_map_str(el, out), ntype);
135984260Sobrien		else
136084260Sobrien			key_add(el, in, key_map_str(el, out), ntype);
136184260Sobrien		map[(unsigned char) *in] = ED_SEQUENCE_LEAD_IN;
136284260Sobrien		break;
13631573Srgrimes
136484260Sobrien	case XK_CMD:
136584260Sobrien		if ((cmd = parse_cmd(el, argv[argc])) == -1) {
136684260Sobrien			(void) fprintf(el->el_errfile,
136784260Sobrien			    "%s: Invalid command `%s'.\n", argv[0], argv[argc]);
136884260Sobrien			return (-1);
136984260Sobrien		}
137084260Sobrien		if (key)
1371244941Spfg			term_set_arrow(el, in, key_map_cmd(el, cmd), ntype);
137284260Sobrien		else {
137384260Sobrien			if (in[1]) {
137484260Sobrien				key_add(el, in, key_map_cmd(el, cmd), ntype);
137584260Sobrien				map[(unsigned char) *in] = ED_SEQUENCE_LEAD_IN;
137684260Sobrien			} else {
137784260Sobrien				key_clear(el, map, in);
137884260Sobrien				map[(unsigned char) *in] = cmd;
137984260Sobrien			}
138084260Sobrien		}
138184260Sobrien		break;
138284260Sobrien
138384260Sobrien	default:
1384167464Sstefanf		EL_ABORT((el->el_errfile, "Bad XK_ type %d\n", ntype));
138584260Sobrien		break;
13861573Srgrimes	}
138784260Sobrien	return (0);
13881573Srgrimes}
13891573Srgrimes
13901573Srgrimes
13911573Srgrimes/* map_addfunc():
13921573Srgrimes *	add a user defined function
13931573Srgrimes */
13941573Srgrimesprotected int
139584260Sobrienmap_addfunc(EditLine *el, const char *name, const char *help, el_func_t func)
13961573Srgrimes{
139784260Sobrien	void *p;
1398150947Sstefanf	int nf = el->el_map.nfunc + 1;
13991573Srgrimes
140084260Sobrien	if (name == NULL || help == NULL || func == NULL)
140184260Sobrien		return (-1);
14021573Srgrimes
1403148814Sstefanf	if ((p = el_realloc(el->el_map.func, nf * sizeof(el_func_t))) == NULL)
140484260Sobrien		return (-1);
140584260Sobrien	el->el_map.func = (el_func_t *) p;
1406148814Sstefanf	if ((p = el_realloc(el->el_map.help, nf * sizeof(el_bindings_t)))
140784260Sobrien	    == NULL)
140884260Sobrien		return (-1);
140984260Sobrien	el->el_map.help = (el_bindings_t *) p;
14101573Srgrimes
141184260Sobrien	nf = el->el_map.nfunc;
141284260Sobrien	el->el_map.func[nf] = func;
14131573Srgrimes
141484260Sobrien	el->el_map.help[nf].name = name;
141584260Sobrien	el->el_map.help[nf].func = nf;
141684260Sobrien	el->el_map.help[nf].description = help;
141784260Sobrien	el->el_map.nfunc++;
141884260Sobrien
141984260Sobrien	return (0);
14201573Srgrimes}
1421