mirror of
https://github.com/neovim/neovim.git
synced 2025-02-25 18:55:25 -06:00
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
8fc6a1dae0
This commit is contained in:
parent
10459e1ed0
commit
d21e6285e9
@ -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);
|
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.
|
// Store character to be displayed.
|
||||||
// Skip characters that are left of the screen for 'nowrap'.
|
// Skip characters that are left of the screen for 'nowrap'.
|
||||||
vcol_prev = wlv.vcol;
|
|
||||||
if (wlv.draw_state < WL_LINE || n_skip <= 0) {
|
if (wlv.draw_state < WL_LINE || n_skip <= 0) {
|
||||||
// Store the character.
|
// Store the character.
|
||||||
if (wp->w_p_rl && utf_char2cells(mb_c) > 1) {
|
if (wp->w_p_rl && utf_char2cells(mb_c) > 1) {
|
||||||
|
@ -9,6 +9,34 @@ local command = helpers.command
|
|||||||
describe('display', function()
|
describe('display', function()
|
||||||
before_each(clear)
|
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()
|
-- oldtest: Test_display_scroll_at_topline()
|
||||||
it('scroll when modified at topline vim-patch:8.2.1488', function()
|
it('scroll when modified at topline vim-patch:8.2.1488', function()
|
||||||
local screen = Screen.new(20, 4)
|
local screen = Screen.new(20, 4)
|
||||||
|
@ -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)
|
|
69
test/functional/legacy/visual_spec.lua
Normal file
69
test/functional/legacy/visual_spec.lua
Normal file
@ -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)
|
@ -1558,5 +1558,23 @@ func Test_heap_buffer_overflow()
|
|||||||
set updatecount&
|
set updatecount&
|
||||||
endfunc
|
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
|
" vim: shiftwidth=2 sts=2 expandtab
|
||||||
|
Loading…
Reference in New Issue
Block a user