mirror of
				https://github.com/neovim/neovim.git
				synced 2025-11-04 01:34:25 +00:00 
			
		
		
		
	Before calling "attach" a screen object is just a dummy container for (row, col) values whose purpose is to be sent as part of the "attach" function call anyway. Just create the screen in an attached state directly. Keep the complete (row, col, options) config together. It is still completely valid to later detach and re-attach as needed, including to another session.
		
			
				
	
	
		
			442 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			442 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
local t = require('test.testutil')
 | 
						|
local n = require('test.functional.testnvim')()
 | 
						|
local clear = n.clear
 | 
						|
local Screen = require('test.functional.ui.screen')
 | 
						|
 | 
						|
before_each(clear)
 | 
						|
 | 
						|
describe('Scrollbind', function()
 | 
						|
  local screen --- @type test.functional.ui.screen
 | 
						|
 | 
						|
  before_each(function()
 | 
						|
    screen = Screen.new(40, 12)
 | 
						|
  end)
 | 
						|
 | 
						|
  it('works with one buffer with virtual lines', function()
 | 
						|
    n.exec_lua(function()
 | 
						|
      local lines = {} --- @type string[]
 | 
						|
 | 
						|
      for i = 1, 20 do
 | 
						|
        lines[i] = tostring(i * 2 - 1)
 | 
						|
      end
 | 
						|
 | 
						|
      local ns = vim.api.nvim_create_namespace('test')
 | 
						|
 | 
						|
      vim.api.nvim_buf_set_lines(0, 0, -1, false, lines)
 | 
						|
      vim.bo.buftype = 'nofile'
 | 
						|
 | 
						|
      for i in ipairs(lines) do
 | 
						|
        vim.api.nvim_buf_set_extmark(0, ns, i - 1, 0, {
 | 
						|
          virt_lines = { { { tostring(2 * i) .. ' v' } } },
 | 
						|
        })
 | 
						|
      end
 | 
						|
 | 
						|
      vim.wo.scrollbind = true
 | 
						|
      vim.cmd.vsplit()
 | 
						|
      vim.wo.scrollbind = true
 | 
						|
    end)
 | 
						|
 | 
						|
    n.feed('<C-d>')
 | 
						|
 | 
						|
    t.eq(5, n.api.nvim_get_option_value('scroll', {}))
 | 
						|
 | 
						|
    screen:expect({
 | 
						|
      grid = [[
 | 
						|
        6 v                 │6 v                |
 | 
						|
        7                   │7                  |
 | 
						|
        8 v                 │8 v                |
 | 
						|
        9                   │9                  |
 | 
						|
        10 v                │10 v               |
 | 
						|
        ^11                  │11                 |
 | 
						|
        12 v                │12 v               |
 | 
						|
        13                  │13                 |
 | 
						|
        14 v                │14 v               |
 | 
						|
        15                  │15                 |
 | 
						|
        {3:[Scratch]            }{2:[Scratch]          }|
 | 
						|
                                                |
 | 
						|
      ]],
 | 
						|
    })
 | 
						|
 | 
						|
    n.feed('<C-u>')
 | 
						|
 | 
						|
    local line1_grid = [[
 | 
						|
      ^1                   │1                  |
 | 
						|
      2 v                 │2 v                |
 | 
						|
      3                   │3                  |
 | 
						|
      4 v                 │4 v                |
 | 
						|
      5                   │5                  |
 | 
						|
      6 v                 │6 v                |
 | 
						|
      7                   │7                  |
 | 
						|
      8 v                 │8 v                |
 | 
						|
      9                   │9                  |
 | 
						|
      10 v                │10 v               |
 | 
						|
      {3:[Scratch]            }{2:[Scratch]          }|
 | 
						|
                                              |
 | 
						|
    ]]
 | 
						|
 | 
						|
    screen:expect({ grid = line1_grid })
 | 
						|
 | 
						|
    n.api.nvim_set_option_value('scroll', 6, {})
 | 
						|
 | 
						|
    n.feed('<C-d>')
 | 
						|
 | 
						|
    screen:expect({
 | 
						|
      grid = [[
 | 
						|
        7                   │7                  |
 | 
						|
        8 v                 │8 v                |
 | 
						|
        9                   │9                  |
 | 
						|
        10 v                │10 v               |
 | 
						|
        11                  │11                 |
 | 
						|
        12 v                │12 v               |
 | 
						|
        ^13                  │13                 |
 | 
						|
        14 v                │14 v               |
 | 
						|
        15                  │15                 |
 | 
						|
        16 v                │16 v               |
 | 
						|
        {3:[Scratch]            }{2:[Scratch]          }|
 | 
						|
                                                |
 | 
						|
      ]],
 | 
						|
    })
 | 
						|
 | 
						|
    n.feed('<C-u>')
 | 
						|
 | 
						|
    screen:expect({ grid = line1_grid })
 | 
						|
  end)
 | 
						|
 | 
						|
  it('works with two buffers with virtual lines on one side', function()
 | 
						|
    n.exec_lua(function()
 | 
						|
      local lines = {} --- @type string[]
 | 
						|
 | 
						|
      for i = 1, 20 do
 | 
						|
        lines[i] = tostring(i)
 | 
						|
      end
 | 
						|
 | 
						|
      local ns = vim.api.nvim_create_namespace('test')
 | 
						|
 | 
						|
      vim.api.nvim_buf_set_lines(0, 0, -1, false, lines)
 | 
						|
      vim.bo.buftype = 'nofile'
 | 
						|
 | 
						|
      vim.wo.scrollbind = true
 | 
						|
      vim.cmd.vnew()
 | 
						|
 | 
						|
      lines = {} --- @type string[]
 | 
						|
 | 
						|
      for i = 1, 20 do
 | 
						|
        lines[i] = tostring(i + (i > 3 and 4 or 0))
 | 
						|
      end
 | 
						|
      vim.api.nvim_buf_set_lines(0, 0, -1, false, lines)
 | 
						|
      vim.bo.buftype = 'nofile'
 | 
						|
 | 
						|
      vim.api.nvim_buf_set_extmark(0, ns, 2, 0, {
 | 
						|
        virt_lines = {
 | 
						|
          { { '4 v' } },
 | 
						|
          { { '5 v' } },
 | 
						|
          { { '6 v' } },
 | 
						|
          { { '7 v' } },
 | 
						|
        },
 | 
						|
      })
 | 
						|
 | 
						|
      vim.wo.scrollbind = true
 | 
						|
    end)
 | 
						|
 | 
						|
    n.feed('<C-d>')
 | 
						|
 | 
						|
    t.eq(5, n.api.nvim_get_option_value('scroll', {}))
 | 
						|
 | 
						|
    screen:expect({
 | 
						|
      grid = [[
 | 
						|
        6 v                 │6                  |
 | 
						|
        7 v                 │7                  |
 | 
						|
        8                   │8                  |
 | 
						|
        9                   │9                  |
 | 
						|
        ^10                  │10                 |
 | 
						|
        11                  │11                 |
 | 
						|
        12                  │12                 |
 | 
						|
        13                  │13                 |
 | 
						|
        14                  │14                 |
 | 
						|
        15                  │15                 |
 | 
						|
        {3:[Scratch]            }{2:[Scratch]          }|
 | 
						|
                                                |
 | 
						|
      ]],
 | 
						|
    })
 | 
						|
 | 
						|
    n.feed('<C-u>')
 | 
						|
 | 
						|
    local line1_grid = [[
 | 
						|
      ^1                   │1                  |
 | 
						|
      2                   │2                  |
 | 
						|
      3                   │3                  |
 | 
						|
      4 v                 │4                  |
 | 
						|
      5 v                 │5                  |
 | 
						|
      6 v                 │6                  |
 | 
						|
      7 v                 │7                  |
 | 
						|
      8                   │8                  |
 | 
						|
      9                   │9                  |
 | 
						|
      10                  │10                 |
 | 
						|
      {3:[Scratch]            }{2:[Scratch]          }|
 | 
						|
                                              |
 | 
						|
    ]]
 | 
						|
 | 
						|
    screen:expect({ grid = line1_grid })
 | 
						|
 | 
						|
    n.api.nvim_set_option_value('scroll', 6, {})
 | 
						|
 | 
						|
    n.feed('<C-d>')
 | 
						|
 | 
						|
    screen:expect({
 | 
						|
      grid = [[
 | 
						|
        7 v                 │7                  |
 | 
						|
        8                   │8                  |
 | 
						|
        9                   │9                  |
 | 
						|
        10                  │10                 |
 | 
						|
        ^11                  │11                 |
 | 
						|
        12                  │12                 |
 | 
						|
        13                  │13                 |
 | 
						|
        14                  │14                 |
 | 
						|
        15                  │15                 |
 | 
						|
        16                  │16                 |
 | 
						|
        {3:[Scratch]            }{2:[Scratch]          }|
 | 
						|
                                                |
 | 
						|
      ]],
 | 
						|
    })
 | 
						|
 | 
						|
    n.feed('<C-u>')
 | 
						|
 | 
						|
    screen:expect({ grid = line1_grid })
 | 
						|
 | 
						|
    -- Note: not the same as n.feed('4<C-e>')
 | 
						|
    n.feed('<C-e>')
 | 
						|
    n.feed('<C-e>')
 | 
						|
    n.feed('<C-e>')
 | 
						|
    n.feed('<C-e>')
 | 
						|
 | 
						|
    screen:expect({
 | 
						|
      grid = [[
 | 
						|
        5 v                 │5                  |
 | 
						|
        6 v                 │6                  |
 | 
						|
        7 v                 │7                  |
 | 
						|
        ^8                   │8                  |
 | 
						|
        9                   │9                  |
 | 
						|
        10                  │10                 |
 | 
						|
        11                  │11                 |
 | 
						|
        12                  │12                 |
 | 
						|
        13                  │13                 |
 | 
						|
        14                  │14                 |
 | 
						|
        {3:[Scratch]            }{2:[Scratch]          }|
 | 
						|
                                                |
 | 
						|
      ]],
 | 
						|
    })
 | 
						|
 | 
						|
    n.feed('<C-e>')
 | 
						|
 | 
						|
    screen:expect({
 | 
						|
      grid = [[
 | 
						|
        6 v                 │6                  |
 | 
						|
        7 v                 │7                  |
 | 
						|
        ^8                   │8                  |
 | 
						|
        9                   │9                  |
 | 
						|
        10                  │10                 |
 | 
						|
        11                  │11                 |
 | 
						|
        12                  │12                 |
 | 
						|
        13                  │13                 |
 | 
						|
        14                  │14                 |
 | 
						|
        15                  │15                 |
 | 
						|
        {3:[Scratch]            }{2:[Scratch]          }|
 | 
						|
                                                |
 | 
						|
      ]],
 | 
						|
    })
 | 
						|
 | 
						|
    n.feed('<C-y>')
 | 
						|
    n.feed('<C-y>')
 | 
						|
 | 
						|
    screen:expect({
 | 
						|
      grid = [[
 | 
						|
        4 v                 │4                  |
 | 
						|
        5 v                 │5                  |
 | 
						|
        6 v                 │6                  |
 | 
						|
        7 v                 │7                  |
 | 
						|
        ^8                   │8                  |
 | 
						|
        9                   │9                  |
 | 
						|
        10                  │10                 |
 | 
						|
        11                  │11                 |
 | 
						|
        12                  │12                 |
 | 
						|
        13                  │13                 |
 | 
						|
        {3:[Scratch]            }{2:[Scratch]          }|
 | 
						|
                                                |
 | 
						|
      ]],
 | 
						|
    })
 | 
						|
  end)
 | 
						|
 | 
						|
  it('works with buffers of different lengths', function()
 | 
						|
    n.exec_lua(function()
 | 
						|
      vim.api.nvim_buf_set_lines(0, 0, -1, false, { '1', '2', '3' })
 | 
						|
      vim.bo.buftype = 'nofile'
 | 
						|
 | 
						|
      vim.wo.scrollbind = true
 | 
						|
      vim.cmd.vnew()
 | 
						|
 | 
						|
      local lines = {} --- @type string[]
 | 
						|
 | 
						|
      for i = 1, 50 do
 | 
						|
        lines[i] = tostring(i)
 | 
						|
      end
 | 
						|
 | 
						|
      vim.api.nvim_buf_set_lines(0, 0, -1, false, lines)
 | 
						|
      vim.bo.buftype = 'nofile'
 | 
						|
      vim.wo.scrollbind = true
 | 
						|
    end)
 | 
						|
 | 
						|
    n.feed('10<C-e>')
 | 
						|
 | 
						|
    screen:expect({
 | 
						|
      grid = [[
 | 
						|
        ^11                  │3                  |
 | 
						|
        12                  │{1:~                  }|
 | 
						|
        13                  │{1:~                  }|
 | 
						|
        14                  │{1:~                  }|
 | 
						|
        15                  │{1:~                  }|
 | 
						|
        16                  │{1:~                  }|
 | 
						|
        17                  │{1:~                  }|
 | 
						|
        18                  │{1:~                  }|
 | 
						|
        19                  │{1:~                  }|
 | 
						|
        20                  │{1:~                  }|
 | 
						|
        {3:[Scratch]            }{2:[Scratch]          }|
 | 
						|
                                                |
 | 
						|
      ]],
 | 
						|
    })
 | 
						|
 | 
						|
    n.feed('<C-y>')
 | 
						|
 | 
						|
    screen:expect({
 | 
						|
      grid = [[
 | 
						|
        10                  │3                  |
 | 
						|
        ^11                  │{1:~                  }|
 | 
						|
        12                  │{1:~                  }|
 | 
						|
        13                  │{1:~                  }|
 | 
						|
        14                  │{1:~                  }|
 | 
						|
        15                  │{1:~                  }|
 | 
						|
        16                  │{1:~                  }|
 | 
						|
        17                  │{1:~                  }|
 | 
						|
        18                  │{1:~                  }|
 | 
						|
        19                  │{1:~                  }|
 | 
						|
        {3:[Scratch]            }{2:[Scratch]          }|
 | 
						|
                                                |
 | 
						|
      ]],
 | 
						|
    })
 | 
						|
  end)
 | 
						|
 | 
						|
  it('works with buffers of different lengths and virtual lines', function()
 | 
						|
    n.exec_lua(function()
 | 
						|
      vim.api.nvim_buf_set_lines(0, 0, -1, false, { '1', '5', '6' })
 | 
						|
 | 
						|
      local ns = vim.api.nvim_create_namespace('test')
 | 
						|
      vim.api.nvim_buf_set_extmark(0, ns, 0, 0, {
 | 
						|
        virt_lines = {
 | 
						|
          { { '2 v' } },
 | 
						|
          { { '3 v' } },
 | 
						|
          { { '4 v' } },
 | 
						|
        },
 | 
						|
      })
 | 
						|
 | 
						|
      vim.bo.buftype = 'nofile'
 | 
						|
 | 
						|
      vim.wo.scrollbind = true
 | 
						|
      vim.cmd.vnew()
 | 
						|
 | 
						|
      local lines = {} --- @type string[]
 | 
						|
 | 
						|
      for i = 1, 50 do
 | 
						|
        lines[i] = tostring(i)
 | 
						|
      end
 | 
						|
 | 
						|
      vim.api.nvim_buf_set_lines(0, 0, -1, false, lines)
 | 
						|
      vim.bo.buftype = 'nofile'
 | 
						|
      vim.wo.scrollbind = true
 | 
						|
    end)
 | 
						|
 | 
						|
    n.feed('<C-e>')
 | 
						|
    n.feed('<C-e>')
 | 
						|
    screen:expect({
 | 
						|
      grid = [[
 | 
						|
        ^3                   │3 v                |
 | 
						|
        4                   │4 v                |
 | 
						|
        5                   │5                  |
 | 
						|
        6                   │6                  |
 | 
						|
        7                   │{1:~                  }|
 | 
						|
        8                   │{1:~                  }|
 | 
						|
        9                   │{1:~                  }|
 | 
						|
        10                  │{1:~                  }|
 | 
						|
        11                  │{1:~                  }|
 | 
						|
        12                  │{1:~                  }|
 | 
						|
        {3:[Scratch]            }{2:[Scratch]          }|
 | 
						|
                                                |
 | 
						|
      ]],
 | 
						|
    })
 | 
						|
 | 
						|
    n.feed('8<C-e>')
 | 
						|
 | 
						|
    screen:expect({
 | 
						|
      grid = [[
 | 
						|
        ^11                  │6                  |
 | 
						|
        12                  │{1:~                  }|
 | 
						|
        13                  │{1:~                  }|
 | 
						|
        14                  │{1:~                  }|
 | 
						|
        15                  │{1:~                  }|
 | 
						|
        16                  │{1:~                  }|
 | 
						|
        17                  │{1:~                  }|
 | 
						|
        18                  │{1:~                  }|
 | 
						|
        19                  │{1:~                  }|
 | 
						|
        20                  │{1:~                  }|
 | 
						|
        {3:[Scratch]            }{2:[Scratch]          }|
 | 
						|
                                                |
 | 
						|
      ]],
 | 
						|
    })
 | 
						|
 | 
						|
    n.feed('<C-y>')
 | 
						|
    n.feed('<C-y>')
 | 
						|
    n.feed('<C-y>')
 | 
						|
    n.feed('<C-y>')
 | 
						|
    n.feed('<C-y>')
 | 
						|
 | 
						|
    t.eq(n.exec_lua [[return vim.fn.line('w0', 1001)]], 6)
 | 
						|
    t.eq(n.exec_lua [[return vim.fn.line('w0', 1000)]], 3)
 | 
						|
 | 
						|
    screen:expect({
 | 
						|
      grid = [[
 | 
						|
        6                   │6                  |
 | 
						|
        7                   │{1:~                  }|
 | 
						|
        8                   │{1:~                  }|
 | 
						|
        9                   │{1:~                  }|
 | 
						|
        10                  │{1:~                  }|
 | 
						|
        ^11                  │{1:~                  }|
 | 
						|
        12                  │{1:~                  }|
 | 
						|
        13                  │{1:~                  }|
 | 
						|
        14                  │{1:~                  }|
 | 
						|
        15                  │{1:~                  }|
 | 
						|
        {3:[Scratch]            }{2:[Scratch]          }|
 | 
						|
                                                |
 | 
						|
      ]],
 | 
						|
    })
 | 
						|
 | 
						|
    n.feed('<C-y>')
 | 
						|
    n.feed('<C-y>')
 | 
						|
    n.feed('<C-y>')
 | 
						|
 | 
						|
    screen:expect({
 | 
						|
      grid = [[
 | 
						|
        3                   │3 v                |
 | 
						|
        4                   │4 v                |
 | 
						|
        5                   │5                  |
 | 
						|
        6                   │6                  |
 | 
						|
        7                   │{1:~                  }|
 | 
						|
        8                   │{1:~                  }|
 | 
						|
        9                   │{1:~                  }|
 | 
						|
        10                  │{1:~                  }|
 | 
						|
        ^11                  │{1:~                  }|
 | 
						|
        12                  │{1:~                  }|
 | 
						|
        {3:[Scratch]            }{2:[Scratch]          }|
 | 
						|
                                                |
 | 
						|
      ]],
 | 
						|
    })
 | 
						|
  end)
 | 
						|
end)
 |