📄 map.c
字号:
map_end(EditLine *el){ el_free((ptr_t) el->el_map.alt); el->el_map.alt = NULL; el_free((ptr_t) 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((ptr_t) el->el_map.help); el->el_map.help = NULL; el_free((ptr_t) el->el_map.func); el->el_map.func = NULL;}/* map_init_nls(): * Find all the printable keys and bind them to self insert */private voidmap_init_nls(EditLine *el){ int i; el_action_t *map = el->el_map.key; for (i = 0200; i <= 0377; i++) if (isprint(i)) map[i] = ED_INSERT;}/* map_init_meta(): * Bind all the meta keys to the appropriate ESC-<key> sequence */private voidmap_init_meta(EditLine *el){ char 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] = (char) 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; key_add(el, buf, key_map_cmd(el, (int) map[i]), XK_CMD); break; } map[(int) buf[0]] = ED_SEQUENCE_LEAD_IN;}/* map_init_vi(): * Initialize the vi bindings */protected voidmap_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; key_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); term_bind_arrow(el);}/* map_init_emacs(): * Initialize the emacs bindings */protected voidmap_init_emacs(EditLine *el){ int i; char 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; key_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; key_add(el, buf, key_map_cmd(el, EM_EXCHANGE_MARK), XK_CMD); tty_bind_char(el, 1); term_bind_arrow(el);}/* map_set_editor(): * Set the editor */protected intmap_set_editor(EditLine *el, char *editor){ if (strcmp(editor, "emacs") == 0) { map_init_emacs(el); return (0); } if (strcmp(editor, "vi") == 0) { map_init_vi(el); return (0); } return (-1);}/* map_get_editor(): * Retrieve the editor */protected intmap_get_editor(EditLine *el, const char **editor){ if (editor == NULL) return (-1); switch (el->el_map.type) { case MAP_EMACS: *editor = "emacs"; return (0); case MAP_VI: *editor = "vi"; return (0); } return (-1);}/* map_print_key(): * Print the function description for 1 key */private voidmap_print_key(EditLine *el, el_action_t *map, const char *in){ char outbuf[EL_BUFSIZ]; el_bindings_t *bp; if (in[0] == '\0' || in[1] == '\0') { (void) key__decode_str(in, outbuf, ""); for (bp = el->el_map.help; bp->name != NULL; bp++) if (bp->func == map[(unsigned char) *in]) { (void) fprintf(el->el_outfile, "%s\t->\t%s\n", outbuf, bp->name); return; } } else key_print(el, in);}/* map_print_some_keys(): * Print keys from first to last */private voidmap_print_some_keys(EditLine *el, el_action_t *map, int first, int last){ el_bindings_t *bp; char 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) fprintf(el->el_outfile, "%-15s-> is undefined\n", key__decode_str(firstbuf, unparsbuf, STRQQ)); return; } for (bp = el->el_map.help; bp->name != NULL; bp++) { if (bp->func == map[first]) { if (first == last) { (void) fprintf(el->el_outfile, "%-15s-> %s\n", key__decode_str(firstbuf, unparsbuf, STRQQ), bp->name); } else { (void) fprintf(el->el_outfile, "%-4s to %-7s-> %s\n", key__decode_str(firstbuf, unparsbuf, STRQQ), key__decode_str(lastbuf, extrabuf, STRQQ), bp->name); } return; } }#ifdef MAP_DEBUG if (map == el->el_map.key) { (void) fprintf(el->el_outfile, "BUG!!! %s isn't bound to anything.\n", key__decode_str(firstbuf, unparsbuf, STRQQ)); (void) fprintf(el->el_outfile, "el->el_map.key[%d] == %d\n", first, el->el_map.key[first]); } else { (void) fprintf(el->el_outfile, "BUG!!! %s isn't bound to anything.\n", key__decode_str(firstbuf, unparsbuf, STRQQ)); (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. */private voidmap_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"); key_print(el, ""); (void) fprintf(el->el_outfile, "Arrow key bindings\n"); term_print_arrow(el, "");}/* map_bind(): * Add/remove/change bindings */protected intmap_bind(EditLine *el, int argc, const char **argv){ el_action_t *map; int ntype, rem; const char *p; char inbuf[EL_BUFSIZ]; char outbuf[EL_BUFSIZ]; const char *in = NULL; char *out = NULL; el_bindings_t *bp; 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;#ifdef notyet case 'c': ntype = XK_EXE; break;#endif 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': for (bp = el->el_map.help; bp->name != NULL; bp++) (void) fprintf(el->el_outfile, "%s\n\t%s\n", bp->name, bp->description); return (0); default: (void) fprintf(el->el_errfile, "%s: Invalid switch `%c'.\n", argv[0], 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, "%s: Invalid \\ or ^ in instring.\n", argv[0]); return (-1); } if (rem) { if (key) { (void) term_clear_arrow(el, in); return (-1); } if (in[1]) (void) key_delete(el, in); else if (map[(unsigned char) *in] == ED_SEQUENCE_LEAD_IN) (void) key_delete(el, in); else map[(unsigned char) *in] = ED_UNASSIGNED; return (0); } if (argv[argc] == NULL) { if (key) term_print_arrow(el, in); else map_print_key(el, map, in); return (0); }#ifdef notyet if (argv[argc + 1] != NULL) { bindkey_usage(); return (-1); }#endif switch (ntype) { case XK_STR: case XK_EXE: if ((out = parse__string(outbuf, argv[argc])) == NULL) { (void) fprintf(el->el_errfile, "%s: Invalid \\ or ^ in outstring.\n", argv[0]); return (-1); } if (key) term_set_arrow(el, in, key_map_str(el, out), ntype); else key_add(el, in, key_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, "%s: Invalid command `%s'.\n", argv[0], argv[argc]); return (-1); } if (key) term_set_arrow(el, in, key_map_str(el, out), ntype); else { if (in[1]) { key_add(el, in, key_map_cmd(el, cmd), ntype); map[(unsigned char) *in] = ED_SEQUENCE_LEAD_IN; } else { key_clear(el, map, in); map[(unsigned char) *in] = cmd; } } break; default: EL_ABORT((el->el_errfile, "Bad XK_ type\n", ntype)); break; } return (0);}/* map_addfunc(): * add a user defined function */protected intmap_addfunc(EditLine *el, const char *name, const char *help, el_func_t func){ void *p; int nf = el->el_map.nfunc + 2; if (name == NULL || help == NULL || func == NULL) return (-1); if ((p = el_realloc(el->el_map.func, nf * sizeof(el_func_t))) == NULL) return (-1); el->el_map.func = (el_func_t *) p; if ((p = el_realloc(el->el_map.help, nf * sizeof(el_bindings_t))) == NULL) return (-1); el->el_map.help = (el_bindings_t *) p; nf = el->el_map.nfunc; el->el_map.func[nf] = func; el->el_map.help[nf].name = name; el->el_map.help[nf].func = nf; el->el_map.help[nf].description = help; el->el_map.help[++nf].name = NULL; el->el_map.nfunc++; return (0);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -