/*      $NetBSD: map.c,v 1.56 2025/01/03 00:40:08 rillig Exp $  */

/*-
* Copyright (c) 1992, 1993
*      The Regents of the University of California.  All rights reserved.
*
* This code is derived from software contributed to Berkeley by
* Christos Zoulas of Cornell University.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
*    notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
*    notice, this list of conditions and the following disclaimer in the
*    documentation and/or other materials provided with the distribution.
* 3. Neither the name of the University nor the names of its contributors
*    may be used to endorse or promote products derived from this software
*    without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/

#include "config.h"
#if !defined(lint) && !defined(SCCSID)
#if 0
static char sccsid[] = "@(#)map.c       8.1 (Berkeley) 6/4/93";
#else
__RCSID("$NetBSD: map.c,v 1.56 2025/01/03 00:40:08 rillig Exp $");
#endif
#endif /* not lint && not SCCSID */

/*
* map.c: Editor function definitions
*/
#include <ctype.h>
#include <stdlib.h>
#include <string.h>

#include "el.h"
#include "common.h"
#include "emacs.h"
#include "vi.h"
#include "fcns.h"
#include "func.h"
#include "help.h"
#include "parse.h"

static void     map_print_key(EditLine *, el_action_t *, const wchar_t *);
static void     map_print_some_keys(EditLine *, el_action_t *, wint_t, wint_t);
static void     map_print_all_keys(EditLine *);
static void     map_init_nls(EditLine *);
static void     map_init_meta(EditLine *);

/* keymap tables ; should be N_KEYS*sizeof(KEYCMD) bytes long */


static const el_action_t  el_map_emacs[] = {
       /*   0 */       EM_SET_MARK,            /* ^@ */
       /*   1 */       ED_MOVE_TO_BEG,         /* ^A */
       /*   2 */       ED_PREV_CHAR,           /* ^B */
       /*   3 */       ED_IGNORE,              /* ^C */
       /*   4 */       EM_DELETE_OR_LIST,      /* ^D */
       /*   5 */       ED_MOVE_TO_END,         /* ^E */
       /*   6 */       ED_NEXT_CHAR,           /* ^F */
       /*   7 */       ED_UNASSIGNED,          /* ^G */
       /*   8 */       EM_DELETE_PREV_CHAR,    /* ^H */
       /*   9 */       ED_UNASSIGNED,          /* ^I */
       /*  10 */       ED_NEWLINE,             /* ^J */
       /*  11 */       ED_KILL_LINE,           /* ^K */
       /*  12 */       ED_CLEAR_SCREEN,        /* ^L */
       /*  13 */       ED_NEWLINE,             /* ^M */
       /*  14 */       ED_NEXT_HISTORY,        /* ^N */
       /*  15 */       ED_IGNORE,              /* ^O */
       /*  16 */       ED_PREV_HISTORY,        /* ^P */
       /*  17 */       ED_IGNORE,              /* ^Q */
       /*  18 */       EM_INC_SEARCH_PREV,     /* ^R */
       /*  19 */       ED_IGNORE,              /* ^S */
       /*  20 */       ED_TRANSPOSE_CHARS,     /* ^T */
       /*  21 */       EM_KILL_LINE,           /* ^U */
       /*  22 */       ED_QUOTED_INSERT,       /* ^V */
       /*  23 */       ED_DELETE_PREV_WORD,    /* ^W */
       /*  24 */       ED_SEQUENCE_LEAD_IN,    /* ^X */
       /*  25 */       EM_YANK,                /* ^Y */
       /*  26 */       ED_IGNORE,              /* ^Z */
       /*  27 */       EM_META_NEXT,           /* ^[ */
       /*  28 */       ED_IGNORE,              /* ^\ */
       /*  29 */       ED_IGNORE,              /* ^] */
       /*  30 */       ED_UNASSIGNED,          /* ^^ */
       /*  31 */       ED_UNASSIGNED,          /* ^_ */
       /*  32 */       ED_INSERT,              /* SPACE */
       /*  33 */       ED_INSERT,              /* ! */
       /*  34 */       ED_INSERT,              /* " */
       /*  35 */       ED_INSERT,              /* # */
       /*  36 */       ED_INSERT,              /* $ */
       /*  37 */       ED_INSERT,              /* % */
       /*  38 */       ED_INSERT,              /* & */
       /*  39 */       ED_INSERT,              /* ' */
       /*  40 */       ED_INSERT,              /* ( */
       /*  41 */       ED_INSERT,              /* ) */
       /*  42 */       ED_INSERT,              /* * */
       /*  43 */       ED_INSERT,              /* + */
       /*  44 */       ED_INSERT,              /* , */
       /*  45 */       ED_INSERT,              /* - */
       /*  46 */       ED_INSERT,              /* . */
       /*  47 */       ED_INSERT,              /* / */
       /*  48 */       ED_DIGIT,               /* 0 */
       /*  49 */       ED_DIGIT,               /* 1 */
       /*  50 */       ED_DIGIT,               /* 2 */
       /*  51 */       ED_DIGIT,               /* 3 */
       /*  52 */       ED_DIGIT,               /* 4 */
       /*  53 */       ED_DIGIT,               /* 5 */
       /*  54 */       ED_DIGIT,               /* 6 */
       /*  55 */       ED_DIGIT,               /* 7 */
       /*  56 */       ED_DIGIT,               /* 8 */
       /*  57 */       ED_DIGIT,               /* 9 */
       /*  58 */       ED_INSERT,              /* : */
       /*  59 */       ED_INSERT,              /* ; */
       /*  60 */       ED_INSERT,              /* < */
       /*  61 */       ED_INSERT,              /* = */
       /*  62 */       ED_INSERT,              /* > */
       /*  63 */       ED_INSERT,              /* ? */
       /*  64 */       ED_INSERT,              /* @ */
       /*  65 */       ED_INSERT,              /* A */
       /*  66 */       ED_INSERT,              /* B */
       /*  67 */       ED_INSERT,              /* C */
       /*  68 */       ED_INSERT,              /* D */
       /*  69 */       ED_INSERT,              /* E */
       /*  70 */       ED_INSERT,              /* F */
       /*  71 */       ED_INSERT,              /* G */
       /*  72 */       ED_INSERT,              /* H */
       /*  73 */       ED_INSERT,              /* I */
       /*  74 */       ED_INSERT,              /* J */
       /*  75 */       ED_INSERT,              /* K */
       /*  76 */       ED_INSERT,              /* L */
       /*  77 */       ED_INSERT,              /* M */
       /*  78 */       ED_INSERT,              /* N */
       /*  79 */       ED_INSERT,              /* O */
       /*  80 */       ED_INSERT,              /* P */
       /*  81 */       ED_INSERT,              /* Q */
       /*  82 */       ED_INSERT,              /* R */
       /*  83 */       ED_INSERT,              /* S */
       /*  84 */       ED_INSERT,              /* T */
       /*  85 */       ED_INSERT,              /* U */
       /*  86 */       ED_INSERT,              /* V */
       /*  87 */       ED_INSERT,              /* W */
       /*  88 */       ED_INSERT,              /* X */
       /*  89 */       ED_INSERT,              /* Y */
       /*  90 */       ED_INSERT,              /* Z */
       /*  91 */       ED_INSERT,              /* [ */
       /*  92 */       ED_INSERT,              /* \ */
       /*  93 */       ED_INSERT,              /* ] */
       /*  94 */       ED_INSERT,              /* ^ */
       /*  95 */       ED_INSERT,              /* _ */
       /*  96 */       ED_INSERT,              /* ` */
       /*  97 */       ED_INSERT,              /* a */
       /*  98 */       ED_INSERT,              /* b */
       /*  99 */       ED_INSERT,              /* c */
       /* 100 */       ED_INSERT,              /* d */
       /* 101 */       ED_INSERT,              /* e */
       /* 102 */       ED_INSERT,              /* f */
       /* 103 */       ED_INSERT,              /* g */
       /* 104 */       ED_INSERT,              /* h */
       /* 105 */       ED_INSERT,              /* i */
       /* 106 */       ED_INSERT,              /* j */
       /* 107 */       ED_INSERT,              /* k */
       /* 108 */       ED_INSERT,              /* l */
       /* 109 */       ED_INSERT,              /* m */
       /* 110 */       ED_INSERT,              /* n */
       /* 111 */       ED_INSERT,              /* o */
       /* 112 */       ED_INSERT,              /* p */
       /* 113 */       ED_INSERT,              /* q */
       /* 114 */       ED_INSERT,              /* r */
       /* 115 */       ED_INSERT,              /* s */
       /* 116 */       ED_INSERT,              /* t */
       /* 117 */       ED_INSERT,              /* u */
       /* 118 */       ED_INSERT,              /* v */
       /* 119 */       ED_INSERT,              /* w */
       /* 120 */       ED_INSERT,              /* x */
       /* 121 */       ED_INSERT,              /* y */
       /* 122 */       ED_INSERT,              /* z */
       /* 123 */       ED_INSERT,              /* { */
       /* 124 */       ED_INSERT,              /* | */
       /* 125 */       ED_INSERT,              /* } */
       /* 126 */       ED_INSERT,              /* ~ */
       /* 127 */       EM_DELETE_PREV_CHAR,    /* ^? */
       /* 128 */       ED_UNASSIGNED,          /* M-^@ */
       /* 129 */       ED_UNASSIGNED,          /* M-^A */
       /* 130 */       ED_UNASSIGNED,          /* M-^B */
       /* 131 */       ED_UNASSIGNED,          /* M-^C */
       /* 132 */       ED_UNASSIGNED,          /* M-^D */
       /* 133 */       ED_UNASSIGNED,          /* M-^E */
       /* 134 */       ED_UNASSIGNED,          /* M-^F */
       /* 135 */       ED_UNASSIGNED,          /* M-^G */
       /* 136 */       ED_DELETE_PREV_WORD,    /* M-^H */
       /* 137 */       ED_UNASSIGNED,          /* M-^I */
       /* 138 */       ED_UNASSIGNED,          /* M-^J */
       /* 139 */       ED_UNASSIGNED,          /* M-^K */
       /* 140 */       ED_CLEAR_SCREEN,        /* M-^L */
       /* 141 */       ED_UNASSIGNED,          /* M-^M */
       /* 142 */       ED_UNASSIGNED,          /* M-^N */
       /* 143 */       ED_UNASSIGNED,          /* M-^O */
       /* 144 */       ED_UNASSIGNED,          /* M-^P */
       /* 145 */       ED_UNASSIGNED,          /* M-^Q */
       /* 146 */       ED_UNASSIGNED,          /* M-^R */
       /* 147 */       ED_UNASSIGNED,          /* M-^S */
       /* 148 */       ED_UNASSIGNED,          /* M-^T */
       /* 149 */       ED_UNASSIGNED,          /* M-^U */
       /* 150 */       ED_UNASSIGNED,          /* M-^V */
       /* 151 */       ED_UNASSIGNED,          /* M-^W */
       /* 152 */       ED_UNASSIGNED,          /* M-^X */
       /* 153 */       ED_UNASSIGNED,          /* M-^Y */
       /* 154 */       ED_UNASSIGNED,          /* M-^Z */
       /* 155 */       ED_UNASSIGNED,          /* M-^[ */
       /* 156 */       ED_UNASSIGNED,          /* M-^\ */
       /* 157 */       ED_UNASSIGNED,          /* M-^] */
       /* 158 */       ED_UNASSIGNED,          /* M-^^ */
       /* 159 */       EM_COPY_PREV_WORD,      /* M-^_ */
       /* 160 */       ED_UNASSIGNED,          /* M-SPACE */
       /* 161 */       ED_UNASSIGNED,          /* M-! */
       /* 162 */       ED_UNASSIGNED,          /* M-" */
       /* 163 */       ED_UNASSIGNED,          /* M-# */
       /* 164 */       ED_UNASSIGNED,          /* M-$ */
       /* 165 */       ED_UNASSIGNED,          /* M-% */
       /* 166 */       ED_UNASSIGNED,          /* M-& */
       /* 167 */       ED_UNASSIGNED,          /* M-' */
       /* 168 */       ED_UNASSIGNED,          /* M-( */
       /* 169 */       ED_UNASSIGNED,          /* M-) */
       /* 170 */       ED_UNASSIGNED,          /* M-* */
       /* 171 */       ED_UNASSIGNED,          /* M-+ */
       /* 172 */       ED_UNASSIGNED,          /* M-, */
       /* 173 */       ED_UNASSIGNED,          /* M-- */
       /* 174 */       ED_UNASSIGNED,          /* M-. */
       /* 175 */       ED_UNASSIGNED,          /* M-/ */
       /* 176 */       ED_ARGUMENT_DIGIT,      /* M-0 */
       /* 177 */       ED_ARGUMENT_DIGIT,      /* M-1 */
       /* 178 */       ED_ARGUMENT_DIGIT,      /* M-2 */
       /* 179 */       ED_ARGUMENT_DIGIT,      /* M-3 */
       /* 180 */       ED_ARGUMENT_DIGIT,      /* M-4 */
       /* 181 */       ED_ARGUMENT_DIGIT,      /* M-5 */
       /* 182 */       ED_ARGUMENT_DIGIT,      /* M-6 */
       /* 183 */       ED_ARGUMENT_DIGIT,      /* M-7 */
       /* 184 */       ED_ARGUMENT_DIGIT,      /* M-8 */
       /* 185 */       ED_ARGUMENT_DIGIT,      /* M-9 */
       /* 186 */       ED_UNASSIGNED,          /* M-: */
       /* 187 */       ED_UNASSIGNED,          /* M-; */
       /* 188 */       ED_UNASSIGNED,          /* M-< */
       /* 189 */       ED_UNASSIGNED,          /* M-= */
       /* 190 */       ED_UNASSIGNED,          /* M-> */
       /* 191 */       ED_UNASSIGNED,          /* M-? */
       /* 192 */       ED_UNASSIGNED,          /* M-@ */
       /* 193 */       ED_UNASSIGNED,          /* M-A */
       /* 194 */       ED_PREV_WORD,           /* M-B */
       /* 195 */       EM_CAPITOL_CASE,        /* M-C */
       /* 196 */       EM_DELETE_NEXT_WORD,    /* M-D */
       /* 197 */       ED_UNASSIGNED,          /* M-E */
       /* 198 */       EM_NEXT_WORD,           /* M-F */
       /* 199 */       ED_UNASSIGNED,          /* M-G */
       /* 200 */       ED_UNASSIGNED,          /* M-H */
       /* 201 */       ED_UNASSIGNED,          /* M-I */
       /* 202 */       ED_UNASSIGNED,          /* M-J */
       /* 203 */       ED_UNASSIGNED,          /* M-K */
       /* 204 */       EM_LOWER_CASE,          /* M-L */
       /* 205 */       ED_UNASSIGNED,          /* M-M */
       /* 206 */       ED_SEARCH_NEXT_HISTORY, /* M-N */
       /* 207 */       ED_SEQUENCE_LEAD_IN,    /* M-O */
       /* 208 */       ED_SEARCH_PREV_HISTORY, /* M-P */
       /* 209 */       ED_UNASSIGNED,          /* M-Q */
       /* 210 */       ED_UNASSIGNED,          /* M-R */
       /* 211 */       ED_UNASSIGNED,          /* M-S */
       /* 212 */       ED_UNASSIGNED,          /* M-T */
       /* 213 */       EM_UPPER_CASE,          /* M-U */
       /* 214 */       ED_UNASSIGNED,          /* M-V */
       /* 215 */       EM_COPY_REGION,         /* M-W */
       /* 216 */       ED_COMMAND,             /* M-X */
       /* 217 */       ED_UNASSIGNED,          /* M-Y */
       /* 218 */       ED_UNASSIGNED,          /* M-Z */
       /* 219 */       ED_SEQUENCE_LEAD_IN,    /* M-[ */
       /* 220 */       ED_UNASSIGNED,          /* M-\ */
       /* 221 */       ED_UNASSIGNED,          /* M-] */
       /* 222 */       ED_UNASSIGNED,          /* M-^ */
       /* 223 */       ED_UNASSIGNED,          /* M-_ */
       /* 223 */       ED_UNASSIGNED,          /* M-` */
       /* 224 */       ED_UNASSIGNED,          /* M-a */
       /* 225 */       ED_PREV_WORD,           /* M-b */
       /* 226 */       EM_CAPITOL_CASE,        /* M-c */
       /* 227 */       EM_DELETE_NEXT_WORD,    /* M-d */
       /* 228 */       ED_UNASSIGNED,          /* M-e */
       /* 229 */       EM_NEXT_WORD,           /* M-f */
       /* 230 */       ED_UNASSIGNED,          /* M-g */
       /* 231 */       ED_UNASSIGNED,          /* M-h */
       /* 232 */       ED_UNASSIGNED,          /* M-i */
       /* 233 */       ED_UNASSIGNED,          /* M-j */
       /* 234 */       ED_UNASSIGNED,          /* M-k */
       /* 235 */       EM_LOWER_CASE,          /* M-l */
       /* 236 */       ED_UNASSIGNED,          /* M-m */
       /* 237 */       ED_SEARCH_NEXT_HISTORY, /* M-n */
       /* 238 */       ED_UNASSIGNED,          /* M-o */
       /* 239 */       ED_SEARCH_PREV_HISTORY, /* M-p */
       /* 240 */       ED_UNASSIGNED,          /* M-q */
       /* 241 */       ED_UNASSIGNED,          /* M-r */
       /* 242 */       ED_UNASSIGNED,          /* M-s */
       /* 243 */       ED_UNASSIGNED,          /* M-t */
       /* 244 */       EM_UPPER_CASE,          /* M-u */
       /* 245 */       ED_UNASSIGNED,          /* M-v */
       /* 246 */       EM_COPY_REGION,         /* M-w */
       /* 247 */       ED_COMMAND,             /* M-x */
       /* 248 */       ED_UNASSIGNED,          /* M-y */
       /* 249 */       ED_UNASSIGNED,          /* M-z */
       /* 250 */       ED_UNASSIGNED,          /* M-{ */
       /* 251 */       ED_UNASSIGNED,          /* M-| */
       /* 252 */       ED_UNASSIGNED,          /* M-} */
       /* 253 */       ED_UNASSIGNED,          /* M-~ */
       /* 254 */       ED_DELETE_PREV_WORD     /* M-^? */
       /* 255 */
};


/*
* keymap table for vi.  Each index into above tbl; should be
* N_KEYS entries long.  Vi mode uses a sticky-extend to do command mode:
* insert mode characters are in the normal keymap, and command mode
* in the extended keymap.
*/
static const el_action_t  el_map_vi_insert[] = {
#ifdef KSHVI
       /*   0 */       ED_UNASSIGNED,          /* ^@ */
       /*   1 */       ED_INSERT,              /* ^A */
       /*   2 */       ED_INSERT,              /* ^B */
       /*   3 */       ED_INSERT,              /* ^C */
       /*   4 */       VI_LIST_OR_EOF,         /* ^D */
       /*   5 */       ED_INSERT,              /* ^E */
       /*   6 */       ED_INSERT,              /* ^F */
       /*   7 */       ED_INSERT,              /* ^G */
       /*   8 */       VI_DELETE_PREV_CHAR,    /* ^H */   /* BackSpace key */
       /*   9 */       ED_INSERT,              /* ^I */   /* Tab Key  */
       /*  10 */       ED_NEWLINE,             /* ^J */
       /*  11 */       ED_INSERT,              /* ^K */
       /*  12 */       ED_INSERT,              /* ^L */
       /*  13 */       ED_NEWLINE,             /* ^M */
       /*  14 */       ED_INSERT,              /* ^N */
       /*  15 */       ED_INSERT,              /* ^O */
       /*  16 */       ED_INSERT,              /* ^P */
       /*  17 */       ED_IGNORE,              /* ^Q */
       /*  18 */       ED_INSERT,              /* ^R */
       /*  19 */       ED_IGNORE,              /* ^S */
       /*  20 */       ED_INSERT,              /* ^T */
       /*  21 */       VI_KILL_LINE_PREV,      /* ^U */
       /*  22 */       ED_QUOTED_INSERT,       /* ^V */
       /*  23 */       ED_DELETE_PREV_WORD,    /* ^W */
               /* ED_DELETE_PREV_WORD: Only until strt edit pos */
       /*  24 */       ED_INSERT,              /* ^X */
       /*  25 */       ED_INSERT,              /* ^Y */
       /*  26 */       ED_INSERT,              /* ^Z */
       /*  27 */       VI_COMMAND_MODE,        /* ^[ */  /* [ Esc ] key */
       /*  28 */       ED_IGNORE,              /* ^\ */
       /*  29 */       ED_INSERT,              /* ^] */
       /*  30 */       ED_INSERT,              /* ^^ */
       /*  31 */       ED_INSERT,              /* ^_ */
#else /* !KSHVI */
                               /*
                                * NOTE: These mappings do NOT Correspond well
                                * to the KSH VI editing assignments.
                                * On the other and they are convenient and
                                * many people have have gotten used to them.
                                */
       /*   0 */       ED_UNASSIGNED,          /* ^@ */
       /*   1 */       ED_MOVE_TO_BEG,         /* ^A */
       /*   2 */       ED_PREV_CHAR,           /* ^B */
       /*   3 */       ED_IGNORE,              /* ^C */
       /*   4 */       VI_LIST_OR_EOF,         /* ^D */
       /*   5 */       ED_MOVE_TO_END,         /* ^E */
       /*   6 */       ED_NEXT_CHAR,           /* ^F */
       /*   7 */       ED_UNASSIGNED,          /* ^G */
       /*   8 */       VI_DELETE_PREV_CHAR,    /* ^H */   /* BackSpace key */
       /*   9 */       ED_UNASSIGNED,          /* ^I */   /* Tab Key */
       /*  10 */       ED_NEWLINE,             /* ^J */
       /*  11 */       ED_KILL_LINE,           /* ^K */
       /*  12 */       ED_CLEAR_SCREEN,        /* ^L */
       /*  13 */       ED_NEWLINE,             /* ^M */
       /*  14 */       ED_NEXT_HISTORY,        /* ^N */
       /*  15 */       ED_IGNORE,              /* ^O */
       /*  16 */       ED_PREV_HISTORY,        /* ^P */
       /*  17 */       ED_IGNORE,              /* ^Q */
       /*  18 */       ED_REDISPLAY,           /* ^R */
       /*  19 */       ED_IGNORE,              /* ^S */
       /*  20 */       ED_TRANSPOSE_CHARS,     /* ^T */
       /*  21 */       VI_KILL_LINE_PREV,      /* ^U */
       /*  22 */       ED_QUOTED_INSERT,       /* ^V */
       /*  23 */       ED_DELETE_PREV_WORD,    /* ^W */
       /*  24 */       ED_UNASSIGNED,          /* ^X */
       /*  25 */       ED_IGNORE,              /* ^Y */
       /*  26 */       ED_IGNORE,              /* ^Z */
       /*  27 */       VI_COMMAND_MODE,        /* ^[ */
       /*  28 */       ED_IGNORE,              /* ^\ */
       /*  29 */       ED_UNASSIGNED,          /* ^] */
       /*  30 */       ED_UNASSIGNED,          /* ^^ */
       /*  31 */       ED_UNASSIGNED,          /* ^_ */
#endif  /* KSHVI */
       /*  32 */       ED_INSERT,              /* SPACE */
       /*  33 */       ED_INSERT,              /* ! */
       /*  34 */       ED_INSERT,              /* " */
       /*  35 */       ED_INSERT,              /* # */
       /*  36 */       ED_INSERT,              /* $ */
       /*  37 */       ED_INSERT,              /* % */
       /*  38 */       ED_INSERT,              /* & */
       /*  39 */       ED_INSERT,              /* ' */
       /*  40 */       ED_INSERT,              /* ( */
       /*  41 */       ED_INSERT,              /* ) */
       /*  42 */       ED_INSERT,              /* * */
       /*  43 */       ED_INSERT,              /* + */
       /*  44 */       ED_INSERT,              /* , */
       /*  45 */       ED_INSERT,              /* - */
       /*  46 */       ED_INSERT,              /* . */
       /*  47 */       ED_INSERT,              /* / */
       /*  48 */       ED_INSERT,              /* 0 */
       /*  49 */       ED_INSERT,              /* 1 */
       /*  50 */       ED_INSERT,              /* 2 */
       /*  51 */       ED_INSERT,              /* 3 */
       /*  52 */       ED_INSERT,              /* 4 */
       /*  53 */       ED_INSERT,              /* 5 */
       /*  54 */       ED_INSERT,              /* 6 */
       /*  55 */       ED_INSERT,              /* 7 */
       /*  56 */       ED_INSERT,              /* 8 */
       /*  57 */       ED_INSERT,              /* 9 */
       /*  58 */       ED_INSERT,              /* : */
       /*  59 */       ED_INSERT,              /* ; */
       /*  60 */       ED_INSERT,              /* < */
       /*  61 */       ED_INSERT,              /* = */
       /*  62 */       ED_INSERT,              /* > */
       /*  63 */       ED_INSERT,              /* ? */
       /*  64 */       ED_INSERT,              /* @ */
       /*  65 */       ED_INSERT,              /* A */
       /*  66 */       ED_INSERT,              /* B */
       /*  67 */       ED_INSERT,              /* C */
       /*  68 */       ED_INSERT,              /* D */
       /*  69 */       ED_INSERT,              /* E */
       /*  70 */       ED_INSERT,              /* F */
       /*  71 */       ED_INSERT,              /* G */
       /*  72 */       ED_INSERT,              /* H */
       /*  73 */       ED_INSERT,              /* I */
       /*  74 */       ED_INSERT,              /* J */
       /*  75 */       ED_INSERT,              /* K */
       /*  76 */       ED_INSERT,              /* L */
       /*  77 */       ED_INSERT,              /* M */
       /*  78 */       ED_INSERT,              /* N */
       /*  79 */       ED_INSERT,              /* O */
       /*  80 */       ED_INSERT,              /* P */
       /*  81 */       ED_INSERT,              /* Q */
       /*  82 */       ED_INSERT,              /* R */
       /*  83 */       ED_INSERT,              /* S */
       /*  84 */       ED_INSERT,              /* T */
       /*  85 */       ED_INSERT,              /* U */
       /*  86 */       ED_INSERT,              /* V */
       /*  87 */       ED_INSERT,              /* W */
       /*  88 */       ED_INSERT,              /* X */
       /*  89 */       ED_INSERT,              /* Y */
       /*  90 */       ED_INSERT,              /* Z */
       /*  91 */       ED_INSERT,              /* [ */
       /*  92 */       ED_INSERT,              /* \ */
       /*  93 */       ED_INSERT,              /* ] */
       /*  94 */       ED_INSERT,              /* ^ */
       /*  95 */       ED_INSERT,              /* _ */
       /*  96 */       ED_INSERT,              /* ` */
       /*  97 */       ED_INSERT,              /* a */
       /*  98 */       ED_INSERT,              /* b */
       /*  99 */       ED_INSERT,              /* c */
       /* 100 */       ED_INSERT,              /* d */
       /* 101 */       ED_INSERT,              /* e */
       /* 102 */       ED_INSERT,              /* f */
       /* 103 */       ED_INSERT,              /* g */
       /* 104 */       ED_INSERT,              /* h */
       /* 105 */       ED_INSERT,              /* i */
       /* 106 */       ED_INSERT,              /* j */
       /* 107 */       ED_INSERT,              /* k */
       /* 108 */       ED_INSERT,              /* l */
       /* 109 */       ED_INSERT,              /* m */
       /* 110 */       ED_INSERT,              /* n */
       /* 111 */       ED_INSERT,              /* o */
       /* 112 */       ED_INSERT,              /* p */
       /* 113 */       ED_INSERT,              /* q */
       /* 114 */       ED_INSERT,              /* r */
       /* 115 */       ED_INSERT,              /* s */
       /* 116 */       ED_INSERT,              /* t */
       /* 117 */       ED_INSERT,              /* u */
       /* 118 */       ED_INSERT,              /* v */
       /* 119 */       ED_INSERT,              /* w */
       /* 120 */       ED_INSERT,              /* x */
       /* 121 */       ED_INSERT,              /* y */
       /* 122 */       ED_INSERT,              /* z */
       /* 123 */       ED_INSERT,              /* { */
       /* 124 */       ED_INSERT,              /* | */
       /* 125 */       ED_INSERT,              /* } */
       /* 126 */       ED_INSERT,              /* ~ */
       /* 127 */       VI_DELETE_PREV_CHAR,    /* ^? */
       /* 128 */       ED_INSERT,              /* M-^@ */
       /* 129 */       ED_INSERT,              /* M-^A */
       /* 130 */       ED_INSERT,              /* M-^B */
       /* 131 */       ED_INSERT,              /* M-^C */
       /* 132 */       ED_INSERT,              /* M-^D */
       /* 133 */       ED_INSERT,              /* M-^E */
       /* 134 */       ED_INSERT,              /* M-^F */
       /* 135 */       ED_INSERT,              /* M-^G */
       /* 136 */       ED_INSERT,              /* M-^H */
       /* 137 */       ED_INSERT,              /* M-^I */
       /* 138 */       ED_INSERT,              /* M-^J */
       /* 139 */       ED_INSERT,              /* M-^K */
       /* 140 */       ED_INSERT,              /* M-^L */
       /* 141 */       ED_INSERT,              /* M-^M */
       /* 142 */       ED_INSERT,              /* M-^N */
       /* 143 */       ED_INSERT,              /* M-^O */
       /* 144 */       ED_INSERT,              /* M-^P */
       /* 145 */       ED_INSERT,              /* M-^Q */
       /* 146 */       ED_INSERT,              /* M-^R */
       /* 147 */       ED_INSERT,              /* M-^S */
       /* 148 */       ED_INSERT,              /* M-^T */
       /* 149 */       ED_INSERT,              /* M-^U */
       /* 150 */       ED_INSERT,              /* M-^V */
       /* 151 */       ED_INSERT,              /* M-^W */
       /* 152 */       ED_INSERT,              /* M-^X */
       /* 153 */       ED_INSERT,              /* M-^Y */
       /* 154 */       ED_INSERT,              /* M-^Z */
       /* 155 */       ED_INSERT,              /* M-^[ */
       /* 156 */       ED_INSERT,              /* M-^\ */
       /* 157 */       ED_INSERT,              /* M-^] */
       /* 158 */       ED_INSERT,              /* M-^^ */
       /* 159 */       ED_INSERT,              /* M-^_ */
       /* 160 */       ED_INSERT,              /* M-SPACE */
       /* 161 */       ED_INSERT,              /* M-! */
       /* 162 */       ED_INSERT,              /* M-" */
       /* 163 */       ED_INSERT,              /* M-# */
       /* 164 */       ED_INSERT,              /* M-$ */
       /* 165 */       ED_INSERT,              /* M-% */
       /* 166 */       ED_INSERT,              /* M-& */
       /* 167 */       ED_INSERT,              /* M-' */
       /* 168 */       ED_INSERT,              /* M-( */
       /* 169 */       ED_INSERT,              /* M-) */
       /* 170 */       ED_INSERT,              /* M-* */
       /* 171 */       ED_INSERT,              /* M-+ */
       /* 172 */       ED_INSERT,              /* M-, */
       /* 173 */       ED_INSERT,              /* M-- */
       /* 174 */       ED_INSERT,              /* M-. */
       /* 175 */       ED_INSERT,              /* M-/ */
       /* 176 */       ED_INSERT,              /* M-0 */
       /* 177 */       ED_INSERT,              /* M-1 */
       /* 178 */       ED_INSERT,              /* M-2 */
       /* 179 */       ED_INSERT,              /* M-3 */
       /* 180 */       ED_INSERT,              /* M-4 */
       /* 181 */       ED_INSERT,              /* M-5 */
       /* 182 */       ED_INSERT,              /* M-6 */
       /* 183 */       ED_INSERT,              /* M-7 */
       /* 184 */       ED_INSERT,              /* M-8 */
       /* 185 */       ED_INSERT,              /* M-9 */
       /* 186 */       ED_INSERT,              /* M-: */
       /* 187 */       ED_INSERT,              /* M-; */
       /* 188 */       ED_INSERT,              /* M-< */
       /* 189 */       ED_INSERT,              /* M-= */
       /* 190 */       ED_INSERT,              /* M-> */
       /* 191 */       ED_INSERT,              /* M-? */
       /* 192 */       ED_INSERT,              /* M-@ */
       /* 193 */       ED_INSERT,              /* M-A */
       /* 194 */       ED_INSERT,              /* M-B */
       /* 195 */       ED_INSERT,              /* M-C */
       /* 196 */       ED_INSERT,              /* M-D */
       /* 197 */       ED_INSERT,              /* M-E */
       /* 198 */       ED_INSERT,              /* M-F */
       /* 199 */       ED_INSERT,              /* M-G */
       /* 200 */       ED_INSERT,              /* M-H */
       /* 201 */       ED_INSERT,              /* M-I */
       /* 202 */       ED_INSERT,              /* M-J */
       /* 203 */       ED_INSERT,              /* M-K */
       /* 204 */       ED_INSERT,              /* M-L */
       /* 205 */       ED_INSERT,              /* M-M */
       /* 206 */       ED_INSERT,              /* M-N */
       /* 207 */       ED_INSERT,              /* M-O */
       /* 208 */       ED_INSERT,              /* M-P */
       /* 209 */       ED_INSERT,              /* M-Q */
       /* 210 */       ED_INSERT,              /* M-R */
       /* 211 */       ED_INSERT,              /* M-S */
       /* 212 */       ED_INSERT,              /* M-T */
       /* 213 */       ED_INSERT,              /* M-U */
       /* 214 */       ED_INSERT,              /* M-V */
       /* 215 */       ED_INSERT,              /* M-W */
       /* 216 */       ED_INSERT,              /* M-X */
       /* 217 */       ED_INSERT,              /* M-Y */
       /* 218 */       ED_INSERT,              /* M-Z */
       /* 219 */       ED_INSERT,              /* M-[ */
       /* 220 */       ED_INSERT,              /* M-\ */
       /* 221 */       ED_INSERT,              /* M-] */
       /* 222 */       ED_INSERT,              /* M-^ */
       /* 223 */       ED_INSERT,              /* M-_ */
       /* 224 */       ED_INSERT,              /* M-` */
       /* 225 */       ED_INSERT,              /* M-a */
       /* 226 */       ED_INSERT,              /* M-b */
       /* 227 */       ED_INSERT,              /* M-c */
       /* 228 */       ED_INSERT,              /* M-d */
       /* 229 */       ED_INSERT,              /* M-e */
       /* 230 */       ED_INSERT,              /* M-f */
       /* 231 */       ED_INSERT,              /* M-g */
       /* 232 */       ED_INSERT,              /* M-h */
       /* 233 */       ED_INSERT,              /* M-i */
       /* 234 */       ED_INSERT,              /* M-j */
       /* 235 */       ED_INSERT,              /* M-k */
       /* 236 */       ED_INSERT,              /* M-l */
       /* 237 */       ED_INSERT,              /* M-m */
       /* 238 */       ED_INSERT,              /* M-n */
       /* 239 */       ED_INSERT,              /* M-o */
       /* 240 */       ED_INSERT,              /* M-p */
       /* 241 */       ED_INSERT,              /* M-q */
       /* 242 */       ED_INSERT,              /* M-r */
       /* 243 */       ED_INSERT,              /* M-s */
       /* 244 */       ED_INSERT,              /* M-t */
       /* 245 */       ED_INSERT,              /* M-u */
       /* 246 */       ED_INSERT,              /* M-v */
       /* 247 */       ED_INSERT,              /* M-w */
       /* 248 */       ED_INSERT,              /* M-x */
       /* 249 */       ED_INSERT,              /* M-y */
       /* 250 */       ED_INSERT,              /* M-z */
       /* 251 */       ED_INSERT,              /* M-{ */
       /* 252 */       ED_INSERT,              /* M-| */
       /* 253 */       ED_INSERT,              /* M-} */
       /* 254 */       ED_INSERT,              /* M-~ */
       /* 255 */       ED_INSERT               /* M-^? */
};

static const el_action_t el_map_vi_command[] = {
       /*   0 */       ED_UNASSIGNED,          /* ^@ */
       /*   1 */       ED_MOVE_TO_BEG,         /* ^A */
       /*   2 */       ED_UNASSIGNED,          /* ^B */
       /*   3 */       ED_IGNORE,              /* ^C */
       /*   4 */       ED_UNASSIGNED,          /* ^D */
       /*   5 */       ED_MOVE_TO_END,         /* ^E */
       /*   6 */       ED_UNASSIGNED,          /* ^F */
       /*   7 */       ED_UNASSIGNED,          /* ^G */
       /*   8 */       ED_DELETE_PREV_CHAR,    /* ^H */
       /*   9 */       ED_UNASSIGNED,          /* ^I */
       /*  10 */       ED_NEWLINE,             /* ^J */
       /*  11 */       ED_KILL_LINE,           /* ^K */
       /*  12 */       ED_CLEAR_SCREEN,        /* ^L */
       /*  13 */       ED_NEWLINE,             /* ^M */
       /*  14 */       ED_NEXT_HISTORY,        /* ^N */
       /*  15 */       ED_IGNORE,              /* ^O */
       /*  16 */       ED_PREV_HISTORY,        /* ^P */
       /*  17 */       ED_IGNORE,              /* ^Q */
       /*  18 */       ED_REDISPLAY,           /* ^R */
       /*  19 */       ED_IGNORE,              /* ^S */
       /*  20 */       ED_UNASSIGNED,          /* ^T */
       /*  21 */       VI_KILL_LINE_PREV,      /* ^U */
       /*  22 */       ED_UNASSIGNED,          /* ^V */
       /*  23 */       ED_DELETE_PREV_WORD,    /* ^W */
       /*  24 */       ED_UNASSIGNED,          /* ^X */
       /*  25 */       ED_UNASSIGNED,          /* ^Y */
       /*  26 */       ED_UNASSIGNED,          /* ^Z */
       /*  27 */       EM_META_NEXT,           /* ^[ */
       /*  28 */       ED_IGNORE,              /* ^\ */
       /*  29 */       ED_UNASSIGNED,          /* ^] */
       /*  30 */       ED_UNASSIGNED,          /* ^^ */
       /*  31 */       ED_UNASSIGNED,          /* ^_ */
       /*  32 */       ED_NEXT_CHAR,           /* SPACE */
       /*  33 */       ED_UNASSIGNED,          /* ! */
       /*  34 */       ED_UNASSIGNED,          /* " */
       /*  35 */       VI_COMMENT_OUT,         /* # */
       /*  36 */       ED_MOVE_TO_END,         /* $ */
       /*  37 */       VI_MATCH,               /* % */
       /*  38 */       ED_UNASSIGNED,          /* & */
       /*  39 */       ED_UNASSIGNED,          /* ' */
       /*  40 */       ED_UNASSIGNED,          /* ( */
       /*  41 */       ED_UNASSIGNED,          /* ) */
       /*  42 */       ED_UNASSIGNED,          /* * */
       /*  43 */       ED_NEXT_HISTORY,        /* + */
       /*  44 */       VI_REPEAT_PREV_CHAR,    /* , */
       /*  45 */       ED_PREV_HISTORY,        /* - */
       /*  46 */       VI_REDO,                /* . */
       /*  47 */       VI_SEARCH_PREV,         /* / */
       /*  48 */       VI_ZERO,                /* 0 */
       /*  49 */       ED_ARGUMENT_DIGIT,      /* 1 */
       /*  50 */       ED_ARGUMENT_DIGIT,      /* 2 */
       /*  51 */       ED_ARGUMENT_DIGIT,      /* 3 */
       /*  52 */       ED_ARGUMENT_DIGIT,      /* 4 */
       /*  53 */       ED_ARGUMENT_DIGIT,      /* 5 */
       /*  54 */       ED_ARGUMENT_DIGIT,      /* 6 */
       /*  55 */       ED_ARGUMENT_DIGIT,      /* 7 */
       /*  56 */       ED_ARGUMENT_DIGIT,      /* 8 */
       /*  57 */       ED_ARGUMENT_DIGIT,      /* 9 */
       /*  58 */       ED_COMMAND,             /* : */
       /*  59 */       VI_REPEAT_NEXT_CHAR,    /* ; */
       /*  60 */       ED_UNASSIGNED,          /* < */
       /*  61 */       ED_UNASSIGNED,          /* = */
       /*  62 */       ED_UNASSIGNED,          /* > */
       /*  63 */       VI_SEARCH_NEXT,         /* ? */
       /*  64 */       VI_ALIAS,               /* @ */
       /*  65 */       VI_ADD_AT_EOL,          /* A */
       /*  66 */       VI_PREV_BIG_WORD,       /* B */
       /*  67 */       VI_CHANGE_TO_EOL,       /* C */
       /*  68 */       ED_KILL_LINE,           /* D */
       /*  69 */       VI_END_BIG_WORD,        /* E */
       /*  70 */       VI_PREV_CHAR,           /* F */
       /*  71 */       VI_TO_HISTORY_LINE,     /* G */
       /*  72 */       ED_UNASSIGNED,          /* H */
       /*  73 */       VI_INSERT_AT_BOL,       /* I */
       /*  74 */       ED_SEARCH_NEXT_HISTORY, /* J */
       /*  75 */       ED_SEARCH_PREV_HISTORY, /* K */
       /*  76 */       ED_UNASSIGNED,          /* L */
       /*  77 */       ED_UNASSIGNED,          /* M */
       /*  78 */       VI_REPEAT_SEARCH_PREV,  /* N */
       /*  79 */       ED_SEQUENCE_LEAD_IN,    /* O */
       /*  80 */       VI_PASTE_PREV,          /* P */
       /*  81 */       ED_UNASSIGNED,          /* Q */
       /*  82 */       VI_REPLACE_MODE,        /* R */
       /*  83 */       VI_SUBSTITUTE_LINE,     /* S */
       /*  84 */       VI_TO_PREV_CHAR,        /* T */
       /*  85 */       VI_UNDO_LINE,           /* U */
       /*  86 */       ED_UNASSIGNED,          /* V */
       /*  87 */       VI_NEXT_BIG_WORD,       /* W */
       /*  88 */       ED_DELETE_PREV_CHAR,    /* X */
       /*  89 */       VI_YANK_END,            /* Y */
       /*  90 */       ED_UNASSIGNED,          /* Z */
       /*  91 */       ED_SEQUENCE_LEAD_IN,    /* [ */
       /*  92 */       ED_UNASSIGNED,          /* \ */
       /*  93 */       ED_UNASSIGNED,          /* ] */
       /*  94 */       ED_MOVE_TO_BEG,         /* ^ */
       /*  95 */       VI_HISTORY_WORD,        /* _ */
       /*  96 */       ED_UNASSIGNED,          /* ` */
       /*  97 */       VI_ADD,                 /* a */
       /*  98 */       VI_PREV_WORD,           /* b */
       /*  99 */       VI_CHANGE_META,         /* c */
       /* 100 */       VI_DELETE_META,         /* d */
       /* 101 */       VI_END_WORD,            /* e */
       /* 102 */       VI_NEXT_CHAR,           /* f */
       /* 103 */       ED_UNASSIGNED,          /* g */
       /* 104 */       ED_PREV_CHAR,           /* h */
       /* 105 */       VI_INSERT,              /* i */
       /* 106 */       ED_NEXT_HISTORY,        /* j */
       /* 107 */       ED_PREV_HISTORY,        /* k */
       /* 108 */       ED_NEXT_CHAR,           /* l */
       /* 109 */       ED_UNASSIGNED,          /* m */
       /* 110 */       VI_REPEAT_SEARCH_NEXT,  /* n */
       /* 111 */       ED_UNASSIGNED,          /* o */
       /* 112 */       VI_PASTE_NEXT,          /* p */
       /* 113 */       ED_UNASSIGNED,          /* q */
       /* 114 */       VI_REPLACE_CHAR,        /* r */
       /* 115 */       VI_SUBSTITUTE_CHAR,     /* s */
       /* 116 */       VI_TO_NEXT_CHAR,        /* t */
       /* 117 */       VI_UNDO,                /* u */
       /* 118 */       VI_HISTEDIT,            /* v */
       /* 119 */       VI_NEXT_WORD,           /* w */
       /* 120 */       ED_DELETE_NEXT_CHAR,    /* x */
       /* 121 */       VI_YANK,                /* y */
       /* 122 */       ED_UNASSIGNED,          /* z */
       /* 123 */       ED_UNASSIGNED,          /* { */
       /* 124 */       VI_TO_COLUMN,           /* | */
       /* 125 */       ED_UNASSIGNED,          /* } */
       /* 126 */       VI_CHANGE_CASE,         /* ~ */
       /* 127 */       ED_DELETE_PREV_CHAR,    /* ^? */
       /* 128 */       ED_UNASSIGNED,          /* M-^@ */
       /* 129 */       ED_UNASSIGNED,          /* M-^A */
       /* 130 */       ED_UNASSIGNED,          /* M-^B */
       /* 131 */       ED_UNASSIGNED,          /* M-^C */
       /* 132 */       ED_UNASSIGNED,          /* M-^D */
       /* 133 */       ED_UNASSIGNED,          /* M-^E */
       /* 134 */       ED_UNASSIGNED,          /* M-^F */
       /* 135 */       ED_UNASSIGNED,          /* M-^G */
       /* 136 */       ED_UNASSIGNED,          /* M-^H */
       /* 137 */       ED_UNASSIGNED,          /* M-^I */
       /* 138 */       ED_UNASSIGNED,          /* M-^J */
       /* 139 */       ED_UNASSIGNED,          /* M-^K */
       /* 140 */       ED_UNASSIGNED,          /* M-^L */
       /* 141 */       ED_UNASSIGNED,          /* M-^M */
       /* 142 */       ED_UNASSIGNED,          /* M-^N */
       /* 143 */       ED_UNASSIGNED,          /* M-^O */
       /* 144 */       ED_UNASSIGNED,          /* M-^P */
       /* 145 */       ED_UNASSIGNED,          /* M-^Q */
       /* 146 */       ED_UNASSIGNED,          /* M-^R */
       /* 147 */       ED_UNASSIGNED,          /* M-^S */
       /* 148 */       ED_UNASSIGNED,          /* M-^T */
       /* 149 */       ED_UNASSIGNED,          /* M-^U */
       /* 150 */       ED_UNASSIGNED,          /* M-^V */
       /* 151 */       ED_UNASSIGNED,          /* M-^W */
       /* 152 */       ED_UNASSIGNED,          /* M-^X */
       /* 153 */       ED_UNASSIGNED,          /* M-^Y */
       /* 154 */       ED_UNASSIGNED,          /* M-^Z */
       /* 155 */       ED_UNASSIGNED,          /* M-^[ */
       /* 156 */       ED_UNASSIGNED,          /* M-^\ */
       /* 157 */       ED_UNASSIGNED,          /* M-^] */
       /* 158 */       ED_UNASSIGNED,          /* M-^^ */
       /* 159 */       ED_UNASSIGNED,          /* M-^_ */
       /* 160 */       ED_UNASSIGNED,          /* M-SPACE */
       /* 161 */       ED_UNASSIGNED,          /* M-! */
       /* 162 */       ED_UNASSIGNED,          /* M-" */
       /* 163 */       ED_UNASSIGNED,          /* M-# */
       /* 164 */       ED_UNASSIGNED,          /* M-$ */
       /* 165 */       ED_UNASSIGNED,          /* M-% */
       /* 166 */       ED_UNASSIGNED,          /* M-& */
       /* 167 */       ED_UNASSIGNED,          /* M-' */
       /* 168 */       ED_UNASSIGNED,          /* M-( */
       /* 169 */       ED_UNASSIGNED,          /* M-) */
       /* 170 */       ED_UNASSIGNED,          /* M-* */
       /* 171 */       ED_UNASSIGNED,          /* M-+ */
       /* 172 */       ED_UNASSIGNED,          /* M-, */
       /* 173 */       ED_UNASSIGNED,          /* M-- */
       /* 174 */       ED_UNASSIGNED,          /* M-. */
       /* 175 */       ED_UNASSIGNED,          /* M-/ */
       /* 176 */       ED_UNASSIGNED,          /* M-0 */
       /* 177 */       ED_UNASSIGNED,          /* M-1 */
       /* 178 */       ED_UNASSIGNED,          /* M-2 */
       /* 179 */       ED_UNASSIGNED,          /* M-3 */
       /* 180 */       ED_UNASSIGNED,          /* M-4 */
       /* 181 */       ED_UNASSIGNED,          /* M-5 */
       /* 182 */       ED_UNASSIGNED,          /* M-6 */
       /* 183 */       ED_UNASSIGNED,          /* M-7 */
       /* 184 */       ED_UNASSIGNED,          /* M-8 */
       /* 185 */       ED_UNASSIGNED,          /* M-9 */
       /* 186 */       ED_UNASSIGNED,          /* M-: */
       /* 187 */       ED_UNASSIGNED,          /* M-; */
       /* 188 */       ED_UNASSIGNED,          /* M-< */
       /* 189 */       ED_UNASSIGNED,          /* M-= */
       /* 190 */       ED_UNASSIGNED,          /* M-> */
       /* 191 */       ED_UNASSIGNED,          /* M-? */
       /* 192 */       ED_UNASSIGNED,          /* M-@ */
       /* 193 */       ED_UNASSIGNED,          /* M-A */
       /* 194 */       ED_UNASSIGNED,          /* M-B */
       /* 195 */       ED_UNASSIGNED,          /* M-C */
       /* 196 */       ED_UNASSIGNED,          /* M-D */
       /* 197 */       ED_UNASSIGNED,          /* M-E */
       /* 198 */       ED_UNASSIGNED,          /* M-F */
       /* 199 */       ED_UNASSIGNED,          /* M-G */
       /* 200 */       ED_UNASSIGNED,          /* M-H */
       /* 201 */       ED_UNASSIGNED,          /* M-I */
       /* 202 */       ED_UNASSIGNED,          /* M-J */
       /* 203 */       ED_UNASSIGNED,          /* M-K */
       /* 204 */       ED_UNASSIGNED,          /* M-L */
       /* 205 */       ED_UNASSIGNED,          /* M-M */
       /* 206 */       ED_UNASSIGNED,          /* M-N */
       /* 207 */       ED_SEQUENCE_LEAD_IN,    /* M-O */
       /* 208 */       ED_UNASSIGNED,          /* M-P */
       /* 209 */       ED_UNASSIGNED,          /* M-Q */
       /* 210 */       ED_UNASSIGNED,          /* M-R */
       /* 211 */       ED_UNASSIGNED,          /* M-S */
       /* 212 */       ED_UNASSIGNED,          /* M-T */
       /* 213 */       ED_UNASSIGNED,          /* M-U */
       /* 214 */       ED_UNASSIGNED,          /* M-V */
       /* 215 */       ED_UNASSIGNED,          /* M-W */
       /* 216 */       ED_UNASSIGNED,          /* M-X */
       /* 217 */       ED_UNASSIGNED,          /* M-Y */
       /* 218 */       ED_UNASSIGNED,          /* M-Z */
       /* 219 */       ED_SEQUENCE_LEAD_IN,    /* M-[ */
       /* 220 */       ED_UNASSIGNED,          /* M-\ */
       /* 221 */       ED_UNASSIGNED,          /* M-] */
       /* 222 */       ED_UNASSIGNED,          /* M-^ */
       /* 223 */       ED_UNASSIGNED,          /* M-_ */
       /* 224 */       ED_UNASSIGNED,          /* M-` */
       /* 225 */       ED_UNASSIGNED,          /* M-a */
       /* 226 */       ED_UNASSIGNED,          /* M-b */
       /* 227 */       ED_UNASSIGNED,          /* M-c */
       /* 228 */       ED_UNASSIGNED,          /* M-d */
       /* 229 */       ED_UNASSIGNED,          /* M-e */
       /* 230 */       ED_UNASSIGNED,          /* M-f */
       /* 231 */       ED_UNASSIGNED,          /* M-g */
       /* 232 */       ED_UNASSIGNED,          /* M-h */
       /* 233 */       ED_UNASSIGNED,          /* M-i */
       /* 234 */       ED_UNASSIGNED,          /* M-j */
       /* 235 */       ED_UNASSIGNED,          /* M-k */
       /* 236 */       ED_UNASSIGNED,          /* M-l */
       /* 237 */       ED_UNASSIGNED,          /* M-m */
       /* 238 */       ED_UNASSIGNED,          /* M-n */
       /* 239 */       ED_UNASSIGNED,          /* M-o */
       /* 240 */       ED_UNASSIGNED,          /* M-p */
       /* 241 */       ED_UNASSIGNED,          /* M-q */
       /* 242 */       ED_UNASSIGNED,          /* M-r */
       /* 243 */       ED_UNASSIGNED,          /* M-s */
       /* 244 */       ED_UNASSIGNED,          /* M-t */
       /* 245 */       ED_UNASSIGNED,          /* M-u */
       /* 246 */       ED_UNASSIGNED,          /* M-v */
       /* 247 */       ED_UNASSIGNED,          /* M-w */
       /* 248 */       ED_UNASSIGNED,          /* M-x */
       /* 249 */       ED_UNASSIGNED,          /* M-y */
       /* 250 */       ED_UNASSIGNED,          /* M-z */
       /* 251 */       ED_UNASSIGNED,          /* M-{ */
       /* 252 */       ED_UNASSIGNED,          /* M-| */
       /* 253 */       ED_UNASSIGNED,          /* M-} */
       /* 254 */       ED_UNASSIGNED,          /* M-~ */
       /* 255 */       ED_UNASSIGNED           /* M-^? */
};


/* map_init():
*      Initialize and allocate the maps
*/
libedit_private int
map_init(EditLine *el)
{

       /*
        * Make sure those are correct before starting.
        */
#ifdef MAP_DEBUG
       if (sizeof(el_map_emacs) != N_KEYS * sizeof(el_action_t))
               EL_ABORT((el->el_errfile, "Emacs map incorrect\n"));
       if (sizeof(el_map_vi_command) != N_KEYS * sizeof(el_action_t))
               EL_ABORT((el->el_errfile, "Vi command map incorrect\n"));
       if (sizeof(el_map_vi_insert) != N_KEYS * sizeof(el_action_t))
               EL_ABORT((el->el_errfile, "Vi insert map incorrect\n"));
#endif

       el->el_map.alt = el_calloc(N_KEYS, sizeof(*el->el_map.alt));
       if (el->el_map.alt == NULL)
               return -1;
       el->el_map.key = el_calloc(N_KEYS, sizeof(*el->el_map.key));
       if (el->el_map.key == NULL)
               goto out;
       el->el_map.emacs = el_map_emacs;
       el->el_map.vic = el_map_vi_command;
       el->el_map.vii = el_map_vi_insert;
       el->el_map.help = el_calloc(EL_NUM_FCNS, sizeof(*el->el_map.help));
       if (el->el_map.help == NULL)
               goto out;
       (void) memcpy(el->el_map.help, el_func_help,
           sizeof(*el->el_map.help) * EL_NUM_FCNS);
       el->el_map.func = el_calloc(EL_NUM_FCNS, sizeof(*el->el_map.func));
       if (el->el_map.func == NULL)
               goto out;
       memcpy(el->el_map.func, el_func, sizeof(*el->el_map.func)
           * EL_NUM_FCNS);
       el->el_map.nfunc = EL_NUM_FCNS;

#ifdef VIDEFAULT
       map_init_vi(el);
#else
       map_init_emacs(el);
#endif /* VIDEFAULT */
       return 0;
out:
       map_end(el);
       return -1;
}


