diff options
author | zeertzjq <zeertzjq@outlook.com> | 2021-08-16 15:27:04 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-08-16 00:27:04 -0700 |
commit | e9dd640897e6a318d770be62bbcc9f417f95990e (patch) | |
tree | 99b0190164906c9c62e53907bc04128be439c488 | |
parent | 54726e8bb9f7d33ad0a603d82b408cb571c2a7a3 (diff) | |
download | rneovim-e9dd640897e6a318d770be62bbcc9f417f95990e.tar.gz rneovim-e9dd640897e6a318d770be62bbcc9f417f95990e.tar.bz2 rneovim-e9dd640897e6a318d770be62bbcc9f417f95990e.zip |
vim-patch:8.2.3295: 'cursorline' should not apply to 'breakindent' #15281
Problem: 'cursorline' should not apply to 'breakindent'.
Solution: Make 'cursorline' apply to 'breakindent' and 'showbreak'
consistently. (closes vim/vim#8684)
https://github.com/vim/vim/commit/4f33bc20d7d5444e44d13f954e8219ad1abd26ef
-rw-r--r-- | src/nvim/screen.c | 44 | ||||
-rw-r--r-- | src/nvim/testdir/test_cursorline.vim | 22 | ||||
-rw-r--r-- | src/nvim/testdir/test_diffmode.vim | 31 | ||||
-rw-r--r-- | test/functional/ui/highlight_spec.lua | 91 |
4 files changed, 166 insertions, 22 deletions
diff --git a/src/nvim/screen.c b/src/nvim/screen.c index 38ed2816ba..2275a0255d 100644 --- a/src/nvim/screen.c +++ b/src/nvim/screen.c @@ -2381,13 +2381,12 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, && wp->w_p_culopt_flags != CULOPT_NBR) { cul_screenline = (wp->w_p_wrap && (wp->w_p_culopt_flags & CULOPT_SCRLINE)); - cul_attr = win_hl_attr(wp, HLF_CUL); - HlAttrs ae = syn_attr2entry(cul_attr); - - // We make a compromise here (#7383): - // * low-priority CursorLine if fg is not set - // * high-priority ("same as Vim" priority) CursorLine if fg is set if (!cul_screenline) { + cul_attr = win_hl_attr(wp, HLF_CUL); + HlAttrs ae = syn_attr2entry(cul_attr); + // We make a compromise here (#7383): + // * low-priority CursorLine if fg is not set + // * high-priority ("same as Vim" priority) CursorLine if fg is set if (ae.rgb_fg_color == -1 && ae.cterm_fg_color == 0) { line_attr_lowprio = cul_attr; } else { @@ -2399,7 +2398,6 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, } } } else { - cul_attr = 0; margin_columns_win(wp, &left_curline_col, &right_curline_col); } area_highlighting = true; @@ -2700,6 +2698,12 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, // Skip this quickly when working on the text. if (draw_state != WL_LINE) { + if (cul_screenline) { + cul_attr = 0; + line_attr = line_attr_save; + line_attr_lowprio = line_attr_lowprio_save; + } + if (draw_state == WL_CMDLINE - 1 && n_extra == 0) { draw_state = WL_CMDLINE; if (cmdwin_type != 0 && wp == curwin) { @@ -2855,9 +2859,6 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, if (diff_hlf != (hlf_T)0) { char_attr = win_hl_attr(wp, diff_hlf); - if (cul_attr) { - char_attr = hl_combine_attr(char_attr, cul_attr); - } } p_extra = NULL; c_extra = ' '; @@ -2943,21 +2944,20 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, } } - if (cul_screenline) { - if (draw_state == WL_LINE - && vcol >= left_curline_col - && vcol < right_curline_col) { - cul_attr = win_hl_attr(wp, HLF_CUL); - HlAttrs ae = syn_attr2entry(cul_attr); - if (ae.rgb_fg_color == -1 && ae.cterm_fg_color == 0) { - line_attr_lowprio = cul_attr; + if (cul_screenline && draw_state == WL_LINE + && vcol >= left_curline_col + && vcol < right_curline_col) { + cul_attr = win_hl_attr(wp, HLF_CUL); + HlAttrs ae = syn_attr2entry(cul_attr); + if (ae.rgb_fg_color == -1 && ae.cterm_fg_color == 0) { + line_attr_lowprio = cul_attr; + } else { + if (!(State & INSERT) && bt_quickfix(wp->w_buffer) + && qf_current_entry(wp) == lnum) { + line_attr = hl_combine_attr(cul_attr, line_attr); } else { line_attr = cul_attr; } - } else { - cul_attr = 0; - line_attr = line_attr_save; - line_attr_lowprio = line_attr_lowprio_save; } } diff --git a/src/nvim/testdir/test_cursorline.vim b/src/nvim/testdir/test_cursorline.vim index 4a0f2665fe..39d8b901ed 100644 --- a/src/nvim/testdir/test_cursorline.vim +++ b/src/nvim/testdir/test_cursorline.vim @@ -192,7 +192,29 @@ func Test_cursorline_screenline() call term_sendkeys(buf, "gj") call term_wait(buf) call VerifyScreenDump(buf, 'Test_'. filename. '_18', {}) + call term_sendkeys(buf, ":set breakindent& foldcolumn& signcolumn&\<cr>") endif + " showbreak should not be highlighted with CursorLine when 'number' is off + call term_sendkeys(buf, "gg0") + call term_sendkeys(buf, ":set list cursorlineopt=screenline listchars=space:-\<cr>") + call term_sendkeys(buf, ":set nonumber\<cr>") + call VerifyScreenDump(buf, 'Test_'. filename. '_19', {}) + call term_sendkeys(buf, "fagj") + call term_wait(buf) + call VerifyScreenDump(buf, 'Test_'. filename. '_20', {}) + call term_sendkeys(buf, "gj") + call term_wait(buf) + call VerifyScreenDump(buf, 'Test_'. filename. '_21', {}) + call term_sendkeys(buf, "gj") + call term_wait(buf) + call VerifyScreenDump(buf, 'Test_'. filename. '_22', {}) + call term_sendkeys(buf, "gj") + call term_wait(buf) + call VerifyScreenDump(buf, 'Test_'. filename. '_23', {}) + call term_sendkeys(buf, "gj") + call term_wait(buf) + call VerifyScreenDump(buf, 'Test_'. filename. '_24', {}) + call term_sendkeys(buf, ":set list& cursorlineopt& listchars&\<cr>") call StopVimInTerminal(buf) call delete(filename) diff --git a/src/nvim/testdir/test_diffmode.vim b/src/nvim/testdir/test_diffmode.vim index 8592f48af7..5c9c1ce884 100644 --- a/src/nvim/testdir/test_diffmode.vim +++ b/src/nvim/testdir/test_diffmode.vim @@ -990,6 +990,37 @@ func Test_diff_with_cursorline() call delete('Xtest_diff_cursorline') endfunc +func Test_diff_with_cursorline_breakindent() + CheckScreendump + + call writefile([ + \ 'hi CursorLine ctermbg=red ctermfg=white', + \ 'set noequalalways wrap diffopt=followwrap cursorline breakindent', + \ '50vnew', + \ 'call setline(1, [" "," "," "," "])', + \ 'exe "norm 20Afoo\<Esc>j20Afoo\<Esc>j20Afoo\<Esc>j20Abar\<Esc>"', + \ 'vnew', + \ 'call setline(1, [" "," "," "," "])', + \ 'exe "norm 20Abee\<Esc>j20Afoo\<Esc>j20Afoo\<Esc>j20Abaz\<Esc>"', + \ 'windo diffthis', + \ '2wincmd w', + \ ], 'Xtest_diff_cursorline_breakindent') + let buf = RunVimInTerminal('-S Xtest_diff_cursorline_breakindent', {}) + + call term_sendkeys(buf, "gg0") + call VerifyScreenDump(buf, 'Test_diff_with_cul_bri_01', {}) + call term_sendkeys(buf, "j") + call VerifyScreenDump(buf, 'Test_diff_with_cul_bri_02', {}) + call term_sendkeys(buf, "j") + call VerifyScreenDump(buf, 'Test_diff_with_cul_bri_03', {}) + call term_sendkeys(buf, "j") + call VerifyScreenDump(buf, 'Test_diff_with_cul_bri_04', {}) + + " clean up + call StopVimInTerminal(buf) + call delete('Xtest_diff_cursorline_breakindent') +endfunc + func Test_diff_with_syntax() CheckScreendump diff --git a/test/functional/ui/highlight_spec.lua b/test/functional/ui/highlight_spec.lua index 7471255345..499aeba6ec 100644 --- a/test/functional/ui/highlight_spec.lua +++ b/test/functional/ui/highlight_spec.lua @@ -912,6 +912,97 @@ describe('CursorLine highlight', function() ]]) end) + it("'cursorlineopt' screenline", function() + local screen = Screen.new(20,5) + screen:set_default_attr_ids({ + [1] = {foreground = Screen.colors.Black, background = Screen.colors.White}; + [2] = {foreground = Screen.colors.Yellow}; + [3] = {foreground = Screen.colors.Red, background = Screen.colors.Green}; + [4] = {foreground = Screen.colors.Green, background = Screen.colors.Red}; + }) + screen:attach() + + feed_command('set wrap cursorline cursorlineopt=screenline') + feed_command('set showbreak=>>>') + feed_command('highlight clear NonText') + feed_command('highlight clear CursorLine') + feed_command('highlight NonText guifg=Yellow gui=NONE') + feed_command('highlight LineNr guifg=Red guibg=Green gui=NONE') + feed_command('highlight CursorLine guifg=Black guibg=White gui=NONE') + feed_command('highlight CursorLineNr guifg=Green guibg=Red gui=NONE') + + feed('30iø<esc>o<esc>30ia<esc>') + + -- CursorLine should not apply to 'showbreak' when 'cursorlineopt' contains "screenline" + screen:expect([[ + øøøøøøøøøøøøøøøøøøøø| + {2:>>>}øøøøøøøøøø | + aaaaaaaaaaaaaaaaaaaa| + {2:>>>}{1:aaaaaaaaa^a }| + | + ]]) + feed('gk') + screen:expect([[ + øøøøøøøøøøøøøøøøøøøø| + {2:>>>}øøøøøøøøøø | + {1:aaaaaaaaaaaa^aaaaaaaa}| + {2:>>>}aaaaaaaaaa | + | + ]]) + feed('k') + screen:expect([[ + {1:øøøøøøøøøøøø^øøøøøøøø}| + {2:>>>}øøøøøøøøøø | + aaaaaaaaaaaaaaaaaaaa| + {2:>>>}aaaaaaaaaa | + | + ]]) + + -- CursorLineNr should not apply to line number when 'cursorlineopt' does not contain "number" + feed_command('set relativenumber numberwidth=2') + screen:expect([[ + {3:0 }{1:øøøøøøøøøøøø^øøøøøø}| + {3: }{2:>>>}øøøøøøøøøøøø | + {3:1 }aaaaaaaaaaaaaaaaaa| + {3: }{2:>>>}aaaaaaaaaaaa | + | + ]]) + + -- CursorLineNr should apply to line number when 'cursorlineopt' contains "number" + feed_command('set cursorlineopt+=number') + screen:expect([[ + {4:0 }{1:øøøøøøøøøøøø^øøøøøø}| + {3: }{2:>>>}øøøøøøøøøøøø | + {3:1 }aaaaaaaaaaaaaaaaaa| + {3: }{2:>>>}aaaaaaaaaaaa | + | + ]]) + feed('gj') + screen:expect([[ + {4:0 }øøøøøøøøøøøøøøøøøø| + {3: }{2:>>>}{1:øøøøøøøøø^øøø }| + {3:1 }aaaaaaaaaaaaaaaaaa| + {3: }{2:>>>}aaaaaaaaaaaa | + | + ]]) + feed('gj') + screen:expect([[ + {3:1 }øøøøøøøøøøøøøøøøøø| + {3: }{2:>>>}øøøøøøøøøøøø | + {4:0 }{1:aaaaaaaaaaaa^aaaaaa}| + {3: }{2:>>>}aaaaaaaaaaaa | + | + ]]) + feed('gj') + screen:expect([[ + {3:1 }øøøøøøøøøøøøøøøøøø| + {3: }{2:>>>}øøøøøøøøøøøø | + {4:0 }aaaaaaaaaaaaaaaaaa| + {3: }{2:>>>}{1:aaaaaaaaa^aaa }| + | + ]]) + end) + it('always updated. vim-patch:8.1.0849', function() local screen = Screen.new(50,5) screen:set_default_attr_ids({ |