mirror of
				https://github.com/neovim/neovim.git
				synced 2025-11-04 09:44:31 +00:00 
			
		
		
		
	fix(plines): folded lines with virt_lines attached to line above
This commit is contained in:
		@@ -1090,6 +1090,7 @@ void textpos2screenpos(win_T *wp, pos_T *pos, int *rowp, int *scolp, int *ccolp,
 | 
			
		||||
      row += local ? 0 : wp->w_winrow + wp->w_winrow_off;
 | 
			
		||||
      coloff = (local ? 0 : wp->w_wincol + wp->w_wincol_off) + 1 + off;
 | 
			
		||||
    } else {
 | 
			
		||||
      assert(lnum == pos->lnum);
 | 
			
		||||
      getvcol(wp, pos, &scol, &ccol, &ecol);
 | 
			
		||||
 | 
			
		||||
      // similar to what is done in validate_cursor_col()
 | 
			
		||||
 
 | 
			
		||||
@@ -38,8 +38,7 @@
 | 
			
		||||
/// @param winheight when true limit to window height
 | 
			
		||||
int plines_win(win_T *wp, linenr_T lnum, bool winheight)
 | 
			
		||||
{
 | 
			
		||||
  // Check for filler lines above this buffer line.  When folded the result
 | 
			
		||||
  // is one line anyway.
 | 
			
		||||
  // Check for filler lines above this buffer line.
 | 
			
		||||
  return plines_win_nofill(wp, lnum, winheight) + win_get_fill(wp, lnum);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -199,16 +198,12 @@ int plines_win_col(win_T *wp, linenr_T lnum, long column)
 | 
			
		||||
int plines_win_full(win_T *wp, linenr_T lnum, linenr_T *const nextp, bool *const foldedp,
 | 
			
		||||
                    const bool cache, const bool winheight)
 | 
			
		||||
{
 | 
			
		||||
  bool folded = hasFoldingWin(wp, lnum, NULL, nextp, cache, NULL);
 | 
			
		||||
  if (foldedp) {
 | 
			
		||||
  bool folded = hasFoldingWin(wp, lnum, &lnum, nextp, cache, NULL);
 | 
			
		||||
  if (foldedp != NULL) {
 | 
			
		||||
    *foldedp = folded;
 | 
			
		||||
  }
 | 
			
		||||
  if (folded) {
 | 
			
		||||
    return 1;
 | 
			
		||||
  } else if (lnum == wp->w_topline) {
 | 
			
		||||
    return plines_win_nofill(wp, lnum, winheight) + wp->w_topfill;
 | 
			
		||||
  }
 | 
			
		||||
  return plines_win(wp, lnum, winheight);
 | 
			
		||||
  return ((folded ? 1 : plines_win_nofill(wp, lnum, winheight)) +
 | 
			
		||||
          (lnum == wp->w_topline ? wp->w_topfill : win_get_fill(wp, lnum)));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int plines_m_win(win_T *wp, linenr_T first, linenr_T last)
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,6 @@ local insert = helpers.insert
 | 
			
		||||
local funcs = helpers.funcs
 | 
			
		||||
local meths = helpers.meths
 | 
			
		||||
local exec = helpers.exec
 | 
			
		||||
local exec_lua = helpers.exec_lua
 | 
			
		||||
local assert_alive = helpers.assert_alive
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -1911,19 +1910,17 @@ describe("folded lines", function()
 | 
			
		||||
      end
 | 
			
		||||
    end)
 | 
			
		||||
 | 
			
		||||
    it('fold attached virtual lines are drawn correctly #21837', function()
 | 
			
		||||
    it('fold attached virtual lines are drawn and scrolled correctly #21837', function()
 | 
			
		||||
      funcs.setline(1, 'line 1')
 | 
			
		||||
      funcs.setline(2, 'line 2')
 | 
			
		||||
      funcs.setline(3, 'line 3')
 | 
			
		||||
      funcs.setline(4, 'line 4')
 | 
			
		||||
      feed("zfj")
 | 
			
		||||
      exec_lua([[
 | 
			
		||||
        local ns = vim.api.nvim_create_namespace("ns")
 | 
			
		||||
        vim.api.nvim_buf_set_extmark(0, ns, 0, 0, { virt_lines_above = true, virt_lines = {{{"virt_line above line 1", ""}}} })
 | 
			
		||||
        vim.api.nvim_buf_set_extmark(0, ns, 1, 0, { virt_lines = {{{"virt_line below line 2", ""}}} })
 | 
			
		||||
        vim.api.nvim_buf_set_extmark(0, ns, 2, 0, { virt_lines_above = true, virt_lines = {{{"virt_line above line 3", ""}}} })
 | 
			
		||||
        vim.api.nvim_buf_set_extmark(0, ns, 3, 0, { virt_lines = {{{"virt_line below line 4", ""}}} })
 | 
			
		||||
      ]])
 | 
			
		||||
      local ns = meths.create_namespace('ns')
 | 
			
		||||
      meths.buf_set_extmark(0, ns, 0, 0, { virt_lines_above = true, virt_lines = {{{"virt_line above line 1", ""}}} })
 | 
			
		||||
      meths.buf_set_extmark(0, ns, 1, 0, { virt_lines = {{{"virt_line below line 2", ""}}} })
 | 
			
		||||
      meths.buf_set_extmark(0, ns, 2, 0, { virt_lines_above = true, virt_lines = {{{"virt_line above line 3", ""}}} })
 | 
			
		||||
      meths.buf_set_extmark(0, ns, 3, 0, { virt_lines = {{{"virt_line below line 4", ""}}} })
 | 
			
		||||
      if multigrid then
 | 
			
		||||
        screen:expect([[
 | 
			
		||||
        ## grid 1
 | 
			
		||||
@@ -2031,6 +2028,223 @@ describe("folded lines", function()
 | 
			
		||||
                                                       |
 | 
			
		||||
        ]])
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      meths.buf_set_extmark(0, ns, 1, 0, { virt_lines = {{{"more virt_line below line 2", ""}}} })
 | 
			
		||||
      feed('G<C-E>')
 | 
			
		||||
      if multigrid then
 | 
			
		||||
        screen:expect([[
 | 
			
		||||
        ## grid 1
 | 
			
		||||
          [2:---------------------------------------------]|
 | 
			
		||||
          [2:---------------------------------------------]|
 | 
			
		||||
          [2:---------------------------------------------]|
 | 
			
		||||
          [2:---------------------------------------------]|
 | 
			
		||||
          [2:---------------------------------------------]|
 | 
			
		||||
          [2:---------------------------------------------]|
 | 
			
		||||
          [2:---------------------------------------------]|
 | 
			
		||||
          [3:---------------------------------------------]|
 | 
			
		||||
        ## grid 2
 | 
			
		||||
          line 1                                       |
 | 
			
		||||
          line 2                                       |
 | 
			
		||||
          virt_line below line 2                       |
 | 
			
		||||
          more virt_line below line 2                  |
 | 
			
		||||
          {5:+--  2 lines: line 3·························}|
 | 
			
		||||
          ^line 5                                       |
 | 
			
		||||
          {1:~                                            }|
 | 
			
		||||
        ## grid 3
 | 
			
		||||
                                                       |
 | 
			
		||||
        ]])
 | 
			
		||||
      else
 | 
			
		||||
        screen:expect([[
 | 
			
		||||
          line 1                                       |
 | 
			
		||||
          line 2                                       |
 | 
			
		||||
          virt_line below line 2                       |
 | 
			
		||||
          more virt_line below line 2                  |
 | 
			
		||||
          {5:+--  2 lines: line 3·························}|
 | 
			
		||||
          ^line 5                                       |
 | 
			
		||||
          {1:~                                            }|
 | 
			
		||||
                                                       |
 | 
			
		||||
        ]])
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      feed('<C-E>')
 | 
			
		||||
      if multigrid then
 | 
			
		||||
        screen:expect([[
 | 
			
		||||
        ## grid 1
 | 
			
		||||
          [2:---------------------------------------------]|
 | 
			
		||||
          [2:---------------------------------------------]|
 | 
			
		||||
          [2:---------------------------------------------]|
 | 
			
		||||
          [2:---------------------------------------------]|
 | 
			
		||||
          [2:---------------------------------------------]|
 | 
			
		||||
          [2:---------------------------------------------]|
 | 
			
		||||
          [2:---------------------------------------------]|
 | 
			
		||||
          [3:---------------------------------------------]|
 | 
			
		||||
        ## grid 2
 | 
			
		||||
          line 2                                       |
 | 
			
		||||
          virt_line below line 2                       |
 | 
			
		||||
          more virt_line below line 2                  |
 | 
			
		||||
          {5:+--  2 lines: line 3·························}|
 | 
			
		||||
          ^line 5                                       |
 | 
			
		||||
          {1:~                                            }|
 | 
			
		||||
          {1:~                                            }|
 | 
			
		||||
        ## grid 3
 | 
			
		||||
                                                       |
 | 
			
		||||
        ]])
 | 
			
		||||
      else
 | 
			
		||||
        screen:expect([[
 | 
			
		||||
          line 2                                       |
 | 
			
		||||
          virt_line below line 2                       |
 | 
			
		||||
          more virt_line below line 2                  |
 | 
			
		||||
          {5:+--  2 lines: line 3·························}|
 | 
			
		||||
          ^line 5                                       |
 | 
			
		||||
          {1:~                                            }|
 | 
			
		||||
          {1:~                                            }|
 | 
			
		||||
                                                       |
 | 
			
		||||
        ]])
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      feed('<C-E>')
 | 
			
		||||
      if multigrid then
 | 
			
		||||
        screen:expect([[
 | 
			
		||||
        ## grid 1
 | 
			
		||||
          [2:---------------------------------------------]|
 | 
			
		||||
          [2:---------------------------------------------]|
 | 
			
		||||
          [2:---------------------------------------------]|
 | 
			
		||||
          [2:---------------------------------------------]|
 | 
			
		||||
          [2:---------------------------------------------]|
 | 
			
		||||
          [2:---------------------------------------------]|
 | 
			
		||||
          [2:---------------------------------------------]|
 | 
			
		||||
          [3:---------------------------------------------]|
 | 
			
		||||
        ## grid 2
 | 
			
		||||
          virt_line below line 2                       |
 | 
			
		||||
          more virt_line below line 2                  |
 | 
			
		||||
          {5:+--  2 lines: line 3·························}|
 | 
			
		||||
          ^line 5                                       |
 | 
			
		||||
          {1:~                                            }|
 | 
			
		||||
          {1:~                                            }|
 | 
			
		||||
          {1:~                                            }|
 | 
			
		||||
        ## grid 3
 | 
			
		||||
                                                       |
 | 
			
		||||
        ]])
 | 
			
		||||
      else
 | 
			
		||||
        screen:expect([[
 | 
			
		||||
          virt_line below line 2                       |
 | 
			
		||||
          more virt_line below line 2                  |
 | 
			
		||||
          {5:+--  2 lines: line 3·························}|
 | 
			
		||||
          ^line 5                                       |
 | 
			
		||||
          {1:~                                            }|
 | 
			
		||||
          {1:~                                            }|
 | 
			
		||||
          {1:~                                            }|
 | 
			
		||||
                                                       |
 | 
			
		||||
        ]])
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      feed('<C-E>')
 | 
			
		||||
      if multigrid then
 | 
			
		||||
        screen:expect([[
 | 
			
		||||
        ## grid 1
 | 
			
		||||
          [2:---------------------------------------------]|
 | 
			
		||||
          [2:---------------------------------------------]|
 | 
			
		||||
          [2:---------------------------------------------]|
 | 
			
		||||
          [2:---------------------------------------------]|
 | 
			
		||||
          [2:---------------------------------------------]|
 | 
			
		||||
          [2:---------------------------------------------]|
 | 
			
		||||
          [2:---------------------------------------------]|
 | 
			
		||||
          [3:---------------------------------------------]|
 | 
			
		||||
        ## grid 2
 | 
			
		||||
          more virt_line below line 2                  |
 | 
			
		||||
          {5:+--  2 lines: line 3·························}|
 | 
			
		||||
          ^line 5                                       |
 | 
			
		||||
          {1:~                                            }|
 | 
			
		||||
          {1:~                                            }|
 | 
			
		||||
          {1:~                                            }|
 | 
			
		||||
          {1:~                                            }|
 | 
			
		||||
        ## grid 3
 | 
			
		||||
                                                       |
 | 
			
		||||
        ]])
 | 
			
		||||
      else
 | 
			
		||||
        screen:expect([[
 | 
			
		||||
          more virt_line below line 2                  |
 | 
			
		||||
          {5:+--  2 lines: line 3·························}|
 | 
			
		||||
          ^line 5                                       |
 | 
			
		||||
          {1:~                                            }|
 | 
			
		||||
          {1:~                                            }|
 | 
			
		||||
          {1:~                                            }|
 | 
			
		||||
          {1:~                                            }|
 | 
			
		||||
                                                       |
 | 
			
		||||
        ]])
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      feed('<C-E>')
 | 
			
		||||
      if multigrid then
 | 
			
		||||
        screen:expect([[
 | 
			
		||||
        ## grid 1
 | 
			
		||||
          [2:---------------------------------------------]|
 | 
			
		||||
          [2:---------------------------------------------]|
 | 
			
		||||
          [2:---------------------------------------------]|
 | 
			
		||||
          [2:---------------------------------------------]|
 | 
			
		||||
          [2:---------------------------------------------]|
 | 
			
		||||
          [2:---------------------------------------------]|
 | 
			
		||||
          [2:---------------------------------------------]|
 | 
			
		||||
          [3:---------------------------------------------]|
 | 
			
		||||
        ## grid 2
 | 
			
		||||
          {5:+--  2 lines: line 3·························}|
 | 
			
		||||
          ^line 5                                       |
 | 
			
		||||
          {1:~                                            }|
 | 
			
		||||
          {1:~                                            }|
 | 
			
		||||
          {1:~                                            }|
 | 
			
		||||
          {1:~                                            }|
 | 
			
		||||
          {1:~                                            }|
 | 
			
		||||
        ## grid 3
 | 
			
		||||
                                                       |
 | 
			
		||||
        ]])
 | 
			
		||||
      else
 | 
			
		||||
        screen:expect([[
 | 
			
		||||
          {5:+--  2 lines: line 3·························}|
 | 
			
		||||
          ^line 5                                       |
 | 
			
		||||
          {1:~                                            }|
 | 
			
		||||
          {1:~                                            }|
 | 
			
		||||
          {1:~                                            }|
 | 
			
		||||
          {1:~                                            }|
 | 
			
		||||
          {1:~                                            }|
 | 
			
		||||
                                                       |
 | 
			
		||||
        ]])
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      feed('<C-E>')
 | 
			
		||||
      if multigrid then
 | 
			
		||||
        screen:expect([[
 | 
			
		||||
        ## grid 1
 | 
			
		||||
          [2:---------------------------------------------]|
 | 
			
		||||
          [2:---------------------------------------------]|
 | 
			
		||||
          [2:---------------------------------------------]|
 | 
			
		||||
          [2:---------------------------------------------]|
 | 
			
		||||
          [2:---------------------------------------------]|
 | 
			
		||||
          [2:---------------------------------------------]|
 | 
			
		||||
          [2:---------------------------------------------]|
 | 
			
		||||
          [3:---------------------------------------------]|
 | 
			
		||||
        ## grid 2
 | 
			
		||||
          ^line 5                                       |
 | 
			
		||||
          {1:~                                            }|
 | 
			
		||||
          {1:~                                            }|
 | 
			
		||||
          {1:~                                            }|
 | 
			
		||||
          {1:~                                            }|
 | 
			
		||||
          {1:~                                            }|
 | 
			
		||||
          {1:~                                            }|
 | 
			
		||||
        ## grid 3
 | 
			
		||||
                                                       |
 | 
			
		||||
        ]])
 | 
			
		||||
      else
 | 
			
		||||
        screen:expect([[
 | 
			
		||||
          ^line 5                                       |
 | 
			
		||||
          {1:~                                            }|
 | 
			
		||||
          {1:~                                            }|
 | 
			
		||||
          {1:~                                            }|
 | 
			
		||||
          {1:~                                            }|
 | 
			
		||||
          {1:~                                            }|
 | 
			
		||||
          {1:~                                            }|
 | 
			
		||||
                                                       |
 | 
			
		||||
        ]])
 | 
			
		||||
      end
 | 
			
		||||
    end)
 | 
			
		||||
 | 
			
		||||
    it('Folded and Visual highlights are combined #19691', function()
 | 
			
		||||
 
 | 
			
		||||
@@ -1,12 +1,12 @@
 | 
			
		||||
local helpers = require('test.functional.helpers')(after_each)
 | 
			
		||||
local clear, eq, meths = helpers.clear, helpers.eq, helpers.meths
 | 
			
		||||
local command, funcs = helpers.command, helpers.funcs
 | 
			
		||||
local feed = helpers.feed
 | 
			
		||||
 | 
			
		||||
before_each(clear)
 | 
			
		||||
 | 
			
		||||
describe('screenpos() function', function()
 | 
			
		||||
  it('works in floating window with border', function()
 | 
			
		||||
    local bufnr = meths.create_buf(false, true)
 | 
			
		||||
    local opts = {
 | 
			
		||||
      relative='editor',
 | 
			
		||||
      height=8,
 | 
			
		||||
@@ -18,34 +18,56 @@ describe('screenpos() function', function()
 | 
			
		||||
      border='none',
 | 
			
		||||
      focusable=1
 | 
			
		||||
    }
 | 
			
		||||
    local float = meths.open_win(bufnr, false, opts)
 | 
			
		||||
    local float = meths.open_win(meths.create_buf(false, true), false, opts)
 | 
			
		||||
    command('redraw')
 | 
			
		||||
    local pos = funcs.screenpos(bufnr, 1, 1)
 | 
			
		||||
    eq(7, pos.row)
 | 
			
		||||
    eq(9, pos.col)
 | 
			
		||||
    eq({row = 7, col = 9, endcol = 9, curscol = 9}, funcs.screenpos(float, 1, 1))
 | 
			
		||||
 | 
			
		||||
    -- only left border
 | 
			
		||||
    opts.border = {'', '', '', '', '', '', '', '|'}
 | 
			
		||||
    meths.win_set_config(float, opts)
 | 
			
		||||
    command('redraw')
 | 
			
		||||
    pos = funcs.screenpos(bufnr, 1, 1)
 | 
			
		||||
    eq(7, pos.row)
 | 
			
		||||
    eq(10, pos.col)
 | 
			
		||||
    eq({row = 7, col = 10, endcol = 10, curscol = 10}, funcs.screenpos(float, 1, 1))
 | 
			
		||||
 | 
			
		||||
    -- only top border
 | 
			
		||||
    opts.border = {'', '_', '', '', '', '', '', ''}
 | 
			
		||||
    meths.win_set_config(float, opts)
 | 
			
		||||
    command('redraw')
 | 
			
		||||
    pos = funcs.screenpos(bufnr, 1, 1)
 | 
			
		||||
    eq(8, pos.row)
 | 
			
		||||
    eq(9, pos.col)
 | 
			
		||||
    eq({row = 8, col = 9, endcol = 9, curscol = 9}, funcs.screenpos(float, 1, 1))
 | 
			
		||||
 | 
			
		||||
    -- both left and top border
 | 
			
		||||
    opts.border = 'single'
 | 
			
		||||
    meths.win_set_config(float, opts)
 | 
			
		||||
    command('redraw')
 | 
			
		||||
    pos = funcs.screenpos(bufnr, 1, 1)
 | 
			
		||||
    eq(8, pos.row)
 | 
			
		||||
    eq(10, pos.col)
 | 
			
		||||
    eq({row = 8, col = 10, endcol = 10, curscol = 10}, funcs.screenpos(float, 1, 1))
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('works for folded line with virt_lines attached to line above', function()
 | 
			
		||||
    meths.buf_set_lines(0, 0, -1, true, {'aaa', 'bbb', 'ccc', 'ddd'})
 | 
			
		||||
    local ns = meths.create_namespace('')
 | 
			
		||||
    meths.buf_set_extmark(0, ns, 0, 0, { virt_lines = {{{'abb'}}, {{'acc'}}, {{'add'}}} })
 | 
			
		||||
    command('2,3fold')
 | 
			
		||||
    eq({row = 5, col = 1, endcol = 1, curscol = 1}, funcs.screenpos(0, 2, 1))
 | 
			
		||||
    eq({row = 5, col = 1, endcol = 1, curscol = 1}, funcs.screenpos(0, 3, 1))
 | 
			
		||||
    eq({row = 6, col = 1, endcol = 1, curscol = 1}, funcs.screenpos(0, 4, 1))
 | 
			
		||||
 | 
			
		||||
    feed('<C-E>')
 | 
			
		||||
    eq({row = 4, col = 1, endcol = 1, curscol = 1}, funcs.screenpos(0, 2, 1))
 | 
			
		||||
    eq({row = 4, col = 1, endcol = 1, curscol = 1}, funcs.screenpos(0, 3, 1))
 | 
			
		||||
    eq({row = 5, col = 1, endcol = 1, curscol = 1}, funcs.screenpos(0, 4, 1))
 | 
			
		||||
 | 
			
		||||
    feed('<C-E>')
 | 
			
		||||
    eq({row = 3, col = 1, endcol = 1, curscol = 1}, funcs.screenpos(0, 2, 1))
 | 
			
		||||
    eq({row = 3, col = 1, endcol = 1, curscol = 1}, funcs.screenpos(0, 3, 1))
 | 
			
		||||
    eq({row = 4, col = 1, endcol = 1, curscol = 1}, funcs.screenpos(0, 4, 1))
 | 
			
		||||
 | 
			
		||||
    feed('<C-E>')
 | 
			
		||||
    eq({row = 2, col = 1, endcol = 1, curscol = 1}, funcs.screenpos(0, 2, 1))
 | 
			
		||||
    eq({row = 2, col = 1, endcol = 1, curscol = 1}, funcs.screenpos(0, 3, 1))
 | 
			
		||||
    eq({row = 3, col = 1, endcol = 1, curscol = 1}, funcs.screenpos(0, 4, 1))
 | 
			
		||||
 | 
			
		||||
    feed('<C-E>')
 | 
			
		||||
    eq({row = 1, col = 1, endcol = 1, curscol = 1}, funcs.screenpos(0, 2, 1))
 | 
			
		||||
    eq({row = 1, col = 1, endcol = 1, curscol = 1}, funcs.screenpos(0, 3, 1))
 | 
			
		||||
    eq({row = 2, col = 1, endcol = 1, curscol = 1}, funcs.screenpos(0, 4, 1))
 | 
			
		||||
  end)
 | 
			
		||||
end)
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user