neovim

Neovim text editor
git clone https://git.dasho.dev/neovim.git
Log | Files | Refs | README

commit dc6885dc24c91f6465de985498cd02deed1aa0f8
parent 3a35fdc3471e5f8fb6ad57b48abaa4e4db006de3
Author: zeertzjq <zeertzjq@outlook.com>
Date:   Mon, 19 May 2025 08:11:54 +0800

vim-patch:9.1.1398: completion: trunc does not follow Pmenu highlighting attributes (#34084)

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: vim/vim#17340

https://github.com/vim/vim/commit/0816f17e9a2ba2d1e132497b03905878c7340a78

Co-authored-by: glepnir <glephunter@gmail.com>
Diffstat:
Msrc/nvim/popupmenu.c | 6+++++-
Mtest/functional/ui/popupmenu_spec.lua | 39++++++++++++++++++++++++++++++++++++++-
Mtest/old/testdir/test_popup.vim | 15++++++++++++++-
3 files changed, 57 insertions(+), 3 deletions(-)

diff --git a/src/nvim/popupmenu.c b/src/nvim/popupmenu.c @@ -651,7 +651,9 @@ void pum_redraw(void) for (int i = 0; i < pum_height; i++) { int idx = i + pum_first; - const hlf_T *const hlfs = (idx == pum_selected) ? hlfsSel : hlfsNorm; + const bool selected = idx == pum_selected; + const hlf_T *const hlfs = selected ? hlfsSel : hlfsNorm; + const int trunc_attr = win_hl_attr(curwin, selected ? HLF_PSI : HLF_PNI); hlf_T hlf = hlfs[0]; // start with "word" highlight int attr = win_hl_attr(curwin, (int)hlf); attr = hl_combine_attr(win_hl_attr(curwin, HLF_PNI), attr); @@ -825,6 +827,7 @@ void pum_redraw(void) grid_line_fill(lcol, grid_col + 1, schar_from_ascii(' '), orig_attr); if (need_fcs_trunc) { linebuf_char[lcol] = fcs_trunc != NUL ? fcs_trunc : schar_from_ascii('<'); + linebuf_attr[lcol] = trunc_attr; if (pum_width > 1 && linebuf_char[lcol + 1] == NUL) { linebuf_char[lcol + 1] = schar_from_ascii(' '); } @@ -837,6 +840,7 @@ void pum_redraw(void) linebuf_char[rcol - 2] = schar_from_ascii(' '); } linebuf_char[rcol - 1] = fcs_trunc != NUL ? fcs_trunc : schar_from_ascii('>'); + linebuf_attr[rcol - 1] = trunc_attr; } } diff --git a/test/functional/ui/popupmenu_spec.lua b/test/functional/ui/popupmenu_spec.lua @@ -5810,6 +5810,7 @@ describe('builtin popupmenu', function() it("'pummaxwidth' with multibyte", function() screen:try_resize(60, 8) exec([[ + hi StrikeFake guifg=DarkRed let g:change = 0 func Omni_test(findstart, base) if a:findstart @@ -5834,8 +5835,14 @@ describe('builtin popupmenu', function() \ #{word: "bar", menu: "fooMenu", kind: "一二三四"}, \ #{word: "一二三四五", kind: "multi"}, \ ] - else return [#{word: "bar", menu: "fooMenu", kind: "一二三"}] + elseif g:change == 3 + return [#{word: "bar", menu: "fooMenu", kind: "一二三"}] + else + return [ + \ #{word: "一二三四五六七八九十", abbr_hlgroup: "StrikeFake"}, + \ #{word: "123456789_123456789_123456789_", abbr_hlgroup: "StrikeFake"}, + \ ] endif endfunc set omnifunc=Omni_test @@ -6399,6 +6406,36 @@ describe('builtin popupmenu', function() end feed('<Esc>') command('set norightleft') + + command('let g:change=4') + feed('S<C-X><C-O>') + if multigrid then + screen:expect({ + grid = [[ + ## grid 1 + [2:--------------------------------]|*19 + [3:--------------------------------]| + ## grid 2 + 一二三四五六七八九十^ | + {1:~ }|*18 + ## grid 3 + {2:-- }{5:match 1 of 2} | + ## grid 4 + {ds:一二三四五六七 }{s:>}| + {dn:123456789_12345}{n:>}| + ]], + float_pos = { [4] = { -1, 'NW', 2, 1, 0, false, 100, 1, 1, 0 } }, + }) + else + screen:expect([[ + 一二三四五六七八九十^ | + {ds:一二三四五六七 }{s:>}{1: }| + {dn:123456789_12345}{n:>}{1: }| + {1:~ }|*16 + {2:-- }{5:match 1 of 2} | + ]]) + end + feed('<Esc>') end) it('does not crash when displayed in last column with rightleft #12032', function() diff --git a/test/old/testdir/test_popup.vim b/test/old/testdir/test_popup.vim @@ -2036,6 +2036,7 @@ func Test_pum_maxwidth_multibyte() CheckScreendump let lines =<< trim END + hi StrikeFake ctermfg=9 let g:change = 0 func Omni_test(findstart, base) if a:findstart @@ -2060,8 +2061,14 @@ func Test_pum_maxwidth_multibyte() \ #{word: "bar", menu: "fooMenu", kind: "一二三四"}, \ #{word: "一二三四五", kind: "multi"}, \ ] - else return [#{word: "bar", menu: "fooMenu", kind: "一二三"}] + elseif g:change == 3 + return [#{word: "bar", menu: "fooMenu", kind: "一二三"}] + else + return [ + \ #{word: "一二三四五六七八九十", abbr_hlgroup: "StrikeFake"}, + \ #{word: "123456789_123456789_123456789_", abbr_hlgroup: "StrikeFake"}, + \ ] endif endfunc set omnifunc=Omni_test @@ -2174,6 +2181,12 @@ func Test_pum_maxwidth_multibyte() call term_sendkeys(buf, "\<Esc>:set norightleft\<CR>") endif + call term_sendkeys(buf, ":let g:change=4\<CR>") + call TermWait(buf, 50) + call term_sendkeys(buf, "S\<C-X>\<C-O>") + call VerifyScreenDump(buf, 'Test_pum_maxwidth_23', {'rows': 8}) + call term_sendkeys(buf, "\<ESC>") + call StopVimInTerminal(buf) endfunc