diff options
Diffstat (limited to '')
| -rw-r--r-- | ChangeLog | 33 | ||||
| -rw-r--r-- | NEWS | 1 | ||||
| -rw-r--r-- | doc-jp/README.func | 2 | ||||
| -rw-r--r-- | doc/README.func | 2 | ||||
| -rw-r--r-- | doc/keymap.default | 4 | ||||
| -rw-r--r-- | fm.h | 16 | ||||
| -rw-r--r-- | funcname.tab | 4 | ||||
| -rw-r--r-- | keybind.c | 4 | ||||
| -rw-r--r-- | linein.c | 25 | ||||
| -rw-r--r-- | main.c | 106 | ||||
| -rw-r--r-- | proto.h | 9 | 
11 files changed, 190 insertions, 16 deletions
| @@ -1,3 +1,34 @@ +2001-12-25  Fumitoshi UKAI  <ukai@debian.or.jp> + +	* [w3m-dev 02726] incremental search +	* NEWS: incremental search +	* fm.h (inputLineHist) define by inputLineHistSearch +	* fm.h (COPY_BUFPOTISION): added +	* fm.h (SAVE_BUFPOSITION): ditto +	* fm.h (RESTORE_BUFPOSITION): ditto +	* funcname.tab (ISEARCH): added +	* funcname.tab (ISEARCH_BACK): added +	* keybind.c (GlobalKeymap): C-s = ISEARCH, C-r = ISEARCH_BACK +	* linein.c (inputLineHistSearch): renamed from inputLineHist, +			new arg incrfunc() for increment search +	* linein.c (inputLineHistSearch): add cursorX, cursorY +	* main.c (srchcore): remove displayBuffer, onA +	* main.c (dispincsrch): added +	* main.c (isrch): ditto +	* main.c (isrchfor): ditto +	* main.c (isrchbak): ditto +	* main.c (srch): add displayBuffer, onA +	* main.c (srch_nxtprv): ditto +	* proto.h (isrchfor): added +	* proto.h (isrchbak): ditto +	* proto.h (inputLineHistSearch): renamed +	* doc/keymap.default (C-r): ISEARCH_BACK +	* doc/keymap.default (C-s): ISEARCH +	* doc/README.func (ISEARCH): added +	* doc/README.func (ISEARCH_BACK): ditto +	* doc-jp/README.func (ISEARCH): added +	* doc-jp/README.func (ISEARCH_BACK): ditto +  2001-12-25  Hironori Sakamoto <hsaka@mth.biglobe.ne.jp>  	* [w3m-dev 02723] cleanup resizing @@ -1500,4 +1531,4 @@  	* release-0-2-1  	* import w3m-0.2.1 -$Id: ChangeLog,v 1.169 2001/12/25 12:41:08 ukai Exp $ +$Id: ChangeLog,v 1.170 2001/12/25 13:43:51 ukai Exp $ @@ -1,5 +1,6 @@  w3m 0.2.4? 0.3? +* incremental search (C-s, C-r)  * linux/ia64 support (?)  ---------------------------------------------------------------- diff --git a/doc-jp/README.func b/doc-jp/README.func index 6e334cb..5f832ff 100644 --- a/doc-jp/README.func +++ b/doc-jp/README.func @@ -28,6 +28,8 @@ HISTORY                URL履歴を表示します  INFO		現在の文書に関する情報を表示します  INIT_MAILCAP   mailcap を再読み込みします(主に local-CGI 用)  INTERRUPT	文書の読み込みを中断します +ISEARCH		ファイルの末尾にむかってインクリメンタルサーチします +ISEARCH_BACK	ファイルの銭湯にむかってインクリメンタルサーチします  LEFT		画面全体を1文字左にずらします  LINE_BEGIN	行頭に移動します  LINE_END	行末に移動します diff --git a/doc/README.func b/doc/README.func index 8e2650c..b992308 100644 --- a/doc/README.func +++ b/doc/README.func @@ -28,6 +28,8 @@ HISTORY		View history of URL  INFO		View info of current document  INTERRUPT	Stop loading document  INIT_MAILCAP    Reread mailcap (mainly for local-CGI) +ISEARCH		Incremental search forward +ISEARCH_BACK	Incremental search backward  LEFT		Shift screen one column  LINE_BEGIN	Go to the beginning of line  LINE_END	Go to the end of line diff --git a/doc/keymap.default b/doc/keymap.default index e692340..2dad146 100644 --- a/doc/keymap.default +++ b/doc/keymap.default @@ -24,8 +24,8 @@ keymap	C-l	REDRAW  keymap	C-m	GOTO_LINK  keymap	C-n	MOVE_DOWN  keymap	C-p	MOVE_UP -keymap	C-r	SEARCH_BACK -keymap	C-s	SEARCH +keymap	C-r	ISEARCH_BACK +keymap	C-s	ISEARCH  keymap	C-u	PREV_LINK  keymap	C-v	NEXT_PAGE  keymap	C-w	WRAP_TOGGLE @@ -1,4 +1,4 @@ -/* $Id: fm.h,v 1.30 2001/12/23 14:44:00 ukai Exp $ */ +/* $Id: fm.h,v 1.31 2001/12/25 13:43:51 ukai Exp $ */  /*    * w3m: WWW wo Miru utility   *  @@ -229,6 +229,7 @@ extern int REV_LB[];   * Macros.   */ +#define inputLineHist(p,d,f,h)	inputLineHistSearch(p,d,f,h,NULL)  #define inputLine(p,d,f)	inputLineHist(p,d,f,NULL)  #define inputStr(p,d)		inputLine(p,d,IN_STRING)  #define inputStrHist(p,d,h)	inputLineHist(p,d,IN_STRING,h) @@ -378,6 +379,19 @@ typedef struct _Buffer {  #endif  } Buffer; + +#define COPY_BUFPOSITION(dstbuf, srcbuf) {\ + (dstbuf)->topLine = (srcbuf)->topLine; \ + (dstbuf)->currentLine = (srcbuf)->currentLine; \ + (dstbuf)->pos = (srcbuf)->pos; \ + (dstbuf)->cursorX = (srcbuf)->cursorX; \ + (dstbuf)->cursorY = (srcbuf)->cursorY; \ + (dstbuf)->visualpos = (srcbuf)->visualpos; \ + (dstbuf)->currentColumn = (srcbuf)->currentColumn; \ +} +#define SAVE_BUFPOSITION(sbufp) COPY_BUFPOSITION(sbufp, Currentbuf) +#define RESTORE_BUFPOSITION(sbufp) COPY_BUFPOSITION(Currentbuf, sbufp) +  #define NO_BUFFER ((Buffer*)1)  #define RB_STACK_SIZE 10 diff --git a/funcname.tab b/funcname.tab index a49c2dd..8478572 100644 --- a/funcname.tab +++ b/funcname.tab @@ -1,4 +1,4 @@ -# $Id: funcname.tab,v 1.4 2001/11/20 17:49:23 ukai Exp $ +# $Id: funcname.tab,v 1.5 2001/12/25 13:43:51 ukai Exp $  # macro name	function name  #----------------------------  @@@		nulcmd @@ -34,6 +34,8 @@ HISTORY		ldHist  INFO		pginfo  INIT_MAILCAP	initMailcap  INTERRUPT	susp +ISEARCH		isrchfor +ISEARCH_BACK	isrchbak  LEFT		col1L  LINE_BEGIN	linbeg  LINE_END	linend @@ -1,4 +1,4 @@ -/* $Id: keybind.c,v 1.4 2001/11/24 02:01:26 ukai Exp $ */ +/* $Id: keybind.c,v 1.5 2001/12/25 13:43:51 ukai Exp $ */  #include "funcname2.h"  char GlobalKeymap[128] = { @@ -11,7 +11,7 @@ char GlobalKeymap[128] = {      /*  C-h     C-i     C-j     C-k     C-l     C-m     C-n     C-o      */      ldHist, nextA, followA, cooLst, rdrwSc, followA, movD, nulcmd,      /*  C-p     C-q     C-r     C-s     C-t     C-u     C-v     C-w      */ -    movU, nulcmd, srchbak, srchfor, nulcmd, prevA, pgFore, wrapToggle, +    movU, nulcmd, isrchbak, isrchfor, nulcmd, prevA, pgFore, wrapToggle,      /*  C-x     C-y     C-z     C-[     C-\     C-]     C-^     C-_      */      nulcmd, nulcmd, susp, escmap, nulcmd, nulcmd, nulcmd, nulcmd,      /*  SPC     !       "       #       $       %       &       '        */ @@ -1,4 +1,4 @@ -/* $Id: linein.c,v 1.17 2001/12/12 17:04:21 ukai Exp $ */ +/* $Id: linein.c,v 1.18 2001/12/25 13:43:51 ukai Exp $ */  #include "fm.h"  #include "local.h"  #include "myctype.h" @@ -81,12 +81,15 @@ static void ins_kanji(Str tmp);  #endif  char * -inputLineHist(char *prompt, char *def_str, int flag, Hist *hist) +inputLineHistSearch(char *prompt, char *def_str, int flag, Hist *hist, +		    int (*incrfunc) (int ch, Str str, short *x, short *y))  {      int opos, x, y, lpos, rpos, epos;      unsigned char c;      char *p;      Lineprop mode; +    short cursorX = -1; +    short cursorY = -1;  #ifdef JP_CHARSET      Str tmp = Strnew();  #endif				/* JP_CHARSET */ @@ -167,7 +170,10 @@ inputLineHist(char *prompt, char *def_str, int flag, Hist *hist)  	else  	    addStr(strBuf->ptr, strProp, CLen, offset, COLS - opos);  	clrtoeolx(); -	move(LASTLINE, opos + x - offset); +	if (cursorX >= 0 && cursorY >= 0) +	    move(cursorY, cursorX); +	else +	    move(LASTLINE, opos + x - offset);  	refresh();        next_char: @@ -190,6 +196,8 @@ inputLineHist(char *prompt, char *def_str, int flag, Hist *hist)  			   (DisplayCode == CODE_SJIS ? CODE_SJIS : CODE_EUC),  			   InnerCode);  	    ins_kanji(tmp); +	    if (incrfunc) +		incrfunc(-1, strBuf, &cursorX, &cursorY);  	}  	else  #endif @@ -226,7 +234,11 @@ inputLineHist(char *prompt, char *def_str, int flag, Hist *hist)  	    cm_disp_next = -1;  	}  	else if (!i_quote && c < 0x20) {	/* Control code */ -	    (*InputKeymap[(int)c]) (c); +	    if (incrfunc == NULL +		|| (c = incrfunc((int)c, strBuf, &cursorX, &cursorY)) < 0x20) +		(*InputKeymap[(int)c]) (c); +	    if (incrfunc) +		incrfunc(-1, strBuf, &cursorX, &cursorY);  	    if (cm_clear)  		cm_next = FALSE;  	    if (cm_disp_clear) @@ -242,6 +254,8 @@ inputLineHist(char *prompt, char *def_str, int flag, Hist *hist)  	    Strcat_char(tmp, c);  	    tmp = conv_str(tmp, DisplayCode, InnerCode);  	    ins_kanji(tmp); +	    if (incrfunc) +		incrfunc(-1, strBuf, &cursorX, &cursorY);  	}  	else if ((c & 0x80) || in_kanji) {	/* Kanji 1 */  	    i_quote = FALSE; @@ -269,6 +283,8 @@ inputLineHist(char *prompt, char *def_str, int flag, Hist *hist)  		strProp[CPos] = PC_ASCII;  	    CPos++;  	    mode = PC_ASCII; +	    if (incrfunc) +		incrfunc(-1, strBuf, &cursorX, &cursorY);  	}  	if (CLen && (flag & IN_CHAR))  	    break; @@ -279,6 +295,7 @@ inputLineHist(char *prompt, char *def_str, int flag, Hist *hist)      if (i_broken)  	return NULL; +      move(LASTLINE, 0);      refresh();      p = strBuf->ptr; @@ -1,4 +1,4 @@ -/* $Id: main.c,v 1.46 2001/12/25 12:41:08 ukai Exp $ */ +/* $Id: main.c,v 1.47 2001/12/25 13:43:51 ukai Exp $ */  #define MAINPROGRAM  #include "fm.h"  #include <signal.h> @@ -1341,8 +1341,6 @@ srchcore(char *str, int (*func) (Buffer *, char *))  	    result = func(Currentbuf, SearchString);      signal(SIGINT, prevtrap);      term_raw(); -    displayBuffer(Currentbuf, B_NORMAL); -    onA();      return result;  } @@ -1359,6 +1357,90 @@ disp_srchresult(int result, char *prompt, char *str)  	disp_message(Sprintf("%s%s", prompt, str)->ptr, FALSE);  } +static int +dispincsrch(int ch, Str buf, short *x, short *y) +{ +    static Buffer sbuf; +    static Line *currentLine; +    static short pos; +    char *str; +    int do_next_search = FALSE; + +    if (ch == 0 && buf == NULL) { +	SAVE_BUFPOSITION(&sbuf);	/* search starting point */ +	currentLine = sbuf.currentLine; +	pos = sbuf.pos; +	return -1; +    } + +    str = buf->ptr; +    switch (ch) { +    case 022:			/* C-r */ +	searchRoutine = backwardSearch; +	do_next_search = TRUE; +	break; +    case 023:			/* C-s */ +	searchRoutine = forwardSearch; +	do_next_search = TRUE; +	break; +    default: +	if (ch >= 0) +	    return ch;		/* use InputKeymap */ +    } + +    if (do_next_search) { +	if (*str) { +	    SAVE_BUFPOSITION(&sbuf); +	    srchcore(str, searchRoutine); +	    arrangeCursor(Currentbuf); +	    if (Currentbuf->currentLine == currentLine +		&& Currentbuf->pos == pos) { +		SAVE_BUFPOSITION(&sbuf); +		srchcore(str, searchRoutine); +		arrangeCursor(Currentbuf); +	    } +	    *x = Currentbuf->cursorX; +	    *y = Currentbuf->cursorY; +	    displayBuffer(Currentbuf, B_NORMAL); +	    return -1; +	} +	else { +	    return 020;		/* _prev completion? */ +	} +    } +    else if (*str) { +	RESTORE_BUFPOSITION(&sbuf); +	arrangeCursor(Currentbuf); +	srchcore(str, searchRoutine); +	arrangeCursor(Currentbuf); +	*x = Currentbuf->cursorX; +	*y = Currentbuf->cursorY; +	currentLine = Currentbuf->currentLine; +	pos = Currentbuf->pos; +	displayBuffer(Currentbuf, B_NORMAL); +    } +    else +	displayBuffer(Currentbuf, B_NORMAL); +    return -1; +} + +void +isrch(int (*func) (Buffer *, char *), char *prompt) +{ +    char *str; +    Buffer sbuf; +    SAVE_BUFPOSITION(&sbuf); +    dispincsrch(0, NULL, NULL, NULL);	/* initialize incremental search state */ + +    searchRoutine = func; +    str = inputLineHistSearch(prompt, NULL, IN_STRING, TextHist, dispincsrch); +    if (str == NULL) { +	RESTORE_BUFPOSITION(&sbuf); +    } +    displayBuffer(Currentbuf, B_NORMAL); +    onA(); +} +  void  srch(int (*func) (Buffer *, char *), char *prompt)  { @@ -1371,24 +1453,40 @@ srch(int (*func) (Buffer *, char *), char *prompt)      if (str == NULL)  	return;      result = srchcore(str, func); +    displayBuffer(Currentbuf, B_NORMAL); +    onA();      disp_srchresult(result, prompt, str);      searchRoutine = func;  }  /* Search regular expression forward */ +  void  srchfor(void)  {      srch(forwardSearch, "Forward: ");  } +void +isrchfor(void) +{ +    isrch(forwardSearch, "I-search: "); +} +  /* Search regular expression backward */ +  void  srchbak(void)  {      srch(backwardSearch, "Backward: ");  } +void +isrchbak(void) +{ +    isrch(backwardSearch, "I-search backward: "); +} +  static void  srch_nxtprv(int reverse)  { @@ -1408,6 +1506,8 @@ srch_nxtprv(int reverse)      if (searchRoutine == backwardSearch)  	reverse ^= 1;      result = srchcore(SearchString, routine[reverse]); +    displayBuffer(Currentbuf, B_NORMAL); +    onA();      disp_srchresult(result, (reverse ? "Backward: " : "Forward: "),  		    SearchString);  } @@ -1,4 +1,4 @@ -/* $Id: proto.h,v 1.18 2001/12/25 12:41:08 ukai Exp $ */ +/* $Id: proto.h,v 1.19 2001/12/25 13:43:51 ukai Exp $ */  /*    *   This file was automatically generated by version 1.7 of cextract.   *   Manual editing not recommended. @@ -17,7 +17,9 @@ extern void ctrCsrV(void);  extern void ctrCsrH(void);  extern void rdrwSc(void);  extern void srchfor(void); +extern void isrchfor(void);  extern void srchbak(void); +extern void isrchbak(void);  extern void srchnxt(void);  extern void srchprv(void);  extern void shiftl(void); @@ -252,7 +254,10 @@ extern void pcmap(void);  extern void escmap(void);  extern void escbmap(void);  extern void escdmap(char c); -extern char *inputLineHist(char *prompt, char *def_str, int flag, Hist *hist); +extern char *inputLineHistSearch(char *prompt, char *def_str, int flag, +				 Hist *hist, +				 int (*incfunc) (int ch, Str buf, short *x, +						 short *y));  #ifdef USE_HISTORY  extern Buffer *historyBuffer(Hist *hist);  extern void loadHistory(Hist *hist); | 
