aboutsummaryrefslogtreecommitdiff
path: root/test/functional/api/vim_spec.lua
diff options
context:
space:
mode:
Diffstat (limited to 'test/functional/api/vim_spec.lua')
-rw-r--r--test/functional/api/vim_spec.lua515
1 files changed, 323 insertions, 192 deletions
diff --git a/test/functional/api/vim_spec.lua b/test/functional/api/vim_spec.lua
index fd0535aa51..af4d4854f5 100644
--- a/test/functional/api/vim_spec.lua
+++ b/test/functional/api/vim_spec.lua
@@ -367,14 +367,11 @@ describe('API', function()
it('displays messages when opts.output=false', function()
local screen = Screen.new(40, 8)
screen:attach()
- screen:set_default_attr_ids({
- [0] = { bold = true, foreground = Screen.colors.Blue },
- })
api.nvim_exec2("echo 'hello'", { output = false })
screen:expect {
grid = [[
^ |
- {0:~ }|*6
+ {1:~ }|*6
hello |
]],
}
@@ -383,14 +380,11 @@ describe('API', function()
it("doesn't display messages when output=true", function()
local screen = Screen.new(40, 6)
screen:attach()
- screen:set_default_attr_ids({
- [0] = { bold = true, foreground = Screen.colors.Blue },
- })
api.nvim_exec2("echo 'hello'", { output = true })
screen:expect {
grid = [[
^ |
- {0:~ }|*4
+ {1:~ }|*4
|
]],
}
@@ -403,7 +397,7 @@ describe('API', function()
screen:expect {
grid = [[
^ |
- {0:~ }|*4
+ {1:~ }|*4
15 |
]],
}
@@ -699,7 +693,7 @@ describe('API', function()
pcall_err(request, 'nvim_call_dict_function', "{ 'f': '' }", 'f', { 1, 2 })
)
eq(
- 'dict argument type must be String or Dictionary',
+ 'dict argument type must be String or Dict',
pcall_err(request, 'nvim_call_dict_function', 42, 'f', { 1, 2 })
)
eq(
@@ -1307,12 +1301,136 @@ describe('API', function()
end)
it('crlf=false does not break lines at CR, CRLF', function()
api.nvim_paste('line 1\r\n\r\rline 2\nline 3\rline 4\r', false, -1)
- expect('line 1\r\n\r\rline 2\nline 3\rline 4\r')
+ local expected = 'line 1\r\n\r\rline 2\nline 3\rline 4\r'
+ expect(expected)
eq({ 0, 3, 14, 0 }, fn.getpos('.'))
+ feed('u') -- Undo.
+ expect('')
+ feed('.') -- Dot-repeat.
+ expect(expected)
+ end)
+ describe('repeating a paste via redo/recording', function()
+ -- Test with indent and control chars and multibyte chars containing 0x80 bytes
+ local text = dedent(([[
+ foo
+ bar
+ baz
+ !!!%s!!!%s!!!%s!!!
+ 最…倒…倀…
+ ]]):format('\0', '\2\3\6\21\22\23\24\27', '\127'))
+ before_each(function()
+ api.nvim_set_option_value('autoindent', true, {})
+ end)
+ local function test_paste_repeat_normal_insert(is_insert)
+ feed('qr' .. (is_insert and 'i' or ''))
+ eq('r', fn.reg_recording())
+ api.nvim_paste(text, true, -1)
+ feed(is_insert and '<Esc>' or '')
+ expect(text)
+ feed('.')
+ expect(text:rep(2))
+ feed('q')
+ eq('', fn.reg_recording())
+ feed('3.')
+ expect(text:rep(5))
+ feed('2@r')
+ expect(text:rep(9))
+ end
+ it('works in Normal mode', function()
+ test_paste_repeat_normal_insert(false)
+ end)
+ it('works in Insert mode', function()
+ test_paste_repeat_normal_insert(true)
+ end)
+ local function test_paste_repeat_visual_select(is_select)
+ insert(('xxx\n'):rep(5))
+ feed('ggqr' .. (is_select and 'gH' or 'V'))
+ api.nvim_paste(text, true, -1)
+ feed('q')
+ expect(text .. ('xxx\n'):rep(4))
+ feed('2@r')
+ expect(text:rep(3) .. ('xxx\n'):rep(2))
+ end
+ it('works in Visual mode (recording only)', function()
+ test_paste_repeat_visual_select(false)
+ end)
+ it('works in Select mode (recording only)', function()
+ test_paste_repeat_visual_select(true)
+ end)
+ end)
+ it('in a mapping recorded in a macro', function()
+ command([[nnoremap <F2> <Cmd>call nvim_paste('foo', v:false, -1)<CR>]])
+ feed('qr<F2>$q')
+ expect('foo')
+ feed('@r') -- repeating a macro containing the mapping should only paste once
+ expect('foofoo')
+ end)
+ local function test_paste_cancel_error(is_error)
+ before_each(function()
+ exec_lua(([[
+ vim.paste = (function(overridden)
+ return function(lines, phase)
+ for i, line in ipairs(lines) do
+ if line == 'CANCEL' then
+ %s
+ end
+ end
+ return overridden(lines, phase)
+ end
+ end)(vim.paste)
+ ]]):format(is_error and 'error("fake fail")' or 'return false'))
+ end)
+ local function check_paste_cancel_error(data, crlf, phase)
+ if is_error then
+ eq('fake fail', pcall_err(api.nvim_paste, data, crlf, phase))
+ else
+ eq(false, api.nvim_paste(data, crlf, phase))
+ end
+ end
+ it('in phase -1', function()
+ feed('A')
+ check_paste_cancel_error('CANCEL', true, -1)
+ feed('<Esc>')
+ expect('')
+ feed('.')
+ expect('')
+ end)
+ it('in phase 1', function()
+ feed('A')
+ check_paste_cancel_error('CANCEL', true, 1)
+ feed('<Esc>')
+ expect('')
+ feed('.')
+ expect('')
+ end)
+ it('in phase 2', function()
+ feed('A')
+ eq(true, api.nvim_paste('aaa', true, 1))
+ expect('aaa')
+ check_paste_cancel_error('CANCEL', true, 2)
+ feed('<Esc>')
+ expect('aaa')
+ feed('.')
+ expect('aaaaaa')
+ end)
+ it('in phase 3', function()
+ feed('A')
+ eq(true, api.nvim_paste('aaa', true, 1))
+ expect('aaa')
+ eq(true, api.nvim_paste('bbb', true, 2))
+ expect('aaabbb')
+ check_paste_cancel_error('CANCEL', true, 3)
+ feed('<Esc>')
+ expect('aaabbb')
+ feed('.')
+ expect('aaabbbaaabbb')
+ end)
+ end
+ describe('vim.paste() cancel', function()
+ test_paste_cancel_error(false)
end)
- it('vim.paste() failure', function()
- api.nvim_exec_lua('vim.paste = (function(lines, phase) error("fake fail") end)', {})
- eq('fake fail', pcall_err(request, 'nvim_paste', 'line 1\nline 2\nline 3', false, 1))
+ describe('vim.paste() error', function()
+ test_paste_cancel_error(true)
end)
end)
@@ -1441,6 +1559,28 @@ describe('API', function()
it('cannot handle NULs', function()
eq(0, api.nvim_strwidth('\0abc'))
end)
+
+ it('can handle emoji with variant selectors and ZWJ', function()
+ local selector = '❤️'
+ eq(2, fn.strchars(selector))
+ eq(1, fn.strcharlen(selector))
+ eq(2, api.nvim_strwidth(selector))
+
+ local no_selector = '❤'
+ eq(1, fn.strchars(no_selector))
+ eq(1, fn.strcharlen(no_selector))
+ eq(1, api.nvim_strwidth(no_selector))
+
+ local selector_zwj_selector = '🏳️‍⚧️'
+ eq(5, fn.strchars(selector_zwj_selector))
+ eq(1, fn.strcharlen(selector_zwj_selector))
+ eq(2, api.nvim_strwidth(selector_zwj_selector))
+
+ local emoji_zwj_emoji = '🧑‍🌾'
+ eq(3, fn.strchars(emoji_zwj_emoji))
+ eq(1, fn.strcharlen(emoji_zwj_emoji))
+ eq(2, api.nvim_strwidth(emoji_zwj_emoji))
+ end)
end)
describe('nvim_get_current_line, nvim_set_current_line', function()
@@ -1503,9 +1643,11 @@ describe('API', function()
it('nvim_get_vvar, nvim_set_vvar', function()
eq('Key is read-only: count', pcall_err(request, 'nvim_set_vvar', 'count', 42))
- eq('Dictionary is locked', pcall_err(request, 'nvim_set_vvar', 'nosuchvar', 42))
+ eq('Dict is locked', pcall_err(request, 'nvim_set_vvar', 'nosuchvar', 42))
api.nvim_set_vvar('errmsg', 'set by API')
eq('set by API', api.nvim_get_vvar('errmsg'))
+ api.nvim_set_vvar('completed_item', { word = 'a', user_data = vim.empty_dict() })
+ eq({}, api.nvim_get_vvar('completed_item')['user_data'])
api.nvim_set_vvar('errmsg', 42)
eq('42', eval('v:errmsg'))
api.nvim_set_vvar('oldfiles', { 'one', 'two' })
@@ -1533,16 +1675,12 @@ describe('API', function()
eq({ 1, 5 }, api.nvim_win_get_cursor(0))
local screen = Screen.new(60, 3)
- screen:set_default_attr_ids({
- [0] = { bold = true, foreground = Screen.colors.Blue },
- [1] = { background = Screen.colors.Yellow },
- })
screen:attach()
eq(1, eval('v:hlsearch'))
screen:expect {
grid = [[
- {1:foo} {1:^foo} {1:foo} |
- {0:~ }|
+ {10:foo} {10:^foo} {10:foo} |
+ {1:~ }|
|
]],
}
@@ -1551,7 +1689,7 @@ describe('API', function()
screen:expect {
grid = [[
foo ^foo foo |
- {0:~ }|
+ {1:~ }|
|
]],
}
@@ -1559,8 +1697,8 @@ describe('API', function()
eq(1, eval('v:hlsearch'))
screen:expect {
grid = [[
- {1:foo} {1:^foo} {1:foo} |
- {0:~ }|
+ {10:foo} {10:^foo} {10:foo} |
+ {1:~ }|
|
]],
}
@@ -1581,9 +1719,9 @@ describe('API', function()
eq(val2, request('vim_del_var', 'lua'))
end)
- it('truncates values with NULs in them', function()
+ it('preserves values with NULs in them', function()
api.nvim_set_var('xxx', 'ab\0cd')
- eq('ab', api.nvim_get_var('xxx'))
+ eq('ab\000cd', api.nvim_get_var('xxx'))
end)
end)
@@ -2144,7 +2282,7 @@ describe('API', function()
end)
describe('nvim_load_context', function()
- it('sets current editor state to given context dictionary', function()
+ it('sets current editor state to given context dict', function()
local opts = { types = { 'regs', 'jumps', 'bufs', 'gvars' } }
eq({}, parse_context(api.nvim_get_context(opts)))
@@ -2160,7 +2298,7 @@ describe('API', function()
eq({ 1, 2, 3 }, eval('[g:one, g:Two, g:THREE]'))
end)
- it('errors when context dictionary is invalid', function()
+ it('errors when context dict is invalid', function()
eq(
'E474: Failed to convert list to msgpack string buffer',
pcall_err(api.nvim_load_context, { regs = { {} }, jumps = { {} } })
@@ -2254,12 +2392,6 @@ describe('API', function()
before_each(function()
screen = Screen.new(40, 8)
screen:attach()
- screen:set_default_attr_ids({
- [0] = { bold = true, foreground = Screen.colors.Blue },
- [1] = { bold = true, foreground = Screen.colors.SeaGreen },
- [2] = { bold = true, reverse = true },
- [3] = { foreground = Screen.colors.Blue },
- })
end)
it('prints long messages correctly #20534', function()
@@ -2287,11 +2419,11 @@ describe('API', function()
screen:expect {
grid = [[
|
- {0:~ }|*3
- {2: }|
+ {1:~ }|*3
+ {3: }|
|
a |
- {1:Press ENTER or type command to continue}^ |
+ {6:Press ENTER or type command to continue}^ |
]],
}
feed('<CR>')
@@ -2299,12 +2431,12 @@ describe('API', function()
screen:expect {
grid = [[
|
- {0:~ }|*2
- {2: }|
+ {1:~ }|*2
+ {3: }|
b |
|
c |
- {1:Press ENTER or type command to continue}^ |
+ {6:Press ENTER or type command to continue}^ |
]],
}
end)
@@ -2314,11 +2446,11 @@ describe('API', function()
screen:expect {
grid = [[
|
- {0:~ }|*3
- {2: }|
- aaa{3:^@}bbb{3:^@^@}ccc |
- ddd{3:^@^@^@}eee |
- {1:Press ENTER or type command to continue}^ |
+ {1:~ }|*3
+ {3: }|
+ aaa{18:^@}bbb{18:^@^@}ccc |
+ ddd{18:^@^@^@}eee |
+ {6:Press ENTER or type command to continue}^ |
]],
}
end)
@@ -2330,20 +2462,14 @@ describe('API', function()
before_each(function()
screen = Screen.new(40, 8)
screen:attach()
- screen:set_default_attr_ids({
- [0] = { bold = true, foreground = Screen.colors.Blue },
- [1] = { foreground = Screen.colors.White, background = Screen.colors.Red },
- [2] = { bold = true, foreground = Screen.colors.SeaGreen },
- [3] = { bold = true, reverse = true },
- })
end)
it('can show one line', function()
async_meths.nvim_err_write('has bork\n')
screen:expect([[
^ |
- {0:~ }|*6
- {1:has bork} |
+ {1:~ }|*6
+ {9:has bork} |
]])
end)
@@ -2351,11 +2477,11 @@ describe('API', function()
async_meths.nvim_err_write('something happened\nvery bad\n')
screen:expect([[
|
- {0:~ }|*3
+ {1:~ }|*3
{3: }|
- {1:something happened} |
- {1:very bad} |
- {2:Press ENTER or type command to continue}^ |
+ {9:something happened} |
+ {9:very bad} |
+ {6:Press ENTER or type command to continue}^ |
]])
end)
@@ -2363,13 +2489,13 @@ describe('API', function()
async_meths.nvim_err_write('FAILURE\nERROR\nEXCEPTION\nTRACEBACK\n')
screen:expect([[
|
- {0:~ }|
+ {1:~ }|
{3: }|
- {1:FAILURE} |
- {1:ERROR} |
- {1:EXCEPTION} |
- {1:TRACEBACK} |
- {2:Press ENTER or type command to continue}^ |
+ {9:FAILURE} |
+ {9:ERROR} |
+ {9:EXCEPTION} |
+ {9:TRACEBACK} |
+ {6:Press ENTER or type command to continue}^ |
]])
end)
@@ -2379,8 +2505,8 @@ describe('API', function()
async_meths.nvim_err_write('fail\n')
screen:expect([[
^ |
- {0:~ }|*6
- {1:very fail} |
+ {1:~ }|*6
+ {9:very fail} |
]])
n.poke_eventloop()
@@ -2388,11 +2514,11 @@ describe('API', function()
async_meths.nvim_err_write('more fail\ntoo fail\n')
screen:expect([[
|
- {0:~ }|*3
+ {1:~ }|*3
{3: }|
- {1:more fail} |
- {1:too fail} |
- {2:Press ENTER or type command to continue}^ |
+ {9:more fail} |
+ {9:too fail} |
+ {6:Press ENTER or type command to continue}^ |
]])
feed('<cr>') -- exit the press ENTER screen
end)
@@ -2402,11 +2528,11 @@ describe('API', function()
screen:expect {
grid = [[
|
- {0:~ }|*3
+ {1:~ }|*3
{3: }|
- {1:aaa^@bbb^@^@ccc} |
- {1:ddd^@^@^@eee} |
- {2:Press ENTER or type command to continue}^ |
+ {9:aaa^@bbb^@^@ccc} |
+ {9:ddd^@^@^@eee} |
+ {6:Press ENTER or type command to continue}^ |
]],
}
end)
@@ -2418,30 +2544,24 @@ describe('API', function()
before_each(function()
screen = Screen.new(40, 8)
screen:attach()
- screen:set_default_attr_ids({
- [0] = { bold = true, foreground = Screen.colors.Blue },
- [1] = { foreground = Screen.colors.White, background = Screen.colors.Red },
- [2] = { bold = true, foreground = Screen.colors.SeaGreen },
- [3] = { bold = true, reverse = true },
- })
end)
it('shows only one return prompt after all lines are shown', function()
async_meths.nvim_err_writeln('FAILURE\nERROR\nEXCEPTION\nTRACEBACK')
screen:expect([[
|
- {0:~ }|
+ {1:~ }|
{3: }|
- {1:FAILURE} |
- {1:ERROR} |
- {1:EXCEPTION} |
- {1:TRACEBACK} |
- {2:Press ENTER or type command to continue}^ |
+ {9:FAILURE} |
+ {9:ERROR} |
+ {9:EXCEPTION} |
+ {9:TRACEBACK} |
+ {6:Press ENTER or type command to continue}^ |
]])
feed('<CR>')
screen:expect([[
^ |
- {0:~ }|*6
+ {1:~ }|*6
|
]])
end)
@@ -2964,6 +3084,13 @@ describe('API', function()
return ('%s(%s)%s'):format(typ, args, rest)
end
end
+
+ it('does not crash parsing invalid VimL expression #29648', function()
+ api.nvim_input(':<C-r>=')
+ api.nvim_input('1bork/')
+ assert_alive()
+ end)
+
require('test.unit.viml.expressions.parser_tests')(it, _check_parsing, hl, fmtn)
end)
@@ -3102,9 +3229,6 @@ describe('API', function()
eq(1, api.nvim_get_current_buf())
local screen = Screen.new(20, 4)
- screen:set_default_attr_ids({
- [1] = { bold = true, foreground = Screen.colors.Blue1 },
- })
screen:attach()
--
@@ -3201,7 +3325,7 @@ describe('API', function()
end)
describe('nvim_get_runtime_file', function()
- local p = n.alter_slashes
+ local p = t.fix_slashes
it('can find files', function()
eq({}, api.nvim_get_runtime_file('bork.borkbork', false))
eq({}, api.nvim_get_runtime_file('bork.borkbork', true))
@@ -3210,36 +3334,36 @@ describe('API', function()
local val = api.nvim_get_runtime_file('autoload/remote/*.vim', true)
eq(2, #val)
if endswith(val[1], 'define.vim') then
- ok(endswith(val[1], p 'autoload/remote/define.vim'))
- ok(endswith(val[2], p 'autoload/remote/host.vim'))
+ ok(endswith(p(val[1]), 'autoload/remote/define.vim'))
+ ok(endswith(p(val[2]), 'autoload/remote/host.vim'))
else
- ok(endswith(val[1], p 'autoload/remote/host.vim'))
- ok(endswith(val[2], p 'autoload/remote/define.vim'))
+ ok(endswith(p(val[1]), 'autoload/remote/host.vim'))
+ ok(endswith(p(val[2]), 'autoload/remote/define.vim'))
end
val = api.nvim_get_runtime_file('autoload/remote/*.vim', false)
eq(1, #val)
ok(
- endswith(val[1], p 'autoload/remote/define.vim')
- or endswith(val[1], p 'autoload/remote/host.vim')
+ endswith(p(val[1]), 'autoload/remote/define.vim')
+ or endswith(p(val[1]), 'autoload/remote/host.vim')
)
val = api.nvim_get_runtime_file('lua', true)
eq(1, #val)
- ok(endswith(val[1], p 'lua'))
+ ok(endswith(p(val[1]), 'lua'))
val = api.nvim_get_runtime_file('lua/vim', true)
eq(1, #val)
- ok(endswith(val[1], p 'lua/vim'))
+ ok(endswith(p(val[1]), 'lua/vim'))
end)
it('can find directories', function()
local val = api.nvim_get_runtime_file('lua/', true)
eq(1, #val)
- ok(endswith(val[1], p 'lua/'))
+ ok(endswith(p(val[1]), 'lua/'))
val = api.nvim_get_runtime_file('lua/vim/', true)
eq(1, #val)
- ok(endswith(val[1], p 'lua/vim/'))
+ ok(endswith(p(val[1]), 'lua/vim/'))
eq({}, api.nvim_get_runtime_file('foobarlang/', true))
end)
@@ -3253,6 +3377,16 @@ describe('API', function()
exc_exec("echo nvim_get_runtime_file('{', v:false)")
)
end)
+ it('preserves order of runtimepath', function()
+ local vimruntime = fn.getenv('VIMRUNTIME')
+ local rtp = string.format('%s/syntax,%s/ftplugin', vimruntime, vimruntime)
+ api.nvim_set_option_value('runtimepath', rtp, {})
+
+ local val = api.nvim_get_runtime_file('vim.vim', true)
+ eq(2, #val)
+ eq(p(val[1]), vimruntime .. '/syntax/vim.vim')
+ eq(p(val[2]), vimruntime .. '/ftplugin/vim.vim')
+ end)
end)
describe('nvim_get_all_options_info', function()
@@ -3458,13 +3592,6 @@ describe('API', function()
before_each(function()
screen = Screen.new(40, 8)
screen:attach()
- screen:set_default_attr_ids({
- [0] = { bold = true, foreground = Screen.colors.Blue },
- [1] = { bold = true, foreground = Screen.colors.SeaGreen },
- [2] = { bold = true, reverse = true },
- [3] = { foreground = Screen.colors.Brown, bold = true }, -- Statement
- [4] = { foreground = Screen.colors.SlateBlue }, -- Special
- })
command('highlight Statement gui=bold guifg=Brown')
command('highlight Special guifg=SlateBlue')
end)
@@ -3474,7 +3601,7 @@ describe('API', function()
screen:expect {
grid = [[
^ |
- {0:~ }|*6
+ {1:~ }|*6
msg |
]],
}
@@ -3489,8 +3616,8 @@ describe('API', function()
screen:expect {
grid = [[
^ |
- {0:~ }|*6
- msg_a{3:msg_b}{4:msg_c} |
+ {1:~ }|*6
+ msg_a{15:msg_b}{16:msg_c} |
]],
}
end)
@@ -3500,11 +3627,11 @@ describe('API', function()
screen:expect {
grid = [[
|
- {0:~ }|*3
- {2: }|
- {3:msg_a} |
- {3:msg_a}{4:msg_b} |
- {1:Press ENTER or type command to continue}^ |
+ {1:~ }|*3
+ {3: }|
+ {15:msg_a} |
+ {15:msg_a}{16:msg_b} |
+ {6:Press ENTER or type command to continue}^ |
]],
}
end)
@@ -3528,24 +3655,16 @@ describe('API', function()
before_each(function()
screen = Screen.new(100, 35)
screen:attach()
- screen:set_default_attr_ids({
- [0] = { bold = true, foreground = Screen.colors.Blue },
- [1] = { background = Screen.colors.Plum1 },
- [2] = { background = tonumber('0xffff40'), bg_indexed = true },
- [3] = {
- background = Screen.colors.Plum1,
- fg_indexed = true,
- foreground = tonumber('0x00e000'),
- },
- [4] = { bold = true, reverse = true, background = Screen.colors.Plum1 },
- [5] = {
- foreground = Screen.colors.Blue,
+ screen:add_extra_attr_ids {
+ [100] = { background = tonumber('0xffff40'), bg_indexed = true },
+ [101] = {
background = Screen.colors.LightMagenta,
- bold = true,
+ foreground = tonumber('0x00e000'),
+ fg_indexed = true,
},
- [6] = { bold = true },
- [7] = { reverse = true, background = Screen.colors.LightMagenta },
- })
+ [102] = { background = Screen.colors.LightMagenta, reverse = true },
+ [103] = { background = Screen.colors.LightMagenta, bold = true, reverse = true },
+ }
end)
it('can batch process sequences', function()
@@ -3561,38 +3680,38 @@ describe('API', function()
screen:expect {
grid = [[
^ |
- {0:~}{1::smile }{0: }|
- {0:~}{1: }{2:oooo$$$$$$$$$$$$oooo}{1: }{0: }|
- {0:~}{1: }{2:oo$$$$$$$$$$$$$$$$$$$$$$$$o}{1: }{0: }|
- {0:~}{1: }{2:oo$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$o}{1: }{2:o$}{1: }{2:$$}{1: }{2:o$}{1: }{0: }|
- {0:~}{1: }{2:o}{1: }{2:$}{1: }{2:oo}{1: }{2:o$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$o}{1: }{2:$$}{1: }{2:$$}{1: }{2:$$o$}{1: }{0: }|
- {0:~}{1: }{2:oo}{1: }{2:$}{1: }{2:$}{1: "}{2:$}{1: }{2:o$$$$$$$$$}{1: }{2:$$$$$$$$$$$$$}{1: }{2:$$$$$$$$$o}{1: }{2:$$$o$$o$}{1: }{0: }|
- {0:~}{1: "}{2:$$$$$$o$}{1: }{2:o$$$$$$$$$}{1: }{2:$$$$$$$$$$$}{1: }{2:$$$$$$$$$$o}{1: }{2:$$$$$$$$}{1: }{0: }|
- {0:~}{1: }{2:$$$$$$$}{1: }{2:$$$$$$$$$$$}{1: }{2:$$$$$$$$$$$}{1: }{2:$$$$$$$$$$$$$$$$$$$$$$$}{1: }{0: }|
- {0:~}{1: }{2:$$$$$$$$$$$$$$$$$$$$$$$}{1: }{2:$$$$$$$$$$$$$}{1: }{2:$$$$$$$$$$$$$$}{1: """}{2:$$$}{1: }{0: }|
- {0:~}{1: "}{2:$$$}{1:""""}{2:$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$}{1: "}{2:$$$}{1: }{0: }|
- {0:~}{1: }{2:$$$}{1: }{2:o$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$}{1: "}{2:$$$o}{1: }{0: }|
- {0:~}{1: }{2:o$$}{1:" }{2:$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$}{1: }{2:$$$o}{1: }{0: }|
- {0:~}{1: }{2:$$$}{1: }{2:$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$}{1:" "}{2:$$$$$$ooooo$$$$o}{1: }{0: }|
- {0:~}{1: }{2:o$$$oooo$$$$$}{1: }{2:$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$}{1: }{2:o$$$$$$$$$$$$$$$$$}{1: }{0: }|
- {0:~}{1: }{2:$$$$$$$$}{1:"}{2:$$$$}{1: }{2:$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$}{1: }{2:$$$$}{1:"""""""" }{0: }|
- {0:~}{1: """" }{2:$$$$}{1: "}{2:$$$$$$$$$$$$$$$$$$$$$$$$$$$$}{1:" }{2:o$$$}{1: }{0: }|
- {0:~}{1: "}{2:$$$o}{1: """}{2:$$$$$$$$$$$$$$$$$$}{1:"}{2:$$}{1:" }{2:$$$}{1: }{0: }|
- {0:~}{1: }{2:$$$o}{1: "}{2:$$}{1:""}{2:$$$$$$}{1:"""" }{2:o$$$}{1: }{0: }|
- {0:~}{1: }{2:$$$$o}{1: }{2:o$$$}{1:" }{0: }|
- {0:~}{1: "}{2:$$$$o}{1: }{2:o$$$$$$o}{1:"}{2:$$$$o}{1: }{2:o$$$$}{1: }{0: }|
- {0:~}{1: "}{2:$$$$$oo}{1: ""}{2:$$$$o$$$$$o}{1: }{2:o$$$$}{1:"" }{0: }|
- {0:~}{1: ""}{2:$$$$$oooo}{1: "}{2:$$$o$$$$$$$$$}{1:""" }{0: }|
- {0:~}{1: ""}{2:$$$$$$$oo}{1: }{2:$$$$$$$$$$}{1: }{0: }|
- {0:~}{1: """"}{2:$$$$$$$$$$$}{1: }{0: }|
- {0:~}{1: }{2:$$$$$$$$$$$$}{1: }{0: }|
- {0:~}{1: }{2:$$$$$$$$$$}{1:" }{0: }|
- {0:~}{1: "}{2:$$$}{1:"""" }{0: }|
- {0:~}{1: }{0: }|
- {0:~}{3:Press ENTER or type command to continue}{1: }{0: }|
- {0:~}{4:term://~/config2/docs/pres//32693:vim --clean +smile 29,39 All}{0: }|
- {0:~}{1::call nvim__screenshot("smile2.cat") }{0: }|
- {0:~ }|*2
+ {1:~}{4::smile }{1: }|
+ {1:~}{4: }{100:oooo$$$$$$$$$$$$oooo}{4: }{1: }|
+ {1:~}{4: }{100:oo$$$$$$$$$$$$$$$$$$$$$$$$o}{4: }{1: }|
+ {1:~}{4: }{100:oo$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$o}{4: }{100:o$}{4: }{100:$$}{4: }{100:o$}{4: }{1: }|
+ {1:~}{4: }{100:o}{4: }{100:$}{4: }{100:oo}{4: }{100:o$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$o}{4: }{100:$$}{4: }{100:$$}{4: }{100:$$o$}{4: }{1: }|
+ {1:~}{4: }{100:oo}{4: }{100:$}{4: }{100:$}{4: "}{100:$}{4: }{100:o$$$$$$$$$}{4: }{100:$$$$$$$$$$$$$}{4: }{100:$$$$$$$$$o}{4: }{100:$$$o$$o$}{4: }{1: }|
+ {1:~}{4: "}{100:$$$$$$o$}{4: }{100:o$$$$$$$$$}{4: }{100:$$$$$$$$$$$}{4: }{100:$$$$$$$$$$o}{4: }{100:$$$$$$$$}{4: }{1: }|
+ {1:~}{4: }{100:$$$$$$$}{4: }{100:$$$$$$$$$$$}{4: }{100:$$$$$$$$$$$}{4: }{100:$$$$$$$$$$$$$$$$$$$$$$$}{4: }{1: }|
+ {1:~}{4: }{100:$$$$$$$$$$$$$$$$$$$$$$$}{4: }{100:$$$$$$$$$$$$$}{4: }{100:$$$$$$$$$$$$$$}{4: """}{100:$$$}{4: }{1: }|
+ {1:~}{4: "}{100:$$$}{4:""""}{100:$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$}{4: "}{100:$$$}{4: }{1: }|
+ {1:~}{4: }{100:$$$}{4: }{100:o$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$}{4: "}{100:$$$o}{4: }{1: }|
+ {1:~}{4: }{100:o$$}{4:" }{100:$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$}{4: }{100:$$$o}{4: }{1: }|
+ {1:~}{4: }{100:$$$}{4: }{100:$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$}{4:" "}{100:$$$$$$ooooo$$$$o}{4: }{1: }|
+ {1:~}{4: }{100:o$$$oooo$$$$$}{4: }{100:$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$}{4: }{100:o$$$$$$$$$$$$$$$$$}{4: }{1: }|
+ {1:~}{4: }{100:$$$$$$$$}{4:"}{100:$$$$}{4: }{100:$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$}{4: }{100:$$$$}{4:"""""""" }{1: }|
+ {1:~}{4: """" }{100:$$$$}{4: "}{100:$$$$$$$$$$$$$$$$$$$$$$$$$$$$}{4:" }{100:o$$$}{4: }{1: }|
+ {1:~}{4: "}{100:$$$o}{4: """}{100:$$$$$$$$$$$$$$$$$$}{4:"}{100:$$}{4:" }{100:$$$}{4: }{1: }|
+ {1:~}{4: }{100:$$$o}{4: "}{100:$$}{4:""}{100:$$$$$$}{4:"""" }{100:o$$$}{4: }{1: }|
+ {1:~}{4: }{100:$$$$o}{4: }{100:o$$$}{4:" }{1: }|
+ {1:~}{4: "}{100:$$$$o}{4: }{100:o$$$$$$o}{4:"}{100:$$$$o}{4: }{100:o$$$$}{4: }{1: }|
+ {1:~}{4: "}{100:$$$$$oo}{4: ""}{100:$$$$o$$$$$o}{4: }{100:o$$$$}{4:"" }{1: }|
+ {1:~}{4: ""}{100:$$$$$oooo}{4: "}{100:$$$o$$$$$$$$$}{4:""" }{1: }|
+ {1:~}{4: ""}{100:$$$$$$$oo}{4: }{100:$$$$$$$$$$}{4: }{1: }|
+ {1:~}{4: """"}{100:$$$$$$$$$$$}{4: }{1: }|
+ {1:~}{4: }{100:$$$$$$$$$$$$}{4: }{1: }|
+ {1:~}{4: }{100:$$$$$$$$$$}{4:" }{1: }|
+ {1:~}{4: "}{100:$$$}{4:"""" }{1: }|
+ {1:~}{4: }{1: }|
+ {1:~}{101:Press ENTER or type command to continue}{4: }{1: }|
+ {1:~}{103:term://~/config2/docs/pres//32693:vim --clean +smile 29,39 All}{1: }|
+ {1:~}{4::call nvim__screenshot("smile2.cat") }{1: }|
+ {1:~ }|*2
|
]],
}
@@ -3624,9 +3743,9 @@ describe('API', function()
screen:expect {
grid = [[
|
- {0:~}{1:^ }{0: }|
- {0:~}{1: }{0: }|*4
- {0:~ }|*3
+ {1:~}{4:^ }{1: }|
+ {1:~}{4: }{1: }|*4
+ {1:~ }|*3
|
]],
}
@@ -3635,10 +3754,10 @@ describe('API', function()
screen:expect {
grid = [[
|
- {0:~}{7: }{1: }{0: }|
- {0:~}{1: }{0: }|*4
- {0:~ }|*3
- {6:-- TERMINAL --} |
+ {1:~}{102: }{4: }{1: }|
+ {1:~}{4: }{1: }|*4
+ {1:~ }|*3
+ {5:-- TERMINAL --} |
]],
}
@@ -3651,10 +3770,10 @@ describe('API', function()
screen:expect {
grid = [[
|
- {0:~}{1:herrejösses!}{7: }{1: }{0: }|
- {0:~}{1: }{0: }|*4
- {0:~ }|*3
- {6:-- TERMINAL --} |
+ {1:~}{4:herrejösses!}{102: }{4: }{1: }|
+ {1:~}{4: }{1: }|*4
+ {1:~ }|*3
+ {5:-- TERMINAL --} |
]],
}
eq('ba\024blaherrejösses!', exec_lua [[ return stream ]])
@@ -3933,11 +4052,11 @@ describe('API', function()
))
eq(
{
- str = '3 ',
- width = 2,
+ str = ' 3 ',
+ width = 9,
highlights = {
{ group = 'LineNr', start = 0 },
- { group = 'ErrorMsg', start = 1 },
+ { group = 'ErrorMsg', start = 8 },
},
},
api.nvim_eval_statusline('%l%#ErrorMsg# ', { use_statuscol_lnum = 3, highlights = true })
@@ -4472,10 +4591,6 @@ describe('API', function()
end)
it('does not interfere with printing line in Ex mode #19400', function()
local screen = Screen.new(60, 7)
- screen:set_default_attr_ids({
- [0] = { bold = true, foreground = Screen.colors.Blue }, -- NonText
- [1] = { bold = true, reverse = true }, -- MsgSeparator
- })
screen:attach()
insert([[
foo
@@ -4484,8 +4599,8 @@ describe('API', function()
screen:expect([[
foo |
bar |
- {0:~ }|*2
- {1: }|
+ {1:~ }|*2
+ {3: }|
Entering Ex mode. Type "visual" to go to Normal mode. |
:1^ |
]])
@@ -4494,7 +4609,7 @@ describe('API', function()
screen:expect([[
foo |
bar |
- {1: }|
+ {3: }|
Entering Ex mode. Type "visual" to go to Normal mode. |
:1 |
foo |
@@ -4934,14 +5049,11 @@ describe('API', function()
it("doesn't display messages when output=true", function()
local screen = Screen.new(40, 6)
screen:attach()
- screen:set_default_attr_ids({
- [0] = { bold = true, foreground = Screen.colors.Blue },
- })
api.nvim_cmd({ cmd = 'echo', args = { [['hello']] } }, { output = true })
screen:expect {
grid = [[
^ |
- {0:~ }|*4
+ {1:~ }|*4
|
]],
}
@@ -4954,7 +5066,7 @@ describe('API', function()
screen:expect {
grid = [[
^ |
- {0:~ }|*4
+ {1:~ }|*4
15 |
]],
}
@@ -5020,12 +5132,29 @@ describe('API', function()
it('nvim__redraw', function()
local screen = Screen.new(60, 5)
screen:attach()
- local win = api.nvim_get_current_win()
eq('at least one action required', pcall_err(api.nvim__redraw, {}))
eq('at least one action required', pcall_err(api.nvim__redraw, { buf = 0 }))
eq('at least one action required', pcall_err(api.nvim__redraw, { win = 0 }))
eq("cannot use both 'buf' and 'win'", pcall_err(api.nvim__redraw, { buf = 0, win = 0 }))
+ local win = api.nvim_get_current_win()
+ -- Can move cursor to recently opened window and window is flushed #28868
feed(':echo getchar()<CR>')
+ local newwin = api.nvim_open_win(0, false, {
+ relative = 'editor',
+ width = 1,
+ height = 1,
+ row = 1,
+ col = 10,
+ })
+ api.nvim__redraw({ win = newwin, cursor = true })
+ screen:expect({
+ grid = [[
+ |
+ {1:~ }{4:^ }{1: }|
+ {1:~ }|*2
+ :echo getchar() |
+ ]],
+ })
fn.setline(1, 'foobar')
command('vnew')
fn.setline(1, 'foobaz')
@@ -5034,11 +5163,13 @@ describe('API', function()
screen:expect({
grid = [[
foobaz │foobar |
- {1:~ }│{1:~ }|*2
+ {1:~ }{4:^f}{1: }│{1:~ }|
+ {1:~ }│{1:~ }|
{3:[No Name] [+] }{2:[No Name] [+] }|
- ^:echo getchar() |
+ :echo getchar() |
]],
})
+ api.nvim_win_close(newwin, true)
-- Can update the grid cursor position #20793
api.nvim__redraw({ cursor = true })
screen:expect({