updated for version 7.0140
diff --git a/src/edit.c b/src/edit.c
index f399f30..d1a48de 100644
--- a/src/edit.c
+++ b/src/edit.c
@@ -819,7 +819,7 @@
/*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 @@
#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 @@
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 @@
}
#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;
+ char_u *funcname;
+ pos_T pos;
- if (*curbuf->b_p_cfu == NUL)
+ 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;
+ args[1] = base;
- matchlist = call_func_retlist(curbuf->b_p_cfu, 3, args, FALSE);
+ 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 @@
}
#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 @@
#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 @@
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 @@
compl_col = startcol;
compl_length = curs_col - startcol;
}
-#ifdef FEAT_COMPL_FUNC
- else if (ctrl_x_mode == CTRL_X_FUNCTION)
+ else if (ctrl_x_mode == CTRL_X_FUNCTION || ctrl_x_mode == CTRL_X_OCCULT)
{
+#ifdef FEAT_COMPL_FUNC
/*
- * 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;
+ char_u *funcname;
+ pos_T pos;
- /* Call 'completefunc' and get pattern length as a string */
- if (*curbuf->b_p_cfu == NUL)
+ /* 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;
+ args[1] = NULL;
+ pos = curwin->w_cursor;
+ col = call_func_retnr(funcname, 2, args, FALSE);
+ curwin->w_cursor = pos; /* restore the cursor position */
- col = call_func_retnr(curbuf->b_p_cfu, 3, args, FALSE);
if (col < 0)
return FAIL;
compl_col = col;
@@ -3519,19 +3494,7 @@
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)
return FAIL;
}
else if (ctrl_x_mode == CTRL_X_SPELL)