Mercurial > vim
diff src/edit.c @ 502:52e76e2b5b65 v7.0140
updated for version 7.0140
author | vimboss |
---|---|
date | Thu, 01 Sep 2005 20:46:49 +0000 |
parents | 08012a1ff8d4 |
children | a7ae7e043e43 |
line wrap: on
line diff
--- a/src/edit.c +++ b/src/edit.c @@ -819,7 +819,7 @@ doESCkey: /*FALLTHROUGH*/ case Ctrl_O: /* execute one command */ -#ifdef FEAT_INS_EXPAND +#ifdef FEAT_COMPL_FUNC if (ctrl_x_mode == CTRL_X_OCCULT) goto docomplete; #endif @@ -1844,9 +1844,9 @@ vim_is_ctrl_x_key(c) #ifdef FEAT_COMPL_FUNC case CTRL_X_FUNCTION: return (c == Ctrl_U || c == Ctrl_P || c == Ctrl_N); -#endif case CTRL_X_OCCULT: return (c == Ctrl_O || c == Ctrl_P || c == Ctrl_N); +#endif case CTRL_X_SPELL: return (c == Ctrl_S || c == Ctrl_P || c == Ctrl_N); } @@ -2360,10 +2360,10 @@ ins_compl_prep(c) case Ctrl_U: ctrl_x_mode = CTRL_X_FUNCTION; break; -#endif case Ctrl_O: ctrl_x_mode = CTRL_X_OCCULT; break; +#endif case 's': case Ctrl_S: ctrl_x_mode = CTRL_X_SPELL; @@ -2581,36 +2581,38 @@ ins_compl_next_buf(buf, flag) } #ifdef FEAT_COMPL_FUNC -static int expand_by_function __ARGS((int col, char_u *base, char_u ***matches)); +static int expand_by_function __ARGS((int type, char_u *base, char_u ***matches)); /* - * Execute user defined complete function 'completefunc', and get matches in - * "matches". + * Execute user defined complete function 'completefunc' or 'occultfunc', and + * get matches in "matches". * Return value is number of matches. */ static int -expand_by_function(col, base, matches) - int col; +expand_by_function(type, base, matches) + int type; /* CTRL_X_OCCULT or CTRL_X_FUNCTION */ char_u *base; char_u ***matches; { list_T *matchlist; - char_u colbuf[30]; - char_u *args[3]; + char_u *args[2]; listitem_T *li; garray_T ga; char_u *p; - - if (*curbuf->b_p_cfu == NUL) + char_u *funcname; + pos_T pos; + + funcname = (type == CTRL_X_FUNCTION) ? curbuf->b_p_cfu : curbuf->b_p_ofu; + if (*funcname == NUL) return 0; /* Call 'completefunc' to obtain the list of matches. */ args[0] = (char_u *)"0"; - sprintf((char *)colbuf, "%d", col + (int)STRLEN(base)); - args[1] = colbuf; - args[2] = base; - - matchlist = call_func_retlist(curbuf->b_p_cfu, 3, args, FALSE); + args[1] = base; + + pos = curwin->w_cursor; + matchlist = call_func_retlist(funcname, 2, args, FALSE); + curwin->w_cursor = pos; /* restore the cursor position */ if (matchlist == NULL) return 0; @@ -2634,30 +2636,6 @@ expand_by_function(col, base, matches) } #endif /* FEAT_COMPL_FUNC */ -static int expand_occult __ARGS((linenr_T lnum, int col, char_u *base, char_u ***matches)); - -/* - * Perform occult completion' - * Return value is number of candidates and array of candidates as "matchp". - */ - static int -expand_occult(lnum, col, pat, matchp) - linenr_T lnum; - int col; - char_u *pat; - char_u ***matchp; -{ - int num_matches; - - /* Use tag completion for now. */ - if (find_tags(pat, &num_matches, matchp, - TAG_REGEXP | TAG_NAMES | TAG_NOIC | - TAG_INS_COMP | (ctrl_x_mode ? TAG_VERBOSE : 0), - TAG_MANY, curbuf->b_ffname) == FAIL) - return 0; - return num_matches; -} - /* * Get the next expansion(s), using "compl_pattern". * The search starts at position "ini" in curbuf and in the direction dir. @@ -2870,20 +2848,13 @@ ins_compl_get_exp(ini, dir) #ifdef FEAT_COMPL_FUNC case CTRL_X_FUNCTION: - num_matches = expand_by_function(first_match_pos.col, - compl_pattern, &matches); + case CTRL_X_OCCULT: + num_matches = expand_by_function(type, compl_pattern, &matches); if (num_matches > 0) ins_compl_add_matches(num_matches, matches, dir); break; #endif - case CTRL_X_OCCULT: - num_matches = expand_occult(first_match_pos.lnum, - first_match_pos.col, compl_pattern, &matches); - if (num_matches > 0) - ins_compl_add_matches(num_matches, matches, dir); - break; - case CTRL_X_SPELL: #ifdef FEAT_SYN_HL num_matches = expand_spelling(first_match_pos.lnum, @@ -3302,7 +3273,7 @@ ins_complete(c) compl_col = compl_startpos.col; } compl_length = curwin->w_cursor.col - (int)compl_col; - /* IObuf is used to add a "word from the next line" would we + /* IObuff is used to add a "word from the next line" would we * have enough space? just being paranoic */ #define MIN_SPACE 75 if (compl_length > (IOSIZE - MIN_SPACE)) @@ -3486,27 +3457,31 @@ ins_complete(c) compl_col = startcol; compl_length = curs_col - startcol; } + else if (ctrl_x_mode == CTRL_X_FUNCTION || ctrl_x_mode == CTRL_X_OCCULT) + { #ifdef FEAT_COMPL_FUNC - else if (ctrl_x_mode == CTRL_X_FUNCTION) - { /* - * Call user defined function 'completefunc' with "a:findstart" is - * 1 to obtain the length of text to use for completion. + * Call user defined function 'completefunc' with "a:findstart" + * set to 1 to obtain the length of text to use for completion. */ - char_u colbuf[30]; - char_u *args[3]; + char_u *args[2]; int col; - - /* Call 'completefunc' and get pattern length as a string */ - if (*curbuf->b_p_cfu == NUL) + char_u *funcname; + pos_T pos; + + /* Call 'completefunc' or 'occultfunc' and get pattern length as a + * string */ + funcname = ctrl_x_mode == CTRL_X_FUNCTION + ? curbuf->b_p_cfu : curbuf->b_p_ofu; + if (*funcname == NUL) return FAIL; args[0] = (char_u *)"1"; - sprintf((char *)colbuf, "%d", (int)curs_col); - args[1] = colbuf; - args[2] = NULL; - - col = call_func_retnr(curbuf->b_p_cfu, 3, args, FALSE); + args[1] = NULL; + pos = curwin->w_cursor; + col = call_func_retnr(funcname, 2, args, FALSE); + curwin->w_cursor = pos; /* restore the cursor position */ + if (col < 0) return FAIL; compl_col = col; @@ -3519,19 +3494,7 @@ ins_complete(c) compl_length = curs_col - compl_col; compl_pattern = vim_strnsave(line + compl_col, compl_length); if (compl_pattern == NULL) - return FAIL; - } -#endif - else if (ctrl_x_mode == CTRL_X_OCCULT) - { - /* TODO: let language-specific function handle locating the text - * to be completed. */ - while (--startcol >= 0 && vim_isIDc(line[startcol])) - ; - compl_col += ++startcol; - compl_length = (int)curs_col - startcol; - compl_pattern = vim_strnsave(line + compl_col, compl_length); - if (compl_pattern == NULL) +#endif return FAIL; } else if (ctrl_x_mode == CTRL_X_SPELL)