📄 term.c
字号:
arrow[A_K_EN].name = "end"; arrow[A_K_EN].key = T_at7; arrow[A_K_EN].fun.cmd = ED_MOVE_TO_END; arrow[A_K_EN].type = XK_CMD;}/* term_reset_arrow(): * Reset arrow key bindings */private voidterm_reset_arrow(EditLine *el){ fkey_t *arrow = el->el_term.t_fkey; static const char strA[] = {033, '[', 'A', '\0'}; static const char strB[] = {033, '[', 'B', '\0'}; static const char strC[] = {033, '[', 'C', '\0'}; static const char strD[] = {033, '[', 'D', '\0'}; static const char strH[] = {033, '[', 'H', '\0'}; static const char strF[] = {033, '[', 'F', '\0'}; static const char stOA[] = {033, 'O', 'A', '\0'}; static const char stOB[] = {033, 'O', 'B', '\0'}; static const char stOC[] = {033, 'O', 'C', '\0'}; static const char stOD[] = {033, 'O', 'D', '\0'}; static const char stOH[] = {033, 'O', 'H', '\0'}; static const char stOF[] = {033, 'O', 'F', '\0'}; key_add(el, strA, &arrow[A_K_UP].fun, arrow[A_K_UP].type); key_add(el, strB, &arrow[A_K_DN].fun, arrow[A_K_DN].type); key_add(el, strC, &arrow[A_K_RT].fun, arrow[A_K_RT].type); key_add(el, strD, &arrow[A_K_LT].fun, arrow[A_K_LT].type); key_add(el, strH, &arrow[A_K_HO].fun, arrow[A_K_HO].type); key_add(el, strF, &arrow[A_K_EN].fun, arrow[A_K_EN].type); key_add(el, stOA, &arrow[A_K_UP].fun, arrow[A_K_UP].type); key_add(el, stOB, &arrow[A_K_DN].fun, arrow[A_K_DN].type); key_add(el, stOC, &arrow[A_K_RT].fun, arrow[A_K_RT].type); key_add(el, stOD, &arrow[A_K_LT].fun, arrow[A_K_LT].type); key_add(el, stOH, &arrow[A_K_HO].fun, arrow[A_K_HO].type); key_add(el, stOF, &arrow[A_K_EN].fun, arrow[A_K_EN].type); if (el->el_map.type == MAP_VI) { key_add(el, &strA[1], &arrow[A_K_UP].fun, arrow[A_K_UP].type); key_add(el, &strB[1], &arrow[A_K_DN].fun, arrow[A_K_DN].type); key_add(el, &strC[1], &arrow[A_K_RT].fun, arrow[A_K_RT].type); key_add(el, &strD[1], &arrow[A_K_LT].fun, arrow[A_K_LT].type); key_add(el, &strH[1], &arrow[A_K_HO].fun, arrow[A_K_HO].type); key_add(el, &strF[1], &arrow[A_K_EN].fun, arrow[A_K_EN].type); key_add(el, &stOA[1], &arrow[A_K_UP].fun, arrow[A_K_UP].type); key_add(el, &stOB[1], &arrow[A_K_DN].fun, arrow[A_K_DN].type); key_add(el, &stOC[1], &arrow[A_K_RT].fun, arrow[A_K_RT].type); key_add(el, &stOD[1], &arrow[A_K_LT].fun, arrow[A_K_LT].type); key_add(el, &stOH[1], &arrow[A_K_HO].fun, arrow[A_K_HO].type); key_add(el, &stOF[1], &arrow[A_K_EN].fun, arrow[A_K_EN].type); }}/* term_set_arrow(): * Set an arrow key binding */protected intterm_set_arrow(EditLine *el, const char *name, key_value_t *fun, int type){ fkey_t *arrow = el->el_term.t_fkey; int i; for (i = 0; i < A_K_NKEYS; i++) if (strcmp(name, arrow[i].name) == 0) { arrow[i].fun = *fun; arrow[i].type = type; return (0); } return (-1);}/* term_clear_arrow(): * Clear an arrow key binding */protected intterm_clear_arrow(EditLine *el, const char *name){ fkey_t *arrow = el->el_term.t_fkey; int i; for (i = 0; i < A_K_NKEYS; i++) if (strcmp(name, arrow[i].name) == 0) { arrow[i].type = XK_NOD; return (0); } return (-1);}/* term_print_arrow(): * Print the arrow key bindings */protected voidterm_print_arrow(EditLine *el, const char *name){ int i; fkey_t *arrow = el->el_term.t_fkey; for (i = 0; i < A_K_NKEYS; i++) if (*name == '\0' || strcmp(name, arrow[i].name) == 0) if (arrow[i].type != XK_NOD) key_kprint(el, arrow[i].name, &arrow[i].fun, arrow[i].type);}/* term_bind_arrow(): * Bind the arrow keys */protected voidterm_bind_arrow(EditLine *el){ el_action_t *map; const el_action_t *dmap; int i, j; char *p; fkey_t *arrow = el->el_term.t_fkey; /* Check if the components needed are initialized */ if (el->el_term.t_buf == NULL || el->el_map.key == NULL) return; map = el->el_map.type == MAP_VI ? el->el_map.alt : el->el_map.key; dmap = el->el_map.type == MAP_VI ? el->el_map.vic : el->el_map.emacs; term_reset_arrow(el); for (i = 0; i < A_K_NKEYS; i++) { p = el->el_term.t_str[arrow[i].key]; if (p && *p) { j = (unsigned char) *p; /* * Assign the arrow keys only if: * * 1. They are multi-character arrow keys and the user * has not re-assigned the leading character, or * has re-assigned the leading character to be * ED_SEQUENCE_LEAD_IN * 2. They are single arrow keys pointing to an * unassigned key. */ if (arrow[i].type == XK_NOD) key_clear(el, map, p); else { if (p[1] && (dmap[j] == map[j] || map[j] == ED_SEQUENCE_LEAD_IN)) { key_add(el, p, &arrow[i].fun, arrow[i].type); map[j] = ED_SEQUENCE_LEAD_IN; } else if (map[j] == ED_UNASSIGNED) { key_clear(el, map, p); if (arrow[i].type == XK_CMD) map[j] = arrow[i].fun.cmd; else key_add(el, p, &arrow[i].fun, arrow[i].type); } } } }}/* term__putc(): * Add a character */protected intterm__putc(int c){ return (fputc(c, term_outfile));}/* term__flush(): * Flush output */protected voidterm__flush(void){ (void) fflush(term_outfile);}/* term_telltc(): * Print the current termcap characteristics */protected int/*ARGSUSED*/term_telltc(EditLine *el, int argc, const char **argv){ const struct termcapstr *t; char **ts; char upbuf[EL_BUFSIZ]; (void) fprintf(el->el_outfile, "\n\tYour terminal has the\n"); (void) fprintf(el->el_outfile, "\tfollowing characteristics:\n\n"); (void) fprintf(el->el_outfile, "\tIt has %d columns and %d lines\n", Val(T_co), Val(T_li)); (void) fprintf(el->el_outfile, "\tIt has %s meta key\n", EL_HAS_META ? "a" : "no"); (void) fprintf(el->el_outfile, "\tIt can%suse tabs\n", EL_CAN_TAB ? " " : "not "); (void) fprintf(el->el_outfile, "\tIt %s automatic margins\n", EL_HAS_AUTO_MARGINS ? "has" : "does not have"); if (EL_HAS_AUTO_MARGINS) (void) fprintf(el->el_outfile, "\tIt %s magic margins\n", EL_HAS_MAGIC_MARGINS ? "has" : "does not have"); for (t = tstr, ts = el->el_term.t_str; t->name != NULL; t++, ts++) (void) fprintf(el->el_outfile, "\t%25s (%s) == %s\n", t->long_name, t->name, *ts && **ts ? key__decode_str(*ts, upbuf, "") : "(empty)"); (void) fputc('\n', el->el_outfile); return (0);}/* term_settc(): * Change the current terminal characteristics */protected int/*ARGSUSED*/term_settc(EditLine *el, int argc, const char **argv){ const struct termcapstr *ts; const struct termcapval *tv; const char *what, *how; if (argv == NULL || argv[1] == NULL || argv[2] == NULL) return (-1); what = argv[1]; how = argv[2]; /* * Do the strings first */ for (ts = tstr; ts->name != NULL; ts++) if (strcmp(ts->name, what) == 0) break; if (ts->name != NULL) { term_alloc(el, ts, how); term_setflags(el); return (0); } /* * Do the numeric ones second */ for (tv = tval; tv->name != NULL; tv++) if (strcmp(tv->name, what) == 0) break; if (tv->name != NULL) { if (tv == &tval[T_pt] || tv == &tval[T_km] || tv == &tval[T_am] || tv == &tval[T_xn]) { if (strcmp(how, "yes") == 0) el->el_term.t_val[tv - tval] = 1; else if (strcmp(how, "no") == 0) el->el_term.t_val[tv - tval] = 0; else { (void) fprintf(el->el_errfile, "settc: Bad value `%s'.\n", how); return (-1); } term_setflags(el); if (term_change_size(el, Val(T_li), Val(T_co)) == -1) return (-1); return (0); } else { long i; char *ep; i = strtol(how, &ep, 10); if (*ep != '\0') { (void) fprintf(el->el_errfile, "settc: Bad value `%s'.\n", how); return (-1); } el->el_term.t_val[tv - tval] = (int) i; el->el_term.t_size.v = Val(T_co); el->el_term.t_size.h = Val(T_li); if (tv == &tval[T_co] || tv == &tval[T_li]) if (term_change_size(el, Val(T_li), Val(T_co)) == -1) return (-1); return (0); } } return (-1);}/* term_echotc(): * Print the termcap string out with variable substitution */protected int/*ARGSUSED*/term_echotc(EditLine *el, int argc, const char **argv){ char *cap, *scap, *ep; int arg_need, arg_cols, arg_rows; int verbose = 0, silent = 0; char *area; static const char fmts[] = "%s\n", fmtd[] = "%d\n"; const struct termcapstr *t; char buf[TC_BUFSIZE]; long i; area = buf; if (argv == NULL || argv[1] == NULL) return (-1); argv++; if (argv[0][0] == '-') { switch (argv[0][1]) { case 'v': verbose = 1; break; case 's': silent = 1; break; default: /* stderror(ERR_NAME | ERR_TCUSAGE); */ break; } argv++; } if (!*argv || *argv[0] == '\0') return (0); if (strcmp(*argv, "tabs") == 0) { (void) fprintf(el->el_outfile, fmts, EL_CAN_TAB ? "yes" : "no"); return (0); } else if (strcmp(*argv, "meta") == 0) { (void) fprintf(el->el_outfile, fmts, Val(T_km) ? "yes" : "no"); return (0); } else if (strcmp(*argv, "xn") == 0) { (void) fprintf(el->el_outfile, fmts, EL_HAS_MAGIC_MARGINS ? "yes" : "no"); return (0); } else if (strcmp(*argv, "am") == 0) { (void) fprintf(el->el_outfile, fmts, EL_HAS_AUTO_MARGINS ? "yes" : "no"); return (0); } else if (strcmp(*argv, "baud") == 0) {#ifdef notdef int i; for (i = 0; baud_rate[i].b_name != NULL; i++) if (el->el_tty.t_speed == baud_rate[i].b_rate) { (void) fprintf(el->el_outfile, fmts, baud_rate[i].b_name); return (0); } (void) fprintf(el->el_outfile, fmtd, 0);#else (void) fprintf(el->el_outfile, fmtd, (int) el->el_tty.t_speed);#endif return (0); } else if (strcmp(*argv, "rows") == 0 || strcmp(*argv, "lines") == 0) { (void) fprintf(el->el_outfile, fmtd, Val(T_li)); return (0); } else if (strcmp(*argv, "cols") == 0) { (void) fprintf(el->el_outfile, fmtd, Val(T_co)); return (0); } /* * Try to use our local definition first */ scap = NULL; for (t = tstr; t->name != NULL; t++) if (strcmp(t->name, *argv) == 0) { scap = el->el_term.t_str[t - tstr]; break; } if (t->name == NULL) scap = tgetstr((char *)argv, &area); if (!scap || scap[0] == '\0') { if (!silent) (void) fprintf(el->el_errfile, "echotc: Termcap parameter `%s' not found.\n", *argv); return (-1); } /* * Count home many values we need for this capability. */ for (cap = scap, arg_need = 0; *cap; cap++) if (*cap == '%') switch (*++cap) { case 'd': case '2': case '3': case '.': case '+': arg_need++; break; case '%': case '>': case 'i': case 'r': case 'n': case 'B': case 'D': break; default: /* * hpux has lot's of them... */ if (verbose) (void) fprintf(el->el_errfile, "echotc: Warning: unknown termcap %% `%c'.\n", *cap); /* This is bad, but I won't complain */ break; } switch (arg_need) { case 0: argv++; if (*argv && *argv[0]) { if (!silent) (void) fprintf(el->el_errfile, "echotc: Warning: Extra argument `%s'.\n", *argv); return (-1); } (void) tputs(scap, 1, term__putc); break; case 1: argv++; if (!*argv || *argv[0] == '\0') { if (!silent) (void) fprintf(el->el_errfile, "echotc: Warning: Missing argument.\n"); return (-1); } arg_cols = 0; i = strtol(*argv, &ep, 10); if (*ep != '\0' || i < 0) { if (!silent) (void) fprintf(el->el_errfile, "echotc: Bad value `%s' for rows.\n", *argv); return (-1); } arg_rows = (int) i; argv++; if (*argv && *argv[0]) { if (!silent) (void) fprintf(el->el_errfile, "echotc: Warning: Extra argument `%s'.\n", *argv); return (-1); } (void) tputs(tgoto(scap, arg_cols, arg_rows), 1, term__putc); break; default: /* This is wrong, but I will ignore it... */ if (verbose) (void) fprintf(el->el_errfile, "echotc: Warning: Too many required arguments (%d).\n", arg_need); /* FALLTHROUGH */ case 2: argv++; if (!*argv || *argv[0] == '\0') { if (!silent) (void) fprintf(el->el_errfile, "echotc: Warning: Missing argument.\n"); return (-1); } i = strtol(*argv, &ep, 10); if (*ep != '\0' || i < 0) { if (!silent) (void) fprintf(el->el_errfile, "echotc: Bad value `%s' for cols.\n", *argv); return (-1); } arg_cols = (int) i; argv++; if (!*argv || *argv[0] == '\0') { if (!silent) (void) fprintf(el->el_errfile, "echotc: Warning: Missing argument.\n"); return (-1); } i = strtol(*argv, &ep, 10); if (*ep != '\0' || i < 0) { if (!silent) (void) fprintf(el->el_errfile, "echotc: Bad value `%s' for rows.\n", *argv); return (-1); } arg_rows = (int) i; if (*ep != '\0') { if (!silent) (void) fprintf(el->el_errfile, "echotc: Bad value `%s'.\n", *argv); return (-1); } argv++; if (*argv && *argv[0]) { if (!silent) (void) fprintf(el->el_errfile, "echotc: Warning: Extra argument `%s'.\n", *argv); return (-1); } (void) tputs(tgoto(scap, arg_cols, arg_rows), arg_rows, term__putc); break; } return (0);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -