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)