Files
neovim/test/functional/ui/fold_spec.lua
luukvbaal a08d6a8ac1 test(screen): remove screen:get_default_attr_ids() (#34973)
Problem:  get_default_attr_ids() is used to get and change a subset of
          the current highlight definitions in {fold,popupmenu}_spec.lua,
          for which we have add_extra_attr_ids().
Solution: Use global highlight definitions and use add_extra_attr_ids to
          replace.
2025-07-17 22:57:34 +02:00

3001 lines
114 KiB
Lua

local t = require('test.testutil')
local n = require('test.functional.testnvim')()
local Screen = require('test.functional.ui.screen')
local clear, feed, eq = n.clear, n.feed, t.eq
local command = n.command
local feed_command = n.feed_command
local insert = n.insert
local fn = n.fn
local api = n.api
local exec = n.exec
local assert_alive = n.assert_alive
local content1 = [[
This is a
valid English
sentence composed by
an exhausted developer
in his cave.
]]
describe('folded lines', function()
before_each(function()
clear()
command('hi VertSplit gui=reverse')
end)
local function with_ext_multigrid(multigrid)
local screen
before_each(function()
screen = Screen.new(45, 8, { rgb = true, ext_multigrid = multigrid })
screen:add_extra_attr_ids({
[100] = { foreground = Screen.colors.Red },
[101] = { foreground = Screen.colors.Red, background = Screen.colors.LightGrey },
[102] = { underline = true },
[103] = { foreground = Screen.colors.Blue4, background = Screen.colors.Red },
[104] = {
bold = true,
background = Screen.colors.LightGray,
foreground = Screen.colors.Blue1,
},
[105] = { background = Screen.colors.Yellow1, foreground = Screen.colors.Blue4 },
[106] = { bold = true, background = Screen.colors.Red, foreground = Screen.colors.Blue1 },
[107] = { background = Screen.colors.LightGrey, foreground = Screen.colors.WebGreen },
[108] = { foreground = Screen.colors.Green, background = Screen.colors.Red },
[109] = { foreground = Screen.colors.Blue, bold = true, background = Screen.colors.Yellow1 },
})
end)
it('with more than one signcolumn', function()
command('set signcolumn=yes:9')
feed('i<cr><esc>')
feed('vkzf')
if multigrid then
screen:expect([[
## grid 1
[2:---------------------------------------------]|*7
[3:---------------------------------------------]|
## grid 2
{7: }{13:^+-- 2 lines: ·············}|
{1:~ }|*6
## grid 3
|
]])
else
screen:expect([[
{7: }{13:^+-- 2 lines: ·············}|
{1:~ }|*6
|
]])
end
end)
local function test_folded_cursorline(foldtext)
if not foldtext then
command('set foldtext=')
end
command('set number cursorline foldcolumn=2')
command('hi link CursorLineFold Search')
insert(content1)
feed('ggzf3jj')
if multigrid then
if foldtext then
screen:expect([[
## grid 1
[2:---------------------------------------------]|*7
[3:---------------------------------------------]|
## grid 2
{7:+ }{8: 1 }{13:+-- 4 lines: This is a················}|
{10: }{15: 5 }{100:^in his cave. }|
{7: }{8: 6 } |
{1:~ }|*4
## grid 3
|
]])
else
screen:expect([[
## grid 1
[2:---------------------------------------------]|*7
[3:---------------------------------------------]|
## grid 2
{7:+ }{8: 1 }{13:This is a······························}|
{10: }{15: 5 }{100:^in his cave. }|
{7: }{8: 6 } |
{1:~ }|*4
## grid 3
|
]])
end
else
if foldtext then
screen:expect([[
{7:+ }{8: 1 }{13:+-- 4 lines: This is a················}|
{10: }{15: 5 }{100:^in his cave. }|
{7: }{8: 6 } |
{1:~ }|*4
|
]])
else
screen:expect([[
{7:+ }{8: 1 }{13:This is a······························}|
{10: }{15: 5 }{100:^in his cave. }|
{7: }{8: 6 } |
{1:~ }|*4
|
]])
end
end
feed('k')
if multigrid then
if foldtext then
screen:expect([[
## grid 1
[2:---------------------------------------------]|*7
[3:---------------------------------------------]|
## grid 2
{10:+ }{15: 1 }{101:^+-- 4 lines: This is a················}|
{7: }{8: 5 }in his cave. |
{7: }{8: 6 } |
{1:~ }|*4
## grid 3
|
]])
else
screen:expect([[
## grid 1
[2:---------------------------------------------]|*7
[3:---------------------------------------------]|
## grid 2
{10:+ }{15: 1 }{101:^This is a······························}|
{7: }{8: 5 }in his cave. |
{7: }{8: 6 } |
{1:~ }|*4
## grid 3
|
]])
end
else
if foldtext then
screen:expect([[
{10:+ }{15: 1 }{101:^+-- 4 lines: This is a················}|
{7: }{8: 5 }in his cave. |
{7: }{8: 6 } |
{1:~ }|*4
|
]])
else
screen:expect([[
{10:+ }{15: 1 }{101:^This is a······························}|
{7: }{8: 5 }in his cave. |
{7: }{8: 6 } |
{1:~ }|*4
|
]])
end
end
-- CursorLine is applied correctly with screenrow motions #22232
feed('jgk')
screen:expect_unchanged()
-- CursorLine is applied correctly when closing a fold when cursor is not at fold start
feed('zo4Gzc')
screen:expect_unchanged()
command('set cursorlineopt=line')
if multigrid then
if foldtext then
screen:expect([[
## grid 1
[2:---------------------------------------------]|*7
[3:---------------------------------------------]|
## grid 2
{7:+ }{8: 1 }{101:^+-- 4 lines: This is a················}|
{7: }{8: 5 }in his cave. |
{7: }{8: 6 } |
{1:~ }|*4
## grid 3
|
]])
else
screen:expect([[
## grid 1
[2:---------------------------------------------]|*7
[3:---------------------------------------------]|
## grid 2
{7:+ }{8: 1 }{101:^This is a······························}|
{7: }{8: 5 }in his cave. |
{7: }{8: 6 } |
{1:~ }|*4
## grid 3
|
]])
end
else
if foldtext then
screen:expect([[
{7:+ }{8: 1 }{101:^+-- 4 lines: This is a················}|
{7: }{8: 5 }in his cave. |
{7: }{8: 6 } |
{1:~ }|*4
|
]])
else
screen:expect([[
{7:+ }{8: 1 }{101:^This is a······························}|
{7: }{8: 5 }in his cave. |
{7: }{8: 6 } |
{1:~ }|*4
|
]])
end
end
command('set relativenumber cursorlineopt=number')
if multigrid then
if foldtext then
screen:expect([[
## grid 1
[2:---------------------------------------------]|*7
[3:---------------------------------------------]|
## grid 2
{10:+ }{15:1 }{13:^+-- 4 lines: This is a················}|
{7: }{8: 1 }in his cave. |
{7: }{8: 2 } |
{1:~ }|*4
## grid 3
|
]])
else
screen:expect([[
## grid 1
[2:---------------------------------------------]|*7
[3:---------------------------------------------]|
## grid 2
{10:+ }{15:1 }{13:^This is a······························}|
{7: }{8: 1 }in his cave. |
{7: }{8: 2 } |
{1:~ }|*4
## grid 3
|
]])
end
else
if foldtext then
screen:expect([[
{10:+ }{15:1 }{13:^+-- 4 lines: This is a················}|
{7: }{8: 1 }in his cave. |
{7: }{8: 2 } |
{1:~ }|*4
|
]])
else
screen:expect([[
{10:+ }{15:1 }{13:^This is a······························}|
{7: }{8: 1 }in his cave. |
{7: }{8: 2 } |
{1:~ }|*4
|
]])
end
end
end
describe("when 'cursorline' is set", function()
local function cursorline_tests(foldtext)
local sfx = not foldtext and ' (transparent foldtext)' or ''
it('with high-priority CursorLine' .. sfx, function()
command('hi! CursorLine guibg=NONE guifg=Red gui=NONE')
test_folded_cursorline(foldtext)
end)
it('with low-priority CursorLine' .. sfx, function()
command('hi! CursorLine guibg=NONE guifg=NONE gui=underline')
screen:add_extra_attr_ids({
[100] = { underline = true },
[101] = {
background = Screen.colors.LightGray,
underline = true,
foreground = Screen.colors.Blue4,
},
})
test_folded_cursorline(foldtext)
end)
end
cursorline_tests(true)
cursorline_tests(false)
end)
it('with spell', function()
command('set spell')
insert(content1)
feed('gg')
feed('zf3j')
if not multigrid then
screen:expect([[
{13:^+-- 4 lines: This is a······················}|
in his cave. |
|
{1:~ }|*4
|
]])
end
end)
it('with matches', function()
insert(content1)
command('highlight MyWord gui=bold guibg=red guifg=white')
command("call matchadd('MyWord', '\\V' . 'test', -1)")
feed('gg')
feed('zf3j')
if not multigrid then
screen:expect([[
{13:^+-- 4 lines: This is a······················}|
in his cave. |
|
{1:~ }|*4
|
]])
end
end)
it('with multibyte fillchars', function()
insert([[
aa
bb
cc
dd
ee
ff]])
command('set fillchars+=foldopen:▾,foldsep:│,foldclose:▸')
feed_command('1')
command('set foldcolumn=2')
feed('zf4j')
feed('zf2j')
feed('zO')
if multigrid then
screen:expect([[
## grid 1
[2:---------------------------------------------]|*7
[3:---------------------------------------------]|
## grid 2
{7:▾▾}^aa |
{7:││}bb |
{7:││}cc |
{7:││}dd |
{7:││}ee |
{7:│ }ff |
{1:~ }|
## grid 3
:1 |
]])
else
screen:expect([[
{7:▾▾}^aa |
{7:││}bb |
{7:││}cc |
{7:││}dd |
{7:││}ee |
{7:│ }ff |
{1:~ }|
:1 |
]])
end
feed_command('set rightleft')
if multigrid then
screen:expect([[
## grid 1
[2:---------------------------------------------]|*7
[3:---------------------------------------------]|
## grid 2
a^a{7:▾▾}|
bb{7:││}|
cc{7:││}|
dd{7:││}|
ee{7:││}|
ff{7: │}|
{1: ~}|
## grid 3
:set rightleft |
]])
else
screen:expect([[
a^a{7:▾▾}|
bb{7:││}|
cc{7:││}|
dd{7:││}|
ee{7:││}|
ff{7: │}|
{1: ~}|
:set rightleft |
]])
end
feed_command('set norightleft')
if multigrid then
api.nvim_input_mouse('left', 'press', '', 2, 0, 1)
screen:expect([[
## grid 1
[2:---------------------------------------------]|*7
[3:---------------------------------------------]|
## grid 2
{7:▾▸}{13:^+--- 5 lines: aa··························}|
{7:│ }ff |
{1:~ }|*5
## grid 3
:set norightleft |
]])
else
api.nvim_input_mouse('left', 'press', '', 0, 0, 1)
screen:expect([[
{7:▾▸}{13:^+--- 5 lines: aa··························}|
{7:│ }ff |
{1:~ }|*5
:set norightleft |
]])
end
if multigrid then
api.nvim_input_mouse('left', 'press', '', 2, 0, 0)
screen:expect([[
## grid 1
[2:---------------------------------------------]|*7
[3:---------------------------------------------]|
## grid 2
{7:▸ }{13:^+-- 6 lines: aa···························}|
{1:~ }|*6
## grid 3
:set norightleft |
]])
else
api.nvim_input_mouse('left', 'press', '', 0, 0, 0)
screen:expect([[
{7:▸ }{13:^+-- 6 lines: aa···························}|
{1:~ }|*6
:set norightleft |
]])
end
-- Add a winbar to avoid double-clicks
command('setlocal winbar=!!!!!!')
if multigrid then
api.nvim_input_mouse('left', 'press', '', 2, 1, 0)
screen:expect([[
## grid 1
[2:---------------------------------------------]|*7
[3:---------------------------------------------]|
## grid 2
{5:!!!!!! }|
{7:▾▸}{13:^+--- 5 lines: aa··························}|
{7:│ }ff |
{1:~ }|*4
## grid 3
:set norightleft |
]])
else
api.nvim_input_mouse('left', 'press', '', 0, 1, 0)
screen:expect([[
{5:!!!!!! }|
{7:▾▸}{13:^+--- 5 lines: aa··························}|
{7:│ }ff |
{1:~ }|*4
:set norightleft |
]])
end
if multigrid then
api.nvim_input_mouse('left', 'press', '', 2, 1, 1)
screen:expect([[
## grid 1
[2:---------------------------------------------]|*7
[3:---------------------------------------------]|
## grid 2
{5:!!!!!! }|
{7:▾▾}^aa |
{7:││}bb |
{7:││}cc |
{7:││}dd |
{7:││}ee |
{7:│ }ff |
## grid 3
:set norightleft |
]])
else
api.nvim_input_mouse('left', 'press', '', 0, 1, 1)
screen:expect([[
{5:!!!!!! }|
{7:▾▾}^aa |
{7:││}bb |
{7:││}cc |
{7:││}dd |
{7:││}ee |
{7:│ }ff |
:set norightleft |
]])
end
end)
it('with split', function()
insert([[
aa
bb
cc
dd
ee
ff]])
feed_command('2')
command('set foldcolumn=1')
feed('zf3j')
feed_command('1')
feed('zf2j')
feed('zO')
feed_command('rightbelow new')
insert([[
aa
bb
cc
dd
ee
ff]])
feed_command('2')
command('set foldcolumn=1')
feed('zf3j')
feed_command('1')
feed('zf2j')
if multigrid then
api.nvim_input_mouse('left', 'press', '', 4, 0, 0)
screen:expect([[
## grid 1
[2:---------------------------------------------]|*2
{2:[No Name] [+] }|
[4:---------------------------------------------]|*3
{3:[No Name] [+] }|
[3:---------------------------------------------]|
## grid 2
{7:-}aa |
{7:-}bb |
## grid 3
:1 |
## grid 4
{7:-}^aa |
{7:+}{13:+--- 4 lines: bb···························}|
{7:│}ff |
]])
else
api.nvim_input_mouse('left', 'press', '', 0, 3, 0)
screen:expect([[
{7:-}aa |
{7:-}bb |
{2:[No Name] [+] }|
{7:-}^aa |
{7:+}{13:+--- 4 lines: bb···························}|
{7:│}ff |
{3:[No Name] [+] }|
:1 |
]])
end
if multigrid then
api.nvim_input_mouse('left', 'press', '', 4, 1, 0)
screen:expect([[
## grid 1
[2:---------------------------------------------]|*2
{2:[No Name] [+] }|
[4:---------------------------------------------]|*3
{3:[No Name] [+] }|
[3:---------------------------------------------]|
## grid 2
{7:-}aa |
{7:-}bb |
## grid 3
:1 |
## grid 4
{7:-}^aa |
{7:-}bb |
{7:2}cc |
]])
else
api.nvim_input_mouse('left', 'press', '', 0, 4, 0)
screen:expect([[
{7:-}aa |
{7:-}bb |
{2:[No Name] [+] }|
{7:-}^aa |
{7:-}bb |
{7:2}cc |
{3:[No Name] [+] }|
:1 |
]])
end
if multigrid then
api.nvim_input_mouse('left', 'press', '', 2, 1, 0)
screen:expect([[
## grid 1
[2:---------------------------------------------]|*2
{3:[No Name] [+] }|
[4:---------------------------------------------]|*3
{2:[No Name] [+] }|
[3:---------------------------------------------]|
## grid 2
{7:-}aa |
{7:+}{13:^+--- 4 lines: bb···························}|
## grid 3
:1 |
## grid 4
{7:-}aa |
{7:-}bb |
{7:2}cc |
]])
else
api.nvim_input_mouse('left', 'press', '', 0, 1, 0)
screen:expect([[
{7:-}aa |
{7:+}{13:^+--- 4 lines: bb···························}|
{3:[No Name] [+] }|
{7:-}aa |
{7:-}bb |
{7:2}cc |
{2:[No Name] [+] }|
:1 |
]])
end
if multigrid then
api.nvim_input_mouse('left', 'press', '', 2, 0, 0)
screen:expect([[
## grid 1
[2:---------------------------------------------]|*2
{3:[No Name] [+] }|
[4:---------------------------------------------]|*3
{2:[No Name] [+] }|
[3:---------------------------------------------]|
## grid 2
{7:+}{13:^+-- 6 lines: aa····························}|
{1:~ }|
## grid 3
:1 |
## grid 4
{7:-}aa |
{7:-}bb |
{7:2}cc |
]])
else
api.nvim_input_mouse('left', 'press', '', 0, 0, 0)
screen:expect([[
{7:+}{13:^+-- 6 lines: aa····························}|
{1:~ }|
{3:[No Name] [+] }|
{7:-}aa |
{7:-}bb |
{7:2}cc |
{2:[No Name] [+] }|
:1 |
]])
end
end)
it('with vsplit', function()
insert([[
aa
bb
cc
dd
ee
ff]])
feed_command('2')
command('set foldcolumn=1')
feed('zf3j')
feed_command('1')
feed('zf2j')
feed('zO')
feed_command('rightbelow vnew')
insert([[
aa
bb
cc
dd
ee
ff]])
feed_command('2')
command('set foldcolumn=1')
feed('zf3j')
feed_command('1')
feed('zf2j')
if multigrid then
api.nvim_input_mouse('left', 'press', '', 4, 0, 0)
screen:expect([[
## grid 1
[2:----------------------]{2:│}[4:----------------------]|*6
{2:[No Name] [+] }{3:[No Name] [+] }|
[3:---------------------------------------------]|
## grid 2
{7:-}aa |
{7:-}bb |
{7:2}cc |
{7:2}dd |
{7:2}ee |
{7:│}ff |
## grid 3
:1 |
## grid 4
{7:-}^aa |
{7:+}{13:+--- 4 lines: bb····}|
{7:│}ff |
{1:~ }|*3
]])
else
api.nvim_input_mouse('left', 'press', '', 0, 0, 23)
screen:expect([[
{7:-}aa {2:│}{7:-}^aa |
{7:-}bb {2:│}{7:+}{13:+--- 4 lines: bb····}|
{7:2}cc {2:│}{7:│}ff |
{7:2}dd {2:│}{1:~ }|
{7:2}ee {2:│}{1:~ }|
{7:│}ff {2:│}{1:~ }|
{2:[No Name] [+] }{3:[No Name] [+] }|
:1 |
]])
end
if multigrid then
api.nvim_input_mouse('left', 'press', '', 4, 1, 0)
screen:expect([[
## grid 1
[2:----------------------]{2:│}[4:----------------------]|*6
{2:[No Name] [+] }{3:[No Name] [+] }|
[3:---------------------------------------------]|
## grid 2
{7:-}aa |
{7:-}bb |
{7:2}cc |
{7:2}dd |
{7:2}ee |
{7:│}ff |
## grid 3
:1 |
## grid 4
{7:-}^aa |
{7:-}bb |
{7:2}cc |
{7:2}dd |
{7:2}ee |
{7:│}ff |
]])
else
api.nvim_input_mouse('left', 'press', '', 0, 1, 23)
screen:expect([[
{7:-}aa {2:│}{7:-}^aa |
{7:-}bb {2:│}{7:-}bb |
{7:2}cc {2:│}{7:2}cc |
{7:2}dd {2:│}{7:2}dd |
{7:2}ee {2:│}{7:2}ee |
{7:│}ff {2:│}{7:│}ff |
{2:[No Name] [+] }{3:[No Name] [+] }|
:1 |
]])
end
if multigrid then
api.nvim_input_mouse('left', 'press', '', 2, 1, 0)
screen:expect([[
## grid 1
[2:----------------------]{2:│}[4:----------------------]|*6
{3:[No Name] [+] }{2:[No Name] [+] }|
[3:---------------------------------------------]|
## grid 2
{7:-}aa |
{7:+}{13:^+--- 4 lines: bb····}|
{7:│}ff |
{1:~ }|*3
## grid 3
:1 |
## grid 4
{7:-}aa |
{7:-}bb |
{7:2}cc |
{7:2}dd |
{7:2}ee |
{7:│}ff |
]])
else
api.nvim_input_mouse('left', 'press', '', 0, 1, 0)
screen:expect([[
{7:-}aa {2:│}{7:-}aa |
{7:+}{13:^+--- 4 lines: bb····}{2:│}{7:-}bb |
{7:│}ff {2:│}{7:2}cc |
{1:~ }{2:│}{7:2}dd |
{1:~ }{2:│}{7:2}ee |
{1:~ }{2:│}{7:│}ff |
{3:[No Name] [+] }{2:[No Name] [+] }|
:1 |
]])
end
if multigrid then
api.nvim_input_mouse('left', 'press', '', 2, 0, 0)
screen:expect([[
## grid 1
[2:----------------------]{2:│}[4:----------------------]|*6
{3:[No Name] [+] }{2:[No Name] [+] }|
[3:---------------------------------------------]|
## grid 2
{7:+}{13:^+-- 6 lines: aa·····}|
{1:~ }|*5
## grid 3
:1 |
## grid 4
{7:-}aa |
{7:-}bb |
{7:2}cc |
{7:2}dd |
{7:2}ee |
{7:│}ff |
]])
else
api.nvim_input_mouse('left', 'press', '', 0, 0, 0)
screen:expect([[
{7:+}{13:^+-- 6 lines: aa·····}{2:│}{7:-}aa |
{1:~ }{2:│}{7:-}bb |
{1:~ }{2:│}{7:2}cc |
{1:~ }{2:│}{7:2}dd |
{1:~ }{2:│}{7:2}ee |
{1:~ }{2:│}{7:│}ff |
{3:[No Name] [+] }{2:[No Name] [+] }|
:1 |
]])
end
end)
it('with tabpages', function()
insert([[
aa
bb
cc
dd
ee
ff]])
feed_command('2')
command('set foldcolumn=2')
feed('zf3j')
feed_command('1')
feed('zf2j')
feed('zO')
feed_command('tab split')
if multigrid then
api.nvim_input_mouse('left', 'press', '', 4, 1, 1)
screen:expect([[
## grid 1
{24: + [No Name] }{5: + [No Name] }{2: }{24:X}|
[4:---------------------------------------------]|*6
[3:---------------------------------------------]|
## grid 2 (hidden)
{7:- }aa |
{7:│-}bb |
{7:││}cc |
{7:││}dd |
{7:││}ee |
{7:│ }ff |
{1:~ }|
## grid 3
:tab split |
## grid 4
{7:- }^aa |
{7:│+}{13:+--- 4 lines: bb··························}|
{7:│ }ff |
{1:~ }|*3
]])
else
api.nvim_input_mouse('left', 'press', '', 0, 2, 1)
screen:expect([[
{24: + [No Name] }{5: + [No Name] }{2: }{24:X}|
{7:- }^aa |
{7:│+}{13:+--- 4 lines: bb··························}|
{7:│ }ff |
{1:~ }|*3
:tab split |
]])
end
if multigrid then
api.nvim_input_mouse('left', 'press', '', 4, 0, 0)
screen:expect([[
## grid 1
{24: + [No Name] }{5: + [No Name] }{2: }{24:X}|
[4:---------------------------------------------]|*6
[3:---------------------------------------------]|
## grid 2 (hidden)
{7:- }aa |
{7:│-}bb |
{7:││}cc |
{7:││}dd |
{7:││}ee |
{7:│ }ff |
{1:~ }|
## grid 3
:tab split |
## grid 4
{7:+ }{13:^+-- 6 lines: aa···························}|
{1:~ }|*5
]])
else
api.nvim_input_mouse('left', 'press', '', 0, 1, 0)
screen:expect([[
{24: + [No Name] }{5: + [No Name] }{2: }{24:X}|
{7:+ }{13:^+-- 6 lines: aa···························}|
{1:~ }|*5
:tab split |
]])
end
feed_command('tabnext')
if multigrid then
api.nvim_input_mouse('left', 'press', '', 2, 1, 1)
screen:expect([[
## grid 1
{5: + [No Name] }{24: + [No Name] }{2: }{24:X}|
[2:---------------------------------------------]|*6
[3:---------------------------------------------]|
## grid 2
{7:- }^aa |
{7:│+}{13:+--- 4 lines: bb··························}|
{7:│ }ff |
{1:~ }|*3
## grid 3
:tabnext |
## grid 4 (hidden)
{7:+ }{13:+-- 6 lines: aa···························}|
{1:~ }|*5
]])
else
api.nvim_input_mouse('left', 'press', '', 0, 2, 1)
screen:expect([[
{5: + [No Name] }{24: + [No Name] }{2: }{24:X}|
{7:- }^aa |
{7:│+}{13:+--- 4 lines: bb··························}|
{7:│ }ff |
{1:~ }|*3
:tabnext |
]])
end
if multigrid then
api.nvim_input_mouse('left', 'press', '', 2, 0, 0)
screen:expect([[
## grid 1
{5: + [No Name] }{24: + [No Name] }{2: }{24:X}|
[2:---------------------------------------------]|*6
[3:---------------------------------------------]|
## grid 2
{7:+ }{13:^+-- 6 lines: aa···························}|
{1:~ }|*5
## grid 3
:tabnext |
## grid 4 (hidden)
{7:+ }{13:+-- 6 lines: aa···························}|
{1:~ }|*5
]])
else
api.nvim_input_mouse('left', 'press', '', 0, 1, 0)
screen:expect([[
{5: + [No Name] }{24: + [No Name] }{2: }{24:X}|
{7:+ }{13:^+-- 6 lines: aa···························}|
{1:~ }|*5
:tabnext |
]])
end
end)
it('with multibyte text', function()
eq(true, api.nvim_get_option_value('arabicshape', {}))
insert([[
å 语 x̨̣̘̫̲͚͎̎͂̀̂͛͛̾͢͟ العَرَبِيَّة
möre text]])
if multigrid then
screen:expect([[
## grid 1
[2:---------------------------------------------]|*7
[3:---------------------------------------------]|
## grid 2
å 语 x̨̣̘̫̲͚͎̎͂̀̂͛͛̾͢ ﺎﻠﻋَﺮَﺒِﻳَّﺓ |
möre tex^t |
{1:~ }|*5
## grid 3
|
]])
else
screen:expect([[
å 语 x̨̣̘̫̲͚͎̎͂̀̂͛͛̾͢ ﺎﻠﻋَﺮَﺒِﻳَّﺓ |
möre tex^t |
{1:~ }|*5
|
]])
end
feed('vkzf')
if multigrid then
screen:expect([[
## grid 1
[2:---------------------------------------------]|*7
[3:---------------------------------------------]|
## grid 2
{13:^+-- 2 lines: å 语 x̨̣̘̫̲͚͎̎͂̀̂͛͛̾͢ ﺎﻠﻋَﺮَﺒِﻳَّﺓ·················}|
{1:~ }|*6
## grid 3
|
]])
else
screen:expect([[
{13:^+-- 2 lines: å 语 x̨̣̘̫̲͚͎̎͂̀̂͛͛̾͢ ﺎﻠﻋَﺮَﺒِﻳَّﺓ·················}|
{1:~ }|*6
|
]])
end
feed_command('set noarabicshape')
if multigrid then
screen:expect([[
## grid 1
[2:---------------------------------------------]|*7
[3:---------------------------------------------]|
## grid 2
{13:^+-- 2 lines: å 语 x̨̣̘̫̲͚͎̎͂̀̂͛͛̾͢ العَرَبِيَّة·················}|
{1:~ }|*6
## grid 3
:set noarabicshape |
]])
else
screen:expect([[
{13:^+-- 2 lines: å 语 x̨̣̘̫̲͚͎̎͂̀̂͛͛̾͢ العَرَبِيَّة·················}|
{1:~ }|*6
:set noarabicshape |
]])
end
feed_command('set number foldcolumn=2')
if multigrid then
screen:expect([[
## grid 1
[2:---------------------------------------------]|*7
[3:---------------------------------------------]|
## grid 2
{7:+ }{8: 1 }{13:^+-- 2 lines: å 语 x̨̣̘̫̲͚͎̎͂̀̂͛͛̾͢ العَرَبِيَّة···········}|
{1:~ }|*6
## grid 3
:set number foldcolumn=2 |
]])
else
screen:expect([[
{7:+ }{8: 1 }{13:^+-- 2 lines: å 语 x̨̣̘̫̲͚͎̎͂̀̂͛͛̾͢ العَرَبِيَّة···········}|
{1:~ }|*6
:set number foldcolumn=2 |
]])
end
-- Note: too much of the folded line gets cut off.This is a vim bug.
feed_command('set rightleft')
if multigrid then
screen:expect([[
## grid 1
[2:---------------------------------------------]|*7
[3:---------------------------------------------]|
## grid 2
{13:···········ةيَّبِرَعَلا x̨̣̘̫̲͚͎̎͂̀̂͛͛̾͢ 语 å :senil 2 --^+}{8: 1 }{7: +}|
{1: ~}|*6
## grid 3
:set rightleft |
]])
else
screen:expect([[
{13:···········ةيَّبِرَعَلا x̨̣̘̫̲͚͎̎͂̀̂͛͛̾͢ 语 å :senil 2 --^+}{8: 1 }{7: +}|
{1: ~}|*6
:set rightleft |
]])
end
feed_command('set nonumber foldcolumn=0')
if multigrid then
screen:expect([[
## grid 1
[2:---------------------------------------------]|*7
[3:---------------------------------------------]|
## grid 2
{13:·················ةيَّبِرَعَلا x̨̣̘̫̲͚͎̎͂̀̂͛͛̾͢ 语 å :senil 2 --^+}|
{1: ~}|*6
## grid 3
:set nonumber foldcolumn=0 |
]])
else
screen:expect([[
{13:·················ةيَّبِرَعَلا x̨̣̘̫̲͚͎̎͂̀̂͛͛̾͢ 语 å :senil 2 --^+}|
{1: ~}|*6
:set nonumber foldcolumn=0 |
]])
end
feed_command('set arabicshape')
if multigrid then
screen:expect([[
## grid 1
[2:---------------------------------------------]|*7
[3:---------------------------------------------]|
## grid 2
{13:·················ﺔﻴَّﺑِﺮَﻌَﻟﺍ x̨̣̘̫̲͚͎̎͂̀̂͛͛̾͢ 语 å :senil 2 --^+}|
{1: ~}|*6
## grid 3
:set arabicshape |
]])
else
screen:expect([[
{13:·················ﺔﻴَّﺑِﺮَﻌَﻟﺍ x̨̣̘̫̲͚͎̎͂̀̂͛͛̾͢ 语 å :senil 2 --^+}|
{1: ~}|*6
:set arabicshape |
]])
end
feed('zo')
if multigrid then
screen:expect([[
## grid 1
[2:---------------------------------------------]|*7
[3:---------------------------------------------]|
## grid 2
ﺔﻴَّﺑِﺮَﻌَ^ﻟﺍ x̨̣̘̫̲͚͎̎͂̀̂͛͛̾͢ 语 å|
txet eröm|
{1: ~}|*5
## grid 3
:set arabicshape |
]])
else
screen:expect([[
ﺔﻴَّﺑِﺮَﻌَ^ﻟﺍ x̨̣̘̫̲͚͎̎͂̀̂͛͛̾͢ 语 å|
txet eröm|
{1: ~}|*5
:set arabicshape |
]])
end
feed_command('set noarabicshape')
if multigrid then
screen:expect([[
## grid 1
[2:---------------------------------------------]|*7
[3:---------------------------------------------]|
## grid 2
ةيَّبِرَعَ^لا x̨̣̘̫̲͚͎̎͂̀̂͛͛̾͢ 语 å|
txet eröm|
{1: ~}|*5
## grid 3
:set noarabicshape |
]])
else
screen:expect([[
ةيَّبِرَعَ^لا x̨̣̘̫̲͚͎̎͂̀̂͛͛̾͢ 语 å|
txet eröm|
{1: ~}|*5
:set noarabicshape |
]])
end
end)
it('in cmdline window', function()
feed_command('set foldmethod=manual foldcolumn=1')
feed_command('let x = 1')
feed_command('/alpha')
feed_command('/omega')
feed('<cr>q:')
if multigrid then
screen:expect([[
## grid 1
[2:---------------------------------------------]|
{2:[No Name] }|
[4:---------------------------------------------]|*4
{3:[Command Line] }|
[3:---------------------------------------------]|
## grid 2
{7: } |
## grid 3
: |
## grid 4
{1::}{7: }set foldmethod=manual foldcolumn=1 |
{1::}{7: }let x = 1 |
{1::}{7: }^ |
{1:~ }|
]])
else
screen:expect([[
{7: } |
{2:[No Name] }|
{1::}{7: }set foldmethod=manual foldcolumn=1 |
{1::}{7: }let x = 1 |
{1::}{7: }^ |
{1:~ }|
{3:[Command Line] }|
: |
]])
end
feed('kzfk')
if multigrid then
screen:expect([[
## grid 1
[2:---------------------------------------------]|
{2:[No Name] }|
[4:---------------------------------------------]|*4
{3:[Command Line] }|
[3:---------------------------------------------]|
## grid 2
{7: } |
## grid 3
: |
## grid 4
{1::}{7:+}{13:^+-- 2 lines: set foldmethod=manual foldcol}|
{1::}{7: } |
{1:~ }|*2
]])
else
screen:expect([[
{7: } |
{2:[No Name] }|
{1::}{7:+}{13:^+-- 2 lines: set foldmethod=manual foldcol}|
{1::}{7: } |
{1:~ }|*2
{3:[Command Line] }|
: |
]])
end
feed('<cr>')
if multigrid then
screen:expect([[
## grid 1
[2:---------------------------------------------]|*7
[3:---------------------------------------------]|
## grid 2
{7: }^ |
{1:~ }|*6
## grid 3
: |
]])
else
screen:expect([[
{7: }^ |
{1:~ }|*6
: |
]])
end
feed('/<c-f>')
if multigrid then
screen:expect([[
## grid 1
[2:---------------------------------------------]|
{2:[No Name] }|
[5:---------------------------------------------]|*4
{3:[Command Line] }|
[3:---------------------------------------------]|
## grid 2
{7: } |
## grid 3
/ |
## grid 5
{1:/}{7: }alpha |
{1:/}{7: }{10:omega} |
{1:/}{7: }^ |
{1:~ }|
]])
else
screen:expect([[
{7: } |
{2:[No Name] }|
{1:/}{7: }alpha |
{1:/}{7: }{10:omega} |
{1:/}{7: }^ |
{1:~ }|
{3:[Command Line] }|
/ |
]])
end
feed('ggzfG')
if multigrid then
screen:expect([[
## grid 1
[2:---------------------------------------------]|
{2:[No Name] }|
[5:---------------------------------------------]|*4
{3:[Command Line] }|
[3:---------------------------------------------]|
## grid 2
{7: } |
## grid 3
/ |
## grid 5
{1:/}{7:+}{13:^+-- 3 lines: alpha························}|
{1:~ }|*3
]])
else
screen:expect([[
{7: } |
{2:[No Name] }|
{1:/}{7:+}{13:^+-- 3 lines: alpha························}|
{1:~ }|*3
{3:[Command Line] }|
/ |
]])
end
end)
it('foldcolumn autoresize', function()
fn.setline(1, 'line 1')
fn.setline(2, 'line 2')
fn.setline(3, 'line 3')
fn.setline(4, 'line 4')
feed('zfj')
command('set foldcolumn=0')
if multigrid then
screen:expect([[
## grid 1
[2:---------------------------------------------]|*7
[3:---------------------------------------------]|
## grid 2
{13:^+-- 2 lines: line 1·························}|
line 3 |
line 4 |
{1:~ }|*4
## grid 3
|
]])
else
screen:expect([[
{13:^+-- 2 lines: line 1·························}|
line 3 |
line 4 |
{1:~ }|*4
|
]])
end
-- should adapt to the current nesting of folds (e.g., 1)
command('set foldcolumn=auto:1')
if multigrid then
screen:expect([[
## grid 1
[2:---------------------------------------------]|*7
[3:---------------------------------------------]|
## grid 2
{7:+}{13:^+-- 2 lines: line 1························}|
{7: }line 3 |
{7: }line 4 |
{1:~ }|*4
## grid 3
|
]])
else
screen:expect([[
{7:+}{13:^+-- 2 lines: line 1························}|
{7: }line 3 |
{7: }line 4 |
{1:~ }|*4
|
]])
end
command('set foldcolumn=auto')
if multigrid then
screen:expect {
grid = [[
## grid 1
[2:---------------------------------------------]|*7
[3:---------------------------------------------]|
## grid 2
{7:+}{13:^+-- 2 lines: line 1························}|
{7: }line 3 |
{7: }line 4 |
{1:~ }|*4
## grid 3
|
]],
unchanged = true,
}
else
screen:expect {
grid = [[
{7:+}{13:^+-- 2 lines: line 1························}|
{7: }line 3 |
{7: }line 4 |
{1:~ }|*4
|
]],
unchanged = true,
}
end
-- fdc should not change with a new fold as the maximum is 1
feed('zf3j')
if multigrid then
screen:expect([[
## grid 1
[2:---------------------------------------------]|*7
[3:---------------------------------------------]|
## grid 2
{7:+}{13:^+-- 4 lines: line 1························}|
{1:~ }|*6
## grid 3
|
]])
else
screen:expect([[
{7:+}{13:^+-- 4 lines: line 1························}|
{1:~ }|*6
|
]])
end
command('set foldcolumn=auto:1')
if multigrid then
screen:expect_unchanged()
end
-- relax the maximum fdc thus fdc should expand to
-- accommodate the current number of folds
command('set foldcolumn=auto:4')
if multigrid then
screen:expect([[
## grid 1
[2:---------------------------------------------]|*7
[3:---------------------------------------------]|
## grid 2
{7:+ }{13:^+-- 4 lines: line 1·······················}|
{1:~ }|*6
## grid 3
|
]])
else
screen:expect([[
{7:+ }{13:^+-- 4 lines: line 1·······················}|
{1:~ }|*6
|
]])
end
end)
it('no crash when foldtext is longer than columns #12988', function()
exec([[
function! MyFoldText() abort
return repeat('-', &columns + 100)
endfunction
]])
command('set foldtext=MyFoldText()')
feed('i<cr><esc>')
feed('vkzf')
if multigrid then
screen:expect([[
## grid 1
[2:---------------------------------------------]|*7
[3:---------------------------------------------]|
## grid 2
{13:^---------------------------------------------}|
{1:~ }|*6
## grid 3
|
]])
else
screen:expect([[
{13:^---------------------------------------------}|
{1:~ }|*6
|
]])
end
assert_alive()
end)
it('fold text is shown when text has been scrolled to the right #19123', function()
insert(content1)
command('set number nowrap')
command('3,4fold')
feed('gg')
if multigrid then
screen:expect([[
## grid 1
[2:---------------------------------------------]|*7
[3:---------------------------------------------]|
## grid 2
{8: 1 }^This is a |
{8: 2 }valid English |
{8: 3 }{13:+-- 2 lines: sentence composed by·······}|
{8: 5 }in his cave. |
{8: 6 } |
{1:~ }|*2
## grid 3
|
]])
else
screen:expect([[
{8: 1 }^This is a |
{8: 2 }valid English |
{8: 3 }{13:+-- 2 lines: sentence composed by·······}|
{8: 5 }in his cave. |
{8: 6 } |
{1:~ }|*2
|
]])
end
feed('zl')
if multigrid then
screen:expect([[
## grid 1
[2:---------------------------------------------]|*7
[3:---------------------------------------------]|
## grid 2
{8: 1 }^his is a |
{8: 2 }alid English |
{8: 3 }{13:+-- 2 lines: sentence composed by·······}|
{8: 5 }n his cave. |
{8: 6 } |
{1:~ }|*2
## grid 3
|
]])
else
screen:expect([[
{8: 1 }^his is a |
{8: 2 }alid English |
{8: 3 }{13:+-- 2 lines: sentence composed by·······}|
{8: 5 }n his cave. |
{8: 6 } |
{1:~ }|*2
|
]])
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 }{13:αβγ······································}|
{8: 5 } |
{8: 6 } |
{8: 7 }!!!!!!!!!!!!!!!!!!!!^! |
{1:~ }|
## grid 3
|
]])
else
screen:expect([[
{8: 1 } |
{8: 2 } |
{8: 3 }{13:αβγ······································}|
{8: 5 } |
{8: 6 } |
{8: 7 }!!!!!!!!!!!!!!!!!!!!^! |
{1:~ }|
|
]])
end
end)
it('fold attached virtual lines are drawn and scrolled correctly #21837', function()
fn.setline(1, 'line 1')
fn.setline(2, 'line 2')
fn.setline(3, 'line 3')
fn.setline(4, 'line 4')
feed('zfj')
local ns = api.nvim_create_namespace('ns')
api.nvim_buf_set_extmark(
0,
ns,
0,
0,
{ virt_lines_above = true, virt_lines = { { { 'virt_line above line 1', '' } } } }
)
api.nvim_buf_set_extmark(
0,
ns,
1,
0,
{ virt_lines = { { { 'virt_line below line 2', '' } } } }
)
api.nvim_buf_set_extmark(
0,
ns,
2,
0,
{ virt_lines_above = true, virt_lines = { { { 'virt_line above line 3', '' } } } }
)
api.nvim_buf_set_extmark(
0,
ns,
3,
0,
{ virt_lines = { { { 'virt_line below line 4', '' } } } }
)
if multigrid then
screen:expect {
grid = [[
## grid 1
[2:---------------------------------------------]|*7
[3:---------------------------------------------]|
## grid 2
{13:^+-- 2 lines: line 1·························}|
virt_line above line 3 |
line 3 |
line 4 |
virt_line below line 4 |
{1:~ }|*2
## grid 3
|
]],
win_viewport = {
[2] = {
win = 1000,
topline = 0,
botline = 5,
curline = 0,
curcol = 0,
linecount = 4,
sum_scroll_delta = 0,
},
},
}
else
screen:expect([[
{13:^+-- 2 lines: line 1·························}|
virt_line above line 3 |
line 3 |
line 4 |
virt_line below line 4 |
{1:~ }|*2
|
]])
end
feed('jzfj')
if multigrid then
screen:expect {
grid = [[
## grid 1
[2:---------------------------------------------]|*7
[3:---------------------------------------------]|
## grid 2
{13:+-- 2 lines: line 1·························}|
{13:^+-- 2 lines: line 3·························}|
{1:~ }|*5
## grid 3
|
]],
win_viewport = {
[2] = {
win = 1000,
topline = 0,
botline = 5,
curline = 2,
curcol = 0,
linecount = 4,
sum_scroll_delta = 0,
},
},
}
else
screen:expect([[
{13:+-- 2 lines: line 1·························}|
{13:^+-- 2 lines: line 3·························}|
{1:~ }|*5
|
]])
end
feed('kzo<C-Y>')
fn.setline(5, 'line 5')
if multigrid then
screen:expect {
grid = [[
## grid 1
[2:---------------------------------------------]|*7
[3:---------------------------------------------]|
## grid 2
virt_line above line 1 |
^line 1 |
line 2 |
virt_line below line 2 |
{13:+-- 2 lines: line 3·························}|
line 5 |
{1:~ }|
## grid 3
|
]],
win_viewport = {
[2] = {
win = 1000,
topline = 0,
botline = 6,
curline = 0,
curcol = 0,
linecount = 5,
sum_scroll_delta = -1,
},
},
}
else
screen:expect([[
virt_line above line 1 |
^line 1 |
line 2 |
virt_line below line 2 |
{13:+-- 2 lines: line 3·························}|
line 5 |
{1:~ }|
|
]])
end
api.nvim_input_mouse('left', 'press', '', multigrid and 2 or 0, 4, 0)
eq({
screencol = 1,
screenrow = 5,
winid = 1000,
wincol = 1,
winrow = 5,
line = 3,
column = 1,
coladd = 0,
}, fn.getmousepos())
api.nvim_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 = [[
## grid 1
[2:---------------------------------------------]|*7
[3:---------------------------------------------]|
## grid 2
line 1 |
line 2 |
virt_line below line 2 |
more virt_line below line 2 |
{13:+-- 2 lines: line 3·························}|
^line 5 |
{1:~ }|
## grid 3
|
]],
win_viewport = {
[2] = {
win = 1000,
topline = 0,
botline = 6,
curline = 4,
curcol = 0,
linecount = 5,
sum_scroll_delta = 0,
},
},
}
else
screen:expect([[
line 1 |
line 2 |
virt_line below line 2 |
more virt_line below line 2 |
{13:+-- 2 lines: line 3·························}|
^line 5 |
{1:~ }|
|
]])
end
feed('<C-E>')
if multigrid then
screen:expect {
grid = [[
## grid 1
[2:---------------------------------------------]|*7
[3:---------------------------------------------]|
## grid 2
line 2 |
virt_line below line 2 |
more virt_line below line 2 |
{13:+-- 2 lines: line 3·························}|
^line 5 |
{1:~ }|*2
## grid 3
|
]],
win_viewport = {
[2] = {
win = 1000,
topline = 1,
botline = 6,
curline = 4,
curcol = 0,
linecount = 5,
sum_scroll_delta = 1,
},
},
}
else
screen:expect([[
line 2 |
virt_line below line 2 |
more virt_line below line 2 |
{13:+-- 2 lines: line 3·························}|
^line 5 |
{1:~ }|*2
|
]])
end
feed('<C-E>')
if multigrid then
screen:expect {
grid = [[
## grid 1
[2:---------------------------------------------]|*7
[3:---------------------------------------------]|
## grid 2
virt_line below line 2 |
more virt_line below line 2 |
{13:+-- 2 lines: line 3·························}|
^line 5 |
{1:~ }|*3
## grid 3
|
]],
win_viewport = {
[2] = {
win = 1000,
topline = 2,
botline = 6,
curline = 4,
curcol = 0,
linecount = 5,
sum_scroll_delta = 2,
},
},
}
else
screen:expect([[
virt_line below line 2 |
more virt_line below line 2 |
{13:+-- 2 lines: line 3·························}|
^line 5 |
{1:~ }|*3
|
]])
end
feed('<C-E>')
if multigrid then
screen:expect {
grid = [[
## grid 1
[2:---------------------------------------------]|*7
[3:---------------------------------------------]|
## grid 2
more virt_line below line 2 |
{13:+-- 2 lines: line 3·························}|
^line 5 |
{1:~ }|*4
## grid 3
|
]],
win_viewport = {
[2] = {
win = 1000,
topline = 2,
botline = 6,
curline = 4,
curcol = 0,
linecount = 5,
sum_scroll_delta = 3,
},
},
}
else
screen:expect([[
more virt_line below line 2 |
{13:+-- 2 lines: line 3·························}|
^line 5 |
{1:~ }|*4
|
]])
end
feed('<C-E>')
if multigrid then
screen:expect {
grid = [[
## grid 1
[2:---------------------------------------------]|*7
[3:---------------------------------------------]|
## grid 2
{13:+-- 2 lines: line 3·························}|
^line 5 |
{1:~ }|*5
## grid 3
|
]],
win_viewport = {
[2] = {
win = 1000,
topline = 2,
botline = 6,
curline = 4,
curcol = 0,
linecount = 5,
sum_scroll_delta = 4,
},
},
}
else
screen:expect([[
{13:+-- 2 lines: line 3·························}|
^line 5 |
{1:~ }|*5
|
]])
end
feed('<C-E>')
if multigrid then
screen:expect {
grid = [[
## grid 1
[2:---------------------------------------------]|*7
[3:---------------------------------------------]|
## grid 2
^line 5 |
{1:~ }|*6
## grid 3
|
]],
win_viewport = {
[2] = {
win = 1000,
topline = 4,
botline = 6,
curline = 4,
curcol = 0,
linecount = 5,
sum_scroll_delta = 5,
},
},
}
else
screen:expect([[
^line 5 |
{1:~ }|*6
|
]])
end
feed('3<C-Y>')
if multigrid then
screen:expect {
grid = [[
## grid 1
[2:---------------------------------------------]|*7
[3:---------------------------------------------]|
## grid 2
virt_line below line 2 |
more virt_line below line 2 |
{13:+-- 2 lines: line 3·························}|
^line 5 |
{1:~ }|*3
## grid 3
|
]],
win_viewport = {
[2] = {
win = 1000,
topline = 2,
botline = 6,
curline = 4,
curcol = 0,
linecount = 5,
sum_scroll_delta = 2,
},
},
}
else
screen:expect([[
virt_line below line 2 |
more virt_line below line 2 |
{13:+-- 2 lines: line 3·························}|
^line 5 |
{1:~ }|*3
|
]])
end
api.nvim_input_mouse('left', 'press', '3', multigrid and 2 or 0, 3, 0)
if multigrid then
screen:expect {
grid = [[
## grid 1
[2:---------------------------------------------]|*7
[3:---------------------------------------------]|
## grid 2
virt_line below line 2 |
more virt_line below line 2 |
{13:+-- 2 lines: line 3·························}|
^l{17:ine 5} |
{1:~ }|*3
## grid 3
{5:-- VISUAL LINE --} |
]],
win_viewport = {
[2] = {
win = 1000,
topline = 2,
botline = 6,
curline = 4,
curcol = 0,
linecount = 5,
sum_scroll_delta = 2,
},
},
}
else
screen:expect([[
virt_line below line 2 |
more virt_line below line 2 |
{13:+-- 2 lines: line 3·························}|
^l{17:ine 5} |
{1:~ }|*3
{5:-- VISUAL LINE --} |
]])
end
api.nvim_input_mouse('left', 'drag', '3', multigrid and 2 or 0, 7, 0)
if multigrid then
screen:expect {
grid = [[
## grid 1
[2:---------------------------------------------]|*7
[3:---------------------------------------------]|
## grid 2
more virt_line below line 2 |
{13:+-- 2 lines: line 3·························}|
^l{17:ine 5} |
{1:~ }|*4
## grid 3
{5:-- VISUAL LINE --} |
]],
win_viewport = {
[2] = {
win = 1000,
topline = 2,
botline = 6,
curline = 4,
curcol = 0,
linecount = 5,
sum_scroll_delta = 3,
},
},
}
else
screen:expect([[
more virt_line below line 2 |
{13:+-- 2 lines: line 3·························}|
^l{17:ine 5} |
{1:~ }|*4
{5:-- VISUAL LINE --} |
]])
end
api.nvim_input_mouse('left', 'drag', '3', multigrid and 2 or 0, 7, 5)
if multigrid then
screen:expect {
grid = [[
## grid 1
[2:---------------------------------------------]|*7
[3:---------------------------------------------]|
## grid 2
{13:+-- 2 lines: line 3·························}|
{17:line }^5 |
{1:~ }|*5
## grid 3
{5:-- VISUAL LINE --} |
]],
win_viewport = {
[2] = {
win = 1000,
topline = 2,
botline = 6,
curline = 4,
curcol = 5,
linecount = 5,
sum_scroll_delta = 4,
},
},
}
else
screen:expect([[
{13:+-- 2 lines: line 3·························}|
{17:line }^5 |
{1:~ }|*5
{5:-- VISUAL LINE --} |
]])
end
feed('<Esc>gg')
command('botright 1split | wincmd w')
if multigrid then
screen:expect {
grid = [[
## grid 1
[2:---------------------------------------------]|*4
{3:[No Name] [+] }|
[4:---------------------------------------------]|
{2:[No Name] [+] }|
[3:---------------------------------------------]|
## grid 2
^line 1 |
line 2 |
virt_line below line 2 |
more virt_line below line 2 |
## grid 3
|
## grid 4
line 1 |
]],
win_viewport = {
[2] = {
win = 1000,
topline = 0,
botline = 3,
curline = 0,
curcol = 0,
linecount = 5,
sum_scroll_delta = 0,
},
[4] = {
win = 1001,
topline = 0,
botline = 2,
curline = 0,
curcol = 0,
linecount = 5,
sum_scroll_delta = 0,
},
},
}
else
screen:expect([[
^line 1 |
line 2 |
virt_line below line 2 |
more virt_line below line 2 |
{3:[No Name] [+] }|
line 1 |
{2:[No Name] [+] }|
|
]])
end
feed('<C-Y>')
if multigrid then
screen:expect {
grid = [[
## grid 1
[2:---------------------------------------------]|*4
{3:[No Name] [+] }|
[4:---------------------------------------------]|
{2:[No Name] [+] }|
[3:---------------------------------------------]|
## grid 2
virt_line above line 1 |
^line 1 |
line 2 |
virt_line below line 2 |
## grid 3
|
## grid 4
line 1 |
]],
win_viewport = {
[2] = {
win = 1000,
topline = 0,
botline = 3,
curline = 0,
curcol = 0,
linecount = 5,
sum_scroll_delta = -1,
},
[4] = {
win = 1001,
topline = 0,
botline = 2,
curline = 0,
curcol = 0,
linecount = 5,
sum_scroll_delta = 0,
},
},
}
else
screen:expect([[
virt_line above line 1 |
^line 1 |
line 2 |
virt_line below line 2 |
{3:[No Name] [+] }|
line 1 |
{2:[No Name] [+] }|
|
]])
end
end)
it('Folded and Visual highlights are combined #19691', function()
command('hi! Visual guifg=NONE guibg=Red')
insert([[
" foofoofoofoofoofoo
" 口 {{{1
set nocp
" }}}1
" barbarbarbarbarbar
" 口 {{{1
set foldmethod=marker
" }}}1
" bazbazbazbazbazbaz]])
feed('gg')
command('source')
feed('<C-V>G15l')
if multigrid then
screen:expect([[
## grid 1
[2:---------------------------------------------]|*7
[3:---------------------------------------------]|
## grid 2
{30:" foofoofoofoofo}ofoo |
{103:+-- 3 lines: " }{13:口···························}|
{30:" barbarbarbarba}rbar |
{103:+-- 3 lines: " }{13:口···························}|
{30:" bazbazbazbazb}^azbaz |
{1:~ }|*2
## grid 3
{5:-- VISUAL BLOCK --} |
]])
else
screen:expect([[
{30:" foofoofoofoofo}ofoo |
{103:+-- 3 lines: " }{13:口···························}|
{30:" barbarbarbarba}rbar |
{103:+-- 3 lines: " }{13:口···························}|
{30:" bazbazbazbazb}^azbaz |
{1:~ }|*2
{5:-- VISUAL BLOCK --} |
]])
end
feed('l')
if multigrid then
screen:expect([[
## grid 1
[2:---------------------------------------------]|*7
[3:---------------------------------------------]|
## grid 2
{30:" foofoofoofoofoo}foo |
{103:+-- 3 lines: " 口}{13:···························}|
{30:" barbarbarbarbar}bar |
{103:+-- 3 lines: " 口}{13:···························}|
{30:" bazbazbazbazba}^zbaz |
{1:~ }|*2
## grid 3
{5:-- VISUAL BLOCK --} |
]])
else
screen:expect([[
{30:" foofoofoofoofoo}foo |
{103:+-- 3 lines: " 口}{13:···························}|
{30:" barbarbarbarbar}bar |
{103:+-- 3 lines: " 口}{13:···························}|
{30:" bazbazbazbazba}^zbaz |
{1:~ }|*2
{5:-- VISUAL BLOCK --} |
]])
end
feed('l')
if multigrid then
screen:expect([[
## grid 1
[2:---------------------------------------------]|*7
[3:---------------------------------------------]|
## grid 2
{30:" foofoofoofoofoof}oo |
{103:+-- 3 lines: " 口}{13:···························}|
{30:" barbarbarbarbarb}ar |
{103:+-- 3 lines: " 口}{13:···························}|
{30:" bazbazbazbazbaz}^baz |
{1:~ }|*2
## grid 3
{5:-- VISUAL BLOCK --} |
]])
else
screen:expect([[
{30:" foofoofoofoofoof}oo |
{103:+-- 3 lines: " 口}{13:···························}|
{30:" barbarbarbarbarb}ar |
{103:+-- 3 lines: " 口}{13:···························}|
{30:" bazbazbazbazbaz}^baz |
{1:~ }|*2
{5:-- VISUAL BLOCK --} |
]])
end
feed('2l')
if multigrid then
screen:expect([[
## grid 1
[2:---------------------------------------------]|*7
[3:---------------------------------------------]|
## grid 2
{30:" foofoofoofoofoofoo} |
{103:+-- 3 lines: " 口··}{13:·························}|
{30:" barbarbarbarbarbar} |
{103:+-- 3 lines: " 口··}{13:·························}|
{30:" bazbazbazbazbazba}^z |
{1:~ }|*2
## grid 3
{5:-- VISUAL BLOCK --} |
]])
else
screen:expect([[
{30:" foofoofoofoofoofoo} |
{103:+-- 3 lines: " 口··}{13:·························}|
{30:" barbarbarbarbarbar} |
{103:+-- 3 lines: " 口··}{13:·························}|
{30:" bazbazbazbazbazba}^z |
{1:~ }|*2
{5:-- VISUAL BLOCK --} |
]])
end
feed('O16l')
if multigrid then
screen:expect([[
## grid 1
[2:---------------------------------------------]|*7
[3:---------------------------------------------]|
## grid 2
" foofoofoofoofo{30:ofoo} |
{13:+-- 3 lines: " }{103:口··}{13:·························}|
" barbarbarbarba{30:rbar} |
{13:+-- 3 lines: " }{103:口··}{13:·························}|
" bazbazbazbazba^z{30:baz} |
{1:~ }|*2
## grid 3
{5:-- VISUAL BLOCK --} |
]])
else
screen:expect([[
" foofoofoofoofo{30:ofoo} |
{13:+-- 3 lines: " }{103:口··}{13:·························}|
" barbarbarbarba{30:rbar} |
{13:+-- 3 lines: " }{103:口··}{13:·························}|
" bazbazbazbazba^z{30:baz} |
{1:~ }|*2
{5:-- VISUAL BLOCK --} |
]])
end
feed('l')
if multigrid then
screen:expect([[
## grid 1
[2:---------------------------------------------]|*7
[3:---------------------------------------------]|
## grid 2
" foofoofoofoofoo{30:foo} |
{13:+-- 3 lines: " }{103:口··}{13:·························}|
" barbarbarbarbar{30:bar} |
{13:+-- 3 lines: " }{103:口··}{13:·························}|
" bazbazbazbazbaz^b{30:az} |
{1:~ }|*2
## grid 3
{5:-- VISUAL BLOCK --} |
]])
else
screen:expect([[
" foofoofoofoofoo{30:foo} |
{13:+-- 3 lines: " }{103:口··}{13:·························}|
" barbarbarbarbar{30:bar} |
{13:+-- 3 lines: " }{103:口··}{13:·························}|
" bazbazbazbazbaz^b{30:az} |
{1:~ }|*2
{5:-- VISUAL BLOCK --} |
]])
end
end)
it('do not show search or match highlight #24084', function()
insert([[
line 1
line 2
line 3
line 4]])
command('2,3fold')
feed('/line')
if multigrid then
screen:expect([[
## grid 1
[2:---------------------------------------------]|*7
[3:---------------------------------------------]|
## grid 2
{2:line} 1 |
{13:+-- 2 lines: line 2·························}|
{10:line} 4 |
{1:~ }|*4
## grid 3
/line^ |
]])
else
screen:expect([[
{2:line} 1 |
{13:+-- 2 lines: line 2·························}|
{10:line} 4 |
{1:~ }|*4
/line^ |
]])
end
feed('<Esc>')
fn.matchadd('Search', 'line')
if multigrid then
screen:expect([[
## grid 1
[2:---------------------------------------------]|*7
[3:---------------------------------------------]|
## grid 2
{10:line} 1 |
{13:+-- 2 lines: line 2·························}|
{10:line} ^4 |
{1:~ }|*4
## grid 3
|
]])
else
screen:expect([[
{10:line} 1 |
{13:+-- 2 lines: line 2·························}|
{10:line} ^4 |
{1:~ }|*4
|
]])
end
end)
it('foldtext with virtual text format', 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')
api.nvim_set_option_value('cursorline', true, {})
api.nvim_set_option_value('foldcolumn', '4', {})
api.nvim_set_option_value(
'foldtext',
'['
.. '["▶", ["F0", "F1"]], '
.. '[v:folddashes], '
.. '["\t", "Search"], '
.. '[getline(v:foldstart), "NonText"]]',
{}
)
command('3,4fold')
command('5,6fold')
command('2,6fold')
if multigrid then
screen:expect([[
## grid 1
[2:------------------------------]|*6
[3:------------------------------]|
## grid 2
{7: }This is a |
{7:+ }{9:^▶}{101:-}{20: }{104:valid English}{101:·····}|
{1:~ }|*4
## grid 3
|
]])
else
screen:expect([[
{7: }This is a |
{7:+ }{9:^▶}{101:-}{20: }{104:valid English}{101:·····}|
{1:~ }|*4
|
]])
end
eq('▶-\tvalid English', fn.foldtextresult(2))
feed('zo')
if multigrid then
screen:expect([[
## grid 1
[2:------------------------------]|*6
[3:------------------------------]|
## grid 2
{7: }This is a |
{7:- }valid English |
{7:│+ }{9:▶}{13:--}{105: }{104:sentence composed }|
{7:│+ }{9:^▶}{101:--}{20: }{104:in his cave.}{101:······}|
{1:~ }|*2
## grid 3
|
]])
else
screen:expect([[
{7: }This is a |
{7:- }valid English |
{7:│+ }{9:▶}{13:--}{105: }{104:sentence composed }|
{7:│+ }{9:^▶}{101:--}{20: }{104:in his cave.}{101:······}|
{1:~ }|*2
|
]])
end
eq('▶--\tsentence composed by', fn.foldtextresult(3))
eq('▶--\tin his cave.', fn.foldtextresult(5))
command('hi! Visual guifg=NONE guibg=Red')
feed('V2k')
if multigrid then
screen:expect([[
## grid 1
[2:------------------------------]|*6
[3:------------------------------]|
## grid 2
{7: }This is a |
{7:- }^v{30:alid English} |
{7:│+ }{9:▶}{103:--}{105: }{106:sentence composed }|
{7:│+ }{9:▶}{103:--}{105: }{106:in his cave.}{103:······}|
{1:~ }|*2
## grid 3
{5:-- VISUAL LINE --} |
]])
else
screen:expect([[
{7: }This is a |
{7:- }^v{30:alid English} |
{7:│+ }{9:▶}{103:--}{105: }{106:sentence composed }|
{7:│+ }{9:▶}{103:--}{105: }{106:in his cave.}{103:······}|
{1:~ }|*2
{5:-- VISUAL LINE --} |
]])
end
api.nvim_set_option_value('rightleft', true, {})
if multigrid then
screen:expect([[
## grid 1
[2:------------------------------]|*6
[3:------------------------------]|
## grid 2
a si sihT{7: }|
{30:hsilgnE dila}^v{7: -}|
{106: desopmoc ecnetnes}{105: }{103:--}{9:▶}{7: +│}|
{103:······}{106:.evac sih ni}{105: }{103:--}{9:▶}{7: +│}|
{1: ~}|*2
## grid 3
{5:-- VISUAL LINE --} |
]])
else
screen:expect([[
a si sihT{7: }|
{30:hsilgnE dila}^v{7: -}|
{106: desopmoc ecnetnes}{105: }{103:--}{9:▶}{7: +│}|
{103:······}{106:.evac sih ni}{105: }{103:--}{9:▶}{7: +│}|
{1: ~}|*2
{5:-- VISUAL LINE --} |
]])
end
end)
it('transparent foldtext', function()
screen:try_resize(30, 7)
insert(content1)
command('hi! CursorLine guibg=NONE guifg=Red gui=NONE')
command([[syn match Keyword /\<sentence\>/]])
command('hi! Keyword guibg=NONE guifg=Green')
api.nvim_set_option_value('cursorline', true, {})
api.nvim_set_option_value('foldcolumn', '4', {})
api.nvim_set_option_value('foldtext', '', {})
command('3,4fold')
command('5,6fold')
command('2,6fold')
if multigrid then
screen:expect([[
## grid 1
[2:------------------------------]|*6
[3:------------------------------]|
## grid 2
{7: }This is a |
{7:+ }{101:^valid English·············}|
{1:~ }|*4
## grid 3
|
]])
else
screen:expect([[
{7: }This is a |
{7:+ }{101:^valid English·············}|
{1:~ }|*4
|
]])
end
feed('zo')
if multigrid then
screen:expect([[
## grid 1
[2:------------------------------]|*6
[3:------------------------------]|
## grid 2
{7: }This is a |
{7:- }valid English |
{7:│+ }{107:sentence}{13: composed by······}|
{7:│+ }{101:^in his cave.··············}|
{1:~ }|*2
## grid 3
|
]])
else
screen:expect([[
{7: }This is a |
{7:- }valid English |
{7:│+ }{107:sentence}{13: composed by······}|
{7:│+ }{101:^in his cave.··············}|
{1:~ }|*2
|
]])
end
command('hi! Visual guifg=NONE guibg=Red')
feed('V2k')
if multigrid then
screen:expect([[
## grid 1
[2:------------------------------]|*6
[3:------------------------------]|
## grid 2
{7: }This is a |
{7:- }^v{30:alid English} |
{7:│+ }{108:sentence}{103: composed by······}|
{7:│+ }{103:in his cave.··············}|
{1:~ }|*2
## grid 3
{5:-- VISUAL LINE --} |
]])
else
screen:expect([[
{7: }This is a |
{7:- }^v{30:alid English} |
{7:│+ }{108:sentence}{103: composed by······}|
{7:│+ }{103:in his cave.··············}|
{1:~ }|*2
{5:-- VISUAL LINE --} |
]])
end
api.nvim_set_option_value('rightleft', true, {})
if multigrid then
screen:expect([[
## grid 1
[2:------------------------------]|*6
[3:------------------------------]|
## grid 2
a si sihT{7: }|
{30:hsilgnE dila}^v{7: -}|
{103:······yb desopmoc }{108:ecnetnes}{7: +│}|
{103:··············.evac sih ni}{7: +│}|
{1: ~}|*2
## grid 3
{5:-- VISUAL LINE --} |
]])
else
screen:expect([[
a si sihT{7: }|
{30:hsilgnE dila}^v{7: -}|
{103:······yb desopmoc }{108:ecnetnes}{7: +│}|
{103:··············.evac sih ni}{7: +│}|
{1: ~}|*2
{5:-- 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:- }{100:^alid English }|
{7:│+ }{107:entence}{13: composed by·······}|
{7:│+ }{13:n his cave.···············}|
{1:~ }|*2
## grid 3
|
]])
else
screen:expect([[
{7: }his is a |
{7:- }{100:^alid English }|
{7:│+ }{107:entence}{13: composed by·······}|
{7:│+ }{13: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: }{100:^! }|
{7: } |
{7:- } |
{7:│+ }{13:sed by····················}|
{7:│+ }{13:··························}|
{1:~ }|
## grid 3
|
]])
else
screen:expect([[
{7: }{100:^! }|
{7: } |
{7:- } |
{7:│+ }{13:sed by····················}|
{7:│+ }{13:··························}|
{1:~ }|
|
]])
end
end)
it('transparent foldtext filler text search highlighting', function()
screen:try_resize(30, 7)
insert(content1)
api.nvim_set_option_value('foldtext', '', {})
command("3,4fold | let v:hlsearch = 1 | let @/ = '.'")
if multigrid then
screen:expect([[
## grid 1
[2:------------------------------]|*6
[3:------------------------------]|
## grid 2
{10:This is a} |
{10:valid English} |
{105:sentence composed by}{13:··········}|
{10:in his cave.} |
^ |
{1:~ }|
## grid 3
|
]])
else
screen:expect([[
{10:This is a} |
{10:valid English} |
{105:sentence composed by}{13:··········}|
{10:in his cave.} |
^ |
{1:~ }|
|
]])
end
command("let @/ = '$'")
if multigrid then
screen:expect([[
## grid 1
[2:------------------------------]|*6
[3:------------------------------]|
## grid 2
This is a{10: } |
valid English{10: } |
{13:sentence composed by}{105:·}{13:·········}|
in his cave.{10: } |
{10:^ } |
{1:~ }|
## grid 3
|
]])
else
screen:expect([[
This is a{10: } |
valid English{10: } |
{13:sentence composed by}{105:·}{13:·········}|
in his cave.{10: } |
{10:^ } |
{1:~ }|
|
]])
end
command("let @/ = '.\\?'")
if multigrid then
screen:expect([[
## grid 1
[2:------------------------------]|*6
[3:------------------------------]|
## grid 2
{10:This is a } |
{10:valid English } |
{105:sentence composed by·}{13:·········}|
{10:in his cave. } |
{10:^ } |
{1:~ }|
## grid 3
|
]])
else
screen:expect([[
{10:This is a } |
{10:valid English } |
{105:sentence composed by·}{13:·········}|
{10:in his cave. } |
{10:^ } |
{1:~ }|
|
]])
end
command('set list')
screen:expect_unchanged() -- No "eol" set for &listchars yet.
command("set listchars+=eol:& | let @/ = '.'")
if multigrid then
screen:expect([[
## grid 1
[2:------------------------------]|*6
[3:------------------------------]|
## grid 2
{10:This is a}{1:&} |
{10:valid English}{1:&} |
{105:sentence composed by}{104:&}{13:·········}|
{10:in his cave.}{1:&} |
{1:^&} |
{1:~ }|
## grid 3
|
]])
else
screen:expect([[
{10:This is a}{1:&} |
{10:valid English}{1:&} |
{105:sentence composed by}{104:&}{13:·········}|
{10:in his cave.}{1:&} |
{1:^&} |
{1:~ }|
|
]])
end
command("let @/ = '$'")
if multigrid then
screen:expect([[
## grid 1
[2:------------------------------]|*6
[3:------------------------------]|
## grid 2
This is a{109:&} |
valid English{109:&} |
{13:sentence composed by}{109:&}{13:·········}|
in his cave.{109:&} |
{109:^&} |
{1:~ }|
## grid 3
|
]])
else
screen:expect([[
This is a{109:&} |
valid English{109:&} |
{13:sentence composed by}{109:&}{13:·········}|
in his cave.{109:&} |
{109:^&} |
{1:~ }|
|
]])
end
command("let @/ = '.\\?'")
if multigrid then
screen:expect([[
## grid 1
[2:------------------------------]|*6
[3:------------------------------]|
## grid 2
{10:This is a}{109:&} |
{10:valid English}{109:&} |
{105:sentence composed by}{109:&}{13:·········}|
{10:in his cave.}{109:&} |
{109:^&} |
{1:~ }|
## grid 3
|
]])
else
screen:expect([[
{10:This is a}{109:&} |
{10:valid English}{109:&} |
{105:sentence composed by}{109:&}{13:·········}|
{10:in his cave.}{109:&} |
{109:^&} |
{1:~ }|
|
]])
end
end)
end
describe('with ext_multigrid', function()
with_ext_multigrid(true)
end)
describe('without ext_multigrid', function()
with_ext_multigrid(false)
end)
it("do not interfere with corrected cursor position for 'scrolloff'", function()
local screen = Screen.new(40, 7)
exec([[
call setline(1, range(10))
6,7fold
set scrolloff=1
norm L
]])
screen:expect([[
0 |
1 |
2 |
3 |
^4 |
{13:+-- 2 lines: 5·························}|
|
]])
end)
end)