Mercurial > vim
diff src/edit.c @ 452:01af1008a8d8
updated for version 7.0120
author | vimboss |
---|---|
date | Sat, 30 Jul 2005 22:43:24 +0000 |
parents | 3709cf52b9b5 |
children | 3b705e71c7b0 |
line wrap: on
line diff
--- a/src/edit.c +++ b/src/edit.c @@ -2550,85 +2550,56 @@ ins_compl_next_buf(buf, flag) } #ifdef FEAT_COMPL_FUNC -static char_u *call_completefunc __ARGS((char_u *line, char_u *base, int col, int preproc)); -static int expand_by_function __ARGS((linenr_T lnum, int col, char_u *base, char_u ***matches)); +static int expand_by_function __ARGS((int col, char_u *base, char_u ***matches)); /* - * Execute user defined complete function 'completefunc'. - * Return NULL if some error occurs. - */ - static char_u * -call_completefunc(line, base, col, preproc) - char_u *line; - char_u *base; - int col; - int preproc; -{ - char_u colbuf[30]; - char_u *args[4]; - - /* Return NULL when 'completefunc' isn't set. */ - if (*curbuf->b_p_cfu == NUL) - return NULL; - - sprintf((char *)colbuf, "%d", col + (base ? (int)STRLEN(base) : 0)); - args[0] = line; - args[1] = base; - args[2] = colbuf; - args[3] = (char_u *)(preproc ? "1" : "0"); - return (char_u *)call_func_retstr(curbuf->b_p_cfu, 4, args, FALSE); -} - -/* - * Execute user defined complete function 'completefunc', and get candidates - * are separeted with "\n". Return value is number of candidates and array - * of candidates as "matches". + * Execute user defined complete function 'completefunc', and get matches in + * "matches". + * Return value is number of matches. */ static int -expand_by_function(lnum, col, base, matches) - linenr_T lnum; +expand_by_function(col, base, matches) int col; char_u *base; char_u ***matches; { - char_u *matchstr = NULL; - char_u *line_copy = vim_strsave(ml_get(lnum)); - - /* Execute 'completefunc' and get the result */ - matchstr = call_completefunc(line_copy, base, col, 0); - vim_free(line_copy); - - /* Parse returned string */ - if (matchstr != NULL) - { - garray_T ga; - char_u *p, *pnext; - - ga_init2(&ga, (int)sizeof(char*), 8); - for (p = matchstr; *p != NUL; p = pnext) - { - int len; - - pnext = vim_strchr(p, '\n'); - if (pnext == NULL) - pnext = p + STRLEN(p); - len = pnext - p; - if (len > 0) - { - if (ga_grow(&ga, 1) == FAIL) - break; - ((char_u **)ga.ga_data)[ga.ga_len] = vim_strnsave(p, len); - ++ga.ga_len; - } - if (*pnext != NUL) - ++pnext; - } - vim_free(matchstr); - if (ga.ga_len > 0) - *matches = (char_u**)ga.ga_data; - return ga.ga_len; - } - return 0; + list_T *matchlist; + char_u colbuf[30]; + char_u *args[3]; + listitem_T *li; + garray_T ga; + char_u *p; + + if (*curbuf->b_p_cfu == 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); + if (matchlist == NULL) + return 0; + + /* Go through the List with matches and put them in an array. */ + ga_init2(&ga, (int)sizeof(char_u *), 8); + for (li = matchlist->lv_first; li != NULL; li = li->li_next) + { + p = get_tv_string_chk(&li->li_tv); + if (p != NULL && *p != NUL) + { + if (ga_grow(&ga, 1) == FAIL) + break; + ((char_u **)ga.ga_data)[ga.ga_len] = vim_strsave(p); + ++ga.ga_len; + } + } + + list_unref(matchlist); + *matches = (char_u **)ga.ga_data; + return ga.ga_len; } #endif /* FEAT_COMPL_FUNC */ @@ -2868,8 +2839,8 @@ ins_compl_get_exp(ini, dir) #ifdef FEAT_COMPL_FUNC case CTRL_X_FUNCTION: - num_matches = expand_by_function(first_match_pos.lnum, - first_match_pos.col, compl_pattern, &matches); + num_matches = expand_by_function(first_match_pos.col, + compl_pattern, &matches); if (num_matches > 0) ins_compl_add_matches(num_matches, matches, dir); break; @@ -3477,31 +3448,33 @@ ins_complete(c) else if (ctrl_x_mode == CTRL_X_FUNCTION) { /* - * Call user defined function 'completefunc' with line content, - * cursor column number and preproc is 1. Obtain length of text - * to use for completion. + * Call user defined function 'completefunc' with "a:findstart" is + * 1 to obtain the length of text to use for completion. */ - char_u *lenstr; - int keeplen = 0; - char_u *line_copy = vim_strsave(line); + char_u colbuf[30]; + char_u *args[3]; + int col; /* Call 'completefunc' and get pattern length as a string */ - lenstr = call_completefunc(line_copy, NULL, curs_col, 1); - vim_free(line_copy); - if (lenstr == NULL) + if (*curbuf->b_p_cfu == NUL) return FAIL; - keeplen = atoi((char *)lenstr); - vim_free(lenstr); - if (keeplen < 0) + + 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); + if (col < 0) return FAIL; - if ((colnr_T)keeplen > curs_col) - keeplen = curs_col; + compl_col = col; + if ((colnr_T)compl_col > curs_col) + compl_col = curs_col; /* Setup variables for completion. Need to obtain "line" again, * it may have become invalid. */ line = ml_get(curwin->w_cursor.lnum); - compl_col = keeplen; - compl_length = curs_col - keeplen; + compl_length = curs_col - compl_col; compl_pattern = vim_strnsave(line + compl_col, compl_length); if (compl_pattern == NULL) return FAIL; @@ -3510,7 +3483,7 @@ ins_complete(c) else if (ctrl_x_mode == CTRL_X_OCCULT) { /* TODO: let language-specific function handle locating the text - * to be completed or use 'coupler' option. */ + * to be completed. */ while (--startcol >= 0 && vim_isIDc(line[startcol])) ; compl_col += ++startcol;