mirror of
				https://github.com/neovim/neovim.git
				synced 2025-11-03 17:24:29 +00:00 
			
		
		
		
	fix(folds): avoid unnecessary loop with horizontal scrolling (#33932)
Fix #33931
(cherry picked from commit 1d9990daac)
			
			
This commit is contained in:
		
				
					committed by
					
						
						github-actions[bot]
					
				
			
			
				
	
			
			
			
						parent
						
							8daffd0cbb
						
					
				
				
					commit
					bdd8498ed7
				
			@@ -1447,7 +1447,9 @@ int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, int col_rows, b
 | 
			
		||||
                        ? (startrow == 0 ? wp->w_skipcol : 0)
 | 
			
		||||
                        : wp->w_leftcol;
 | 
			
		||||
 | 
			
		||||
  if (start_col > 0 && col_rows == 0) {
 | 
			
		||||
  if (has_foldtext) {
 | 
			
		||||
    wlv.vcol = start_col;
 | 
			
		||||
  } else if (start_col > 0 && col_rows == 0) {
 | 
			
		||||
    char *prev_ptr = ptr;
 | 
			
		||||
    CharSize cs = { 0 };
 | 
			
		||||
 | 
			
		||||
@@ -1490,12 +1492,14 @@ int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, int col_rows, b
 | 
			
		||||
    // - 'cuc' is set, or
 | 
			
		||||
    // - 'colorcolumn' is set, or
 | 
			
		||||
    // - 'virtualedit' is set, or
 | 
			
		||||
    // - the visual mode is active,
 | 
			
		||||
    // - the visual mode is active, or
 | 
			
		||||
    // - drawing a fold
 | 
			
		||||
    // the end of the line may be before the start of the displayed part.
 | 
			
		||||
    if (wlv.vcol < start_col && (wp->w_p_cuc
 | 
			
		||||
                                 || wlv.color_cols
 | 
			
		||||
                                 || virtual_active(wp)
 | 
			
		||||
                                 || (VIsual_active && wp->w_buffer == curwin->w_buffer))) {
 | 
			
		||||
                                 || (VIsual_active && wp->w_buffer == curwin->w_buffer)
 | 
			
		||||
                                 || has_fold)) {
 | 
			
		||||
      wlv.vcol = start_col;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -1899,6 +1903,7 @@ int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, int col_rows, b
 | 
			
		||||
      wlv.n_extra = (int)strlen(wlv.p_extra);
 | 
			
		||||
 | 
			
		||||
      if (wlv.p_extra != buf_fold) {
 | 
			
		||||
        assert(foldtext_free == NULL);
 | 
			
		||||
        foldtext_free = wlv.p_extra;
 | 
			
		||||
      }
 | 
			
		||||
      wlv.sc_extra = NUL;
 | 
			
		||||
 
 | 
			
		||||
@@ -1593,6 +1593,45 @@ describe('folded lines', function()
 | 
			
		||||
                                                       |
 | 
			
		||||
        ]])
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      eq({ 0, 1, 2, 0, 2 }, fn.getcurpos())
 | 
			
		||||
      api.nvim_input_mouse('left', 'press', '', multigrid and 2 or 0, 2, 4)
 | 
			
		||||
      eq({ 0, 3, 2, 0, 2 }, fn.getcurpos())
 | 
			
		||||
      feed('2k')
 | 
			
		||||
      eq({ 0, 1, 2, 0, 2 }, fn.getcurpos())
 | 
			
		||||
 | 
			
		||||
      api.nvim_set_option_value('foldtext', "'αβγ'", { win = 0 })
 | 
			
		||||
      -- No crash or memory leak when scrolling beyond end of folded line #33931
 | 
			
		||||
      fn.append('$', ('!'):rep(100))
 | 
			
		||||
      feed('G$')
 | 
			
		||||
      if multigrid then
 | 
			
		||||
        screen:expect([[
 | 
			
		||||
        ## grid 1
 | 
			
		||||
          [2:---------------------------------------------]|*7
 | 
			
		||||
          [3:---------------------------------------------]|
 | 
			
		||||
        ## grid 2
 | 
			
		||||
          {8:  1 }                                         |
 | 
			
		||||
          {8:  2 }                                         |
 | 
			
		||||
          {8:  3 }{5:αβγ······································}|
 | 
			
		||||
          {8:  5 }                                         |
 | 
			
		||||
          {8:  6 }                                         |
 | 
			
		||||
          {8:  7 }!!!!!!!!!!!!!!!!!!!!^!                    |
 | 
			
		||||
          {1:~                                            }|
 | 
			
		||||
        ## grid 3
 | 
			
		||||
                                                       |
 | 
			
		||||
        ]])
 | 
			
		||||
      else
 | 
			
		||||
        screen:expect([[
 | 
			
		||||
          {8:  1 }                                         |
 | 
			
		||||
          {8:  2 }                                         |
 | 
			
		||||
          {8:  3 }{5:αβγ······································}|
 | 
			
		||||
          {8:  5 }                                         |
 | 
			
		||||
          {8:  6 }                                         |
 | 
			
		||||
          {8:  7 }!!!!!!!!!!!!!!!!!!!!^!                    |
 | 
			
		||||
          {1:~                                            }|
 | 
			
		||||
                                                       |
 | 
			
		||||
        ]])
 | 
			
		||||
      end
 | 
			
		||||
    end)
 | 
			
		||||
 | 
			
		||||
    it('fold attached virtual lines are drawn and scrolled correctly #21837', function()
 | 
			
		||||
@@ -2624,8 +2663,6 @@ describe('folded lines', function()
 | 
			
		||||
      screen:try_resize(30, 7)
 | 
			
		||||
      insert(content1)
 | 
			
		||||
      command('hi! CursorLine guibg=NONE guifg=Red gui=NONE')
 | 
			
		||||
      command('hi F0 guibg=Red guifg=Black')
 | 
			
		||||
      command('hi F1 guifg=White')
 | 
			
		||||
      command([[syn match Keyword /\<sentence\>/]])
 | 
			
		||||
      command('hi! Keyword guibg=NONE guifg=Green')
 | 
			
		||||
      api.nvim_set_option_value('cursorline', true, {})
 | 
			
		||||
@@ -2734,6 +2771,63 @@ describe('folded lines', function()
 | 
			
		||||
          {11:-- VISUAL LINE --}             |
 | 
			
		||||
        ]])
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      api.nvim_set_option_value('rightleft', false, {})
 | 
			
		||||
      api.nvim_set_option_value('wrap', false, {})
 | 
			
		||||
      feed('<Esc>zl')
 | 
			
		||||
      if multigrid then
 | 
			
		||||
        screen:expect([[
 | 
			
		||||
        ## grid 1
 | 
			
		||||
          [2:------------------------------]|*6
 | 
			
		||||
          [3:------------------------------]|
 | 
			
		||||
        ## grid 2
 | 
			
		||||
          {7:    }his is a                  |
 | 
			
		||||
          {7:-   }{12:^alid English              }|
 | 
			
		||||
          {7:│+  }{21:entence}{5: composed by·······}|
 | 
			
		||||
          {7:│+  }{5:n his cave.···············}|
 | 
			
		||||
          {1:~                             }|*2
 | 
			
		||||
        ## grid 3
 | 
			
		||||
                                        |
 | 
			
		||||
        ]])
 | 
			
		||||
      else
 | 
			
		||||
        screen:expect([[
 | 
			
		||||
          {7:    }his is a                  |
 | 
			
		||||
          {7:-   }{12:^alid English              }|
 | 
			
		||||
          {7:│+  }{21:entence}{5: composed by·······}|
 | 
			
		||||
          {7:│+  }{5:n his cave.···············}|
 | 
			
		||||
          {1:~                             }|*2
 | 
			
		||||
                                        |
 | 
			
		||||
        ]])
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      fn.append(0, ('!'):rep(15))
 | 
			
		||||
      feed('gg$zs')
 | 
			
		||||
      if multigrid then
 | 
			
		||||
        screen:expect([[
 | 
			
		||||
        ## grid 1
 | 
			
		||||
          [2:------------------------------]|*6
 | 
			
		||||
          [3:------------------------------]|
 | 
			
		||||
        ## grid 2
 | 
			
		||||
          {7:    }{12:^!                         }|
 | 
			
		||||
          {7:    }                          |
 | 
			
		||||
          {7:-   }                          |
 | 
			
		||||
          {7:│+  }{5:sed by····················}|
 | 
			
		||||
          {7:│+  }{5:··························}|
 | 
			
		||||
          {1:~                             }|
 | 
			
		||||
        ## grid 3
 | 
			
		||||
                                        |
 | 
			
		||||
        ]])
 | 
			
		||||
      else
 | 
			
		||||
        screen:expect([[
 | 
			
		||||
          {7:    }{12:^!                         }|
 | 
			
		||||
          {7:    }                          |
 | 
			
		||||
          {7:-   }                          |
 | 
			
		||||
          {7:│+  }{5:sed by····················}|
 | 
			
		||||
          {7:│+  }{5:··························}|
 | 
			
		||||
          {1:~                             }|
 | 
			
		||||
                                        |
 | 
			
		||||
        ]])
 | 
			
		||||
      end
 | 
			
		||||
    end)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user