patch 9.1.1398: completion: trunc does not follow Pmenu highlighting attributes
Problem: When items are combined with user-defined highlight attributes
(e.g., strikethrough), trunc inherits these attributes, making
the text difficult to read.
Solution: trunc now uses the original Pmenu and PmenuSel highlight
attributes (glepnir)
closes: #17340
Signed-off-by: glepnir <glephunter@gmail.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
diff --git a/src/popupmenu.c b/src/popupmenu.c
index d629049..6d91c33 100644
--- a/src/popupmenu.c
+++ b/src/popupmenu.c
@@ -589,14 +589,16 @@
int width,
int width_limit,
int totwidth,
- int next_isempty)
+ int next_isempty,
+ int selected)
{
- char_u *rt;
- int cells;
+ char_u *rt = NULL;
+ int cells = 0;
int over_cell = 0;
int truncated = FALSE;
int pad = next_isempty ? 0 : 2;
- int remaining;
+ int remaining = 0;
+ int trunc_attr = highlight_attr[selected ? HLF_PSI : HLF_PNI];
int truncrl = curwin->w_fill_chars.truncrl != NUL
? curwin->w_fill_chars.truncrl : '<';
@@ -656,7 +658,8 @@
width = cells + over_cell + 1;
rt = orig_rt;
- screen_putchar(truncrl, row, col - width + 1 + TPL_LCOL(NULL), attr);
+ screen_putchar(truncrl, row,
+ col - width + 1 + TPL_LCOL(NULL), trunc_attr);
if (over_cell > 0)
screen_fill(row, row + 1, col - width + 2 + TPL_LCOL(NULL),
@@ -691,15 +694,17 @@
int width, // width already calculated in outer loop
int width_limit,
int totwidth,
- int next_isempty)
+ int next_isempty,
+ int selected)
{
- int size;
- int cells;
+ int size = 0;
+ int cells = 0;
char_u *st_end = NULL;
int over_cell = 0;
int pad = next_isempty ? 0 : 2;
- int truncated;
- int remaining;
+ int truncated = FALSE;
+ int remaining = 0;
+ int trunc_attr = highlight_attr[selected ? HLF_PSI : HLF_PNI];
int trunc = curwin->w_fill_chars.trunc != NUL
? curwin->w_fill_chars.trunc : '>';
@@ -756,7 +761,8 @@
screen_fill(row, row + 1, col + cells + TPL_LCOL(NULL),
col + cells + over_cell + TPL_LCOL(NULL), ' ', ' ', attr);
- screen_putchar(trunc, row, col + cells + over_cell + TPL_LCOL(NULL), attr);
+ screen_putchar(trunc, row,
+ col + cells + over_cell + TPL_LCOL(NULL), trunc_attr);
}
VIM_CLEAR(st);
@@ -785,6 +791,7 @@
char_u *p = pum_get_item(idx, item_type);
int width = 0; // item width
int w; // char width
+ int selected = idx == pum_selected;
for ( ; ; MB_PTR_ADV(p))
{
@@ -815,11 +822,11 @@
#ifdef FEAT_RIGHTLEFT
if (pum_rl)
col = pum_display_rtl_text(row, col, st, attr, attrs,
- width, pum_width, *totwidth_ptr, next_isempty);
+ width, pum_width, *totwidth_ptr, next_isempty, selected);
else
#endif
col = pum_display_ltr_text(row, col, st, attr, attrs,
- width, pum_width, *totwidth_ptr, next_isempty);
+ width, pum_width, *totwidth_ptr, next_isempty, selected);
if (attrs != NULL)
VIM_CLEAR(attrs);