0
0
mirror of https://github.com/vim/vim.git synced 2025-09-23 03:43:49 -04:00

updated for version 7.0196

This commit is contained in:
Bram Moolenaar
2006-02-10 23:20:28 +00:00
parent 110bc6bc91
commit c7453f52d4
13 changed files with 225 additions and 70 deletions

View File

@@ -95,6 +95,9 @@ static compl_T *compl_shown_match = NULL;
* are used. */
static char_u *compl_leader = NULL;
static int compl_get_longest = FALSE; /* put longest common string
in compl_leader */
static int compl_used_match; /* Selected one of the matches. When
FALSE the match was edited or using
the longest common string. */
@@ -119,6 +122,7 @@ static expand_T compl_xp;
static void ins_ctrl_x __ARGS((void));
static int has_compl_option __ARGS((int dict_opt));
static void ins_compl_longest_match __ARGS((compl_T *match));
static void ins_compl_add_matches __ARGS((int num_matches, char_u **matches));
static int ins_compl_make_cyclic __ARGS((void));
static void ins_compl_upd_pum __ARGS((void));
@@ -136,7 +140,7 @@ static buf_T *ins_compl_next_buf __ARGS((buf_T *buf, int flag));
static int ins_compl_get_exp __ARGS((pos_T *ini));
static void ins_compl_delete __ARGS((void));
static void ins_compl_insert __ARGS((void));
static int ins_compl_next __ARGS((int allow_get_expansion, int count));
static int ins_compl_next __ARGS((int allow_get_expansion, int count, int insert_match));
static int ins_compl_key2dir __ARGS((int c));
static int ins_compl_pum_key __ARGS((int c));
static int ins_compl_key2count __ARGS((int c));
@@ -683,12 +687,6 @@ edit(cmdchar, startln, count)
#endif
#ifdef FEAT_INS_EXPAND
/* When the popup menu is visible cursor keys change the selection. */
if (c == K_UP && pum_visible())
c = Ctrl_P;
if (c == K_DOWN && pum_visible())
c = Ctrl_N;
/*
* Special handling of keys while the popup menu is visible or wanted
* and the cursor is still in the completed word.
@@ -717,11 +715,19 @@ edit(cmdchar, startln, count)
ins_compl_addleader(c);
continue;
}
/* Pressing Enter selects the current match. */
if (c == CAR || c == K_KENTER || c == NL)
{
ins_compl_delete();
ins_compl_insert();
}
}
}
/* Prepare for or stop CTRL-X mode. This doesn't do completion, but
* it does fix up the text when finishing completion. */
compl_get_longest = FALSE;
if (c != K_IGNORE && ins_compl_prep(c))
continue;
#endif
@@ -1103,6 +1109,10 @@ doESCkey:
break;
case K_UP: /* <Up> */
#ifdef FEAT_INS_EXPAND
if (pum_visible())
goto docomplete;
#endif
if (mod_mask & MOD_MASK_SHIFT)
ins_pageup();
else
@@ -1120,6 +1130,10 @@ doESCkey:
break;
case K_DOWN: /* <Down> */
#ifdef FEAT_INS_EXPAND
if (pum_visible())
goto docomplete;
#endif
if (mod_mask & MOD_MASK_SHIFT)
ins_pagedown();
else
@@ -1860,7 +1874,7 @@ ins_ctrl_x()
/* if the next ^X<> won't ADD nothing, then reset
* compl_cont_status */
if (compl_cont_status & CONT_N_ADDS)
compl_cont_status = (compl_cont_status | CONT_INTRPT);
compl_cont_status |= CONT_INTRPT;
else
compl_cont_status = 0;
/* We're not sure which CTRL-X mode it will be yet */
@@ -2138,9 +2152,69 @@ ins_compl_add(str, len, fname, extra, cdir, flags)
compl_first_match = match;
compl_curr_match = match;
/*
* Find the longest common string if still doing that.
*/
if (compl_get_longest && (flags & ORIGINAL_TEXT) == 0)
ins_compl_longest_match(match);
return OK;
}
/*
* Reduce the longest common string for match "match".
*/
static void
ins_compl_longest_match(match)
compl_T *match;
{
char_u *p, *s;
int l;
int had_match;
if (compl_leader == NULL)
/* First match, use it as a whole. */
compl_leader = vim_strsave(match->cp_str);
else
{
/* Reduce the text if this match differs from compl_leader. */
for (p = compl_leader, s = match->cp_str; *p != NUL; p += l, s += l)
{
#ifdef FEAT_MBYTE
if (has_mbyte)
{
l = mb_ptr2len(p);
if (STRNCMP(p, s, l) != 0)
break;
}
else
#endif
{
if (*p != *s)
break;
l = 1;
}
}
if (*p != NUL)
{
/* Leader was shortened, need to change the inserted text. */
*p = NUL;
had_match = (curwin->w_cursor.col > compl_col);
ins_compl_delete();
ins_bytes(compl_leader + curwin->w_cursor.col - compl_col);
ins_redraw(FALSE);
/* When the match isn't there (to avoid matching itself) remove it
* again after redrawing. */
if (!had_match)
ins_compl_delete();
}
compl_used_match = FALSE;
}
}
/*
* Add an array of matches to the list of matches.
* Frees matches[].
@@ -2231,7 +2305,7 @@ ins_compl_del_pum()
pum_wanted()
{
/* 'completeopt' must contain "menu" */
if (*p_cot == NUL)
if (vim_strchr(p_cot, 'm') == NULL)
return FALSE;
/* The display looks bad on a B&W display. */
@@ -2762,6 +2836,14 @@ ins_compl_prep(c)
if (c == K_SELECT)
return retval;
/* Set "compl_get_longest" when finding the first matches. */
if (ctrl_x_mode == CTRL_X_NOT_DEFINED_YET
|| (ctrl_x_mode == 0 && !compl_started))
{
compl_get_longest = (vim_strchr(p_cot, 'l') != NULL);
compl_used_match = TRUE;
}
if (ctrl_x_mode == CTRL_X_NOT_DEFINED_YET)
{
/*
@@ -3356,7 +3438,7 @@ ins_compl_get_exp(ini)
last_match_pos = *pos;
}
else if (first_match_pos.lnum == last_match_pos.lnum
&& first_match_pos.col == last_match_pos.col)
&& first_match_pos.col == last_match_pos.col)
found_new_match = FAIL;
if (found_new_match == FAIL)
{
@@ -3470,9 +3552,10 @@ ins_compl_get_exp(ini)
{
if (got_int)
break;
/* Fill the popup menu as soon as possible. */
if (pum_wanted() && type != -1)
/* Fill the popup menu as soon as possible. */
ins_compl_check_keys(0);
if ((ctrl_x_mode != 0 && ctrl_x_mode != CTRL_X_WHOLE_LINE)
|| compl_interrupted)
break;
@@ -3547,10 +3630,11 @@ ins_compl_insert()
* calls this function with "allow_get_expansion" FALSE.
*/
static int
ins_compl_next(allow_get_expansion, count)
ins_compl_next(allow_get_expansion, count, insert_match)
int allow_get_expansion;
int count; /* repeat completion this many times; should
be at least 1 */
int insert_match; /* Insert the newly selected match */
{
int num_matches = -1;
int i;
@@ -3558,11 +3642,23 @@ ins_compl_next(allow_get_expansion, count)
compl_T *found_compl = NULL;
int found_end = FALSE;
if (allow_get_expansion)
if (compl_leader != NULL
&& (compl_shown_match->cp_flags & ORIGINAL_TEXT) == 0)
{
/* Set "compl_shown_match" to the actually shown match, it may differ
* when "compl_leader" is used to omit some of the matches. */
while (STRNCMP(compl_shown_match->cp_str,
compl_leader, STRLEN(compl_leader)) != 0
&& compl_shown_match->cp_next != NULL
&& compl_shown_match->cp_next != compl_first_match)
compl_shown_match = compl_shown_match->cp_next;
}
if (allow_get_expansion && insert_match
&& (!compl_get_longest || compl_used_match))
/* Delete old text to be replaced */
ins_compl_delete();
}
compl_pending = FALSE;
/* Repeat this for when <PageUp> or <PageDown> is typed. But don't wrap
@@ -3615,14 +3711,25 @@ ins_compl_next(allow_get_expansion, count)
}
}
/* Insert the text of the new completion */
ins_compl_insert();
/* Insert the text of the new completion, or the compl_leader. */
if (insert_match)
{
if (!compl_get_longest || compl_used_match)
ins_compl_insert();
else
ins_bytes(compl_leader + curwin->w_cursor.col - compl_col);
}
else
compl_used_match = FALSE;
if (!allow_get_expansion)
{
/* may undisplay the popup menu first */
ins_compl_upd_pum();
/* redraw to show the user what was inserted */
update_screen(0);
/* display the updated popup menu */
ins_compl_show_pum();
@@ -3685,13 +3792,14 @@ ins_compl_check_keys(frequency)
{
c = safe_vgetc(); /* Eat the character */
compl_shows_dir = ins_compl_key2dir(c);
(void)ins_compl_next(FALSE, ins_compl_key2count(c));
(void)ins_compl_next(FALSE, ins_compl_key2count(c),
c != K_UP && c != K_DOWN);
}
else if (c != Ctrl_R)
compl_interrupted = TRUE;
}
if (compl_pending && !got_int)
(void)ins_compl_next(FALSE, 1);
(void)ins_compl_next(FALSE, 1, TRUE);
}
/*
@@ -3702,8 +3810,9 @@ ins_compl_check_keys(frequency)
ins_compl_key2dir(c)
int c;
{
if (c == Ctrl_P || c == Ctrl_L || (pum_visible()
&& (c == K_PAGEUP || c == K_KPAGEUP || c == K_S_UP)))
if (c == Ctrl_P || c == Ctrl_L
|| (pum_visible() && (c == K_PAGEUP || c == K_KPAGEUP
|| c == K_S_UP || c == K_UP)))
return BACKWARD;
return FORWARD;
}
@@ -3717,7 +3826,8 @@ ins_compl_pum_key(c)
int c;
{
return pum_visible() && (c == K_PAGEUP || c == K_KPAGEUP || c == K_S_UP
|| c == K_PAGEDOWN || c == K_KPAGEDOWN || c == K_S_DOWN);
|| c == K_PAGEDOWN || c == K_KPAGEDOWN || c == K_S_DOWN
|| c == K_UP || c == K_DOWN);
}
/*
@@ -3730,7 +3840,7 @@ ins_compl_key2count(c)
{
int h;
if (ins_compl_pum_key(c))
if (ins_compl_pum_key(c) && c != K_UP && c != K_DOWN)
{
h = pum_get_height();
if (h > 3)
@@ -3783,7 +3893,8 @@ ins_complete(c)
* been split because it was longer than 'tw'). if SOL is set then
* skip the previous pattern, a word at the beginning of the line has
* been inserted, we'll look for that -- Acevedo. */
if ((compl_cont_status & CONT_INTRPT) && compl_cont_mode == ctrl_x_mode)
if ((compl_cont_status & CONT_INTRPT) == CONT_INTRPT
&& compl_cont_mode == ctrl_x_mode)
{
/*
* it is a continued search
@@ -4129,9 +4240,10 @@ ins_complete(c)
compl_shows_dir = compl_direction;
/*
* Find next match.
* Find next match (and following matches).
*/
n = ins_compl_next(TRUE, ins_compl_key2count(c));
n = ins_compl_next(TRUE, ins_compl_key2count(c),
c != K_UP && c != K_DOWN);
/* may undisplay the popup menu */
ins_compl_upd_pum();