📄 command.c
字号:
rxvt_scr_index(r, UP); break; /* 8.3.87: NEXT LINE */ case C1_NEL: /* ESC E */ rxvt_scr_add_lines(r, (const unsigned char *)"\n\r", 1, 2); break; /* kidnapped escape sequence: Should be 8.3.48 */ case C1_ESA: /* ESC G */ rxvt_process_graphics(r); break; /* 8.3.63: CHARACTER TABULATION SET */ case C1_HTS: /* ESC H */ rxvt_scr_set_tab(r, 1); break; /* 8.3.105: REVERSE LINE FEED */ case C1_RI: /* ESC M */ rxvt_scr_index(r, DN); break; /* 8.3.142: SINGLE-SHIFT TWO */ /*case C1_SS2: scr_single_shift (2); break; */ /* 8.3.143: SINGLE-SHIFT THREE */ /*case C1_SS3: scr_single_shift (3); break; */ /* 8.3.27: DEVICE CONTROL STRING */ case C1_DCS: /* ESC P */ rxvt_process_dcs_seq(r); break; /* 8.3.110: SINGLE CHARACTER INTRODUCER */ case C1_SCI: /* ESC Z */ rxvt_tt_write(r, (const unsigned char *)ESCZ_ANSWER, (unsigned int)(sizeof(ESCZ_ANSWER) - 1)); break; /* steal obsolete ESC [ c */ /* 8.3.16: CONTROL SEQUENCE INTRODUCER */ case C1_CSI: /* ESC [ */ rxvt_process_csi_seq(r); break; /* 8.3.90: OPERATING SYSTEM COMMAND */ case C1_OSC: /* ESC ] */ rxvt_process_osc_seq(r); break; /* 8.3.106: RESET TO INITIAL STATE */ case 'c': rxvt_scr_poweron(r); rxvt_scrollbar_show(r, 1); break; /* 8.3.79: LOCKING-SHIFT TWO (see ISO2022) */ case 'n': rxvt_scr_charset_choose(r, 2); break; /* 8.3.81: LOCKING-SHIFT THREE (see ISO2022) */ case 'o': rxvt_scr_charset_choose(r, 3); break; }}/*}}} *//*{{{ process CONTROL SEQUENCE INTRODUCER (CSI) sequences `ESC[' *//* *INDENT-OFF* */enum { CSI_ICH = 0x40, CSI_CUU, CSI_CUD, CSI_CUF, CSI_CUB, CSI_CNL, CSI_CPL, CSI_CHA, CSI_CUP, CSI_CHT, CSI_ED , CSI_EL , CSI_IL , CSI_DL , CSI_EF , CSI_EA , CSI_DCH, CSI_SEE, CSI_CPR, CSI_SU , CSI_SD , CSI_NP , CSI_PP , CSI_CTC, CSI_ECH, CSI_CVT, CSI_CBT, CSI_SRS, CSI_PTX, CSI_SDS, CSI_SIMD, CSI_5F, CSI_HPA, CSI_HPR, CSI_REP, CSI_DA , CSI_VPA, CSI_VPR, CSI_HVP, CSI_TBC, CSI_SM , CSI_MC , CSI_HPB, CSI_VPB, CSI_RM , CSI_SGR, CSI_DSR, CSI_DAQ, CSI_70 , CSI_71 , CSI_72 , CSI_73 , CSI_74 , CSI_75 , CSI_76 , CSI_77 , CSI_78 , CSI_79 , CSI_7A , CSI_7B , CSI_7C , CSI_7D , CSI_7E , CSI_7F };#define make_byte(b7,b6,b5,b4,b3,b2,b1,b0) \ (((b7) << 7) | ((b6) << 6) | ((b5) << 5) | ((b4) << 4) \ | ((b3) << 3) | ((b2) << 2) | ((b1) << 1) | (b0))#define get_byte_array_bit(array, bit) \ (!!((array)[(bit) / 8] & (128 >> ((bit) & 7))))const unsigned char csi_defaults[] = { make_byte(1,1,1,1,1,1,1,1), /* @, A, B, C, D, E, F, G, */ make_byte(1,1,0,0,1,1,0,0), /* H, I, J, K, L, M, N, O, */ make_byte(1,0,1,1,1,1,1,0), /* P, Q, R, S, T, U, V, W, */ make_byte(1,1,1,0,0,0,1,0), /* X, Y, Z, [, \, ], ^, _, */ make_byte(1,1,1,0,1,1,1,0), /* `, a, b, c, d, e, f, g, */ make_byte(0,0,1,1,0,0,0,0), /* h, i, j, k, l, m, n, o, */ make_byte(0,0,0,0,0,0,0,0), /* p, q, r, s, t, u, v, w, */ make_byte(0,0,0,0,0,0,0,0) /* x, y, z, {, |, }, ~, */};/* *INDENT-ON* *//* INTPROTO */voidrxvt_process_csi_seq(rxvt_t *r){ unsigned char ch, priv, i; unsigned int nargs, p; int n, ndef; int arg[ESC_ARGS]; for (nargs = ESC_ARGS; nargs > 0;) arg[--nargs] = 0; priv = 0; ch = rxvt_cmd_getc(r); if (ch >= '<' && ch <= '?') { /* '<' '=' '>' '?' */ priv = ch; ch = rxvt_cmd_getc(r); }/* read any numerical arguments */ for (n = -1; ch < CSI_ICH; ) { if (isdigit(ch)) { if (n < 0) n = ch - '0'; else n = n * 10 + ch - '0'; } else if (ch == ';') { if (nargs < ESC_ARGS) arg[nargs++] = n; n = -1; } else if (ch == '\b') { rxvt_scr_backspace(r); } else if (ch == C0_ESC) { rxvt_process_escape_seq(r); return; } else if (ch < ' ') { rxvt_process_nonprinting(r, ch); } ch = rxvt_cmd_getc(r); } if (ch > CSI_7F) return; if (nargs < ESC_ARGS) arg[nargs++] = n; i = ch - CSI_ICH; ndef = get_byte_array_bit(csi_defaults, i); for (p = 0; p < nargs; p++) if (arg[p] == -1) arg[p] = ndef;#ifdef DEBUG_CMD fprintf(stderr, "CSI "); for (p = 0; p < nargs; p++) fprintf(stderr, "%d%s", arg[p], p < nargs - 1 ? ";" : ""); fprintf(stderr, "%c\n", ch);#endif/* * private mode handling */ if (priv) { switch (priv) { case '>': if (ch == CSI_DA) /* secondary device attributes */ rxvt_tt_printf(r, "\033[>%d;%-.8s;0c", 'R', VSTRING); break; case '?': if (ch == 'h' || ch == 'l' || ch == 'r' || ch == 's' || ch == 't') rxvt_process_terminal_mode(r, ch, priv, nargs, arg); break; } return; } switch (ch) {/* * ISO/IEC 6429:1992(E) CSI sequences (defaults in parentheses) */#ifdef PRINTPIPE case CSI_MC: /* 8.3.83: (0) MEDIA COPY */ switch (arg[0]) { case 0: /* initiate transfer to primary aux device */ rxvt_scr_printscreen(r, 0); break; case 5: /* start relay to primary aux device */ rxvt_process_print_pipe(r); break; } break;#endif case CSI_CUU: /* 8.3.22: (1) CURSOR UP */ case CSI_VPR: /* 8.3.161: (1) LINE POSITION FORWARD */ arg[0] = -arg[0]; /* FALLTHROUGH */ case CSI_CUD: /* 8.3.19: (1) CURSOR DOWN */ case CSI_VPB: /* 8.3.160: (1) LINE POSITION BACKWARD */ rxvt_scr_gotorc(r, arg[0], 0, RELATIVE); break; case CSI_CUB: /* 8.3.18: (1) CURSOR LEFT */ case CSI_HPB: /* 8.3.59: (1) CHARACTER POSITION BACKWARD */#ifdef ISO6429 arg[0] = -arg[0];#else /* emulate common DEC VTs */ arg[0] = arg[0] ? -arg[0] : -1;#endif /* FALLTHROUGH */ case CSI_CUF: /* 8.3.20: (1) CURSOR RIGHT */ case CSI_HPR: /* 8.3.60: (1) CHARACTER POSITION FORWARD */#ifdef ISO6429 rxvt_scr_gotorc(r, 0, arg[0], RELATIVE);#else /* emulate common DEC VTs */ rxvt_scr_gotorc(r, 0, arg[0] ? arg[0] : 1, RELATIVE);#endif break; case CSI_CPL: /* 8.3.13: (1) CURSOR PRECEDING LINE */ arg[0] = -arg[0]; /* FALLTHROUGH */ case CSI_CNL: /* 8.3.12: (1) CURSOR NEXT LINE */ rxvt_scr_gotorc(r, arg[0], 0, R_RELATIVE); break; case CSI_CHA: /* 8.3.9: (1) CURSOR CHARACTER ABSOLUTE */ case CSI_HPA: /* 8.3.58: (1) CURSOR POSITION ABSOLUTE */ rxvt_scr_gotorc(r, 0, arg[0] - 1, R_RELATIVE); break; case CSI_VPA: /* 8.3.159: (1) LINE POSITION ABSOLUTE */ rxvt_scr_gotorc(r, arg[0] - 1, 0, C_RELATIVE); break; case CSI_CUP: /* 8.3.21: (1,1) CURSOR POSITION */ case CSI_HVP: /* 8.3.64: (1,1) CHARACTER AND LINE POSITION */ rxvt_scr_gotorc(r, arg[0] - 1, nargs < 2 ? 0 : (arg[1] - 1), 0); break; case CSI_CBT: /* 8.3.7: (1) CURSOR BACKWARD TABULATION */ arg[0] = -arg[0]; /* FALLTHROUGH */ case CSI_CHT: /* 8.3.10: (1) CURSOR FORWARD TABULATION */ rxvt_scr_tab(r, arg[0]); break; case CSI_ED: /* 8.3.40: (0) ERASE IN PAGE */ rxvt_scr_erase_screen(r, arg[0]); break; case CSI_EL: /* 8.3.42: (0) ERASE IN LINE */ rxvt_scr_erase_line(r, arg[0]); break; case CSI_ICH: /* 8.3.65: (1) INSERT CHARACTER */ rxvt_scr_insdel_chars(r, arg[0], INSERT); break; case CSI_IL: /* 8.3.68: (1) INSERT LINE */ rxvt_scr_insdel_lines(r, arg[0], INSERT); break; case CSI_DL: /* 8.3.33: (1) DELETE LINE */ rxvt_scr_insdel_lines(r, arg[0], DELETE); break; case CSI_ECH: /* 8.3.39: (1) ERASE CHARACTER */ rxvt_scr_insdel_chars(r, arg[0], ERASE); break; case CSI_DCH: /* 8.3.26: (1) DELETE CHARACTER */ rxvt_scr_insdel_chars(r, arg[0], DELETE); break; case CSI_SD: /* 8.3.114: (1) SCROLL DOWN */ arg[0] = -arg[0]; /* FALLTHROUGH */ case CSI_SU: /* 8.3.148: (1) SCROLL UP */ rxvt_scroll_text(r, r->screen.tscroll, r->screen.bscroll, arg[0], 0); break; case CSI_DA: /* 8.3.24: (0) DEVICE ATTRIBUTES */ rxvt_tt_write(r, (const unsigned char *)VT100_ANS, (unsigned int)(sizeof(VT100_ANS) - 1)); break; case CSI_SGR: /* 8.3.118: (0) SELECT GRAPHIC RENDITION */ rxvt_process_sgr_mode(r, nargs, arg); break; case CSI_DSR: /* 8.3.36: (0) DEVICE STATUS REPORT */ switch (arg[0]) { case 5: /* DSR requested */ rxvt_tt_printf(r, "\033[0n"); break; case 6: /* CPR requested */ rxvt_scr_report_position(r); break;#if defined (ENABLE_DISPLAY_ANSWER) case 7: /* unofficial extension */ rxvt_tt_printf(r, "%-.250s\n", r->h->rs[Rs_display_name]); break;#endif case 8: /* unofficial extension */ rxvt_xterm_seq(r, XTerm_title, APL_NAME "-" VERSION, CHAR_ST); break; } break; case CSI_TBC: /* 8.3.155: (0) TABULATION CLEAR */ switch (arg[0]) { case 0: /* char tab stop cleared at active position */ rxvt_scr_set_tab(r, 0); break; /* case 1: */ /* line tab stop cleared in active line */ /* case 2: */ /* char tab stops cleared in active line */ case 3: /* all char tab stops are cleared */ /* case 4: */ /* all line tab stops are cleared */ case 5: /* all tab stops are cleared */ rxvt_scr_set_tab(r, -1); break; } break; case CSI_CTC: /* 8.3.17: (0) CURSOR TABULATION CONTROL */ switch (arg[0]) { case 0: /* char tab stop set at active position */ rxvt_scr_set_tab(r, 1); break; /* = ESC H */ /* case 1: */ /* line tab stop set at active line */ case 2: /* char tab stop cleared at active position */ rxvt_scr_set_tab(r, 0); break; /* = ESC [ 0 g */ /* case 3: */ /* line tab stop cleared at active line */ /* case 4: */ /* char tab stops cleared at active line */ case 5: /* all char tab stops are cleared */ rxvt_scr_set_tab(r, -1); break; /* = ESC [ 3 g */ /* case 6: */ /* all line tab stops are cleared */ } break; case CSI_RM: /* 8.3.107: RESET MODE */ if (arg[0] == 4) rxvt_scr_insert_mode(r, 0); break; case CSI_SM: /* 8.3.126: SET MODE */ if (arg[0] == 4) rxvt_scr_insert_mode(r, 1); break;/* * PRIVATE USE beyond this point. All CSI_7? seqeunces here */ case CSI_72: /* DECSTBM: set top and bottom margins */ if (nargs == 1) rxvt_scr_scroll_region(r, arg[0] - 1, MAX_ROWS - 1); else if (nargs == 0 || arg[0] >= arg[1]) rxvt_scr_scroll_region(r, 0, MAX_ROWS - 1); else rxvt_scr_scroll_region(r, arg[0] - 1, arg[1] - 1); break; case CSI_73: rxvt_scr_cursor(r, SAVE); break; case CSI_75: rxvt_scr_cursor(r, RESTORE); break;#ifndef NO_FRILLS case CSI_74: rxvt_process_window_ops(r, arg, nargs); break;#endif case CSI_78: /* DECREQTPARM */ if (arg[0] == 0 || arg[0] == 1) rxvt_tt_printf(r, "\033[%d;1;1;112;112;1;0x", arg[0] + 2); /* FALLTHROUGH */ default: break; }}/*}}} */#ifndef NO_FRILLS/* ARGSUSED *//* INTPROTO */voidrxvt_process_window_ops(rxvt_t *r, const int *args, unsigned int nargs){ int x, y; char *s; XWindowAttributes wattr; Window wdummy; if (nargs == 0) return; switch (args[0]) { /* * commands */ case 1: /* deiconify window */ XMapWindow(r->Xdisplay, r->TermWin.parent[0]); break; case 2: /* iconify window */ XIconifyWindow(r->Xdisplay, r->TermWin.parent[0], DefaultScreen(r->Xdisplay)); break; case 3: /* set position (pixels) */ XMoveWindow(r->Xdisplay, r->TermWin.parent[0], args[1], args[2]); break; case 4: /* set size (pixels) */ rxvt_set_widthheight(r, (unsigned int)args[2], (unsigned int)args[1]); break; case 5: /* raise window */ XRaiseWindow(r->Xdisplay, r->TermWin.parent[0]); break; case 6: /* lower window */ XLowerWindow(r->Xdisplay, r->TermWin.parent[0]); break; case 7: /* refresh window */ rxvt_scr_touch(r, True); break; case 8: /* set size (chars) */ rxvt_set_widthheight(r, (unsigned int)(args[2] * r->TermWin.fwidth), (unsigned int)(args[1] * r->TermWin.fheight)); break; default: if (args[0] >= 24) /* set height (chars) */ rxvt_set_widthheight(r, (unsigned int)r->TermWin.width, (unsigned int)(args[1] * r->TermWin.fheight)); break; /* * reports - some output format copied from XTerm */ case 11: /* report window state */ XGetWindowAttributes(r->Xdisplay, r->TermWin.parent[0], &wattr); rxvt_tt_printf(r, "\033[%dt", wattr.map_state == IsViewable ? 1 : 2); break; case 13: /* report window position */ XGetWindowAttributes(r->Xdisplay, r->TermWin.parent[0], &wattr); XTranslateCoordinates(r->Xdisplay, r->TermWin.parent[0], wattr.root, -wattr.border_width, -wattr.border_width, &x, &y, &wdummy); rxvt_tt_printf(r, "\033[3;%d;%dt", x, y); break; case 14: /* report window size (pixels) */ XGetWindowAttributes(r->Xdisplay, r->TermWin.parent[0], &wattr); rxvt_tt_printf(r, "\033[4;%d;%dt", wattr.height, wattr.width); break; case 18: /* report window size (chars) */ rxvt_tt_printf(r, "\033[8;%d;%dt", r->TermWin.nrow, r->TermWin.ncol); break;#if 0 /* XXX: currently disabled due to security concerns */ case 20: /* report icon label */ XGetIconName(r->Xdisplay, r->TermWin.parent[0], &s); rxvt_tt_printf(r, "\033]L%-.200s\234", s ? s : ""); /* 8bit ST */ break; case 21: /* report window title */ XFetchName(r->Xdisplay, r->TermWin.parent[0], &s); rxvt_tt_printf(r, "\033]l%-.200s\234", s ? s : ""); /* 8bit ST */ break;#endif }}#endif/*----------------------------------------------------------------------*//* * get input up until STRING TERMINATOR (or BEL) * ends_how is terminator used. returned input must be free()d *//* INTPROTO */unsigned char *rxvt_get_to_st(rxvt_t *r, unsigned char *ends_how){ int seen_esc = 0; /* se
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -