diff options
author | zeertzjq <zeertzjq@outlook.com> | 2023-08-21 07:18:39 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-08-21 07:18:39 +0800 |
commit | d21e6285e93302b6d387ad6d362b683db09c5239 (patch) | |
tree | 9e7fdb16e80ab4b8e7c3ca002168870fa1ad471d | |
parent | 10459e1ed0fe6429b15705567135c55e0778b262 (diff) | |
download | rneovim-d21e6285e93302b6d387ad6d362b683db09c5239.tar.gz rneovim-d21e6285e93302b6d387ad6d362b683db09c5239.tar.bz2 rneovim-d21e6285e93302b6d387ad6d362b683db09c5239.zip |
vim-patch:9.0.1759: Visual highlight not working with cursor at end of screen line (#24806)
Problem: Visual highlight not working with cursor at end of screen line
and 'showbreak'.
Solution: Only update "vcol_prev" when drawing buffer text.
closes: vim/vim#12865
https://github.com/vim/vim/commit/8fc6a1dae07aa63faa6bfe6ed93888635745830c
-rw-r--r-- | src/nvim/drawline.c | 5 | ||||
-rw-r--r-- | test/functional/legacy/display_spec.lua | 28 | ||||
-rw-r--r-- | test/functional/legacy/visual_mode_spec.lua | 79 | ||||
-rw-r--r-- | test/functional/legacy/visual_spec.lua | 69 | ||||
-rw-r--r-- | test/old/testdir/test_visual.vim | 18 |
5 files changed, 119 insertions, 80 deletions
diff --git a/src/nvim/drawline.c b/src/nvim/drawline.c index e531704970..753baa2675 100644 --- a/src/nvim/drawline.c +++ b/src/nvim/drawline.c @@ -2940,9 +2940,12 @@ int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, bool number_onl wlv.char_attr = hl_combine_attr(wlv.line_attr_lowprio, wlv.char_attr); } + if (wlv.draw_state == WL_LINE) { + vcol_prev = wlv.vcol; + } + // Store character to be displayed. // Skip characters that are left of the screen for 'nowrap'. - vcol_prev = wlv.vcol; if (wlv.draw_state < WL_LINE || n_skip <= 0) { // Store the character. if (wp->w_p_rl && utf_char2cells(mb_c) > 1) { diff --git a/test/functional/legacy/display_spec.lua b/test/functional/legacy/display_spec.lua index 482b88eae8..89120baea9 100644 --- a/test/functional/legacy/display_spec.lua +++ b/test/functional/legacy/display_spec.lua @@ -9,6 +9,34 @@ local command = helpers.command describe('display', function() before_each(clear) + -- oldtest: Test_visual_block_scroll() + it('redraws properly after scrolling with matchparen loaded and scrolloff=1', function() + local screen = Screen.new(30, 7) + screen:attach() + screen:set_default_attr_ids({ + [1] = {bold = true}, + [2] = {background = Screen.colors.LightGrey}, + }) + + exec([[ + source $VIMRUNTIME/plugin/matchparen.vim + set scrolloff=1 + call setline(1, ['a', 'b', 'c', 'd', 'e', '', '{', '}', '{', 'f', 'g', '}']) + call cursor(5, 1) + ]]) + + feed('V<c-d><c-d>') + screen:expect([[ + {2:{} | + {2:}} | + {2:{} | + {2:f} | + ^g | + } | + {1:-- VISUAL LINE --} | + ]]) + end) + -- oldtest: Test_display_scroll_at_topline() it('scroll when modified at topline vim-patch:8.2.1488', function() local screen = Screen.new(20, 4) diff --git a/test/functional/legacy/visual_mode_spec.lua b/test/functional/legacy/visual_mode_spec.lua deleted file mode 100644 index 1a08fb4c0e..0000000000 --- a/test/functional/legacy/visual_mode_spec.lua +++ /dev/null @@ -1,79 +0,0 @@ -local helpers = require('test.functional.helpers')(after_each) - -local Screen = require('test.functional.ui.screen') -local clear = helpers.clear -local feed = helpers.feed -local exec = helpers.exec - -before_each(clear) - -describe('visual line mode', function() - -- oldtest: Test_visual_block_scroll() - it('redraws properly after scrolling with matchparen loaded and scrolloff=1', function() - local screen = Screen.new(30, 7) - screen:attach() - screen:set_default_attr_ids({ - [1] = {bold = true}, - [2] = {background = Screen.colors.LightGrey}, - }) - - exec([[ - source $VIMRUNTIME/plugin/matchparen.vim - set scrolloff=1 - call setline(1, ['a', 'b', 'c', 'd', 'e', '', '{', '}', '{', 'f', 'g', '}']) - call cursor(5, 1) - ]]) - - feed('V<c-d><c-d>') - screen:expect([[ - {2:{} | - {2:}} | - {2:{} | - {2:f} | - ^g | - } | - {1:-- VISUAL LINE --} | - ]]) - end) -end) - -describe('visual block mode', function() - -- oldtest: Test_visual_block_with_virtualedit() - it('shows selection correctly with virtualedit=block', function() - local screen = Screen.new(30, 7) - screen:set_default_attr_ids({ - [1] = {bold = true}, -- ModeMsg - [2] = {background = Screen.colors.LightGrey}, -- Visual - [3] = {foreground = Screen.colors.Blue, bold = true} -- NonText - }) - screen:attach() - - exec([[ - call setline(1, ['aaaaaa', 'bbbb', 'cc']) - set virtualedit=block - normal G - ]]) - - feed('<C-V>gg$') - screen:expect([[ - {2:aaaaaa}^ | - {2:bbbb } | - {2:cc } | - {3:~ }| - {3:~ }| - {3:~ }| - {1:-- VISUAL BLOCK --} | - ]]) - - feed('<Esc>gg<C-V>G$') - screen:expect([[ - {2:aaaaaa } | - {2:bbbb } | - {2:cc}^ {2: } | - {3:~ }| - {3:~ }| - {3:~ }| - {1:-- VISUAL BLOCK --} | - ]]) - end) -end) diff --git a/test/functional/legacy/visual_spec.lua b/test/functional/legacy/visual_spec.lua new file mode 100644 index 0000000000..629fab5eb5 --- /dev/null +++ b/test/functional/legacy/visual_spec.lua @@ -0,0 +1,69 @@ +local helpers = require('test.functional.helpers')(after_each) + +local Screen = require('test.functional.ui.screen') +local clear = helpers.clear +local feed = helpers.feed +local exec = helpers.exec + +before_each(clear) + +describe('Visual highlight', function() + local screen + + before_each(function() + screen = Screen.new(50, 6) + screen:set_default_attr_ids({ + [0] = {foreground = Screen.colors.Blue, bold = true}, -- NonText + [1] = {bold = true}, -- ModeMsg + [2] = {background = Screen.colors.LightGrey}, -- Visual + }) + screen:attach() + end) + + -- oldtest: Test_visual_block_with_virtualedit() + it('shows selection correctly with virtualedit=block', function() + exec([[ + call setline(1, ['aaaaaa', 'bbbb', 'cc']) + set virtualedit=block + normal G + ]]) + + feed('<C-V>gg$') + screen:expect([[ + {2:aaaaaa}^ | + {2:bbbb } | + {2:cc } | + {0:~ }| + {0:~ }| + {1:-- VISUAL BLOCK --} | + ]]) + + feed('<Esc>gg<C-V>G$') + screen:expect([[ + {2:aaaaaa } | + {2:bbbb } | + {2:cc}^ {2: } | + {0:~ }| + {0:~ }| + {1:-- VISUAL BLOCK --} | + ]]) + end) + + -- oldtest: Test_visual_hl_with_showbreak() + it("with cursor at end of screen line and 'showbreak'", function() + exec([[ + setlocal showbreak=+ + call setline(1, repeat('a', &columns + 10)) + normal g$v4lo + ]]) + + screen:expect([[ + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa^a| + {0:+}{2:aaaa}aaaaaa | + {0:~ }| + {0:~ }| + {0:~ }| + {1:-- VISUAL --} | + ]]) + end) +end) diff --git a/test/old/testdir/test_visual.vim b/test/old/testdir/test_visual.vim index 04282416bb..a12ecefc73 100644 --- a/test/old/testdir/test_visual.vim +++ b/test/old/testdir/test_visual.vim @@ -1558,5 +1558,23 @@ func Test_heap_buffer_overflow() set updatecount& endfunc +" Test Visual highlight with cursor at end of screen line and 'showbreak' +func Test_visual_hl_with_showbreak() + CheckScreendump + + let lines =<< trim END + setlocal showbreak=+ + call setline(1, repeat('a', &columns + 10)) + normal g$v4lo + END + call writefile(lines, 'XTest_visual_sbr', 'D') + + let buf = RunVimInTerminal('-S XTest_visual_sbr', {'rows': 6, 'cols': 50}) + call VerifyScreenDump(buf, 'Test_visual_hl_with_showbreak', {}) + + " clean up + call term_sendkeys(buf, "\<Esc>") + call StopVimInTerminal(buf) +endfunc " vim: shiftwidth=2 sts=2 expandtab |