📄 search.c
字号:
} break; } while (el->el_line.lastchar > el->el_line.buffer && *el->el_line.lastchar != '\n') *el->el_line.lastchar-- = '\0'; *el->el_line.lastchar = '\0'; if (!done) { /* Can't search if unmatched '[' */ for (cp = &el->el_search.patbuf[el->el_search.patlen-1], ch = ']'; cp > el->el_search.patbuf; cp--) if (*cp == '[' || *cp == ']') { ch = *cp; break; } if (el->el_search.patlen > 1 && ch != '[') { if (redo && newdir == dir) { if (pchar == '?') { /* wrap around */ el->el_history.eventno = newdir == ED_SEARCH_PREV_HISTORY ? 0 : 0x7fffffff; if (hist_get(el) == CC_ERROR) /* el->el_history.event * no was fixed by * first call */ (void) hist_get(el); el->el_line.cursor = newdir == ED_SEARCH_PREV_HISTORY ? el->el_line.lastchar : el->el_line.buffer; } else el->el_line.cursor += newdir == ED_SEARCH_PREV_HISTORY ? -1 : 1; }#ifdef ANCHOR el->el_search.patbuf[el->el_search.patlen++] = '.'; el->el_search.patbuf[el->el_search.patlen++] = '*';#endif el->el_search.patbuf[el->el_search.patlen] = '\0'; if (el->el_line.cursor < el->el_line.buffer || el->el_line.cursor > el->el_line.lastchar || (ret = ce_search_line(el, &el->el_search.patbuf[1], newdir)) == CC_ERROR) { /* avoid c_setpat */ el->el_state.lastcmd = (el_action_t) newdir; ret = newdir == ED_SEARCH_PREV_HISTORY ? ed_search_prev_history(el, 0) : ed_search_next_history(el, 0); if (ret != CC_ERROR) { el->el_line.cursor = newdir == ED_SEARCH_PREV_HISTORY ? el->el_line.lastchar : el->el_line.buffer; (void) ce_search_line(el, &el->el_search.patbuf[1], newdir); } } el->el_search.patbuf[--el->el_search.patlen] = '\0'; if (ret == CC_ERROR) { term_beep(el); if (el->el_history.eventno != ohisteventno) { el->el_history.eventno = ohisteventno; if (hist_get(el) == CC_ERROR) return (CC_ERROR); } el->el_line.cursor = ocursor; pchar = '?'; } else { pchar = ':'; } } ret = ce_inc_search(el, newdir); if (ret == CC_ERROR && pchar == '?' && oldpchar == ':') /* * break abort of failed search at last * non-failed */ ret = CC_NORM; } if (ret == CC_NORM || (ret == CC_ERROR && oldpatlen == 0)) { /* restore on normal return or error exit */ pchar = oldpchar; el->el_search.patlen = oldpatlen; if (el->el_history.eventno != ohisteventno) { el->el_history.eventno = ohisteventno; if (hist_get(el) == CC_ERROR) return (CC_ERROR); } el->el_line.cursor = ocursor; if (ret == CC_ERROR) re_refresh(el); } if (done || ret != CC_NORM) return (ret); }}/* cv_search(): * Vi search. */protected el_action_tcv_search(EditLine *el, int dir){ char ch; char tmpbuf[EL_BUFSIZ]; int tmplen; tmplen = 0;#ifdef ANCHOR tmpbuf[tmplen++] = '.'; tmpbuf[tmplen++] = '*';#endif el->el_line.buffer[0] = '\0'; el->el_line.lastchar = el->el_line.buffer; el->el_line.cursor = el->el_line.buffer; el->el_search.patdir = dir; c_insert(el, 2); /* prompt + '\n' */ *el->el_line.cursor++ = '\n'; *el->el_line.cursor++ = dir == ED_SEARCH_PREV_HISTORY ? '/' : '?'; re_refresh(el);#ifdef ANCHOR#define LEN 2#else#define LEN 0#endif tmplen = c_gets(el, &tmpbuf[LEN]) + LEN; ch = tmpbuf[tmplen]; tmpbuf[tmplen] = '\0'; if (tmplen == LEN) { /* * Use the old pattern, but wild-card it. */ if (el->el_search.patlen == 0) { el->el_line.buffer[0] = '\0'; el->el_line.lastchar = el->el_line.buffer; el->el_line.cursor = el->el_line.buffer; re_refresh(el); return (CC_ERROR); }#ifdef ANCHOR if (el->el_search.patbuf[0] != '.' && el->el_search.patbuf[0] != '*') { (void) strncpy(tmpbuf, el->el_search.patbuf, sizeof(tmpbuf) - 1); el->el_search.patbuf[0] = '.'; el->el_search.patbuf[1] = '*'; (void) strncpy(&el->el_search.patbuf[2], tmpbuf, EL_BUFSIZ - 3); el->el_search.patlen++; el->el_search.patbuf[el->el_search.patlen++] = '.'; el->el_search.patbuf[el->el_search.patlen++] = '*'; el->el_search.patbuf[el->el_search.patlen] = '\0'; }#endif } else {#ifdef ANCHOR tmpbuf[tmplen++] = '.'; tmpbuf[tmplen++] = '*';#endif tmpbuf[tmplen] = '\0'; (void) strncpy(el->el_search.patbuf, tmpbuf, EL_BUFSIZ - 1); el->el_search.patlen = tmplen; } el->el_state.lastcmd = (el_action_t) dir; /* avoid c_setpat */ el->el_line.cursor = el->el_line.lastchar = el->el_line.buffer; if ((dir == ED_SEARCH_PREV_HISTORY ? ed_search_prev_history(el, 0) : ed_search_next_history(el, 0)) == CC_ERROR) { re_refresh(el); return (CC_ERROR); } else { if (ch == 0033) { re_refresh(el); *el->el_line.lastchar++ = '\n'; *el->el_line.lastchar = '\0'; re_goto_bottom(el); return (CC_NEWLINE); } else return (CC_REFRESH); }}/* ce_search_line(): * Look for a pattern inside a line */protected el_action_tce_search_line(EditLine *el, char *pattern, int dir){ char *cp; if (dir == ED_SEARCH_PREV_HISTORY) { for (cp = el->el_line.cursor; cp >= el->el_line.buffer; cp--) if (el_match(cp, pattern)) { el->el_line.cursor = cp; return (CC_NORM); } return (CC_ERROR); } else { for (cp = el->el_line.cursor; *cp != '\0' && cp < el->el_line.limit; cp++) if (el_match(cp, pattern)) { el->el_line.cursor = cp; return (CC_NORM); } return (CC_ERROR); }}/* cv_repeat_srch(): * Vi repeat search */protected el_action_tcv_repeat_srch(EditLine *el, int c){#ifdef SDEBUG (void) fprintf(el->el_errfile, "dir %d patlen %d patbuf %s\n", c, el->el_search.patlen, el->el_search.patbuf);#endif el->el_state.lastcmd = (el_action_t) c; /* Hack to stop c_setpat */ el->el_line.lastchar = el->el_line.buffer; switch (c) { case ED_SEARCH_NEXT_HISTORY: return (ed_search_next_history(el, 0)); case ED_SEARCH_PREV_HISTORY: return (ed_search_prev_history(el, 0)); default: return (CC_ERROR); }}/* cv_csearch_back(): * Vi character search reverse */protected el_action_tcv_csearch_back(EditLine *el, int ch, int count, int tflag){ char *cp; cp = el->el_line.cursor; while (count--) { if (*cp == ch) cp--; while (cp > el->el_line.buffer && *cp != ch) cp--; } if (cp < el->el_line.buffer || (cp == el->el_line.buffer && *cp != ch)) return (CC_ERROR); if (*cp == ch && tflag) cp++; el->el_line.cursor = cp; if (el->el_chared.c_vcmd.action & DELETE) { el->el_line.cursor++; cv_delfini(el); return (CC_REFRESH); } re_refresh_cursor(el); return (CC_NORM);}/* cv_csearch_fwd(): * Vi character search forward */protected el_action_tcv_csearch_fwd(EditLine *el, int ch, int count, int tflag){ char *cp; cp = el->el_line.cursor; while (count--) { if (*cp == ch) cp++; while (cp < el->el_line.lastchar && *cp != ch) cp++; } if (cp >= el->el_line.lastchar) return (CC_ERROR); if (*cp == ch && tflag) cp--; el->el_line.cursor = cp; if (el->el_chared.c_vcmd.action & DELETE) { el->el_line.cursor++; cv_delfini(el); return (CC_REFRESH); } re_refresh_cursor(el); return (CC_NORM);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -