/* $NetBSD: map.c,v 1.56 2025/01/03 00:40:08 rillig Exp $ */12/*-3* Copyright (c) 1992, 19934* The Regents of the University of California. All rights reserved.5*6* This code is derived from software contributed to Berkeley by7* Christos Zoulas of Cornell University.8*9* Redistribution and use in source and binary forms, with or without10* modification, are permitted provided that the following conditions11* are met:12* 1. Redistributions of source code must retain the above copyright13* notice, this list of conditions and the following disclaimer.14* 2. Redistributions in binary form must reproduce the above copyright15* notice, this list of conditions and the following disclaimer in the16* documentation and/or other materials provided with the distribution.17* 3. Neither the name of the University nor the names of its contributors18* may be used to endorse or promote products derived from this software19* without specific prior written permission.20*21* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND22* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE23* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE24* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE25* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL26* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS27* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)28* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT29* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY30* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF31* SUCH DAMAGE.32*/3334#include "config.h"35#if !defined(lint) && !defined(SCCSID)36#if 037static char sccsid[] = "@(#)map.c 8.1 (Berkeley) 6/4/93";38#else39__RCSID("$NetBSD: map.c,v 1.56 2025/01/03 00:40:08 rillig Exp $");40#endif41#endif /* not lint && not SCCSID */4243/*44* map.c: Editor function definitions45*/46#include <ctype.h>47#include <stdlib.h>48#include <string.h>4950#include "el.h"51#include "common.h"52#include "emacs.h"53#include "vi.h"54#include "fcns.h"55#include "func.h"56#include "help.h"57#include "parse.h"5859static void map_print_key(EditLine *, el_action_t *, const wchar_t *);60static void map_print_some_keys(EditLine *, el_action_t *, wint_t, wint_t);61static void map_print_all_keys(EditLine *);62static void map_init_nls(EditLine *);63static void map_init_meta(EditLine *);6465/* keymap tables ; should be N_KEYS*sizeof(KEYCMD) bytes long */666768static const el_action_t el_map_emacs[] = {69/* 0 */ EM_SET_MARK, /* ^@ */70/* 1 */ ED_MOVE_TO_BEG, /* ^A */71/* 2 */ ED_PREV_CHAR, /* ^B */72/* 3 */ ED_IGNORE, /* ^C */73/* 4 */ EM_DELETE_OR_LIST, /* ^D */74/* 5 */ ED_MOVE_TO_END, /* ^E */75/* 6 */ ED_NEXT_CHAR, /* ^F */76/* 7 */ ED_UNASSIGNED, /* ^G */77/* 8 */ EM_DELETE_PREV_CHAR, /* ^H */78/* 9 */ ED_UNASSIGNED, /* ^I */79/* 10 */ ED_NEWLINE, /* ^J */80/* 11 */ ED_KILL_LINE, /* ^K */81/* 12 */ ED_CLEAR_SCREEN, /* ^L */82/* 13 */ ED_NEWLINE, /* ^M */83/* 14 */ ED_NEXT_HISTORY, /* ^N */84/* 15 */ ED_IGNORE, /* ^O */85/* 16 */ ED_PREV_HISTORY, /* ^P */86/* 17 */ ED_IGNORE, /* ^Q */87/* 18 */ EM_INC_SEARCH_PREV, /* ^R */88/* 19 */ ED_IGNORE, /* ^S */89/* 20 */ ED_TRANSPOSE_CHARS, /* ^T */90/* 21 */ EM_KILL_LINE, /* ^U */91/* 22 */ ED_QUOTED_INSERT, /* ^V */92/* 23 */ ED_DELETE_PREV_WORD, /* ^W */93/* 24 */ ED_SEQUENCE_LEAD_IN, /* ^X */94/* 25 */ EM_YANK, /* ^Y */95/* 26 */ ED_IGNORE, /* ^Z */96/* 27 */ EM_META_NEXT, /* ^[ */97/* 28 */ ED_IGNORE, /* ^\ */98/* 29 */ ED_IGNORE, /* ^] */99/* 30 */ ED_UNASSIGNED, /* ^^ */100/* 31 */ ED_UNASSIGNED, /* ^_ */101/* 32 */ ED_INSERT, /* SPACE */102/* 33 */ ED_INSERT, /* ! */103/* 34 */ ED_INSERT, /* " */104/* 35 */ ED_INSERT, /* # */105/* 36 */ ED_INSERT, /* $ */106/* 37 */ ED_INSERT, /* % */107/* 38 */ ED_INSERT, /* & */108/* 39 */ ED_INSERT, /* ' */109/* 40 */ ED_INSERT, /* ( */110/* 41 */ ED_INSERT, /* ) */111/* 42 */ ED_INSERT, /* * */112/* 43 */ ED_INSERT, /* + */113/* 44 */ ED_INSERT, /* , */114/* 45 */ ED_INSERT, /* - */115/* 46 */ ED_INSERT, /* . */116/* 47 */ ED_INSERT, /* / */117/* 48 */ ED_DIGIT, /* 0 */118/* 49 */ ED_DIGIT, /* 1 */119/* 50 */ ED_DIGIT, /* 2 */120/* 51 */ ED_DIGIT, /* 3 */121/* 52 */ ED_DIGIT, /* 4 */122/* 53 */ ED_DIGIT, /* 5 */123/* 54 */ ED_DIGIT, /* 6 */124/* 55 */ ED_DIGIT, /* 7 */125/* 56 */ ED_DIGIT, /* 8 */126/* 57 */ ED_DIGIT, /* 9 */127/* 58 */ ED_INSERT, /* : */128/* 59 */ ED_INSERT, /* ; */129/* 60 */ ED_INSERT, /* < */130/* 61 */ ED_INSERT, /* = */131/* 62 */ ED_INSERT, /* > */132/* 63 */ ED_INSERT, /* ? */133/* 64 */ ED_INSERT, /* @ */134/* 65 */ ED_INSERT, /* A */135/* 66 */ ED_INSERT, /* B */136/* 67 */ ED_INSERT, /* C */137/* 68 */ ED_INSERT, /* D */138/* 69 */ ED_INSERT, /* E */139/* 70 */ ED_INSERT, /* F */140/* 71 */ ED_INSERT, /* G */141/* 72 */ ED_INSERT, /* H */142/* 73 */ ED_INSERT, /* I */143/* 74 */ ED_INSERT, /* J */144/* 75 */ ED_INSERT, /* K */145/* 76 */ ED_INSERT, /* L */146/* 77 */ ED_INSERT, /* M */147/* 78 */ ED_INSERT, /* N */148/* 79 */ ED_INSERT, /* O */149/* 80 */ ED_INSERT, /* P */150/* 81 */ ED_INSERT, /* Q */151/* 82 */ ED_INSERT, /* R */152/* 83 */ ED_INSERT, /* S */153/* 84 */ ED_INSERT, /* T */154/* 85 */ ED_INSERT, /* U */155/* 86 */ ED_INSERT, /* V */156/* 87 */ ED_INSERT, /* W */157/* 88 */ ED_INSERT, /* X */158/* 89 */ ED_INSERT, /* Y */159/* 90 */ ED_INSERT, /* Z */160/* 91 */ ED_INSERT, /* [ */161/* 92 */ ED_INSERT, /* \ */162/* 93 */ ED_INSERT, /* ] */163/* 94 */ ED_INSERT, /* ^ */164/* 95 */ ED_INSERT, /* _ */165/* 96 */ ED_INSERT, /* ` */166/* 97 */ ED_INSERT, /* a */167/* 98 */ ED_INSERT, /* b */168/* 99 */ ED_INSERT, /* c */169/* 100 */ ED_INSERT, /* d */170/* 101 */ ED_INSERT, /* e */171/* 102 */ ED_INSERT, /* f */172/* 103 */ ED_INSERT, /* g */173/* 104 */ ED_INSERT, /* h */174/* 105 */ ED_INSERT, /* i */175/* 106 */ ED_INSERT, /* j */176/* 107 */ ED_INSERT, /* k */177/* 108 */ ED_INSERT, /* l */178/* 109 */ ED_INSERT, /* m */179/* 110 */ ED_INSERT, /* n */180/* 111 */ ED_INSERT, /* o */181/* 112 */ ED_INSERT, /* p */182/* 113 */ ED_INSERT, /* q */183/* 114 */ ED_INSERT, /* r */184/* 115 */ ED_INSERT, /* s */185/* 116 */ ED_INSERT, /* t */186/* 117 */ ED_INSERT, /* u */187/* 118 */ ED_INSERT, /* v */188/* 119 */ ED_INSERT, /* w */189/* 120 */ ED_INSERT, /* x */190/* 121 */ ED_INSERT, /* y */191/* 122 */ ED_INSERT, /* z */192/* 123 */ ED_INSERT, /* { */193/* 124 */ ED_INSERT, /* | */194/* 125 */ ED_INSERT, /* } */195/* 126 */ ED_INSERT, /* ~ */196/* 127 */ EM_DELETE_PREV_CHAR, /* ^? */197/* 128 */ ED_UNASSIGNED, /* M-^@ */198/* 129 */ ED_UNASSIGNED, /* M-^A */199/* 130 */ ED_UNASSIGNED, /* M-^B */200/* 131 */ ED_UNASSIGNED, /* M-^C */201/* 132 */ ED_UNASSIGNED, /* M-^D */202/* 133 */ ED_UNASSIGNED, /* M-^E */203/* 134 */ ED_UNASSIGNED, /* M-^F */204/* 135 */ ED_UNASSIGNED, /* M-^G */205/* 136 */ ED_DELETE_PREV_WORD, /* M-^H */206/* 137 */ ED_UNASSIGNED, /* M-^I */207/* 138 */ ED_UNASSIGNED, /* M-^J */208/* 139 */ ED_UNASSIGNED, /* M-^K */209/* 140 */ ED_CLEAR_SCREEN, /* M-^L */210/* 141 */ ED_UNASSIGNED, /* M-^M */211/* 142 */ ED_UNASSIGNED, /* M-^N */212/* 143 */ ED_UNASSIGNED, /* M-^O */213/* 144 */ ED_UNASSIGNED, /* M-^P */214/* 145 */ ED_UNASSIGNED, /* M-^Q */215/* 146 */ ED_UNASSIGNED, /* M-^R */216/* 147 */ ED_UNASSIGNED, /* M-^S */217/* 148 */ ED_UNASSIGNED, /* M-^T */218/* 149 */ ED_UNASSIGNED, /* M-^U */219/* 150 */ ED_UNASSIGNED, /* M-^V */220/* 151 */ ED_UNASSIGNED, /* M-^W */221/* 152 */ ED_UNASSIGNED, /* M-^X */222/* 153 */ ED_UNASSIGNED, /* M-^Y */223/* 154 */ ED_UNASSIGNED, /* M-^Z */224/* 155 */ ED_UNASSIGNED, /* M-^[ */225/* 156 */ ED_UNASSIGNED, /* M-^\ */226/* 157 */ ED_UNASSIGNED, /* M-^] */227/* 158 */ ED_UNASSIGNED, /* M-^^ */228/* 159 */ EM_COPY_PREV_WORD, /* M-^_ */229/* 160 */ ED_UNASSIGNED, /* M-SPACE */230/* 161 */ ED_UNASSIGNED, /* M-! */231/* 162 */ ED_UNASSIGNED, /* M-" */232/* 163 */ ED_UNASSIGNED, /* M-# */233/* 164 */ ED_UNASSIGNED, /* M-$ */234/* 165 */ ED_UNASSIGNED, /* M-% */235/* 166 */ ED_UNASSIGNED, /* M-& */236/* 167 */ ED_UNASSIGNED, /* M-' */237/* 168 */ ED_UNASSIGNED, /* M-( */238/* 169 */ ED_UNASSIGNED, /* M-) */239/* 170 */ ED_UNASSIGNED, /* M-* */240/* 171 */ ED_UNASSIGNED, /* M-+ */241/* 172 */ ED_UNASSIGNED, /* M-, */242/* 173 */ ED_UNASSIGNED, /* M-- */243/* 174 */ ED_UNASSIGNED, /* M-. */244/* 175 */ ED_UNASSIGNED, /* M-/ */245/* 176 */ ED_ARGUMENT_DIGIT, /* M-0 */246/* 177 */ ED_ARGUMENT_DIGIT, /* M-1 */247/* 178 */ ED_ARGUMENT_DIGIT, /* M-2 */248/* 179 */ ED_ARGUMENT_DIGIT, /* M-3 */249/* 180 */ ED_ARGUMENT_DIGIT, /* M-4 */250/* 181 */ ED_ARGUMENT_DIGIT, /* M-5 */251/* 182 */ ED_ARGUMENT_DIGIT, /* M-6 */252/* 183 */ ED_ARGUMENT_DIGIT, /* M-7 */253/* 184 */ ED_ARGUMENT_DIGIT, /* M-8 */254/* 185 */ ED_ARGUMENT_DIGIT, /* M-9 */255/* 186 */ ED_UNASSIGNED, /* M-: */256/* 187 */ ED_UNASSIGNED, /* M-; */257/* 188 */ ED_UNASSIGNED, /* M-< */258/* 189 */ ED_UNASSIGNED, /* M-= */259/* 190 */ ED_UNASSIGNED, /* M-> */260/* 191 */ ED_UNASSIGNED, /* M-? */261/* 192 */ ED_UNASSIGNED, /* M-@ */262/* 193 */ ED_UNASSIGNED, /* M-A */263/* 194 */ ED_PREV_WORD, /* M-B */264/* 195 */ EM_CAPITOL_CASE, /* M-C */265/* 196 */ EM_DELETE_NEXT_WORD, /* M-D */266/* 197 */ ED_UNASSIGNED, /* M-E */267/* 198 */ EM_NEXT_WORD, /* M-F */268/* 199 */ ED_UNASSIGNED, /* M-G */269/* 200 */ ED_UNASSIGNED, /* M-H */270/* 201 */ ED_UNASSIGNED, /* M-I */271/* 202 */ ED_UNASSIGNED, /* M-J */272/* 203 */ ED_UNASSIGNED, /* M-K */273/* 204 */ EM_LOWER_CASE, /* M-L */274/* 205 */ ED_UNASSIGNED, /* M-M */275/* 206 */ ED_SEARCH_NEXT_HISTORY, /* M-N */276/* 207 */ ED_SEQUENCE_LEAD_IN, /* M-O */277/* 208 */ ED_SEARCH_PREV_HISTORY, /* M-P */278/* 209 */ ED_UNASSIGNED, /* M-Q */279/* 210 */ ED_UNASSIGNED, /* M-R */280/* 211 */ ED_UNASSIGNED, /* M-S */281/* 212 */ ED_UNASSIGNED, /* M-T */282/* 213 */ EM_UPPER_CASE, /* M-U */283/* 214 */ ED_UNASSIGNED, /* M-V */284/* 215 */ EM_COPY_REGION, /* M-W */285/* 216 */ ED_COMMAND, /* M-X */286/* 217 */ ED_UNASSIGNED, /* M-Y */287/* 218 */ ED_UNASSIGNED, /* M-Z */288/* 219 */ ED_SEQUENCE_LEAD_IN, /* M-[ */289/* 220 */ ED_UNASSIGNED, /* M-\ */290/* 221 */ ED_UNASSIGNED, /* M-] */291/* 222 */ ED_UNASSIGNED, /* M-^ */292/* 223 */ ED_UNASSIGNED, /* M-_ */293/* 223 */ ED_UNASSIGNED, /* M-` */294/* 224 */ ED_UNASSIGNED, /* M-a */295/* 225 */ ED_PREV_WORD, /* M-b */296/* 226 */ EM_CAPITOL_CASE, /* M-c */297/* 227 */ EM_DELETE_NEXT_WORD, /* M-d */298/* 228 */ ED_UNASSIGNED, /* M-e */299/* 229 */ EM_NEXT_WORD, /* M-f */300/* 230 */ ED_UNASSIGNED, /* M-g */301/* 231 */ ED_UNASSIGNED, /* M-h */302/* 232 */ ED_UNASSIGNED, /* M-i */303/* 233 */ ED_UNASSIGNED, /* M-j */304/* 234 */ ED_UNASSIGNED, /* M-k */305/* 235 */ EM_LOWER_CASE, /* M-l */306/* 236 */ ED_UNASSIGNED, /* M-m */307/* 237 */ ED_SEARCH_NEXT_HISTORY, /* M-n */308/* 238 */ ED_UNASSIGNED, /* M-o */309/* 239 */ ED_SEARCH_PREV_HISTORY, /* M-p */310/* 240 */ ED_UNASSIGNED, /* M-q */311/* 241 */ ED_UNASSIGNED, /* M-r */312/* 242 */ ED_UNASSIGNED, /* M-s */313/* 243 */ ED_UNASSIGNED, /* M-t */314/* 244 */ EM_UPPER_CASE, /* M-u */315/* 245 */ ED_UNASSIGNED, /* M-v */316/* 246 */ EM_COPY_REGION, /* M-w */317/* 247 */ ED_COMMAND, /* M-x */318/* 248 */ ED_UNASSIGNED, /* M-y */319/* 249 */ ED_UNASSIGNED, /* M-z */320/* 250 */ ED_UNASSIGNED, /* M-{ */321/* 251 */ ED_UNASSIGNED, /* M-| */322/* 252 */ ED_UNASSIGNED, /* M-} */323/* 253 */ ED_UNASSIGNED, /* M-~ */324/* 254 */ ED_DELETE_PREV_WORD /* M-^? */325/* 255 */326};327328329/*330* keymap table for vi. Each index into above tbl; should be331* N_KEYS entries long. Vi mode uses a sticky-extend to do command mode:332* insert mode characters are in the normal keymap, and command mode333* in the extended keymap.334*/335static const el_action_t el_map_vi_insert[] = {336#ifdef KSHVI337/* 0 */ ED_UNASSIGNED, /* ^@ */338/* 1 */ ED_INSERT, /* ^A */339/* 2 */ ED_INSERT, /* ^B */340/* 3 */ ED_INSERT, /* ^C */341/* 4 */ VI_LIST_OR_EOF, /* ^D */342/* 5 */ ED_INSERT, /* ^E */343/* 6 */ ED_INSERT, /* ^F */344/* 7 */ ED_INSERT, /* ^G */345/* 8 */ VI_DELETE_PREV_CHAR, /* ^H */ /* BackSpace key */346/* 9 */ ED_INSERT, /* ^I */ /* Tab Key */347/* 10 */ ED_NEWLINE, /* ^J */348/* 11 */ ED_INSERT, /* ^K */349/* 12 */ ED_INSERT, /* ^L */350/* 13 */ ED_NEWLINE, /* ^M */351/* 14 */ ED_INSERT, /* ^N */352/* 15 */ ED_INSERT, /* ^O */353/* 16 */ ED_INSERT, /* ^P */354/* 17 */ ED_IGNORE, /* ^Q */355/* 18 */ ED_INSERT, /* ^R */356/* 19 */ ED_IGNORE, /* ^S */357/* 20 */ ED_INSERT, /* ^T */358/* 21 */ VI_KILL_LINE_PREV, /* ^U */359/* 22 */ ED_QUOTED_INSERT, /* ^V */360/* 23 */ ED_DELETE_PREV_WORD, /* ^W */361/* ED_DELETE_PREV_WORD: Only until strt edit pos */362/* 24 */ ED_INSERT, /* ^X */363/* 25 */ ED_INSERT, /* ^Y */364/* 26 */ ED_INSERT, /* ^Z */365/* 27 */ VI_COMMAND_MODE, /* ^[ */ /* [ Esc ] key */366/* 28 */ ED_IGNORE, /* ^\ */367/* 29 */ ED_INSERT, /* ^] */368/* 30 */ ED_INSERT, /* ^^ */369/* 31 */ ED_INSERT, /* ^_ */370#else /* !KSHVI */371/*372* NOTE: These mappings do NOT Correspond well373* to the KSH VI editing assignments.374* On the other and they are convenient and375* many people have have gotten used to them.376*/377/* 0 */ ED_UNASSIGNED, /* ^@ */378/* 1 */ ED_MOVE_TO_BEG, /* ^A */379/* 2 */ ED_PREV_CHAR, /* ^B */380/* 3 */ ED_IGNORE, /* ^C */381/* 4 */ VI_LIST_OR_EOF, /* ^D */382/* 5 */ ED_MOVE_TO_END, /* ^E */383/* 6 */ ED_NEXT_CHAR, /* ^F */384/* 7 */ ED_UNASSIGNED, /* ^G */385/* 8 */ VI_DELETE_PREV_CHAR, /* ^H */ /* BackSpace key */386/* 9 */ ED_UNASSIGNED, /* ^I */ /* Tab Key */387/* 10 */ ED_NEWLINE, /* ^J */388/* 11 */ ED_KILL_LINE, /* ^K */389/* 12 */ ED_CLEAR_SCREEN, /* ^L */390/* 13 */ ED_NEWLINE, /* ^M */391/* 14 */ ED_NEXT_HISTORY, /* ^N */392/* 15 */ ED_IGNORE, /* ^O */393/* 16 */ ED_PREV_HISTORY, /* ^P */394/* 17 */ ED_IGNORE, /* ^Q */395/* 18 */ ED_REDISPLAY, /* ^R */396/* 19 */ ED_IGNORE, /* ^S */397/* 20 */ ED_TRANSPOSE_CHARS, /* ^T */398/* 21 */ VI_KILL_LINE_PREV, /* ^U */399/* 22 */ ED_QUOTED_INSERT, /* ^V */400/* 23 */ ED_DELETE_PREV_WORD, /* ^W */401/* 24 */ ED_UNASSIGNED, /* ^X */402/* 25 */ ED_IGNORE, /* ^Y */403/* 26 */ ED_IGNORE, /* ^Z */404/* 27 */ VI_COMMAND_MODE, /* ^[ */405/* 28 */ ED_IGNORE, /* ^\ */406/* 29 */ ED_UNASSIGNED, /* ^] */407/* 30 */ ED_UNASSIGNED, /* ^^ */408/* 31 */ ED_UNASSIGNED, /* ^_ */409#endif /* KSHVI */410/* 32 */ ED_INSERT, /* SPACE */411/* 33 */ ED_INSERT, /* ! */412/* 34 */ ED_INSERT, /* " */413/* 35 */ ED_INSERT, /* # */414/* 36 */ ED_INSERT, /* $ */415/* 37 */ ED_INSERT, /* % */416/* 38 */ ED_INSERT, /* & */417/* 39 */ ED_INSERT, /* ' */418/* 40 */ ED_INSERT, /* ( */419/* 41 */ ED_INSERT, /* ) */420/* 42 */ ED_INSERT, /* * */421/* 43 */ ED_INSERT, /* + */422/* 44 */ ED_INSERT, /* , */423/* 45 */ ED_INSERT, /* - */424/* 46 */ ED_INSERT, /* . */425/* 47 */ ED_INSERT, /* / */426/* 48 */ ED_INSERT, /* 0 */427/* 49 */ ED_INSERT, /* 1 */428/* 50 */ ED_INSERT, /* 2 */429/* 51 */ ED_INSERT, /* 3 */430/* 52 */ ED_INSERT, /* 4 */431/* 53 */ ED_INSERT, /* 5 */432/* 54 */ ED_INSERT, /* 6 */433/* 55 */ ED_INSERT, /* 7 */434/* 56 */ ED_INSERT, /* 8 */435/* 57 */ ED_INSERT, /* 9 */436/* 58 */ ED_INSERT, /* : */437/* 59 */ ED_INSERT, /* ; */438/* 60 */ ED_INSERT, /* < */439/* 61 */ ED_INSERT, /* = */440/* 62 */ ED_INSERT, /* > */441/* 63 */ ED_INSERT, /* ? */442/* 64 */ ED_INSERT, /* @ */443/* 65 */ ED_INSERT, /* A */444/* 66 */ ED_INSERT, /* B */445/* 67 */ ED_INSERT, /* C */446/* 68 */ ED_INSERT, /* D */447/* 69 */ ED_INSERT, /* E */448/* 70 */ ED_INSERT, /* F */449/* 71 */ ED_INSERT, /* G */450/* 72 */ ED_INSERT, /* H */451/* 73 */ ED_INSERT, /* I */452/* 74 */ ED_INSERT, /* J */453/* 75 */ ED_INSERT, /* K */454/* 76 */ ED_INSERT, /* L */455/* 77 */ ED_INSERT, /* M */456/* 78 */ ED_INSERT, /* N */457/* 79 */ ED_INSERT, /* O */458/* 80 */ ED_INSERT, /* P */459/* 81 */ ED_INSERT, /* Q */460/* 82 */ ED_INSERT, /* R */461/* 83 */ ED_INSERT, /* S */462/* 84 */ ED_INSERT, /* T */463/* 85 */ ED_INSERT, /* U */464/* 86 */ ED_INSERT, /* V */465/* 87 */ ED_INSERT, /* W */466/* 88 */ ED_INSERT, /* X */467/* 89 */ ED_INSERT, /* Y */468/* 90 */ ED_INSERT, /* Z */469/* 91 */ ED_INSERT, /* [ */470/* 92 */ ED_INSERT, /* \ */471/* 93 */ ED_INSERT, /* ] */472/* 94 */ ED_INSERT, /* ^ */473/* 95 */ ED_INSERT, /* _ */474/* 96 */ ED_INSERT, /* ` */475/* 97 */ ED_INSERT, /* a */476/* 98 */ ED_INSERT, /* b */477/* 99 */ ED_INSERT, /* c */478/* 100 */ ED_INSERT, /* d */479/* 101 */ ED_INSERT, /* e */480/* 102 */ ED_INSERT, /* f */481/* 103 */ ED_INSERT, /* g */482/* 104 */ ED_INSERT, /* h */483/* 105 */ ED_INSERT, /* i */484/* 106 */ ED_INSERT, /* j */485/* 107 */ ED_INSERT, /* k */486/* 108 */ ED_INSERT, /* l */487/* 109 */ ED_INSERT, /* m */488/* 110 */ ED_INSERT, /* n */489/* 111 */ ED_INSERT, /* o */490/* 112 */ ED_INSERT, /* p */491/* 113 */ ED_INSERT, /* q */492/* 114 */ ED_INSERT, /* r */493/* 115 */ ED_INSERT, /* s */494/* 116 */ ED_INSERT, /* t */495/* 117 */ ED_INSERT, /* u */496/* 118 */ ED_INSERT, /* v */497/* 119 */ ED_INSERT, /* w */498/* 120 */ ED_INSERT, /* x */499/* 121 */ ED_INSERT, /* y */500/* 122 */ ED_INSERT, /* z */501/* 123 */ ED_INSERT, /* { */502/* 124 */ ED_INSERT, /* | */503/* 125 */ ED_INSERT, /* } */504/* 126 */ ED_INSERT, /* ~ */505/* 127 */ VI_DELETE_PREV_CHAR, /* ^? */506/* 128 */ ED_INSERT, /* M-^@ */507/* 129 */ ED_INSERT, /* M-^A */508/* 130 */ ED_INSERT, /* M-^B */509/* 131 */ ED_INSERT, /* M-^C */510/* 132 */ ED_INSERT, /* M-^D */511/* 133 */ ED_INSERT, /* M-^E */512/* 134 */ ED_INSERT, /* M-^F */513/* 135 */ ED_INSERT, /* M-^G */514/* 136 */ ED_INSERT, /* M-^H */515/* 137 */ ED_INSERT, /* M-^I */516/* 138 */ ED_INSERT, /* M-^J */517/* 139 */ ED_INSERT, /* M-^K */518/* 140 */ ED_INSERT, /* M-^L */519/* 141 */ ED_INSERT, /* M-^M */520/* 142 */ ED_INSERT, /* M-^N */521/* 143 */ ED_INSERT, /* M-^O */522/* 144 */ ED_INSERT, /* M-^P */523/* 145 */ ED_INSERT, /* M-^Q */524/* 146 */ ED_INSERT, /* M-^R */525/* 147 */ ED_INSERT, /* M-^S */526/* 148 */ ED_INSERT, /* M-^T */527/* 149 */ ED_INSERT, /* M-^U */528/* 150 */ ED_INSERT, /* M-^V */529/* 151 */ ED_INSERT, /* M-^W */530/* 152 */ ED_INSERT, /* M-^X */531/* 153 */ ED_INSERT, /* M-^Y */532/* 154 */ ED_INSERT, /* M-^Z */533/* 155 */ ED_INSERT, /* M-^[ */534/* 156 */ ED_INSERT, /* M-^\ */535/* 157 */ ED_INSERT, /* M-^] */536/* 158 */ ED_INSERT, /* M-^^ */537/* 159 */ ED_INSERT, /* M-^_ */538/* 160 */ ED_INSERT, /* M-SPACE */539/* 161 */ ED_INSERT, /* M-! */540/* 162 */ ED_INSERT, /* M-" */541/* 163 */ ED_INSERT, /* M-# */542/* 164 */ ED_INSERT, /* M-$ */543/* 165 */ ED_INSERT, /* M-% */544/* 166 */ ED_INSERT, /* M-& */545/* 167 */ ED_INSERT, /* M-' */546/* 168 */ ED_INSERT, /* M-( */547/* 169 */ ED_INSERT, /* M-) */548/* 170 */ ED_INSERT, /* M-* */549/* 171 */ ED_INSERT, /* M-+ */550/* 172 */ ED_INSERT, /* M-, */551/* 173 */ ED_INSERT, /* M-- */552/* 174 */ ED_INSERT, /* M-. */553/* 175 */ ED_INSERT, /* M-/ */554/* 176 */ ED_INSERT, /* M-0 */555/* 177 */ ED_INSERT, /* M-1 */556/* 178 */ ED_INSERT, /* M-2 */557/* 179 */ ED_INSERT, /* M-3 */558/* 180 */ ED_INSERT, /* M-4 */559/* 181 */ ED_INSERT, /* M-5 */560/* 182 */ ED_INSERT, /* M-6 */561/* 183 */ ED_INSERT, /* M-7 */562/* 184 */ ED_INSERT, /* M-8 */563/* 185 */ ED_INSERT, /* M-9 */564/* 186 */ ED_INSERT, /* M-: */565/* 187 */ ED_INSERT, /* M-; */566/* 188 */ ED_INSERT, /* M-< */567/* 189 */ ED_INSERT, /* M-= */568/* 190 */ ED_INSERT, /* M-> */569/* 191 */ ED_INSERT, /* M-? */570/* 192 */ ED_INSERT, /* M-@ */571/* 193 */ ED_INSERT, /* M-A */572/* 194 */ ED_INSERT, /* M-B */573/* 195 */ ED_INSERT, /* M-C */574/* 196 */ ED_INSERT, /* M-D */575/* 197 */ ED_INSERT, /* M-E */576/* 198 */ ED_INSERT, /* M-F */577/* 199 */ ED_INSERT, /* M-G */578/* 200 */ ED_INSERT, /* M-H */579/* 201 */ ED_INSERT, /* M-I */580/* 202 */ ED_INSERT, /* M-J */581/* 203 */ ED_INSERT, /* M-K */582/* 204 */ ED_INSERT, /* M-L */583/* 205 */ ED_INSERT, /* M-M */584/* 206 */ ED_INSERT, /* M-N */585/* 207 */ ED_INSERT, /* M-O */586/* 208 */ ED_INSERT, /* M-P */587/* 209 */ ED_INSERT, /* M-Q */588/* 210 */ ED_INSERT, /* M-R */589/* 211 */ ED_INSERT, /* M-S */590/* 212 */ ED_INSERT, /* M-T */591/* 213 */ ED_INSERT, /* M-U */592/* 214 */ ED_INSERT, /* M-V */593/* 215 */ ED_INSERT, /* M-W */594/* 216 */ ED_INSERT, /* M-X */595/* 217 */ ED_INSERT, /* M-Y */596/* 218 */ ED_INSERT, /* M-Z */597/* 219 */ ED_INSERT, /* M-[ */598/* 220 */ ED_INSERT, /* M-\ */599/* 221 */ ED_INSERT, /* M-] */600/* 222 */ ED_INSERT, /* M-^ */601/* 223 */ ED_INSERT, /* M-_ */602/* 224 */ ED_INSERT, /* M-` */603/* 225 */ ED_INSERT, /* M-a */604/* 226 */ ED_INSERT, /* M-b */605/* 227 */ ED_INSERT, /* M-c */606/* 228 */ ED_INSERT, /* M-d */607/* 229 */ ED_INSERT, /* M-e */608/* 230 */ ED_INSERT, /* M-f */609/* 231 */ ED_INSERT, /* M-g */610/* 232 */ ED_INSERT, /* M-h */611/* 233 */ ED_INSERT, /* M-i */612/* 234 */ ED_INSERT, /* M-j */613/* 235 */ ED_INSERT, /* M-k */614/* 236 */ ED_INSERT, /* M-l */615/* 237 */ ED_INSERT, /* M-m */616/* 238 */ ED_INSERT, /* M-n */617/* 239 */ ED_INSERT, /* M-o */618/* 240 */ ED_INSERT, /* M-p */619/* 241 */ ED_INSERT, /* M-q */620/* 242 */ ED_INSERT, /* M-r */621/* 243 */ ED_INSERT, /* M-s */622/* 244 */ ED_INSERT, /* M-t */623/* 245 */ ED_INSERT, /* M-u */624/* 246 */ ED_INSERT, /* M-v */625/* 247 */ ED_INSERT, /* M-w */626/* 248 */ ED_INSERT, /* M-x */627/* 249 */ ED_INSERT, /* M-y */628/* 250 */ ED_INSERT, /* M-z */629/* 251 */ ED_INSERT, /* M-{ */630/* 252 */ ED_INSERT, /* M-| */631/* 253 */ ED_INSERT, /* M-} */632/* 254 */ ED_INSERT, /* M-~ */633/* 255 */ ED_INSERT /* M-^? */634};635636static const el_action_t el_map_vi_command[] = {637/* 0 */ ED_UNASSIGNED, /* ^@ */638/* 1 */ ED_MOVE_TO_BEG, /* ^A */639/* 2 */ ED_UNASSIGNED, /* ^B */640/* 3 */ ED_IGNORE, /* ^C */641/* 4 */ ED_UNASSIGNED, /* ^D */642/* 5 */ ED_MOVE_TO_END, /* ^E */643/* 6 */ ED_UNASSIGNED, /* ^F */644/* 7 */ ED_UNASSIGNED, /* ^G */645/* 8 */ ED_DELETE_PREV_CHAR, /* ^H */646/* 9 */ ED_UNASSIGNED, /* ^I */647/* 10 */ ED_NEWLINE, /* ^J */648/* 11 */ ED_KILL_LINE, /* ^K */649/* 12 */ ED_CLEAR_SCREEN, /* ^L */650/* 13 */ ED_NEWLINE, /* ^M */651/* 14 */ ED_NEXT_HISTORY, /* ^N */652/* 15 */ ED_IGNORE, /* ^O */653/* 16 */ ED_PREV_HISTORY, /* ^P */654/* 17 */ ED_IGNORE, /* ^Q */655/* 18 */ ED_REDISPLAY, /* ^R */656/* 19 */ ED_IGNORE, /* ^S */657/* 20 */ ED_UNASSIGNED, /* ^T */658/* 21 */ VI_KILL_LINE_PREV, /* ^U */659/* 22 */ ED_UNASSIGNED, /* ^V */660/* 23 */ ED_DELETE_PREV_WORD, /* ^W */661/* 24 */ ED_UNASSIGNED, /* ^X */662/* 25 */ ED_UNASSIGNED, /* ^Y */663/* 26 */ ED_UNASSIGNED, /* ^Z */664/* 27 */ EM_META_NEXT, /* ^[ */665/* 28 */ ED_IGNORE, /* ^\ */666/* 29 */ ED_UNASSIGNED, /* ^] */667/* 30 */ ED_UNASSIGNED, /* ^^ */668/* 31 */ ED_UNASSIGNED, /* ^_ */669/* 32 */ ED_NEXT_CHAR, /* SPACE */670/* 33 */ ED_UNASSIGNED, /* ! */671/* 34 */ ED_UNASSIGNED, /* " */672/* 35 */ VI_COMMENT_OUT, /* # */673/* 36 */ ED_MOVE_TO_END, /* $ */674/* 37 */ VI_MATCH, /* % */675/* 38 */ ED_UNASSIGNED, /* & */676/* 39 */ ED_UNASSIGNED, /* ' */677/* 40 */ ED_UNASSIGNED, /* ( */678/* 41 */ ED_UNASSIGNED, /* ) */679/* 42 */ ED_UNASSIGNED, /* * */680/* 43 */ ED_NEXT_HISTORY, /* + */681/* 44 */ VI_REPEAT_PREV_CHAR, /* , */682/* 45 */ ED_PREV_HISTORY, /* - */683/* 46 */ VI_REDO, /* . */684/* 47 */ VI_SEARCH_PREV, /* / */685/* 48 */ VI_ZERO, /* 0 */686/* 49 */ ED_ARGUMENT_DIGIT, /* 1 */687/* 50 */ ED_ARGUMENT_DIGIT, /* 2 */688/* 51 */ ED_ARGUMENT_DIGIT, /* 3 */689/* 52 */ ED_ARGUMENT_DIGIT, /* 4 */690/* 53 */ ED_ARGUMENT_DIGIT, /* 5 */691/* 54 */ ED_ARGUMENT_DIGIT, /* 6 */692/* 55 */ ED_ARGUMENT_DIGIT, /* 7 */693/* 56 */ ED_ARGUMENT_DIGIT, /* 8 */694/* 57 */ ED_ARGUMENT_DIGIT, /* 9 */695/* 58 */ ED_COMMAND, /* : */696/* 59 */ VI_REPEAT_NEXT_CHAR, /* ; */697/* 60 */ ED_UNASSIGNED, /* < */698/* 61 */ ED_UNASSIGNED, /* = */699/* 62 */ ED_UNASSIGNED, /* > */700/* 63 */ VI_SEARCH_NEXT, /* ? */701/* 64 */ VI_ALIAS, /* @ */702/* 65 */ VI_ADD_AT_EOL, /* A */703/* 66 */ VI_PREV_BIG_WORD, /* B */704/* 67 */ VI_CHANGE_TO_EOL, /* C */705/* 68 */ ED_KILL_LINE, /* D */706/* 69 */ VI_END_BIG_WORD, /* E */707/* 70 */ VI_PREV_CHAR, /* F */708/* 71 */ VI_TO_HISTORY_LINE, /* G */709/* 72 */ ED_UNASSIGNED, /* H */710/* 73 */ VI_INSERT_AT_BOL, /* I */711/* 74 */ ED_SEARCH_NEXT_HISTORY, /* J */712/* 75 */ ED_SEARCH_PREV_HISTORY, /* K */713/* 76 */ ED_UNASSIGNED, /* L */714/* 77 */ ED_UNASSIGNED, /* M */715/* 78 */ VI_REPEAT_SEARCH_PREV, /* N */716/* 79 */ ED_SEQUENCE_LEAD_IN, /* O */717/* 80 */ VI_PASTE_PREV, /* P */718/* 81 */ ED_UNASSIGNED, /* Q */719/* 82 */ VI_REPLACE_MODE, /* R */720/* 83 */ VI_SUBSTITUTE_LINE, /* S */721/* 84 */ VI_TO_PREV_CHAR, /* T */722/* 85 */ VI_UNDO_LINE, /* U */723/* 86 */ ED_UNASSIGNED, /* V */724/* 87 */ VI_NEXT_BIG_WORD, /* W */725/* 88 */ ED_DELETE_PREV_CHAR, /* X */726/* 89 */ VI_YANK_END, /* Y */727/* 90 */ ED_UNASSIGNED, /* Z */728/* 91 */ ED_SEQUENCE_LEAD_IN, /* [ */729/* 92 */ ED_UNASSIGNED, /* \ */730/* 93 */ ED_UNASSIGNED, /* ] */731/* 94 */ ED_MOVE_TO_BEG, /* ^ */732/* 95 */ VI_HISTORY_WORD, /* _ */733/* 96 */ ED_UNASSIGNED, /* ` */734/* 97 */ VI_ADD, /* a */735/* 98 */ VI_PREV_WORD, /* b */736/* 99 */ VI_CHANGE_META, /* c */737/* 100 */ VI_DELETE_META, /* d */738/* 101 */ VI_END_WORD, /* e */739/* 102 */ VI_NEXT_CHAR, /* f */740/* 103 */ ED_UNASSIGNED, /* g */741/* 104 */ ED_PREV_CHAR, /* h */742/* 105 */ VI_INSERT, /* i */743/* 106 */ ED_NEXT_HISTORY, /* j */744/* 107 */ ED_PREV_HISTORY, /* k */745/* 108 */ ED_NEXT_CHAR, /* l */746/* 109 */ ED_UNASSIGNED, /* m */747/* 110 */ VI_REPEAT_SEARCH_NEXT, /* n */748/* 111 */ ED_UNASSIGNED, /* o */749/* 112 */ VI_PASTE_NEXT, /* p */750/* 113 */ ED_UNASSIGNED, /* q */751/* 114 */ VI_REPLACE_CHAR, /* r */752/* 115 */ VI_SUBSTITUTE_CHAR, /* s */753/* 116 */ VI_TO_NEXT_CHAR, /* t */754/* 117 */ VI_UNDO, /* u */755/* 118 */ VI_HISTEDIT, /* v */756/* 119 */ VI_NEXT_WORD, /* w */757/* 120 */ ED_DELETE_NEXT_CHAR, /* x */758/* 121 */ VI_YANK, /* y */759/* 122 */ ED_UNASSIGNED, /* z */760/* 123 */ ED_UNASSIGNED, /* { */761/* 124 */ VI_TO_COLUMN, /* | */762/* 125 */ ED_UNASSIGNED, /* } */763/* 126 */ VI_CHANGE_CASE, /* ~ */764/* 127 */ ED_DELETE_PREV_CHAR, /* ^? */765/* 128 */ ED_UNASSIGNED, /* M-^@ */766/* 129 */ ED_UNASSIGNED, /* M-^A */767/* 130 */ ED_UNASSIGNED, /* M-^B */768/* 131 */ ED_UNASSIGNED, /* M-^C */769/* 132 */ ED_UNASSIGNED, /* M-^D */770/* 133 */ ED_UNASSIGNED, /* M-^E */771/* 134 */ ED_UNASSIGNED, /* M-^F */772/* 135 */ ED_UNASSIGNED, /* M-^G */773/* 136 */ ED_UNASSIGNED, /* M-^H */774/* 137 */ ED_UNASSIGNED, /* M-^I */775/* 138 */ ED_UNASSIGNED, /* M-^J */776/* 139 */ ED_UNASSIGNED, /* M-^K */777/* 140 */ ED_UNASSIGNED, /* M-^L */778/* 141 */ ED_UNASSIGNED, /* M-^M */779/* 142 */ ED_UNASSIGNED, /* M-^N */780/* 143 */ ED_UNASSIGNED, /* M-^O */781/* 144 */ ED_UNASSIGNED, /* M-^P */782/* 145 */ ED_UNASSIGNED, /* M-^Q */783/* 146 */ ED_UNASSIGNED, /* M-^R */784/* 147 */ ED_UNASSIGNED, /* M-^S */785/* 148 */ ED_UNASSIGNED, /* M-^T */786/* 149 */ ED_UNASSIGNED, /* M-^U */787/* 150 */ ED_UNASSIGNED, /* M-^V */788/* 151 */ ED_UNASSIGNED, /* M-^W */789/* 152 */ ED_UNASSIGNED, /* M-^X */790/* 153 */ ED_UNASSIGNED, /* M-^Y */791/* 154 */ ED_UNASSIGNED, /* M-^Z */792/* 155 */ ED_UNASSIGNED, /* M-^[ */793/* 156 */ ED_UNASSIGNED, /* M-^\ */794/* 157 */ ED_UNASSIGNED, /* M-^] */795/* 158 */ ED_UNASSIGNED, /* M-^^ */796/* 159 */ ED_UNASSIGNED, /* M-^_ */797/* 160 */ ED_UNASSIGNED, /* M-SPACE */798/* 161 */ ED_UNASSIGNED, /* M-! */799/* 162 */ ED_UNASSIGNED, /* M-" */800/* 163 */ ED_UNASSIGNED, /* M-# */801/* 164 */ ED_UNASSIGNED, /* M-$ */802/* 165 */ ED_UNASSIGNED, /* M-% */803/* 166 */ ED_UNASSIGNED, /* M-& */804/* 167 */ ED_UNASSIGNED, /* M-' */805/* 168 */ ED_UNASSIGNED, /* M-( */806/* 169 */ ED_UNASSIGNED, /* M-) */807/* 170 */ ED_UNASSIGNED, /* M-* */808/* 171 */ ED_UNASSIGNED, /* M-+ */809/* 172 */ ED_UNASSIGNED, /* M-, */810/* 173 */ ED_UNASSIGNED, /* M-- */811/* 174 */ ED_UNASSIGNED, /* M-. */812/* 175 */ ED_UNASSIGNED, /* M-/ */813/* 176 */ ED_UNASSIGNED, /* M-0 */814/* 177 */ ED_UNASSIGNED, /* M-1 */815/* 178 */ ED_UNASSIGNED, /* M-2 */816/* 179 */ ED_UNASSIGNED, /* M-3 */817/* 180 */ ED_UNASSIGNED, /* M-4 */818/* 181 */ ED_UNASSIGNED, /* M-5 */819/* 182 */ ED_UNASSIGNED, /* M-6 */820/* 183 */ ED_UNASSIGNED, /* M-7 */821/* 184 */ ED_UNASSIGNED, /* M-8 */822/* 185 */ ED_UNASSIGNED, /* M-9 */823/* 186 */ ED_UNASSIGNED, /* M-: */824/* 187 */ ED_UNASSIGNED, /* M-; */825/* 188 */ ED_UNASSIGNED, /* M-< */826/* 189 */ ED_UNASSIGNED, /* M-= */827/* 190 */ ED_UNASSIGNED, /* M-> */828/* 191 */ ED_UNASSIGNED, /* M-? */829/* 192 */ ED_UNASSIGNED, /* M-@ */830/* 193 */ ED_UNASSIGNED, /* M-A */831/* 194 */ ED_UNASSIGNED, /* M-B */832/* 195 */ ED_UNASSIGNED, /* M-C */833/* 196 */ ED_UNASSIGNED, /* M-D */834/* 197 */ ED_UNASSIGNED, /* M-E */835/* 198 */ ED_UNASSIGNED, /* M-F */836/* 199 */ ED_UNASSIGNED, /* M-G */837/* 200 */ ED_UNASSIGNED, /* M-H */838/* 201 */ ED_UNASSIGNED, /* M-I */839/* 202 */ ED_UNASSIGNED, /* M-J */840/* 203 */ ED_UNASSIGNED, /* M-K */841/* 204 */ ED_UNASSIGNED, /* M-L */842/* 205 */ ED_UNASSIGNED, /* M-M */843/* 206 */ ED_UNASSIGNED, /* M-N */844/* 207 */ ED_SEQUENCE_LEAD_IN, /* M-O */845/* 208 */ ED_UNASSIGNED, /* M-P */846/* 209 */ ED_UNASSIGNED, /* M-Q */847/* 210 */ ED_UNASSIGNED, /* M-R */848/* 211 */ ED_UNASSIGNED, /* M-S */849/* 212 */ ED_UNASSIGNED, /* M-T */850/* 213 */ ED_UNASSIGNED, /* M-U */851/* 214 */ ED_UNASSIGNED, /* M-V */852/* 215 */ ED_UNASSIGNED, /* M-W */853/* 216 */ ED_UNASSIGNED, /* M-X */854/* 217 */ ED_UNASSIGNED, /* M-Y */855/* 218 */ ED_UNASSIGNED, /* M-Z */856/* 219 */ ED_SEQUENCE_LEAD_IN, /* M-[ */857/* 220 */ ED_UNASSIGNED, /* M-\ */858/* 221 */ ED_UNASSIGNED, /* M-] */859/* 222 */ ED_UNASSIGNED, /* M-^ */860/* 223 */ ED_UNASSIGNED, /* M-_ */861/* 224 */ ED_UNASSIGNED, /* M-` */862/* 225 */ ED_UNASSIGNED, /* M-a */863/* 226 */ ED_UNASSIGNED, /* M-b */864/* 227 */ ED_UNASSIGNED, /* M-c */865/* 228 */ ED_UNASSIGNED, /* M-d */866/* 229 */ ED_UNASSIGNED, /* M-e */867/* 230 */ ED_UNASSIGNED, /* M-f */868/* 231 */ ED_UNASSIGNED, /* M-g */869/* 232 */ ED_UNASSIGNED, /* M-h */870/* 233 */ ED_UNASSIGNED, /* M-i */871/* 234 */ ED_UNASSIGNED, /* M-j */872/* 235 */ ED_UNASSIGNED, /* M-k */873/* 236 */ ED_UNASSIGNED, /* M-l */874/* 237 */ ED_UNASSIGNED, /* M-m */875/* 238 */ ED_UNASSIGNED, /* M-n */876/* 239 */ ED_UNASSIGNED, /* M-o */877/* 240 */ ED_UNASSIGNED, /* M-p */878/* 241 */ ED_UNASSIGNED, /* M-q */879/* 242 */ ED_UNASSIGNED, /* M-r */880/* 243 */ ED_UNASSIGNED, /* M-s */881/* 244 */ ED_UNASSIGNED, /* M-t */882/* 245 */ ED_UNASSIGNED, /* M-u */883/* 246 */ ED_UNASSIGNED, /* M-v */884/* 247 */ ED_UNASSIGNED, /* M-w */885/* 248 */ ED_UNASSIGNED, /* M-x */886/* 249 */ ED_UNASSIGNED, /* M-y */887/* 250 */ ED_UNASSIGNED, /* M-z */888/* 251 */ ED_UNASSIGNED, /* M-{ */889/* 252 */ ED_UNASSIGNED, /* M-| */890/* 253 */ ED_UNASSIGNED, /* M-} */891/* 254 */ ED_UNASSIGNED, /* M-~ */892/* 255 */ ED_UNASSIGNED /* M-^? */893};894895896/* map_init():897* Initialize and allocate the maps898*/899libedit_private int900map_init(EditLine *el)901{902903/*904* Make sure those are correct before starting.905*/906#ifdef MAP_DEBUG907if (sizeof(el_map_emacs) != N_KEYS * sizeof(el_action_t))908EL_ABORT((el->el_errfile, "Emacs map incorrect\n"));909if (sizeof(el_map_vi_command) != N_KEYS * sizeof(el_action_t))910EL_ABORT((el->el_errfile, "Vi command map incorrect\n"));911if (sizeof(el_map_vi_insert) != N_KEYS * sizeof(el_action_t))912EL_ABORT((el->el_errfile, "Vi insert map incorrect\n"));913#endif914915el->el_map.alt = el_calloc(N_KEYS, sizeof(*el->el_map.alt));916if (el->el_map.alt == NULL)917return -1;918el->el_map.key = el_calloc(N_KEYS, sizeof(*el->el_map.key));919if (el->el_map.key == NULL)920goto out;921el->el_map.emacs = el_map_emacs;922el->el_map.vic = el_map_vi_command;923el->el_map.vii = el_map_vi_insert;924el->el_map.help = el_calloc(EL_NUM_FCNS, sizeof(*el->el_map.help));925if (el->el_map.help == NULL)926goto out;927(void) memcpy(el->el_map.help, el_func_help,928sizeof(*el->el_map.help) * EL_NUM_FCNS);929el->el_map.func = el_calloc(EL_NUM_FCNS, sizeof(*el->el_map.func));930if (el->el_map.func == NULL)931goto out;932memcpy(el->el_map.func, el_func, sizeof(*el->el_map.func)933* EL_NUM_FCNS);934el->el_map.nfunc = EL_NUM_FCNS;935936#ifdef VIDEFAULT937map_init_vi(el);938#else939map_init_emacs(el);940#endif /* VIDEFAULT */941return 0;942out:943map_end(el);944return -1;945}946947948/* map_end():949* Free the space taken by the editor maps950*/951libedit_private void952map_end(EditLine *el)953{954955el_free(el->el_map.alt);956el->el_map.alt = NULL;957el_free(el->el_map.key);958el->el_map.key = NULL;959el->el_map.emacs = NULL;960el->el_map.vic = NULL;961el->el_map.vii = NULL;962el_free(el->el_map.help);963el->el_map.help = NULL;964el_free(el->el_map.func);965el->el_map.func = NULL;966}967968969/* map_init_nls():970* Find all the printable keys and bind them to self insert971*/972static void973map_init_nls(EditLine *el)974{975int i;976977el_action_t *map = el->el_map.key;978979for (i = 0200; i <= 0377; i++)980if (iswprint(i))981map[i] = ED_INSERT;982}983984985/* map_init_meta():986* Bind all the meta keys to the appropriate ESC-<key> sequence987*/988static void989map_init_meta(EditLine *el)990{991wchar_t buf[3];992int i;993el_action_t *map = el->el_map.key;994el_action_t *alt = el->el_map.alt;995996for (i = 0; i <= 0377 && map[i] != EM_META_NEXT; i++)997continue;998999if (i > 0377) {1000for (i = 0; i <= 0377 && alt[i] != EM_META_NEXT; i++)1001continue;1002if (i > 0377) {1003i = 033;1004if (el->el_map.type == MAP_VI)1005map = alt;1006} else1007map = alt;1008}1009buf[0] = (wchar_t)i;1010buf[2] = 0;1011for (i = 0200; i <= 0377; i++)1012switch (map[i]) {1013case ED_INSERT:1014case ED_UNASSIGNED:1015case ED_SEQUENCE_LEAD_IN:1016break;1017default:1018buf[1] = i & 0177;1019keymacro_add(el, buf, keymacro_map_cmd(el, (int) map[i]), XK_CMD);1020break;1021}1022map[(int) buf[0]] = ED_SEQUENCE_LEAD_IN;1023}102410251026/* map_init_vi():1027* Initialize the vi bindings1028*/1029libedit_private void1030map_init_vi(EditLine *el)1031{1032int i;1033el_action_t *key = el->el_map.key;1034el_action_t *alt = el->el_map.alt;1035const el_action_t *vii = el->el_map.vii;1036const el_action_t *vic = el->el_map.vic;10371038el->el_map.type = MAP_VI;1039el->el_map.current = el->el_map.key;10401041keymacro_reset(el);10421043for (i = 0; i < N_KEYS; i++) {1044key[i] = vii[i];1045alt[i] = vic[i];1046}10471048map_init_meta(el);1049map_init_nls(el);10501051tty_bind_char(el, 1);1052terminal_bind_arrow(el);1053}105410551056/* map_init_emacs():1057* Initialize the emacs bindings1058*/1059libedit_private void1060map_init_emacs(EditLine *el)1061{1062int i;1063wchar_t buf[3];1064el_action_t *key = el->el_map.key;1065el_action_t *alt = el->el_map.alt;1066const el_action_t *emacs = el->el_map.emacs;10671068el->el_map.type = MAP_EMACS;1069el->el_map.current = el->el_map.key;1070keymacro_reset(el);10711072for (i = 0; i < N_KEYS; i++) {1073key[i] = emacs[i];1074alt[i] = ED_UNASSIGNED;1075}10761077map_init_meta(el);1078map_init_nls(el);10791080buf[0] = CONTROL('X');1081buf[1] = CONTROL('X');1082buf[2] = 0;1083keymacro_add(el, buf, keymacro_map_cmd(el, EM_EXCHANGE_MARK), XK_CMD);10841085tty_bind_char(el, 1);1086terminal_bind_arrow(el);1087}108810891090/* map_set_editor():1091* Set the editor1092*/1093libedit_private int1094map_set_editor(EditLine *el, wchar_t *editor)1095{10961097if (wcscmp(editor, L"emacs") == 0) {1098map_init_emacs(el);1099return 0;1100}1101if (wcscmp(editor, L"vi") == 0) {1102map_init_vi(el);1103return 0;1104}1105return -1;1106}110711081109/* map_get_editor():1110* Retrieve the editor1111*/1112libedit_private int1113map_get_editor(EditLine *el, const wchar_t **editor)1114{11151116if (editor == NULL)1117return -1;1118switch (el->el_map.type) {1119case MAP_EMACS:1120*editor = L"emacs";1121return 0;1122case MAP_VI:1123*editor = L"vi";1124return 0;1125}1126return -1;1127}112811291130/* map_print_key():1131* Print the function description for 1 key1132*/1133static void1134map_print_key(EditLine *el, el_action_t *map, const wchar_t *in)1135{1136char outbuf[EL_BUFSIZ];1137el_bindings_t *bp, *ep;11381139if (in[0] == '\0' || in[1] == '\0') {1140(void) keymacro__decode_str(in, outbuf, sizeof(outbuf), "");1141ep = &el->el_map.help[el->el_map.nfunc];1142for (bp = el->el_map.help; bp < ep; bp++)1143if (bp->func == map[(unsigned char) *in]) {1144(void) fprintf(el->el_outfile,1145"%s\t->\t%ls\n", outbuf, bp->name);1146return;1147}1148} else1149keymacro_print(el, in);1150}115111521153/* map_print_some_keys():1154* Print keys from first to last1155*/1156static void1157map_print_some_keys(EditLine *el, el_action_t *map, wint_t first, wint_t last)1158{1159el_bindings_t *bp, *ep;1160wchar_t firstbuf[2], lastbuf[2];1161char unparsbuf[EL_BUFSIZ], extrabuf[EL_BUFSIZ];11621163firstbuf[0] = first;1164firstbuf[1] = 0;1165lastbuf[0] = last;1166lastbuf[1] = 0;1167if (map[first] == ED_UNASSIGNED) {1168if (first == last) {1169(void) keymacro__decode_str(firstbuf, unparsbuf,1170sizeof(unparsbuf), STRQQ);1171(void) fprintf(el->el_outfile,1172"%-15s-> is undefined\n", unparsbuf);1173}1174return;1175}1176ep = &el->el_map.help[el->el_map.nfunc];1177for (bp = el->el_map.help; bp < ep; bp++) {1178if (bp->func == map[first]) {1179if (first == last) {1180(void) keymacro__decode_str(firstbuf, unparsbuf,1181sizeof(unparsbuf), STRQQ);1182(void) fprintf(el->el_outfile, "%-15s-> %ls\n",1183unparsbuf, bp->name);1184} else {1185(void) keymacro__decode_str(firstbuf, unparsbuf,1186sizeof(unparsbuf), STRQQ);1187(void) keymacro__decode_str(lastbuf, extrabuf,1188sizeof(extrabuf), STRQQ);1189(void) fprintf(el->el_outfile,1190"%-4s to %-7s-> %ls\n",1191unparsbuf, extrabuf, bp->name);1192}1193return;1194}1195}1196#ifdef MAP_DEBUG1197if (map == el->el_map.key) {1198(void) keymacro__decode_str(firstbuf, unparsbuf,1199sizeof(unparsbuf), STRQQ);1200(void) fprintf(el->el_outfile,1201"BUG!!! %s isn't bound to anything.\n", unparsbuf);1202(void) fprintf(el->el_outfile, "el->el_map.key[%d] == %d\n",1203first, el->el_map.key[first]);1204} else {1205(void) keymacro__decode_str(firstbuf, unparsbuf,1206sizeof(unparsbuf), STRQQ);1207(void) fprintf(el->el_outfile,1208"BUG!!! %s isn't bound to anything.\n", unparsbuf);1209(void) fprintf(el->el_outfile, "el->el_map.alt[%d] == %d\n",1210first, el->el_map.alt[first]);1211}1212#endif1213EL_ABORT((el->el_errfile, "Error printing keys\n"));1214}121512161217/* map_print_all_keys():1218* Print the function description for all keys.1219*/1220static void1221map_print_all_keys(EditLine *el)1222{1223int prev, i;12241225(void) fprintf(el->el_outfile, "Standard key bindings\n");1226prev = 0;1227for (i = 0; i < N_KEYS; i++) {1228if (el->el_map.key[prev] == el->el_map.key[i])1229continue;1230map_print_some_keys(el, el->el_map.key, prev, i - 1);1231prev = i;1232}1233map_print_some_keys(el, el->el_map.key, prev, i - 1);12341235(void) fprintf(el->el_outfile, "Alternative key bindings\n");1236prev = 0;1237for (i = 0; i < N_KEYS; i++) {1238if (el->el_map.alt[prev] == el->el_map.alt[i])1239continue;1240map_print_some_keys(el, el->el_map.alt, prev, i - 1);1241prev = i;1242}1243map_print_some_keys(el, el->el_map.alt, prev, i - 1);12441245(void) fprintf(el->el_outfile, "Multi-character bindings\n");1246keymacro_print(el, L"");1247(void) fprintf(el->el_outfile, "Arrow key bindings\n");1248terminal_print_arrow(el, L"");1249}125012511252/* map_bind():1253* Add/remove/change bindings1254*/1255libedit_private int1256map_bind(EditLine *el, int argc, const wchar_t **argv)1257{1258el_action_t *map;1259int ntype, rem;1260const wchar_t *p;1261wchar_t inbuf[EL_BUFSIZ];1262wchar_t outbuf[EL_BUFSIZ];1263const wchar_t *in = NULL;1264wchar_t *out;1265el_bindings_t *bp, *ep;1266int cmd;1267int key;12681269if (argv == NULL)1270return -1;12711272map = el->el_map.key;1273ntype = XK_CMD;1274key = rem = 0;1275for (argc = 1; (p = argv[argc]) != NULL; argc++)1276if (p[0] == '-')1277switch (p[1]) {1278case 'a':1279map = el->el_map.alt;1280break;12811282case 's':1283ntype = XK_STR;1284break;1285case 'k':1286key = 1;1287break;12881289case 'r':1290rem = 1;1291break;12921293case 'v':1294map_init_vi(el);1295return 0;12961297case 'e':1298map_init_emacs(el);1299return 0;13001301case 'l':1302ep = &el->el_map.help[el->el_map.nfunc];1303for (bp = el->el_map.help; bp < ep; bp++)1304(void) fprintf(el->el_outfile,1305"%ls\n\t%ls\n",1306bp->name, bp->description);1307return 0;1308default:1309(void) fprintf(el->el_errfile,1310"%ls: Invalid switch `%lc'.\n",1311argv[0], (wint_t)p[1]);1312}1313else1314break;13151316if (argv[argc] == NULL) {1317map_print_all_keys(el);1318return 0;1319}1320if (key)1321in = argv[argc++];1322else if ((in = parse__string(inbuf, argv[argc++])) == NULL) {1323(void) fprintf(el->el_errfile,1324"%ls: Invalid \\ or ^ in instring.\n",1325argv[0]);1326return -1;1327}1328if (rem) {1329if (key) {1330(void) terminal_clear_arrow(el, in);1331return -1;1332}1333if (in[1])1334(void) keymacro_delete(el, in);1335else if (map[(unsigned char) *in] == ED_SEQUENCE_LEAD_IN)1336(void) keymacro_delete(el, in);1337else1338map[(unsigned char) *in] = ED_UNASSIGNED;1339return 0;1340}1341if (argv[argc] == NULL) {1342if (key)1343terminal_print_arrow(el, in);1344else1345map_print_key(el, map, in);1346return 0;1347}1348#ifdef notyet1349if (argv[argc + 1] != NULL) {1350bindkeymacro_usage();1351return -1;1352}1353#endif13541355switch (ntype) {1356case XK_STR:1357if ((out = parse__string(outbuf, argv[argc])) == NULL) {1358(void) fprintf(el->el_errfile,1359"%ls: Invalid \\ or ^ in outstring.\n", argv[0]);1360return -1;1361}1362if (key)1363terminal_set_arrow(el, in, keymacro_map_str(el, out), ntype);1364else1365keymacro_add(el, in, keymacro_map_str(el, out), ntype);1366map[(unsigned char) *in] = ED_SEQUENCE_LEAD_IN;1367break;13681369case XK_CMD:1370if ((cmd = parse_cmd(el, argv[argc])) == -1) {1371(void) fprintf(el->el_errfile,1372"%ls: Invalid command `%ls'.\n",1373argv[0], argv[argc]);1374return -1;1375}1376if (key)1377terminal_set_arrow(el, in, keymacro_map_cmd(el, cmd), ntype);1378else {1379if (in[1]) {1380keymacro_add(el, in, keymacro_map_cmd(el, cmd), ntype);1381map[(unsigned char) *in] = ED_SEQUENCE_LEAD_IN;1382} else {1383keymacro_clear(el, map, in);1384map[(unsigned char) *in] = (el_action_t)cmd;1385}1386}1387break;13881389/* coverity[dead_error_begin] */1390default:1391EL_ABORT((el->el_errfile, "Bad XK_ type %d\n", ntype));1392}1393return 0;1394}139513961397/* map_addfunc():1398* add a user defined function1399*/1400libedit_private int1401map_addfunc(EditLine *el, const wchar_t *name, const wchar_t *help,1402el_func_t func)1403{1404void *p;1405size_t nf = el->el_map.nfunc + 1;14061407if (name == NULL || help == NULL || func == NULL)1408return -1;14091410if ((p = el_realloc(el->el_map.func, nf *1411sizeof(*el->el_map.func))) == NULL)1412return -1;1413el->el_map.func = p;1414if ((p = el_realloc(el->el_map.help, nf * sizeof(*el->el_map.help)))1415== NULL)1416return -1;1417el->el_map.help = p;14181419nf = (size_t)el->el_map.nfunc;1420el->el_map.func[nf] = func;14211422el->el_map.help[nf].name = name;1423el->el_map.help[nf].func = (int)nf;1424el->el_map.help[nf].description = help;1425el->el_map.nfunc++;14261427return 0;1428}142914301431