mirror of
				https://github.com/neovim/neovim.git
				synced 2025-10-26 12:27:24 +00:00 
			
		
		
		
	vim-patch:9.0.1759: Visual highlight not working with cursor at end of screen line
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:
		| @@ -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 | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 zeertzjq
					zeertzjq