/* map_end():
*      Free the space taken by the editor maps
*/
libedit_private void
map_end(EditLine *el)
{

       el_free(el->el_map.alt);
       el->el_map.alt = NULL;
       el_free(el->el_map.key);
       el->el_map.key = NULL;
       el->el_map.emacs = NULL;
       el->el_map.vic = NULL;
       el->el_map.vii = NULL;
       el_free(el->el_map.help);
       el->el_map.help = NULL;
       el_free(el->el_map.func);
       el->el_map.func = NULL;
}


/* map_init_nls():
*      Find all the printable keys and bind them to self insert
*/
static void
map_init_nls(EditLine *el)
{
       int i;

       el_action_t *map = el->el_map.key;

       for (i = 0200; i <= 0377; i++)
               if (iswprint(i))
                       map[i] = ED_INSERT;
}


/* map_init_meta():
*      Bind all the meta keys to the appropriate ESC-<key> sequence
*/
static void
map_init_meta(EditLine *el)
{
       wchar_t buf[3];
       int i;
       el_action_t *map = el->el_map.key;
       el_action_t *alt = el->el_map.alt;

       for (i = 0; i <= 0377 && map[i] != EM_META_NEXT; i++)
               continue;

       if (i > 0377) {
               for (i = 0; i <= 0377 && alt[i] != EM_META_NEXT; i++)
                       continue;
               if (i > 0377) {
                       i = 033;
                       if (el->el_map.type == MAP_VI)
                               map = alt;
               } else
                       map = alt;
       }
       buf[0] = (wchar_t)i;
       buf[2] = 0;
       for (i = 0200; i <= 0377; i++)
               switch (map[i]) {
               case ED_INSERT:
               case ED_UNASSIGNED:
               case ED_SEQUENCE_LEAD_IN:
                       break;
               default:
                       buf[1] = i & 0177;
                       keymacro_add(el, buf, keymacro_map_cmd(el, (int) map[i]), XK_CMD);
                       break;
               }
       map[(int) buf[0]] = ED_SEQUENCE_LEAD_IN;
}


