mirror of
				https://github.com/neovim/neovim.git
				synced 2025-11-04 09:44:31 +00:00 
			
		
		
		
	vim-patch:9.1.1482: scrolling with 'splitkeep' and line() (#34670)
Problem:  Topline is preemptively updated by line() in WinResized
          autocmd with 'splitkeep' != "cursor".
Solution: Set `skip_update_topline` when 'splitkeep' != "cursor".
          (Luuk van Baal)
fe803c8c04
(cherry picked from commit 0b91e9f83b)
			
			
This commit is contained in:
		
				
					committed by
					
						
						github-actions[bot]
					
				
			
			
				
	
			
			
			
						parent
						
							db3b856779
						
					
				
				
					commit
					d5cbc99358
				
			@@ -4437,17 +4437,15 @@ static void f_line(typval_T *argvars, typval_T *rettv, EvalFuncData fptr)
 | 
				
			|||||||
    if (wp != NULL && tp != NULL) {
 | 
					    if (wp != NULL && tp != NULL) {
 | 
				
			||||||
      switchwin_T switchwin;
 | 
					      switchwin_T switchwin;
 | 
				
			||||||
      if (switch_win_noblock(&switchwin, wp, tp, true) == OK) {
 | 
					      if (switch_win_noblock(&switchwin, wp, tp, true) == OK) {
 | 
				
			||||||
        // in diff mode, prevent that the window scrolls
 | 
					        // With 'splitkeep' != cursor and in diff mode, prevent that the
 | 
				
			||||||
        // and keep the topline
 | 
					        // window scrolls and keep the topline.
 | 
				
			||||||
        if (curwin->w_p_diff && switchwin.sw_curwin->w_p_diff) {
 | 
					        if (*p_spk != 'c' || (curwin->w_p_diff && switchwin.sw_curwin->w_p_diff)) {
 | 
				
			||||||
          skip_update_topline = true;
 | 
					          skip_update_topline = true;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        check_cursor(curwin);
 | 
					        check_cursor(curwin);
 | 
				
			||||||
        fp = var2fpos(&argvars[0], true, &fnum, false);
 | 
					        fp = var2fpos(&argvars[0], true, &fnum, false);
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      if (curwin->w_p_diff && switchwin.sw_curwin->w_p_diff) {
 | 
					      skip_update_topline = false;
 | 
				
			||||||
        skip_update_topline = false;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
      restore_win_noblock(&switchwin, true);
 | 
					      restore_win_noblock(&switchwin, true);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  } else {
 | 
					  } else {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -326,4 +326,31 @@ describe('splitkeep', function()
 | 
				
			|||||||
                                              |
 | 
					                                              |
 | 
				
			||||||
    ]])
 | 
					    ]])
 | 
				
			||||||
  end)
 | 
					  end)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  -- oldtest: Test_splitkeep_line()
 | 
				
			||||||
 | 
					  it("no scrolling with 'splitkeep' and line()", function()
 | 
				
			||||||
 | 
					    screen:try_resize(40, 6)
 | 
				
			||||||
 | 
					    exec([[
 | 
				
			||||||
 | 
					      set splitkeep=screen nosplitbelow
 | 
				
			||||||
 | 
					      autocmd WinResized * call line('w0', 1000)
 | 
				
			||||||
 | 
					      call setline(1, range(1000))
 | 
				
			||||||
 | 
					    ]])
 | 
				
			||||||
 | 
					    screen:expect([[
 | 
				
			||||||
 | 
					      ^0                                       |
 | 
				
			||||||
 | 
					      1                                       |
 | 
				
			||||||
 | 
					      2                                       |
 | 
				
			||||||
 | 
					      3                                       |
 | 
				
			||||||
 | 
					      4                                       |
 | 
				
			||||||
 | 
					                                              |
 | 
				
			||||||
 | 
					    ]])
 | 
				
			||||||
 | 
					    feed(':wincmd s<CR>')
 | 
				
			||||||
 | 
					    screen:expect([[
 | 
				
			||||||
 | 
					      ^0                                       |
 | 
				
			||||||
 | 
					      1                                       |
 | 
				
			||||||
 | 
					      {3:[No Name] [+]                           }|
 | 
				
			||||||
 | 
					      3                                       |
 | 
				
			||||||
 | 
					      {2:[No Name] [+]                           }|
 | 
				
			||||||
 | 
					      :wincmd s                               |
 | 
				
			||||||
 | 
					    ]])
 | 
				
			||||||
 | 
					  end)
 | 
				
			||||||
end)
 | 
					end)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2075,6 +2075,24 @@ func Test_splitkeep_skipcol()
 | 
				
			|||||||
  call VerifyScreenDump(buf, 'Test_splitkeep_skipcol_1', {})
 | 
					  call VerifyScreenDump(buf, 'Test_splitkeep_skipcol_1', {})
 | 
				
			||||||
endfunc
 | 
					endfunc
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Test_splitkeep_line()
 | 
				
			||||||
 | 
					  CheckScreendump
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  let lines =<< trim END
 | 
				
			||||||
 | 
					    set splitkeep=screen nosplitbelow
 | 
				
			||||||
 | 
					    autocmd WinResized * call line('w0', 1000)
 | 
				
			||||||
 | 
					    call setline(1, range(1000))
 | 
				
			||||||
 | 
					  END
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  call writefile(lines, 'XTestSplitkeepSkipcol', 'D')
 | 
				
			||||||
 | 
					  let buf = RunVimInTerminal('-S XTestSplitkeepSkipcol', #{rows: 6, cols: 40})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  call VerifyScreenDump(buf, 'Test_splitkeep_line_1', {})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  call term_sendkeys(buf, ":wincmd s\<CR>")
 | 
				
			||||||
 | 
					  call VerifyScreenDump(buf, 'Test_splitkeep_line_2', {})
 | 
				
			||||||
 | 
					endfunc
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func Test_new_help_window_on_error()
 | 
					func Test_new_help_window_on_error()
 | 
				
			||||||
  help change.txt
 | 
					  help change.txt
 | 
				
			||||||
  execute "normal! /CTRL-@\<CR>"
 | 
					  execute "normal! /CTRL-@\<CR>"
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user