mirror of
				https://github.com/neovim/neovim.git
				synced 2025-11-04 01:34:25 +00:00 
			
		
		
		
	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
0816f17e9a
Co-authored-by: glepnir <glephunter@gmail.com>
			
			
This commit is contained in:
		@@ -651,7 +651,9 @@ void pum_redraw(void)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  for (int i = 0; i < pum_height; i++) {
 | 
					  for (int i = 0; i < pum_height; i++) {
 | 
				
			||||||
    int idx = i + pum_first;
 | 
					    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
 | 
					    hlf_T hlf = hlfs[0];  // start with "word" highlight
 | 
				
			||||||
    int attr = win_hl_attr(curwin, (int)hlf);
 | 
					    int attr = win_hl_attr(curwin, (int)hlf);
 | 
				
			||||||
    attr = hl_combine_attr(win_hl_attr(curwin, HLF_PNI), attr);
 | 
					    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);
 | 
					      grid_line_fill(lcol, grid_col + 1, schar_from_ascii(' '), orig_attr);
 | 
				
			||||||
      if (need_fcs_trunc) {
 | 
					      if (need_fcs_trunc) {
 | 
				
			||||||
        linebuf_char[lcol] = fcs_trunc != NUL ? fcs_trunc : schar_from_ascii('<');
 | 
					        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) {
 | 
					        if (pum_width > 1 && linebuf_char[lcol + 1] == NUL) {
 | 
				
			||||||
          linebuf_char[lcol + 1] = schar_from_ascii(' ');
 | 
					          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 - 2] = schar_from_ascii(' ');
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        linebuf_char[rcol - 1] = fcs_trunc != NUL ? fcs_trunc : schar_from_ascii('>');
 | 
					        linebuf_char[rcol - 1] = fcs_trunc != NUL ? fcs_trunc : schar_from_ascii('>');
 | 
				
			||||||
 | 
					        linebuf_attr[rcol - 1] = trunc_attr;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5810,6 +5810,7 @@ describe('builtin popupmenu', function()
 | 
				
			|||||||
    it("'pummaxwidth' with multibyte", function()
 | 
					    it("'pummaxwidth' with multibyte", function()
 | 
				
			||||||
      screen:try_resize(60, 8)
 | 
					      screen:try_resize(60, 8)
 | 
				
			||||||
      exec([[
 | 
					      exec([[
 | 
				
			||||||
 | 
					        hi StrikeFake guifg=DarkRed
 | 
				
			||||||
        let g:change = 0
 | 
					        let g:change = 0
 | 
				
			||||||
        func Omni_test(findstart, base)
 | 
					        func Omni_test(findstart, base)
 | 
				
			||||||
          if a:findstart
 | 
					          if a:findstart
 | 
				
			||||||
@@ -5834,8 +5835,14 @@ describe('builtin popupmenu', function()
 | 
				
			|||||||
              \ #{word: "bar", menu: "fooMenu", kind: "一二三四"},
 | 
					              \ #{word: "bar", menu: "fooMenu", kind: "一二三四"},
 | 
				
			||||||
              \ #{word: "一二三四五", kind: "multi"},
 | 
					              \ #{word: "一二三四五", kind: "multi"},
 | 
				
			||||||
              \ ]
 | 
					              \ ]
 | 
				
			||||||
          else
 | 
					 | 
				
			||||||
            return [#{word: "bar", menu: "fooMenu", kind: "一二三"}]
 | 
					            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
 | 
					          endif
 | 
				
			||||||
        endfunc
 | 
					        endfunc
 | 
				
			||||||
        set omnifunc=Omni_test
 | 
					        set omnifunc=Omni_test
 | 
				
			||||||
@@ -6399,6 +6406,36 @@ describe('builtin popupmenu', function()
 | 
				
			|||||||
      end
 | 
					      end
 | 
				
			||||||
      feed('<Esc>')
 | 
					      feed('<Esc>')
 | 
				
			||||||
      command('set norightleft')
 | 
					      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)
 | 
					    end)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    it('does not crash when displayed in last column with rightleft #12032', function()
 | 
					    it('does not crash when displayed in last column with rightleft #12032', function()
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2036,6 +2036,7 @@ func Test_pum_maxwidth_multibyte()
 | 
				
			|||||||
  CheckScreendump
 | 
					  CheckScreendump
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  let lines =<< trim END
 | 
					  let lines =<< trim END
 | 
				
			||||||
 | 
					    hi StrikeFake ctermfg=9
 | 
				
			||||||
    let g:change = 0
 | 
					    let g:change = 0
 | 
				
			||||||
    func Omni_test(findstart, base)
 | 
					    func Omni_test(findstart, base)
 | 
				
			||||||
      if a:findstart
 | 
					      if a:findstart
 | 
				
			||||||
@@ -2060,8 +2061,14 @@ func Test_pum_maxwidth_multibyte()
 | 
				
			|||||||
          \ #{word: "bar", menu: "fooMenu", kind: "一二三四"},
 | 
					          \ #{word: "bar", menu: "fooMenu", kind: "一二三四"},
 | 
				
			||||||
          \ #{word: "一二三四五", kind: "multi"},
 | 
					          \ #{word: "一二三四五", kind: "multi"},
 | 
				
			||||||
          \ ]
 | 
					          \ ]
 | 
				
			||||||
      else
 | 
					 | 
				
			||||||
        return [#{word: "bar", menu: "fooMenu", kind: "一二三"}]
 | 
					        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
 | 
					      endif
 | 
				
			||||||
    endfunc
 | 
					    endfunc
 | 
				
			||||||
    set omnifunc=Omni_test
 | 
					    set omnifunc=Omni_test
 | 
				
			||||||
@@ -2174,6 +2181,12 @@ func Test_pum_maxwidth_multibyte()
 | 
				
			|||||||
    call term_sendkeys(buf, "\<Esc>:set norightleft\<CR>")
 | 
					    call term_sendkeys(buf, "\<Esc>:set norightleft\<CR>")
 | 
				
			||||||
  endif
 | 
					  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)
 | 
					  call StopVimInTerminal(buf)
 | 
				
			||||||
endfunc
 | 
					endfunc
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user