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); | ||||
|     } | ||||
|  | ||||
|     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) { | ||||
|   | ||||
| @@ -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) | ||||
|   | ||||
| @@ -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& | ||||
| 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 | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 zeertzjq
					zeertzjq