mirror of
https://github.com/neovim/neovim.git
synced 2025-09-07 20:08:17 +00:00

When a plugin registers a TermRequest handler there is currently no way for the handler to know where the terminal's cursor position was when the sequence was received. This is often useful information, e.g. for OSC 133 sequences which are used to annotate shell prompts. Modify the event data for the TermRequest autocommand to be a table instead of just a string. The "sequence" field of the table contains the sequence string and the "cursor" field contains the cursor position when the sequence was received. To maintain consistency between TermRequest and TermResponse (and to future proof the latter), TermResponse's event data is also updated to be a table with a "sequence" field. BREAKING CHANGE: event data for TermRequest and TermResponse is now a table
349 lines
11 KiB
Lua
349 lines
11 KiB
Lua
--
|
|
-- Tests for default autocmds, mappings, commands, and menus.
|
|
--
|
|
-- See options/defaults_spec.lua for default options and environment decisions.
|
|
--
|
|
|
|
local t = require('test.testutil')
|
|
local n = require('test.functional.testnvim')()
|
|
local Screen = require('test.functional.ui.screen')
|
|
|
|
describe('default', function()
|
|
describe('autocommands', function()
|
|
it('nvim.terminal.TermClose closes terminal with default shell on success', function()
|
|
n.clear()
|
|
n.api.nvim_set_option_value('shell', n.testprg('shell-test'), {})
|
|
n.command('set shellcmdflag=EXIT shellredir= shellpipe= shellquote= shellxquote=')
|
|
|
|
-- Should not block other events
|
|
n.command('let g:n=0')
|
|
n.command('au BufEnter * let g:n = g:n + 1')
|
|
|
|
n.command('terminal')
|
|
t.eq(1, n.eval('get(g:, "n", 0)'))
|
|
|
|
t.retry(nil, 1000, function()
|
|
t.neq('terminal', n.api.nvim_get_option_value('buftype', { buf = 0 }))
|
|
t.eq(2, n.eval('get(g:, "n", 0)'))
|
|
end)
|
|
end)
|
|
end)
|
|
|
|
describe('popupmenu', function()
|
|
it('can be disabled by user', function()
|
|
n.clear {
|
|
args = { '+autocmd! nvim.popupmenu', '+aunmenu PopUp' },
|
|
}
|
|
local screen = Screen.new(40, 8)
|
|
n.insert([[
|
|
1 line 1
|
|
2 https://example.com
|
|
3 line 3
|
|
4 line 4]])
|
|
|
|
n.api.nvim_input_mouse('right', 'press', '', 0, 1, 4)
|
|
screen:expect({
|
|
grid = [[
|
|
1 line 1 |
|
|
2 ht^tps://example.com |
|
|
3 line 3 |
|
|
4 line 4 |
|
|
{1:~ }|*3
|
|
|
|
|
]],
|
|
})
|
|
end)
|
|
|
|
it('right-click on URL shows "Open in web browser"', function()
|
|
n.clear()
|
|
local screen = Screen.new(40, 8)
|
|
n.insert([[
|
|
1 line 1
|
|
2 https://example.com
|
|
3 line 3
|
|
4 line 4]])
|
|
|
|
n.api.nvim_input_mouse('right', 'press', '', 0, 3, 4)
|
|
screen:expect({
|
|
grid = [[
|
|
1 line 1 |
|
|
2 https://example.com |
|
|
3 line 3 |
|
|
4 li^ne 4 |
|
|
{1:~ }{4: Inspect }{1: }|
|
|
{1:~ }{4: }{1: }|
|
|
{1:~ }{4: Paste }{1: }|
|
|
{4: Select All } |
|
|
]],
|
|
})
|
|
|
|
n.api.nvim_input_mouse('right', 'press', '', 0, 1, 4)
|
|
screen:expect({
|
|
grid = [[
|
|
1 line 1 |
|
|
2 ht^tps://example.com |
|
|
3 l{4: Open in web browser } |
|
|
4 l{4: Inspect } |
|
|
{1:~ }{4: }{1: }|
|
|
{1:~ }{4: Paste }{1: }|
|
|
{1:~ }{4: Select All }{1: }|
|
|
{4: } |
|
|
]],
|
|
})
|
|
end)
|
|
end)
|
|
|
|
describe('key mappings', function()
|
|
describe('Visual mode search mappings', function()
|
|
it('handle various chars properly', function()
|
|
n.clear({ args_rm = { '--cmd' } })
|
|
local screen = Screen.new(60, 8)
|
|
screen:set_default_attr_ids({
|
|
[1] = { foreground = Screen.colors.NvimDarkGray4 },
|
|
[2] = {
|
|
foreground = Screen.colors.NvimDarkGray3,
|
|
background = Screen.colors.NvimLightGray3,
|
|
},
|
|
[3] = {
|
|
foreground = Screen.colors.NvimLightGrey1,
|
|
background = Screen.colors.NvimDarkYellow,
|
|
},
|
|
[4] = {
|
|
foreground = Screen.colors.NvimDarkGrey1,
|
|
background = Screen.colors.NvimLightYellow,
|
|
},
|
|
})
|
|
n.api.nvim_buf_set_lines(0, 0, -1, true, {
|
|
[[testing <CR> /?\!1]],
|
|
[[testing <CR> /?\!2]],
|
|
[[testing <CR> /?\!3]],
|
|
[[testing <CR> /?\!4]],
|
|
})
|
|
n.feed('gg0vf!')
|
|
n.poke_eventloop()
|
|
n.feed('*')
|
|
screen:expect([[
|
|
{3:testing <CR> /?\!}1 |
|
|
{4:^testing <CR> /?\!}2 |
|
|
{3:testing <CR> /?\!}3 |
|
|
{3:testing <CR> /?\!}4 |
|
|
{1:~ }|*2
|
|
{2:[No Name] [+] 2,1 All}|
|
|
/\Vtesting <CR> /?\\! [2/4] |
|
|
]])
|
|
n.feed('n')
|
|
screen:expect([[
|
|
{3:testing <CR> /?\!}1 |
|
|
{3:testing <CR> /?\!}2 |
|
|
{4:^testing <CR> /?\!}3 |
|
|
{3:testing <CR> /?\!}4 |
|
|
{1:~ }|*2
|
|
{2:[No Name] [+] 3,1 All}|
|
|
/\Vtesting <CR> /?\\! [3/4] |
|
|
]])
|
|
n.feed('G0vf!')
|
|
n.poke_eventloop()
|
|
n.feed('#')
|
|
screen:expect([[
|
|
{3:testing <CR> /?\!}1 |
|
|
{3:testing <CR> /?\!}2 |
|
|
{4:^testing <CR> /?\!}3 |
|
|
{3:testing <CR> /?\!}4 |
|
|
{1:~ }|*2
|
|
{2:[No Name] [+] 3,1 All}|
|
|
?\Vtesting <CR> /?\\! [3/4] |
|
|
]])
|
|
n.feed('n')
|
|
screen:expect([[
|
|
{3:testing <CR> /?\!}1 |
|
|
{4:^testing <CR> /?\!}2 |
|
|
{3:testing <CR> /?\!}3 |
|
|
{3:testing <CR> /?\!}4 |
|
|
{1:~ }|*2
|
|
{2:[No Name] [+] 2,1 All}|
|
|
?\Vtesting <CR> /?\\! [2/4] |
|
|
]])
|
|
end)
|
|
end)
|
|
|
|
describe('unimpaired-style mappings', function()
|
|
it('show the command output when successful', function()
|
|
n.clear({ args_rm = { '--cmd' } })
|
|
local screen = Screen.new(40, 8)
|
|
n.fn.setqflist({
|
|
{ filename = 'file1', text = 'item1' },
|
|
{ filename = 'file2', text = 'item2' },
|
|
})
|
|
|
|
n.feed(']q')
|
|
|
|
screen:set_default_attr_ids({
|
|
[1] = { foreground = Screen.colors.NvimDarkGrey4 },
|
|
[2] = {
|
|
background = Screen.colors.NvimLightGray3,
|
|
foreground = Screen.colors.NvimDarkGrey3,
|
|
},
|
|
})
|
|
screen:expect({
|
|
grid = [[
|
|
^ |
|
|
{1:~ }|*5
|
|
{2:file2 0,0-1 All}|
|
|
(2 of 2): item2 |
|
|
]],
|
|
})
|
|
end)
|
|
|
|
it('do not show a full stack trace when unsuccessful #30625', function()
|
|
n.clear({ args_rm = { '--cmd' } })
|
|
local screen = Screen.new(40, 8)
|
|
screen:set_default_attr_ids({
|
|
[1] = { foreground = Screen.colors.NvimDarkGray4 },
|
|
[2] = {
|
|
background = Screen.colors.NvimLightGrey3,
|
|
foreground = Screen.colors.NvimDarkGray3,
|
|
},
|
|
[3] = { foreground = Screen.colors.NvimLightRed },
|
|
[4] = { foreground = Screen.colors.NvimLightCyan },
|
|
})
|
|
|
|
n.feed('[a')
|
|
screen:expect({
|
|
grid = [[
|
|
|
|
|
{1:~ }|*4
|
|
{2: }|
|
|
{3:E163: There is only one file to edit} |
|
|
{4:Press ENTER or type command to continue}^ |
|
|
]],
|
|
})
|
|
|
|
n.feed('[q')
|
|
screen:expect({
|
|
grid = [[
|
|
^ |
|
|
{1:~ }|*5
|
|
{2:[No Name] 0,0-1 All}|
|
|
{3:E42: No Errors} |
|
|
]],
|
|
})
|
|
|
|
n.feed('[l')
|
|
screen:expect({
|
|
grid = [[
|
|
^ |
|
|
{1:~ }|*5
|
|
{2:[No Name] 0,0-1 All}|
|
|
{3:E776: No location list} |
|
|
]],
|
|
})
|
|
|
|
n.feed('[t')
|
|
screen:expect({
|
|
grid = [[
|
|
^ |
|
|
{1:~ }|*5
|
|
{2:[No Name] 0,0-1 All}|
|
|
{3:E73: Tag stack empty} |
|
|
]],
|
|
})
|
|
end)
|
|
|
|
describe('[<Space>', function()
|
|
it('adds an empty line above the current line', function()
|
|
n.clear({ args_rm = { '--cmd' } })
|
|
n.insert([[first line]])
|
|
n.feed('[<Space>')
|
|
n.expect([[
|
|
|
|
first line]])
|
|
end)
|
|
|
|
it('works with a count', function()
|
|
n.clear({ args_rm = { '--cmd' } })
|
|
n.insert([[first line]])
|
|
n.feed('5[<Space>')
|
|
n.expect([[
|
|
|
|
|
|
|
|
|
|
|
|
first line]])
|
|
end)
|
|
|
|
it('supports dot repetition', function()
|
|
n.clear({ args_rm = { '--cmd' } })
|
|
n.insert([[first line]])
|
|
n.feed('[<Space>')
|
|
n.feed('.')
|
|
n.expect([[
|
|
|
|
|
|
first line]])
|
|
end)
|
|
|
|
it('supports dot repetition and a count', function()
|
|
n.clear({ args_rm = { '--cmd' } })
|
|
n.insert([[first line]])
|
|
n.feed('[<Space>')
|
|
n.feed('3.')
|
|
n.expect([[
|
|
|
|
|
|
|
|
|
|
first line]])
|
|
end)
|
|
end)
|
|
|
|
describe(']<Space>', function()
|
|
it('adds an empty line below the current line', function()
|
|
n.clear({ args_rm = { '--cmd' } })
|
|
n.insert([[first line]])
|
|
n.feed(']<Space>')
|
|
n.expect([[
|
|
first line
|
|
]])
|
|
end)
|
|
|
|
it('works with a count', function()
|
|
n.clear({ args_rm = { '--cmd' } })
|
|
n.insert([[first line]])
|
|
n.feed('5]<Space>')
|
|
n.expect([[
|
|
first line
|
|
|
|
|
|
|
|
|
|
]])
|
|
end)
|
|
|
|
it('supports dot repetition', function()
|
|
n.clear({ args_rm = { '--cmd' } })
|
|
n.insert([[first line]])
|
|
n.feed(']<Space>')
|
|
n.feed('.')
|
|
n.expect([[
|
|
first line
|
|
|
|
]])
|
|
end)
|
|
|
|
it('supports dot repetition and a count', function()
|
|
n.clear({ args_rm = { '--cmd' } })
|
|
n.insert([[first line]])
|
|
n.feed(']<Space>')
|
|
n.feed('2.')
|
|
n.expect([[
|
|
first line
|
|
|
|
|
|
]])
|
|
end)
|
|
end)
|
|
end)
|
|
end)
|
|
end)
|