/* map_init_vi():
*      Initialize the vi bindings
*/
libedit_private void
map_init_vi(EditLine *el)
{
       int i;
       el_action_t *key = el->el_map.key;
       el_action_t *alt = el->el_map.alt;
       const el_action_t *vii = el->el_map.vii;
       const el_action_t *vic = el->el_map.vic;

       el->el_map.type = MAP_VI;
       el->el_map.current = el->el_map.key;

       keymacro_reset(el);

       for (i = 0; i < N_KEYS; i++) {
               key[i] = vii[i];
               alt[i] = vic[i];
       }

       map_init_meta(el);
       map_init_nls(el);

       tty_bind_char(el, 1);
       terminal_bind_arrow(el);
}


/* map_init_emacs():
*      Initialize the emacs bindings
*/
libedit_private void
map_init_emacs(EditLine *el)
{
       int i;
       wchar_t buf[3];
       el_action_t *key = el->el_map.key;
       el_action_t *alt = el->el_map.alt;
       const el_action_t *emacs = el->el_map.emacs;

       el->el_map.type = MAP_EMACS;
       el->el_map.current = el->el_map.key;
       keymacro_reset(el);

       for (i = 0; i < N_KEYS; i++) {
               key[i] = emacs[i];
               alt[i] = ED_UNASSIGNED;
       }

       map_init_meta(el);
       map_init_nls(el);

       buf[0] = CONTROL('X');
       buf[1] = CONTROL('X');
       buf[2] = 0;
       keymacro_add(el, buf, keymacro_map_cmd(el, EM_EXCHANGE_MARK), XK_CMD);

       tty_bind_char(el, 1);
       terminal_bind_arrow(el);
}


/* map_set_editor():
*      Set the editor
*/
libedit_private int
map_set_editor(EditLine *el, wchar_t *editor)
{

       if (wcscmp(editor, L"emacs") == 0) {
               map_init_emacs(el);
               return 0;
       }
       if (wcscmp(editor, L"vi") == 0) {
               map_init_vi(el);
               return 0;
       }
       return -1;
}


/* map_get_editor():
*      Retrieve the editor
*/
libedit_private int
map_get_editor(EditLine *el, const wchar_t **editor)
{

       if (editor == NULL)
               return -1;
       switch (el->el_map.type) {
       case MAP_EMACS:
               *editor = L"emacs";
               return 0;
       case MAP_VI:
               *editor = L"vi";
               return 0;
       }
       return -1;
}


/* map_print_key():
*      Print the function description for 1 key
*/
static void
map_print_key(EditLine *el, el_action_t *map, const wchar_t *in)
{
       char outbuf[EL_BUFSIZ];
       el_bindings_t *bp, *ep;

       if (in[0] == '\0' || in[1] == '\0') {
               (void) keymacro__decode_str(in, outbuf, sizeof(outbuf), "");
               ep = &el->el_map.help[el->el_map.nfunc];
               for (bp = el->el_map.help; bp < ep; bp++)
                       if (bp->func == map[(unsigned char) *in]) {
                               (void) fprintf(el->el_outfile,
                                   "%s\t->\t%ls\n", outbuf, bp->name);
                               return;
                       }
       } else
               keymacro_print(el, in);
}


/* map_print_some_keys():
*      Print keys from first to last
*/
static void
map_print_some_keys(EditLine *el, el_action_t *map, wint_t first, wint_t last)
{
       el_bindings_t *bp, *ep;
       wchar_t firstbuf[2], lastbuf[2];
       char unparsbuf[EL_BUFSIZ], extrabuf[EL_BUFSIZ];

       firstbuf[0] = first;
       firstbuf[1] = 0;
       lastbuf[0] = last;
       lastbuf[1] = 0;
       if (map[first] == ED_UNASSIGNED) {
               if (first == last) {
                       (void) keymacro__decode_str(firstbuf, unparsbuf,
                           sizeof(unparsbuf), STRQQ);
                       (void) fprintf(el->el_outfile,
                           "%-15s->  is undefined\n", unparsbuf);
               }
               return;
       }
       ep = &el->el_map.help[el->el_map.nfunc];
       for (bp = el->el_map.help; bp < ep; bp++) {
               if (bp->func == map[first]) {
                       if (first == last) {
                               (void) keymacro__decode_str(firstbuf, unparsbuf,
                                   sizeof(unparsbuf), STRQQ);
                               (void) fprintf(el->el_outfile, "%-15s->  %ls\n",
                                   unparsbuf, bp->name);
                       } else {
                               (void) keymacro__decode_str(firstbuf, unparsbuf,
                                   sizeof(unparsbuf), STRQQ);
                               (void) keymacro__decode_str(lastbuf, extrabuf,
                                   sizeof(extrabuf), STRQQ);
                               (void) fprintf(el->el_outfile,
                                   "%-4s to %-7s->  %ls\n",
                                   unparsbuf, extrabuf, bp->name);
                       }
                       return;
               }
       }
#ifdef MAP_DEBUG
       if (map == el->el_map.key) {
               (void) keymacro__decode_str(firstbuf, unparsbuf,
                   sizeof(unparsbuf), STRQQ);
               (void) fprintf(el->el_outfile,
                   "BUG!!! %s isn't bound to anything.\n", unparsbuf);
               (void) fprintf(el->el_outfile, "el->el_map.key[%d] == %d\n",
                   first, el->el_map.key[first]);
       } else {
               (void) keymacro__decode_str(firstbuf, unparsbuf,
                   sizeof(unparsbuf), STRQQ);
               (void) fprintf(el->el_outfile,
                   "BUG!!! %s isn't bound to anything.\n", unparsbuf);
               (void) fprintf(el->el_outfile, "el->el_map.alt[%d] == %d\n",
                   first, el->el_map.alt[first]);
       }
#endif
       EL_ABORT((el->el_errfile, "Error printing keys\n"));
}


/* map_print_all_keys():
*      Print the function description for all keys.
*/
static void
map_print_all_keys(EditLine *el)
{
       int prev, i;

       (void) fprintf(el->el_outfile, "Standard key bindings\n");
       prev = 0;
       for (i = 0; i < N_KEYS; i++) {
               if (el->el_map.key[prev] == el->el_map.key[i])
                       continue;
               map_print_some_keys(el, el->el_map.key, prev, i - 1);
               prev = i;
       }
       map_print_some_keys(el, el->el_map.key, prev, i - 1);

       (void) fprintf(el->el_outfile, "Alternative key bindings\n");
       prev = 0;
       for (i = 0; i < N_KEYS; i++) {
               if (el->el_map.alt[prev] == el->el_map.alt[i])
                       continue;
               map_print_some_keys(el, el->el_map.alt, prev, i - 1);
               prev = i;
       }
       map_print_some_keys(el, el->el_map.alt, prev, i - 1);

       (void) fprintf(el->el_outfile, "Multi-character bindings\n");
       keymacro_print(el, L"");
       (void) fprintf(el->el_outfile, "Arrow key bindings\n");
       terminal_print_arrow(el, L"");
}


/* map_bind():
*      Add/remove/change bindings
*/
libedit_private int
map_bind(EditLine *el, int argc, const wchar_t **argv)
{
       el_action_t *map;
       int ntype, rem;
       const wchar_t *p;
       wchar_t inbuf[EL_BUFSIZ];
       wchar_t outbuf[EL_BUFSIZ];
       const wchar_t *in = NULL;
       wchar_t *out;
       el_bindings_t *bp, *ep;
       int cmd;
       int key;

       if (argv == NULL)
               return -1;

       map = el->el_map.key;
       ntype = XK_CMD;
       key = rem = 0;
       for (argc = 1; (p = argv[argc]) != NULL; argc++)
               if (p[0] == '-')
                       switch (p[1]) {
                       case 'a':
                               map = el->el_map.alt;
                               break;

                       case 's':
                               ntype = XK_STR;
                               break;
                       case 'k':
                               key = 1;
                               break;

                       case 'r':
                               rem = 1;
                               break;

                       case 'v':
                               map_init_vi(el);
                               return 0;

                       case 'e':
                               map_init_emacs(el);
                               return 0;

                       case 'l':
                               ep = &el->el_map.help[el->el_map.nfunc];
                               for (bp = el->el_map.help; bp < ep; bp++)
                                       (void) fprintf(el->el_outfile,
                                           "%ls\n\t%ls\n",
                                           bp->name, bp->description);
                               return 0;
                       default:
                               (void) fprintf(el->el_errfile,
                                   "%ls: Invalid switch `%lc'.\n",
                                   argv[0], (wint_t)p[1]);
                       }
               else
                       break;

       if (argv[argc] == NULL) {
               map_print_all_keys(el);
               return 0;
       }
       if (key)
               in = argv[argc++];
       else if ((in = parse__string(inbuf, argv[argc++])) == NULL) {
               (void) fprintf(el->el_errfile,
                   "%ls: Invalid \\ or ^ in instring.\n",
                   argv[0]);
               return -1;
       }
       if (rem) {
               if (key) {
                       (void) terminal_clear_arrow(el, in);
                       return -1;
               }
               if (in[1])
                       (void) keymacro_delete(el, in);
               else if (map[(unsigned char) *in] == ED_SEQUENCE_LEAD_IN)
                       (void) keymacro_delete(el, in);
               else
                       map[(unsigned char) *in] = ED_UNASSIGNED;
               return 0;
       }
       if (argv[argc] == NULL) {
               if (key)
                       terminal_print_arrow(el, in);
               else
                       map_print_key(el, map, in);
               return 0;
       }
#ifdef notyet
       if (argv[argc + 1] != NULL) {
               bindkeymacro_usage();
               return -1;
       }
#endif

       switch (ntype) {
       case XK_STR:
               if ((out = parse__string(outbuf, argv[argc])) == NULL) {
                       (void) fprintf(el->el_errfile,
                           "%ls: Invalid \\ or ^ in outstring.\n", argv[0]);
                       return -1;
               }
               if (key)
                       terminal_set_arrow(el, in, keymacro_map_str(el, out), ntype);
               else
                       keymacro_add(el, in, keymacro_map_str(el, out), ntype);
               map[(unsigned char) *in] = ED_SEQUENCE_LEAD_IN;
               break;

       case XK_CMD:
               if ((cmd = parse_cmd(el, argv[argc])) == -1) {
                       (void) fprintf(el->el_errfile,
                           "%ls: Invalid command `%ls'.\n",
                           argv[0], argv[argc]);
                       return -1;
               }
               if (key)
                       terminal_set_arrow(el, in, keymacro_map_cmd(el, cmd), ntype);
               else {
                       if (in[1]) {
                               keymacro_add(el, in, keymacro_map_cmd(el, cmd), ntype);
                               map[(unsigned char) *in] = ED_SEQUENCE_LEAD_IN;
                       } else {
                               keymacro_clear(el, map, in);
                               map[(unsigned char) *in] = (el_action_t)cmd;
                       }
               }
               break;

       /* coverity[dead_error_begin] */
       default:
               EL_ABORT((el->el_errfile, "Bad XK_ type %d\n", ntype));
       }
       return 0;
}


/* map_addfunc():
*      add a user defined function
*/
libedit_private int
map_addfunc(EditLine *el, const wchar_t *name, const wchar_t *help,
   el_func_t func)
{
       void *p;
       size_t nf = el->el_map.nfunc + 1;

       if (name == NULL || help == NULL || func == NULL)
               return -1;

       if ((p = el_realloc(el->el_map.func, nf *
           sizeof(*el->el_map.func))) == NULL)
               return -1;
       el->el_map.func = p;
       if ((p = el_realloc(el->el_map.help, nf * sizeof(*el->el_map.help)))
           == NULL)
               return -1;
       el->el_map.help = p;

       nf = (size_t)el->el_map.nfunc;
       el->el_map.func[nf] = func;

       el->el_map.help[nf].name = name;
       el->el_map.help[nf].func = (int)nf;
       el->el_map.help[nf].description = help;
       el->el_map.nfunc++;

       return 0;
}