neovim

Neovim text editor
git clone https://git.dasho.dev/neovim.git
Log | Files | Refs | README

scrollbind_spec.lua (14499B)


      1 local t = require('test.testutil')
      2 local n = require('test.functional.testnvim')()
      3 local clear = n.clear
      4 local Screen = require('test.functional.ui.screen')
      5 
      6 before_each(clear)
      7 
      8 describe('Scrollbind', function()
      9  local screen --- @type test.functional.ui.screen
     10 
     11  before_each(function()
     12    screen = Screen.new(40, 12)
     13  end)
     14 
     15  it('works with one buffer with virtual lines', function()
     16    n.exec_lua(function()
     17      local lines = {} --- @type string[]
     18 
     19      for i = 1, 20 do
     20        lines[i] = tostring(i * 2 - 1)
     21      end
     22 
     23      local ns = vim.api.nvim_create_namespace('test')
     24 
     25      vim.api.nvim_buf_set_lines(0, 0, -1, false, lines)
     26      vim.bo.buftype = 'nofile'
     27 
     28      for i in ipairs(lines) do
     29        vim.api.nvim_buf_set_extmark(0, ns, i - 1, 0, {
     30          virt_lines = { { { tostring(2 * i) .. ' v' } } },
     31        })
     32      end
     33 
     34      vim.wo.scrollbind = true
     35      vim.cmd.vsplit()
     36      vim.wo.scrollbind = true
     37    end)
     38 
     39    n.feed('<C-d>')
     40 
     41    t.eq(5, n.api.nvim_get_option_value('scroll', {}))
     42 
     43    screen:expect({
     44      grid = [[
     45        6 v                 │6 v                |
     46        7                   │7                  |
     47        8 v                 │8 v                |
     48        9                   │9                  |
     49        10 v                │10 v               |
     50        ^11                  │11                 |
     51        12 v                │12 v               |
     52        13                  │13                 |
     53        14 v                │14 v               |
     54        15                  │15                 |
     55        {3:[Scratch]            }{2:[Scratch]          }|
     56                                                |
     57      ]],
     58    })
     59 
     60    n.feed('<C-u>')
     61 
     62    local line1_grid = [[
     63      ^1                   │1                  |
     64      2 v                 │2 v                |
     65      3                   │3                  |
     66      4 v                 │4 v                |
     67      5                   │5                  |
     68      6 v                 │6 v                |
     69      7                   │7                  |
     70      8 v                 │8 v                |
     71      9                   │9                  |
     72      10 v                │10 v               |
     73      {3:[Scratch]            }{2:[Scratch]          }|
     74                                              |
     75    ]]
     76 
     77    screen:expect({ grid = line1_grid })
     78 
     79    n.api.nvim_set_option_value('scroll', 6, {})
     80 
     81    n.feed('<C-d>')
     82 
     83    screen:expect({
     84      grid = [[
     85        7                   │7                  |
     86        8 v                 │8 v                |
     87        9                   │9                  |
     88        10 v                │10 v               |
     89        11                  │11                 |
     90        12 v                │12 v               |
     91        ^13                  │13                 |
     92        14 v                │14 v               |
     93        15                  │15                 |
     94        16 v                │16 v               |
     95        {3:[Scratch]            }{2:[Scratch]          }|
     96                                                |
     97      ]],
     98    })
     99 
    100    n.feed('<C-u>')
    101 
    102    screen:expect({ grid = line1_grid })
    103  end)
    104 
    105  it('works with two buffers with virtual lines on one side', function()
    106    n.exec_lua(function()
    107      local lines = {} --- @type string[]
    108 
    109      for i = 1, 20 do
    110        lines[i] = tostring(i)
    111      end
    112 
    113      local ns = vim.api.nvim_create_namespace('test')
    114 
    115      vim.api.nvim_buf_set_lines(0, 0, -1, false, lines)
    116      vim.bo.buftype = 'nofile'
    117 
    118      vim.wo.scrollbind = true
    119      vim.cmd.vnew()
    120 
    121      lines = {} --- @type string[]
    122 
    123      for i = 1, 20 do
    124        lines[i] = tostring(i + (i > 3 and 4 or 0))
    125      end
    126      vim.api.nvim_buf_set_lines(0, 0, -1, false, lines)
    127      vim.bo.buftype = 'nofile'
    128 
    129      vim.api.nvim_buf_set_extmark(0, ns, 2, 0, {
    130        virt_lines = {
    131          { { '4 v' } },
    132          { { '5 v' } },
    133          { { '6 v' } },
    134          { { '7 v' } },
    135        },
    136      })
    137 
    138      vim.wo.scrollbind = true
    139    end)
    140 
    141    n.feed('<C-d>')
    142 
    143    t.eq(5, n.api.nvim_get_option_value('scroll', {}))
    144 
    145    screen:expect({
    146      grid = [[
    147        6 v                 │6                  |
    148        7 v                 │7                  |
    149        8                   │8                  |
    150        9                   │9                  |
    151        ^10                  │10                 |
    152        11                  │11                 |
    153        12                  │12                 |
    154        13                  │13                 |
    155        14                  │14                 |
    156        15                  │15                 |
    157        {3:[Scratch]            }{2:[Scratch]          }|
    158                                                |
    159      ]],
    160    })
    161 
    162    n.feed('<C-u>')
    163 
    164    local line1_grid = [[
    165      ^1                   │1                  |
    166      2                   │2                  |
    167      3                   │3                  |
    168      4 v                 │4                  |
    169      5 v                 │5                  |
    170      6 v                 │6                  |
    171      7 v                 │7                  |
    172      8                   │8                  |
    173      9                   │9                  |
    174      10                  │10                 |
    175      {3:[Scratch]            }{2:[Scratch]          }|
    176                                              |
    177    ]]
    178 
    179    screen:expect({ grid = line1_grid })
    180 
    181    n.api.nvim_set_option_value('scroll', 6, {})
    182 
    183    n.feed('<C-d>')
    184 
    185    screen:expect({
    186      grid = [[
    187        7 v                 │7                  |
    188        8                   │8                  |
    189        9                   │9                  |
    190        10                  │10                 |
    191        ^11                  │11                 |
    192        12                  │12                 |
    193        13                  │13                 |
    194        14                  │14                 |
    195        15                  │15                 |
    196        16                  │16                 |
    197        {3:[Scratch]            }{2:[Scratch]          }|
    198                                                |
    199      ]],
    200    })
    201 
    202    n.feed('<C-u>')
    203 
    204    screen:expect({ grid = line1_grid })
    205 
    206    -- Note: not the same as n.feed('4<C-e>')
    207    n.feed('<C-e>')
    208    n.feed('<C-e>')
    209    n.feed('<C-e>')
    210    n.feed('<C-e>')
    211 
    212    screen:expect({
    213      grid = [[
    214        5 v                 │5                  |
    215        6 v                 │6                  |
    216        7 v                 │7                  |
    217        ^8                   │8                  |
    218        9                   │9                  |
    219        10                  │10                 |
    220        11                  │11                 |
    221        12                  │12                 |
    222        13                  │13                 |
    223        14                  │14                 |
    224        {3:[Scratch]            }{2:[Scratch]          }|
    225                                                |
    226      ]],
    227    })
    228 
    229    n.feed('<C-e>')
    230 
    231    screen:expect({
    232      grid = [[
    233        6 v                 │6                  |
    234        7 v                 │7                  |
    235        ^8                   │8                  |
    236        9                   │9                  |
    237        10                  │10                 |
    238        11                  │11                 |
    239        12                  │12                 |
    240        13                  │13                 |
    241        14                  │14                 |
    242        15                  │15                 |
    243        {3:[Scratch]            }{2:[Scratch]          }|
    244                                                |
    245      ]],
    246    })
    247 
    248    n.feed('<C-y>')
    249    n.feed('<C-y>')
    250 
    251    screen:expect({
    252      grid = [[
    253        4 v                 │4                  |
    254        5 v                 │5                  |
    255        6 v                 │6                  |
    256        7 v                 │7                  |
    257        ^8                   │8                  |
    258        9                   │9                  |
    259        10                  │10                 |
    260        11                  │11                 |
    261        12                  │12                 |
    262        13                  │13                 |
    263        {3:[Scratch]            }{2:[Scratch]          }|
    264                                                |
    265      ]],
    266    })
    267  end)
    268 
    269  it('works with buffers of different lengths', function()
    270    n.exec_lua(function()
    271      vim.api.nvim_buf_set_lines(0, 0, -1, false, { '1', '2', '3' })
    272      vim.bo.buftype = 'nofile'
    273 
    274      vim.wo.scrollbind = true
    275      vim.cmd.vnew()
    276 
    277      local lines = {} --- @type string[]
    278 
    279      for i = 1, 50 do
    280        lines[i] = tostring(i)
    281      end
    282 
    283      vim.api.nvim_buf_set_lines(0, 0, -1, false, lines)
    284      vim.bo.buftype = 'nofile'
    285      vim.wo.scrollbind = true
    286    end)
    287 
    288    n.feed('10<C-e>')
    289 
    290    screen:expect({
    291      grid = [[
    292        ^11                  │3                  |
    293        12                  │{1:~                  }|
    294        13                  │{1:~                  }|
    295        14                  │{1:~                  }|
    296        15                  │{1:~                  }|
    297        16                  │{1:~                  }|
    298        17                  │{1:~                  }|
    299        18                  │{1:~                  }|
    300        19                  │{1:~                  }|
    301        20                  │{1:~                  }|
    302        {3:[Scratch]            }{2:[Scratch]          }|
    303                                                |
    304      ]],
    305    })
    306 
    307    n.feed('<C-y>')
    308 
    309    screen:expect({
    310      grid = [[
    311        10                  │3                  |
    312        ^11                  │{1:~                  }|
    313        12                  │{1:~                  }|
    314        13                  │{1:~                  }|
    315        14                  │{1:~                  }|
    316        15                  │{1:~                  }|
    317        16                  │{1:~                  }|
    318        17                  │{1:~                  }|
    319        18                  │{1:~                  }|
    320        19                  │{1:~                  }|
    321        {3:[Scratch]            }{2:[Scratch]          }|
    322                                                |
    323      ]],
    324    })
    325  end)
    326 
    327  it('works with buffers of different lengths and virtual lines', function()
    328    n.exec_lua(function()
    329      vim.api.nvim_buf_set_lines(0, 0, -1, false, { '1', '5', '6' })
    330 
    331      local ns = vim.api.nvim_create_namespace('test')
    332      vim.api.nvim_buf_set_extmark(0, ns, 0, 0, {
    333        virt_lines = {
    334          { { '2 v' } },
    335          { { '3 v' } },
    336          { { '4 v' } },
    337        },
    338      })
    339 
    340      vim.bo.buftype = 'nofile'
    341 
    342      vim.wo.scrollbind = true
    343      vim.cmd.vnew()
    344 
    345      local lines = {} --- @type string[]
    346 
    347      for i = 1, 50 do
    348        lines[i] = tostring(i)
    349      end
    350 
    351      vim.api.nvim_buf_set_lines(0, 0, -1, false, lines)
    352      vim.bo.buftype = 'nofile'
    353      vim.wo.scrollbind = true
    354    end)
    355 
    356    n.feed('<C-e>')
    357    n.feed('<C-e>')
    358    screen:expect({
    359      grid = [[
    360        ^3                   │3 v                |
    361        4                   │4 v                |
    362        5                   │5                  |
    363        6                   │6                  |
    364        7                   │{1:~                  }|
    365        8                   │{1:~                  }|
    366        9                   │{1:~                  }|
    367        10                  │{1:~                  }|
    368        11                  │{1:~                  }|
    369        12                  │{1:~                  }|
    370        {3:[Scratch]            }{2:[Scratch]          }|
    371                                                |
    372      ]],
    373    })
    374 
    375    n.feed('8<C-e>')
    376 
    377    screen:expect({
    378      grid = [[
    379        ^11                  │6                  |
    380        12                  │{1:~                  }|
    381        13                  │{1:~                  }|
    382        14                  │{1:~                  }|
    383        15                  │{1:~                  }|
    384        16                  │{1:~                  }|
    385        17                  │{1:~                  }|
    386        18                  │{1:~                  }|
    387        19                  │{1:~                  }|
    388        20                  │{1:~                  }|
    389        {3:[Scratch]            }{2:[Scratch]          }|
    390                                                |
    391      ]],
    392    })
    393 
    394    n.feed('<C-y>')
    395    n.feed('<C-y>')
    396    n.feed('<C-y>')
    397    n.feed('<C-y>')
    398    n.feed('<C-y>')
    399 
    400    t.eq(n.exec_lua [[return vim.fn.line('w0', 1001)]], 6)
    401    t.eq(n.exec_lua [[return vim.fn.line('w0', 1000)]], 3)
    402 
    403    screen:expect({
    404      grid = [[
    405        6                   │6                  |
    406        7                   │{1:~                  }|
    407        8                   │{1:~                  }|
    408        9                   │{1:~                  }|
    409        10                  │{1:~                  }|
    410        ^11                  │{1:~                  }|
    411        12                  │{1:~                  }|
    412        13                  │{1:~                  }|
    413        14                  │{1:~                  }|
    414        15                  │{1:~                  }|
    415        {3:[Scratch]            }{2:[Scratch]          }|
    416                                                |
    417      ]],
    418    })
    419 
    420    n.feed('<C-y>')
    421    n.feed('<C-y>')
    422    n.feed('<C-y>')
    423 
    424    screen:expect({
    425      grid = [[
    426        3                   │3 v                |
    427        4                   │4 v                |
    428        5                   │5                  |
    429        6                   │6                  |
    430        7                   │{1:~                  }|
    431        8                   │{1:~                  }|
    432        9                   │{1:~                  }|
    433        10                  │{1:~                  }|
    434        ^11                  │{1:~                  }|
    435        12                  │{1:~                  }|
    436        {3:[Scratch]            }{2:[Scratch]          }|
    437                                                |
    438      ]],
    439    })
    440  end)
    441 end)