mirror of
https://github.com/neovim/neovim.git
synced 2024-12-20 03:05:11 -07:00
e61228a214
Before calling "attach" a screen object is just a dummy container for (row, col) values whose purpose is to be sent as part of the "attach" function call anyway. Just create the screen in an attached state directly. Keep the complete (row, col, options) config together. It is still completely valid to later detach and re-attach as needed, including to another session.
175 lines
6.5 KiB
Lua
175 lines
6.5 KiB
Lua
local t = require('test.testutil')
|
|
local n = require('test.functional.testnvim')()
|
|
local Screen = require('test.functional.ui.screen')
|
|
|
|
local exec_lua = n.exec_lua
|
|
local eq = t.eq
|
|
local eval = n.eval
|
|
local command = n.command
|
|
local clear = n.clear
|
|
local api = n.api
|
|
|
|
describe('vim.hl.range', function()
|
|
local screen
|
|
|
|
before_each(function()
|
|
clear()
|
|
screen = Screen.new(60, 6)
|
|
screen:add_extra_attr_ids({
|
|
[100] = { foreground = Screen.colors.Blue, background = Screen.colors.Yellow, bold = true },
|
|
})
|
|
api.nvim_set_option_value('list', true, {})
|
|
api.nvim_set_option_value('listchars', 'eol:$', {})
|
|
api.nvim_buf_set_lines(0, 0, -1, true, {
|
|
'asdfghjkl',
|
|
'«口=口»',
|
|
'qwertyuiop',
|
|
'口口=口口',
|
|
'zxcvbnm',
|
|
})
|
|
end)
|
|
|
|
it('works with charwise selection', function()
|
|
exec_lua(function()
|
|
local ns = vim.api.nvim_create_namespace('')
|
|
vim.hl.range(0, ns, 'Search', { 1, 5 }, { 3, 10 })
|
|
end)
|
|
screen:expect([[
|
|
^asdfghjkl{1:$} |
|
|
«口{10:=口»}{100:$} |
|
|
{10:qwertyuiop}{100:$} |
|
|
{10:口口=口}口{1:$} |
|
|
zxcvbnm{1:$} |
|
|
|
|
|
]])
|
|
end)
|
|
|
|
it('works with linewise selection', function()
|
|
exec_lua(function()
|
|
local ns = vim.api.nvim_create_namespace('')
|
|
vim.hl.range(0, ns, 'Search', { 0, 0 }, { 4, 0 }, { regtype = 'V' })
|
|
end)
|
|
screen:expect([[
|
|
{10:^asdfghjkl}{100:$} |
|
|
{10:«口=口»}{100:$} |
|
|
{10:qwertyuiop}{100:$} |
|
|
{10:口口=口口}{100:$} |
|
|
{10:zxcvbnm}{100:$} |
|
|
|
|
|
]])
|
|
end)
|
|
|
|
it('works with blockwise selection', function()
|
|
exec_lua(function()
|
|
local ns = vim.api.nvim_create_namespace('')
|
|
vim.hl.range(0, ns, 'Search', { 0, 0 }, { 4, 4 }, { regtype = '\022' })
|
|
end)
|
|
screen:expect([[
|
|
{10:^asdf}ghjkl{1:$} |
|
|
{10:«口=}口»{1:$} |
|
|
{10:qwer}tyuiop{1:$} |
|
|
{10:口口}=口口{1:$} |
|
|
{10:zxcv}bnm{1:$} |
|
|
|
|
|
]])
|
|
end)
|
|
|
|
it('works with blockwise selection with width', function()
|
|
exec_lua(function()
|
|
local ns = vim.api.nvim_create_namespace('')
|
|
vim.hl.range(0, ns, 'Search', { 0, 4 }, { 4, 7 }, { regtype = '\0226' })
|
|
end)
|
|
screen:expect([[
|
|
^asdf{10:ghjkl}{1:$} |
|
|
«口={10:口»}{1:$} |
|
|
qwer{10:tyuiop}{1:$} |
|
|
口口{10:=口口}{1:$} |
|
|
zxcv{10:bnm}{1:$} |
|
|
|
|
|
]])
|
|
end)
|
|
|
|
it('can use -1 or v:maxcol to indicate end of line', function()
|
|
exec_lua(function()
|
|
local ns = vim.api.nvim_create_namespace('')
|
|
vim.hl.range(0, ns, 'Search', { 0, 4 }, { 1, -1 }, {})
|
|
vim.hl.range(0, ns, 'Search', { 2, 6 }, { 3, vim.v.maxcol }, {})
|
|
end)
|
|
screen:expect([[
|
|
^asdf{10:ghjkl}{100:$} |
|
|
{10:«口=口»}{100:$} |
|
|
qwerty{10:uiop}{100:$} |
|
|
{10:口口=口口}{1:$} |
|
|
zxcvbnm{1:$} |
|
|
|
|
|
]])
|
|
end)
|
|
end)
|
|
|
|
describe('vim.hl.on_yank', function()
|
|
before_each(function()
|
|
clear()
|
|
end)
|
|
|
|
it('does not show errors even if buffer is wiped before timeout', function()
|
|
command('new')
|
|
exec_lua(function()
|
|
vim.hl.on_yank({
|
|
timeout = 10,
|
|
on_macro = true,
|
|
event = { operator = 'y', regtype = 'v' },
|
|
})
|
|
vim.cmd('bwipeout!')
|
|
end)
|
|
vim.uv.sleep(10)
|
|
n.feed('<cr>') -- avoid hang if error message exists
|
|
eq('', eval('v:errmsg'))
|
|
end)
|
|
|
|
it('does not close timer twice', function()
|
|
exec_lua(function()
|
|
vim.hl.on_yank({ timeout = 10, on_macro = true, event = { operator = 'y' } })
|
|
vim.uv.sleep(10)
|
|
vim.schedule(function()
|
|
vim.hl.on_yank({ timeout = 0, on_macro = true, event = { operator = 'y' } })
|
|
end)
|
|
end)
|
|
eq('', eval('v:errmsg'))
|
|
end)
|
|
|
|
it('does not show in another window', function()
|
|
command('vsplit')
|
|
exec_lua(function()
|
|
vim.api.nvim_buf_set_mark(0, '[', 1, 1, {})
|
|
vim.api.nvim_buf_set_mark(0, ']', 1, 1, {})
|
|
vim.hl.on_yank({ timeout = math.huge, on_macro = true, event = { operator = 'y' } })
|
|
end)
|
|
local ns = api.nvim_create_namespace('hlyank')
|
|
local win = api.nvim_get_current_win()
|
|
eq({ win }, api.nvim__ns_get(ns).wins)
|
|
command('wincmd w')
|
|
eq({ win }, api.nvim__ns_get(ns).wins)
|
|
end)
|
|
|
|
it('removes old highlight if new one is created before old one times out', function()
|
|
command('vnew')
|
|
exec_lua(function()
|
|
vim.api.nvim_buf_set_mark(0, '[', 1, 1, {})
|
|
vim.api.nvim_buf_set_mark(0, ']', 1, 1, {})
|
|
vim.hl.on_yank({ timeout = math.huge, on_macro = true, event = { operator = 'y' } })
|
|
end)
|
|
local ns = api.nvim_create_namespace('hlyank')
|
|
eq(api.nvim_get_current_win(), api.nvim__ns_get(ns).wins[1])
|
|
command('wincmd w')
|
|
exec_lua(function()
|
|
vim.api.nvim_buf_set_mark(0, '[', 1, 1, {})
|
|
vim.api.nvim_buf_set_mark(0, ']', 1, 1, {})
|
|
vim.hl.on_yank({ timeout = math.huge, on_macro = true, event = { operator = 'y' } })
|
|
end)
|
|
local win = api.nvim_get_current_win()
|
|
eq({ win }, api.nvim__ns_get(ns).wins)
|
|
command('wincmd w')
|
|
eq({ win }, api.nvim__ns_get(ns).wins)
|
|
end)
|
|
end)
|