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>
diff --git a/src/insexpand.c b/src/insexpand.c
index d3a6300..700ed54 100644
--- a/src/insexpand.c
+++ b/src/insexpand.c
@@ -173,6 +173,7 @@
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_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);
@@ -898,6 +904,32 @@
}
/*
+ * 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".
*/
static void
@@ -917,7 +949,7 @@
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 @@
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 @@
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 @@
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_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 @@
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 @@
// 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 @@
// 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 @@
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;