⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 search.c

📁 早期freebsd实现
💻 C
📖 第 1 页 / 共 2 页
字号:
	*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.eventno 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(el, dir)    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) strcpy(tmpbuf, el->el_search.patbuf);	    el->el_search.patbuf[0] = '.';	    el->el_search.patbuf[1] = '*';	    (void) strcpy(&el->el_search.patbuf[2], tmpbuf);	    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) strcpy(el->el_search.patbuf, tmpbuf);	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(el, pattern, dir)    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(el, c)    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(el, ch, count, tflag)    EditLine *el;    int ch, count, 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(el, ch, count, tflag)    EditLine *el;    int ch, count, 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 + -