📄 slrline.c
字号:
len += dlen; /* ok since dlen comes out 0 */ if (len > rli->edit_width) dlen = len - rli->edit_width; while (dlen--) *p++ = ' '; dlen = 0; } else { if (dlen == 3) { chb &= 0x7F; *p++ = '~'; } *p++ = '^'; if (chb == 127) *p++ = '?'; else *p++ = chb + '@'; } } len += dlen; } /* if (start_len > prompt_len) break; */ tw = rli->tab; b = (unsigned char *) rli->buf; } rli->new_upd_len = (int) (p - rli->new_upd); while (p < rli->new_upd + rli->edit_width) *p++ = ' '; really_update (rli, want_cursor_pos);}void SLrline_redraw (SLang_RLine_Info_Type *rli){ unsigned char *p = rli->new_upd; unsigned char *pmax = p + rli->edit_width; while (p < pmax) *p++ = ' '; rli->new_upd_len = rli->edit_width; really_update (rli, 0); RLupdate (rli);}static int rl_eof_insert (void){ if (This_RLI->len == 0) { SLang_Last_Key_Char = SLang_RL_EOF_Char; /* rl_self_insert (); */ return rl_enter (); } return 0;}/* This is very naive. It knows very little about nesting and nothing * about quoting. */static void blink_match (SLang_RLine_Info_Type *rli){ unsigned char bra, ket; unsigned int delta_column; unsigned char *p, *pmin; int dq_level, sq_level; int level; pmin = rli->buf; p = pmin + rli->point; if (pmin == p) return; ket = SLang_Last_Key_Char; switch (ket) { case ')': bra = '('; break; case ']': bra = '['; break; case '}': bra = '{'; break; default: return; } level = 0; sq_level = dq_level = 0; delta_column = 0; while (p > pmin) { char ch; p--; delta_column++; ch = *p; if (ch == ket) { if ((dq_level == 0) && (sq_level == 0)) level++; } else if (ch == bra) { if ((dq_level != 0) || (sq_level != 0)) continue; level--; if (level == 0) { rli->point -= delta_column; RLupdate (rli); (*rli->input_pending)(10); rli->point += delta_column; RLupdate (rli); break; } if (level < 0) break; } else if (ch == '"') dq_level = !dq_level; else if (ch == '\'') sq_level = !sq_level; }}int SLang_read_line (SLang_RLine_Info_Type *rli){ unsigned char *p, *pmax; SLang_Key_Type *key; SLang_Rline_Quit = 0; This_RLI = rli; p = rli->old_upd; pmax = p + rli->edit_width; while (p < pmax) *p++ = ' '; /* Sanity checking */ rli->len = strlen ((char *) rli->buf); if (rli->len >= rli->buf_len) { rli->len = 0; *rli->buf = 0; } if (rli->point > rli->len) rli->point = rli->len; if (rli->point < 0) rli->point = 0; rli->curs_pos = rli->start_column = 0; rli->new_upd_len = rli->old_upd_len = 0; This_RLI->last_fun = NULL; if (rli->update_hook == NULL) putc ('\r', stdout); RLupdate (rli); while (1) { key = SLang_do_key (RL_Keymap, (int (*)(void)) rli->getkey); if ((key == NULL) || (key->f.f == NULL)) rl_beep (); else { if ((SLang_Last_Key_Char == SLang_RL_EOF_Char) && (*key->str == 2) && (This_RLI->len == 0)) rl_eof_insert (); else if (key->type == SLKEY_F_INTRINSIC) { if ((key->f.f)()) RLupdate (rli); if ((rli->flags & SL_RLINE_BLINK_MATCH) && (rli->input_pending != NULL)) blink_match (rli); } if (SLang_Rline_Quit) { This_RLI->buf[This_RLI->len] = 0; if (SLang_Error == SL_USER_BREAK) { SLang_Error = 0; return -1; } return This_RLI->len; } } if (key != NULL) This_RLI->last_fun = key->f.f; }}static int rl_abort (void){ rl_delete_line (); return rl_enter ();}/* TTY interface --- ANSI */static void ansi_goto_column (int n){ putc('\r', stdout); if (n) fprintf(stdout, "\033[%dC", n);}static void rl_select_line (SLang_Read_Line_Type *p){ This_RLI->last = p; strcpy ((char *) This_RLI->buf, (char *) p->buf); This_RLI->point = This_RLI->len = strlen((char *) p->buf);}static int rl_next_line (void);static int rl_prev_line (void){ SLang_Read_Line_Type *prev; if (((This_RLI->last_fun != (FVOID_STAR) rl_prev_line) && (This_RLI->last_fun != (FVOID_STAR) rl_next_line)) || (This_RLI->last == NULL)) { prev = This_RLI->tail; } else prev = This_RLI->last->prev; if (prev == NULL) { rl_beep (); return 0; } rl_select_line (prev); return 1;}static int rl_redraw (void){ SLrline_redraw (This_RLI); return 1;}static int rl_next_line (void){ SLang_Read_Line_Type *next; if (((This_RLI->last_fun != (FVOID_STAR) rl_prev_line) && (This_RLI->last_fun != (FVOID_STAR) rl_next_line)) || (This_RLI->last == NULL)) { rl_beep (); return 0; } next = This_RLI->last->next; if (next == NULL) { This_RLI->len = This_RLI->point = 0; *This_RLI->buf = 0; This_RLI->last = NULL; } else rl_select_line (next); return 1;}static SLKeymap_Function_Type SLReadLine_Functions[] ={ {"up", rl_prev_line}, {"down", rl_next_line}, {"bol", rl_bol}, {"eol", rl_eol}, {"right", rl_right}, {"left", rl_left}, {"self_insert", rl_self_insert}, {"bdel", rl_bdel}, {"del", rl_del}, {"deleol", rl_deleol}, {"enter", rl_enter}, {"trim", rl_trim}, {"quoted_insert", rl_quote_insert}, {(char *) NULL, NULL}};int SLang_init_readline (SLang_RLine_Info_Type *rli){ int ch; char simple[2]; if (RL_Keymap == NULL) { simple[1] = 0; if (NULL == (RL_Keymap = SLang_create_keymap ("ReadLine", NULL))) return -1; RL_Keymap->functions = SLReadLine_Functions; /* This breaks under some DEC ALPHA compilers (scary!) */#ifndef __DECC for (ch = ' '; ch < 256; ch++) { simple[0] = (char) ch; SLkm_define_key (simple, (FVOID_STAR) rl_self_insert, RL_Keymap); }#else ch = ' '; while (1) { simple[0] = (char) ch; SLkm_define_key (simple, (FVOID_STAR) rl_self_insert, RL_Keymap); ch = ch + 1; if (ch == 256) break; }#endif /* NOT __DECC */ simple[0] = SLang_Abort_Char; SLkm_define_key (simple, (FVOID_STAR) rl_abort, RL_Keymap); simple[0] = SLang_RL_EOF_Char; SLkm_define_key (simple, (FVOID_STAR) rl_eof_insert, RL_Keymap);#ifndef IBMPC_SYSTEM SLkm_define_key ("^[[A", (FVOID_STAR) rl_prev_line, RL_Keymap); SLkm_define_key ("^[[B", (FVOID_STAR) rl_next_line, RL_Keymap); SLkm_define_key ("^[[C", (FVOID_STAR) rl_right, RL_Keymap); SLkm_define_key ("^[[D", (FVOID_STAR) rl_left, RL_Keymap); SLkm_define_key ("^[OA", (FVOID_STAR) rl_prev_line, RL_Keymap); SLkm_define_key ("^[OB", (FVOID_STAR) rl_next_line, RL_Keymap); SLkm_define_key ("^[OC", (FVOID_STAR) rl_right, RL_Keymap); SLkm_define_key ("^[OD", (FVOID_STAR) rl_left, RL_Keymap);#else SLkm_define_key ("^@H", (FVOID_STAR) rl_prev_line, RL_Keymap); SLkm_define_key ("^@P", (FVOID_STAR) rl_next_line, RL_Keymap); SLkm_define_key ("^@M", (FVOID_STAR) rl_right, RL_Keymap); SLkm_define_key ("^@K", (FVOID_STAR) rl_left, RL_Keymap); SLkm_define_key ("^@S", (FVOID_STAR) rl_del, RL_Keymap); SLkm_define_key ("^@O", (FVOID_STAR) rl_eol, RL_Keymap); SLkm_define_key ("^@G", (FVOID_STAR) rl_bol, RL_Keymap); SLkm_define_key ("\xE0H", (FVOID_STAR) rl_prev_line, RL_Keymap); SLkm_define_key ("\xE0P", (FVOID_STAR) rl_next_line, RL_Keymap); SLkm_define_key ("\xE0M", (FVOID_STAR) rl_right, RL_Keymap); SLkm_define_key ("\xE0K", (FVOID_STAR) rl_left, RL_Keymap); SLkm_define_key ("\xE0S", (FVOID_STAR) rl_del, RL_Keymap); SLkm_define_key ("\xE0O", (FVOID_STAR) rl_eol, RL_Keymap); SLkm_define_key ("\xE0G", (FVOID_STAR) rl_bol, RL_Keymap);#endif SLkm_define_key ("^C", (FVOID_STAR) rl_abort, RL_Keymap); SLkm_define_key ("^E", (FVOID_STAR) rl_eol, RL_Keymap); SLkm_define_key ("^G", (FVOID_STAR) rl_abort, RL_Keymap); SLkm_define_key ("^I", (FVOID_STAR) rl_self_insert, RL_Keymap); SLkm_define_key ("^A", (FVOID_STAR) rl_bol, RL_Keymap); SLkm_define_key ("\r", (FVOID_STAR) rl_enter, RL_Keymap); SLkm_define_key ("\n", (FVOID_STAR) rl_enter, RL_Keymap); SLkm_define_key ("^K", (FVOID_STAR) rl_deleol, RL_Keymap); SLkm_define_key ("^L", (FVOID_STAR) rl_deleol, RL_Keymap); SLkm_define_key ("^V", (FVOID_STAR) rl_del, RL_Keymap); SLkm_define_key ("^D", (FVOID_STAR) rl_del, RL_Keymap); SLkm_define_key ("^F", (FVOID_STAR) rl_right, RL_Keymap); SLkm_define_key ("^B", (FVOID_STAR) rl_left, RL_Keymap); SLkm_define_key ("^?", (FVOID_STAR) rl_bdel, RL_Keymap); SLkm_define_key ("^H", (FVOID_STAR) rl_bdel, RL_Keymap); SLkm_define_key ("^P", (FVOID_STAR) rl_prev_line, RL_Keymap); SLkm_define_key ("^N", (FVOID_STAR) rl_next_line, RL_Keymap); SLkm_define_key ("^R", (FVOID_STAR) rl_redraw, RL_Keymap); SLkm_define_key ("`", (FVOID_STAR) rl_quote_insert, RL_Keymap); SLkm_define_key ("\033\\", (FVOID_STAR) rl_trim, RL_Keymap); if (SLang_Error) return -1; } if (rli->prompt == NULL) rli->prompt = ""; if (rli->keymap == NULL) rli->keymap = RL_Keymap; rli->old_upd = rli->upd_buf1; rli->new_upd = rli->upd_buf2; *rli->buf = 0; rli->point = 0; if (rli->flags & SL_RLINE_USE_ANSI) { if (rli->tt_goto_column == NULL) rli->tt_goto_column = ansi_goto_column; } if (Char_Widths[0] == 2) return 0; for (ch = 0; ch < 32; ch++) Char_Widths[ch] = 2; for (ch = 32; ch < 256; ch++) Char_Widths[ch] = 1; Char_Widths[127] = 2;#ifndef IBMPC_SYSTEM for (ch = 128; ch < 160; ch++) Char_Widths[ch] = 3;#endif return 0;}SLang_Read_Line_Type *SLang_rline_save_line (SLang_RLine_Info_Type *rli){ SLang_Read_Line_Type *rl; unsigned char *buf; if ((rli == NULL) || (rli->buf == NULL)) return NULL; if (NULL == (rl = (SLang_Read_Line_Type *) SLmalloc (sizeof (SLang_Read_Line_Type))) || (NULL == (buf = (unsigned char *) SLmake_string ((char *)rli->buf)))) { SLfree ((char *)rl); return NULL; } rl->buf = buf; rl->buf_len = strlen ((char *)buf); rl->num = rl->misc = 0; rl->next = rl->prev = NULL; if (rli->tail != NULL) { rli->tail->next = rl; rl->prev = rli->tail; } rli->tail = rl; return rl;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -