mirror of
https://github.com/vim/vim.git
synced 2025-11-16 23:24:03 -05:00
patch 9.1.0936: cannot highlight completed text
Problem: cannot highlight completed text
Solution: (optionally) highlight auto-completed text using the
ComplMatchIns highlight group (glepnir)
closes: #16173
Signed-off-by: glepnir <glephunter@gmail.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
committed by
Christian Brabandt
parent
368ef5a48c
commit
6a38aff218
@@ -173,6 +173,7 @@ static pos_T compl_startpos;
|
||||
static int compl_length = 0;
|
||||
static colnr_T compl_col = 0; // column where the text starts
|
||||
// that is being completed
|
||||
static colnr_T compl_ins_end_col = 0;
|
||||
static string_T compl_orig_text = {NULL, 0}; // text as it was before
|
||||
// completion started
|
||||
static int compl_cont_mode = 0;
|
||||
@@ -198,6 +199,11 @@ static int compl_selected_item = -1;
|
||||
|
||||
static int *compl_fuzzy_scores;
|
||||
|
||||
// "compl_match_array" points the currently displayed list of entries in the
|
||||
// popup menu. It is NULL when there is no popup menu.
|
||||
static pumitem_T *compl_match_array = NULL;
|
||||
static int compl_match_arraysize;
|
||||
|
||||
static int ins_compl_add(char_u *str, int len, char_u *fname, char_u **cptext, typval_T *user_data, int cdir, int flags, int adup, int *user_hl);
|
||||
static void ins_compl_longest_match(compl_T *match);
|
||||
static void ins_compl_del_pum(void);
|
||||
@@ -897,6 +903,32 @@ ins_compl_equal(compl_T *match, char_u *str, int len)
|
||||
return STRNCMP(match->cp_str.string, str, (size_t)len) == 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* when len is -1 mean use whole length of p otherwise part of p
|
||||
*/
|
||||
static void
|
||||
ins_compl_insert_bytes(char_u *p, int len)
|
||||
{
|
||||
if (len == -1)
|
||||
len = (int)STRLEN(p);
|
||||
ins_bytes_len(p, len);
|
||||
compl_ins_end_col = curwin->w_cursor.col - 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Checks if the column is within the currently inserted completion text
|
||||
* column range. If it is, it returns a special highlight attribute.
|
||||
* -1 mean normal item.
|
||||
*/
|
||||
int
|
||||
ins_compl_col_range_attr(int col)
|
||||
{
|
||||
if (col >= compl_col && col < compl_ins_end_col)
|
||||
return syn_name2attr((char_u *)"ComplMatchIns");
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Reduce the longest common string for match "match".
|
||||
*/
|
||||
@@ -917,7 +949,7 @@ ins_compl_longest_match(compl_T *match)
|
||||
compl_leader.length = match->cp_str.length;
|
||||
had_match = (curwin->w_cursor.col > compl_col);
|
||||
ins_compl_delete();
|
||||
ins_bytes(compl_leader.string + get_compl_len());
|
||||
ins_compl_insert_bytes(compl_leader.string + get_compl_len(), -1);
|
||||
ins_redraw(FALSE);
|
||||
|
||||
// When the match isn't there (to avoid matching itself) remove it
|
||||
@@ -967,7 +999,7 @@ ins_compl_longest_match(compl_T *match)
|
||||
|
||||
had_match = (curwin->w_cursor.col > compl_col);
|
||||
ins_compl_delete();
|
||||
ins_bytes(compl_leader.string + get_compl_len());
|
||||
ins_compl_insert_bytes(compl_leader.string + get_compl_len(), -1);
|
||||
ins_redraw(FALSE);
|
||||
|
||||
// When the match isn't there (to avoid matching itself) remove it
|
||||
@@ -1060,12 +1092,6 @@ get_cot_flags(void)
|
||||
return curbuf->b_cot_flags != 0 ? curbuf->b_cot_flags : cot_flags;
|
||||
}
|
||||
|
||||
|
||||
// "compl_match_array" points the currently displayed list of entries in the
|
||||
// popup menu. It is NULL when there is no popup menu.
|
||||
static pumitem_T *compl_match_array = NULL;
|
||||
static int compl_match_arraysize;
|
||||
|
||||
/*
|
||||
* Update the screen and when there is any scrolling remove the popup menu.
|
||||
*/
|
||||
@@ -1817,6 +1843,7 @@ ins_compl_clear(void)
|
||||
compl_cont_status = 0;
|
||||
compl_started = FALSE;
|
||||
compl_matches = 0;
|
||||
compl_ins_end_col = 0;
|
||||
VIM_CLEAR_STRING(compl_pattern);
|
||||
VIM_CLEAR_STRING(compl_leader);
|
||||
edit_submode_extra = NULL;
|
||||
@@ -1965,7 +1992,7 @@ ins_compl_new_leader(void)
|
||||
{
|
||||
ins_compl_del_pum();
|
||||
ins_compl_delete();
|
||||
ins_bytes(compl_leader.string + get_compl_len());
|
||||
ins_compl_insert_bytes(compl_leader.string + get_compl_len(), -1);
|
||||
compl_used_match = FALSE;
|
||||
|
||||
if (compl_started)
|
||||
@@ -2410,7 +2437,7 @@ ins_compl_stop(int c, int prev_mode, int retval)
|
||||
int compl_len = get_compl_len();
|
||||
|
||||
if ((int)plen > compl_len)
|
||||
ins_bytes_len(p + compl_len, (int)(plen - compl_len));
|
||||
ins_compl_insert_bytes(p + compl_len, (int)(plen - compl_len));
|
||||
}
|
||||
retval = TRUE;
|
||||
}
|
||||
@@ -4260,7 +4287,7 @@ ins_compl_insert(int in_compl_func)
|
||||
// Make sure we don't go over the end of the string, this can happen with
|
||||
// illegal bytes.
|
||||
if (compl_len < (int)compl_shown_match->cp_str.length)
|
||||
ins_bytes(compl_shown_match->cp_str.string + compl_len);
|
||||
ins_compl_insert_bytes(compl_shown_match->cp_str.string + compl_len, -1);
|
||||
if (match_at_original_text(compl_shown_match))
|
||||
compl_used_match = FALSE;
|
||||
else
|
||||
@@ -4537,7 +4564,7 @@ ins_compl_next(
|
||||
// Insert the text of the new completion, or the compl_leader.
|
||||
if (compl_no_insert && !started)
|
||||
{
|
||||
ins_bytes(compl_orig_text.string + get_compl_len());
|
||||
ins_compl_insert_bytes(compl_orig_text.string + get_compl_len(), -1);
|
||||
compl_used_match = FALSE;
|
||||
}
|
||||
else if (insert_match)
|
||||
@@ -4545,7 +4572,7 @@ ins_compl_next(
|
||||
if (!compl_get_longest || compl_used_match)
|
||||
ins_compl_insert(in_compl_func);
|
||||
else
|
||||
ins_bytes(compl_leader.string + get_compl_len());
|
||||
ins_compl_insert_bytes(compl_leader.string + get_compl_len(), -1);
|
||||
}
|
||||
else
|
||||
compl_used_match = FALSE;
|
||||
|
||||
Reference in New Issue
Block a user