📄 chared.c
字号:
el->el_chared.c_undo.ptr = el->el_line.cursor; el->el_chared.c_undo.dsize = size;}#ifdef notdef/* ce__endword(): * Go to the end of this word according to emacs */protected char *ce__endword(char *p, char *high, int n){ p++; while (n--) { while ((p < high) && isspace((unsigned char) *p)) p++; while ((p < high) && !isspace((unsigned char) *p)) p++; } p--; return (p);}#endif/* cv__endword(): * Go to the end of this word according to vi */protected char *cv__endword(char *p, char *high, int n){ p++; while (n--) { while ((p < high) && isspace((unsigned char) *p)) p++; if (isalnum((unsigned char) *p)) while ((p < high) && isalnum((unsigned char) *p)) p++; else while ((p < high) && !(isspace((unsigned char) *p) || isalnum((unsigned char) *p))) p++; } p--; return (p);}/* ch_init(): * Initialize the character editor */protected intch_init(EditLine *el){ el->el_line.buffer = (char *) el_malloc(EL_BUFSIZ); if (el->el_line.buffer == NULL) return (-1); (void) memset(el->el_line.buffer, 0, EL_BUFSIZ); el->el_line.cursor = el->el_line.buffer; el->el_line.lastchar = el->el_line.buffer; el->el_line.limit = &el->el_line.buffer[EL_BUFSIZ - 2]; el->el_chared.c_undo.buf = (char *) el_malloc(EL_BUFSIZ); if (el->el_chared.c_undo.buf == NULL) return (-1); (void) memset(el->el_chared.c_undo.buf, 0, EL_BUFSIZ); el->el_chared.c_undo.action = NOP; el->el_chared.c_undo.isize = 0; el->el_chared.c_undo.dsize = 0; el->el_chared.c_undo.ptr = el->el_line.buffer; el->el_chared.c_vcmd.action = NOP; el->el_chared.c_vcmd.pos = el->el_line.buffer; el->el_chared.c_vcmd.ins = el->el_line.buffer; el->el_chared.c_kill.buf = (char *) el_malloc(EL_BUFSIZ); if (el->el_chared.c_kill.buf == NULL) return (-1); (void) memset(el->el_chared.c_kill.buf, 0, EL_BUFSIZ); el->el_chared.c_kill.mark = el->el_line.buffer; el->el_chared.c_kill.last = el->el_chared.c_kill.buf; el->el_map.current = el->el_map.key; el->el_state.inputmode = MODE_INSERT; /* XXX: save a default */ el->el_state.doingarg = 0; el->el_state.metanext = 0; el->el_state.argument = 1; el->el_state.lastcmd = ED_UNASSIGNED; el->el_chared.c_macro.nline = NULL; el->el_chared.c_macro.level = -1; el->el_chared.c_macro.macro = (char **) el_malloc(EL_MAXMACRO * sizeof(char *)); if (el->el_chared.c_macro.macro == NULL) return (-1); return (0);}/* ch_reset(): * Reset the character editor */protected voidch_reset(EditLine *el){ el->el_line.cursor = el->el_line.buffer; el->el_line.lastchar = el->el_line.buffer; el->el_chared.c_undo.action = NOP; el->el_chared.c_undo.isize = 0; el->el_chared.c_undo.dsize = 0; el->el_chared.c_undo.ptr = el->el_line.buffer; el->el_chared.c_vcmd.action = NOP; el->el_chared.c_vcmd.pos = el->el_line.buffer; el->el_chared.c_vcmd.ins = el->el_line.buffer; el->el_chared.c_kill.mark = el->el_line.buffer; el->el_map.current = el->el_map.key; el->el_state.inputmode = MODE_INSERT; /* XXX: save a default */ el->el_state.doingarg = 0; el->el_state.metanext = 0; el->el_state.argument = 1; el->el_state.lastcmd = ED_UNASSIGNED; el->el_chared.c_macro.level = -1; el->el_history.eventno = 0;}/* ch_enlargebufs(): * Enlarge line buffer to be able to hold twice as much characters. * Returns 1 if successful, 0 if not. */protected intch_enlargebufs(el, addlen) EditLine *el; size_t addlen;{ size_t sz, newsz; char *newbuffer, *oldbuf, *oldkbuf; sz = el->el_line.limit - el->el_line.buffer + EL_LEAVE; newsz = sz * 2; /* * If newly required length is longer than current buffer, we need * to make the buffer big enough to hold both old and new stuff. */ if (addlen > sz) { while(newsz - sz < addlen) newsz *= 2; } /* * Reallocate line buffer. */ newbuffer = el_realloc(el->el_line.buffer, newsz); if (!newbuffer) return 0; /* zero the newly added memory, leave old data in */ (void) memset(&newbuffer[sz], 0, newsz - sz); oldbuf = el->el_line.buffer; el->el_line.buffer = newbuffer; el->el_line.cursor = newbuffer + (el->el_line.cursor - oldbuf); el->el_line.lastchar = newbuffer + (el->el_line.lastchar - oldbuf); el->el_line.limit = &newbuffer[newsz - EL_LEAVE]; /* * Reallocate kill buffer. */ newbuffer = el_realloc(el->el_chared.c_kill.buf, newsz); if (!newbuffer) return 0; /* zero the newly added memory, leave old data in */ (void) memset(&newbuffer[sz], 0, newsz - sz); oldkbuf = el->el_chared.c_kill.buf; el->el_chared.c_kill.buf = newbuffer; el->el_chared.c_kill.last = newbuffer + (el->el_chared.c_kill.last - oldkbuf); el->el_chared.c_kill.mark = el->el_line.buffer + (el->el_chared.c_kill.mark - oldbuf); /* * Reallocate undo buffer. */ newbuffer = el_realloc(el->el_chared.c_undo.buf, newsz); if (!newbuffer) return 0; /* zero the newly added memory, leave old data in */ (void) memset(&newbuffer[sz], 0, newsz - sz); el->el_chared.c_undo.ptr = el->el_line.buffer + (el->el_chared.c_undo.ptr - oldbuf); el->el_chared.c_undo.buf = newbuffer; if (!hist_enlargebuf(el, sz, newsz)) return 0; return 1;}/* ch_end(): * Free the data structures used by the editor */protected voidch_end(EditLine *el){ el_free((ptr_t) el->el_line.buffer); el->el_line.buffer = NULL; el->el_line.limit = NULL; el_free((ptr_t) el->el_chared.c_undo.buf); el->el_chared.c_undo.buf = NULL; el_free((ptr_t) el->el_chared.c_kill.buf); el->el_chared.c_kill.buf = NULL; el_free((ptr_t) el->el_chared.c_macro.macro); el->el_chared.c_macro.macro = NULL; ch_reset(el);}/* el_insertstr(): * Insert string at cursorI */public intel_insertstr(EditLine *el, const char *s){ size_t len; if ((len = strlen(s)) == 0) return (-1); if (el->el_line.lastchar + len >= el->el_line.limit) { if (!ch_enlargebufs(el, len)) return (-1); } c_insert(el, (int)len); while (*s) *el->el_line.cursor++ = *s++; return (0);}/* el_deletestr(): * Delete num characters before the cursor */public voidel_deletestr(EditLine *el, int n){ if (n <= 0) return; if (el->el_line.cursor < &el->el_line.buffer[n]) return; c_delbefore(el, n); /* delete before dot */ el->el_line.cursor -= n; if (el->el_line.cursor < el->el_line.buffer) el->el_line.cursor = el->el_line.buffer;}/* c_gets(): * Get a string */protected intc_gets(EditLine *el, char *buf){ char ch; int len = 0; for (ch = 0; ch == 0;) { if (el_getc(el, &ch) != 1) return (ed_end_of_file(el, 0)); switch (ch) { case 0010: /* Delete and backspace */ case 0177: if (len > 1) { *el->el_line.cursor-- = '\0'; el->el_line.lastchar = el->el_line.cursor; buf[len--] = '\0'; } else { el->el_line.buffer[0] = '\0'; el->el_line.lastchar = el->el_line.buffer; el->el_line.cursor = el->el_line.buffer; return (CC_REFRESH); } re_refresh(el); ch = 0; break; case 0033: /* ESC */ case '\r': /* Newline */ case '\n': break; default: if (len >= EL_BUFSIZ) term_beep(el); else { buf[len++] = ch; *el->el_line.cursor++ = ch; el->el_line.lastchar = el->el_line.cursor; } re_refresh(el); ch = 0; break; } } buf[len] = ch; return (len);}/* c_hpos(): * Return the current horizontal position of the cursor */protected intc_hpos(EditLine *el){ char *ptr; /* * Find how many characters till the beginning of this line. */ if (el->el_line.cursor == el->el_line.buffer) return (0); else { for (ptr = el->el_line.cursor - 1; ptr >= el->el_line.buffer && *ptr != '\n'; ptr--) continue; return (el->el_line.cursor - ptr - 1); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -