mirror of
https://github.com/neovim/neovim.git
synced 2024-12-26 06:05:06 -07:00
0c59771e31
This is the first installment of a multi-PR series significantly refactoring how highlights are being specified. The end goal is to have a base set of 20 ish most common highlights, and then specific files only need to add more groups to that as needed. As a complicating factor, we also want to migrate to the new default color scheme eventually. But by sharing a base set, that future PR will hopefully be a lot smaller since a lot of tests will be migrated just simply by updating the base set in place. As a first step, fix the anti-pattern than Screen defaults to ignoring highlights. Highlights are integral part of the screen state, not something "extra" which we only test "sometimes". For now, we still allow opt-out via the intentionally ugly screen._default_attr_ids = nil The end goal is to get rid of all of these eventually (which will be easier as part of the color scheme migration)
364 lines
9.0 KiB
Lua
364 lines
9.0 KiB
Lua
local helpers = require('test.functional.helpers')(after_each)
|
|
local Screen = require('test.functional.ui.screen')
|
|
local clear, api = helpers.clear, helpers.api
|
|
local eq = helpers.eq
|
|
local command = helpers.command
|
|
|
|
describe('ui/cursor', function()
|
|
local screen
|
|
|
|
before_each(function()
|
|
clear()
|
|
screen = Screen.new(25, 5)
|
|
screen:attach()
|
|
end)
|
|
|
|
it("'guicursor' is published as a UI event", function()
|
|
local expected_mode_info = {
|
|
[1] = {
|
|
blinkoff = 0,
|
|
blinkon = 0,
|
|
blinkwait = 0,
|
|
cell_percentage = 0,
|
|
cursor_shape = 'block',
|
|
name = 'normal',
|
|
hl_id = 0,
|
|
id_lm = 0,
|
|
attr = {},
|
|
attr_lm = {},
|
|
mouse_shape = 0,
|
|
short_name = 'n',
|
|
},
|
|
[2] = {
|
|
blinkoff = 0,
|
|
blinkon = 0,
|
|
blinkwait = 0,
|
|
cell_percentage = 0,
|
|
cursor_shape = 'block',
|
|
name = 'visual',
|
|
hl_id = 0,
|
|
id_lm = 0,
|
|
attr = {},
|
|
attr_lm = {},
|
|
mouse_shape = 0,
|
|
short_name = 'v',
|
|
},
|
|
[3] = {
|
|
blinkoff = 0,
|
|
blinkon = 0,
|
|
blinkwait = 0,
|
|
cell_percentage = 25,
|
|
cursor_shape = 'vertical',
|
|
name = 'insert',
|
|
hl_id = 0,
|
|
id_lm = 0,
|
|
attr = {},
|
|
attr_lm = {},
|
|
mouse_shape = 0,
|
|
short_name = 'i',
|
|
},
|
|
[4] = {
|
|
blinkoff = 0,
|
|
blinkon = 0,
|
|
blinkwait = 0,
|
|
cell_percentage = 20,
|
|
cursor_shape = 'horizontal',
|
|
name = 'replace',
|
|
hl_id = 0,
|
|
id_lm = 0,
|
|
attr = {},
|
|
attr_lm = {},
|
|
mouse_shape = 0,
|
|
short_name = 'r',
|
|
},
|
|
[5] = {
|
|
blinkoff = 0,
|
|
blinkon = 0,
|
|
blinkwait = 0,
|
|
cell_percentage = 0,
|
|
cursor_shape = 'block',
|
|
name = 'cmdline_normal',
|
|
hl_id = 0,
|
|
id_lm = 0,
|
|
attr = {},
|
|
attr_lm = {},
|
|
mouse_shape = 0,
|
|
short_name = 'c',
|
|
},
|
|
[6] = {
|
|
blinkoff = 0,
|
|
blinkon = 0,
|
|
blinkwait = 0,
|
|
cell_percentage = 25,
|
|
cursor_shape = 'vertical',
|
|
name = 'cmdline_insert',
|
|
hl_id = 0,
|
|
id_lm = 0,
|
|
attr = {},
|
|
attr_lm = {},
|
|
mouse_shape = 0,
|
|
short_name = 'ci',
|
|
},
|
|
[7] = {
|
|
blinkoff = 0,
|
|
blinkon = 0,
|
|
blinkwait = 0,
|
|
cell_percentage = 20,
|
|
cursor_shape = 'horizontal',
|
|
name = 'cmdline_replace',
|
|
hl_id = 0,
|
|
id_lm = 0,
|
|
attr = {},
|
|
attr_lm = {},
|
|
mouse_shape = 0,
|
|
short_name = 'cr',
|
|
},
|
|
[8] = {
|
|
blinkoff = 0,
|
|
blinkon = 0,
|
|
blinkwait = 0,
|
|
cell_percentage = 20,
|
|
cursor_shape = 'horizontal',
|
|
name = 'operator',
|
|
hl_id = 0,
|
|
id_lm = 0,
|
|
attr = {},
|
|
attr_lm = {},
|
|
mouse_shape = 0,
|
|
short_name = 'o',
|
|
},
|
|
[9] = {
|
|
blinkoff = 0,
|
|
blinkon = 0,
|
|
blinkwait = 0,
|
|
cell_percentage = 25,
|
|
cursor_shape = 'vertical',
|
|
name = 'visual_select',
|
|
hl_id = 0,
|
|
id_lm = 0,
|
|
attr = {},
|
|
attr_lm = {},
|
|
mouse_shape = 0,
|
|
short_name = 've',
|
|
},
|
|
[10] = {
|
|
name = 'cmdline_hover',
|
|
mouse_shape = 0,
|
|
short_name = 'e',
|
|
},
|
|
[11] = {
|
|
name = 'statusline_hover',
|
|
mouse_shape = 0,
|
|
short_name = 's',
|
|
},
|
|
[12] = {
|
|
name = 'statusline_drag',
|
|
mouse_shape = 0,
|
|
short_name = 'sd',
|
|
},
|
|
[13] = {
|
|
name = 'vsep_hover',
|
|
mouse_shape = 0,
|
|
short_name = 'vs',
|
|
},
|
|
[14] = {
|
|
name = 'vsep_drag',
|
|
mouse_shape = 0,
|
|
short_name = 'vd',
|
|
},
|
|
[15] = {
|
|
name = 'more',
|
|
mouse_shape = 0,
|
|
short_name = 'm',
|
|
},
|
|
[16] = {
|
|
name = 'more_lastline',
|
|
mouse_shape = 0,
|
|
short_name = 'ml',
|
|
},
|
|
[17] = {
|
|
blinkoff = 0,
|
|
blinkon = 0,
|
|
blinkwait = 0,
|
|
cell_percentage = 0,
|
|
cursor_shape = 'block',
|
|
name = 'showmatch',
|
|
hl_id = 0,
|
|
id_lm = 0,
|
|
attr = {},
|
|
attr_lm = {},
|
|
short_name = 'sm',
|
|
},
|
|
}
|
|
|
|
screen:expect(function()
|
|
-- Default 'guicursor', published on startup.
|
|
eq(expected_mode_info, screen._mode_info)
|
|
eq(true, screen._cursor_style_enabled)
|
|
eq('normal', screen.mode)
|
|
end)
|
|
|
|
-- Event is published ONLY if the cursor style changed.
|
|
screen._mode_info = nil
|
|
command("echo 'test'")
|
|
screen:expect {
|
|
grid = [[
|
|
^ |
|
|
{1:~ }|*3
|
|
test |
|
|
]],
|
|
condition = function()
|
|
eq(nil, screen._mode_info)
|
|
end,
|
|
}
|
|
|
|
-- Change the cursor style.
|
|
helpers.command('hi Cursor guibg=DarkGray')
|
|
helpers.command(
|
|
'set guicursor=n-v-c:block,i-ci-ve:ver25,r-cr-o:hor20'
|
|
.. ',a:blinkwait700-blinkoff400-blinkon250-Cursor/lCursor'
|
|
.. ',sm:block-blinkwait175-blinkoff150-blinkon175'
|
|
)
|
|
|
|
-- Update the expected values.
|
|
for _, m in ipairs(expected_mode_info) do
|
|
if m.name == 'showmatch' then
|
|
if m.blinkon then
|
|
m.blinkon = 175
|
|
end
|
|
if m.blinkoff then
|
|
m.blinkoff = 150
|
|
end
|
|
if m.blinkwait then
|
|
m.blinkwait = 175
|
|
end
|
|
else
|
|
if m.blinkon then
|
|
m.blinkon = 250
|
|
end
|
|
if m.blinkoff then
|
|
m.blinkoff = 400
|
|
end
|
|
if m.blinkwait then
|
|
m.blinkwait = 700
|
|
end
|
|
end
|
|
if m.hl_id then
|
|
m.hl_id = 64
|
|
m.attr = { background = Screen.colors.DarkGray }
|
|
end
|
|
if m.id_lm then
|
|
m.id_lm = 69
|
|
end
|
|
end
|
|
|
|
-- Assert the new expectation.
|
|
screen:expect(function()
|
|
eq(expected_mode_info, screen._mode_info)
|
|
eq(true, screen._cursor_style_enabled)
|
|
eq('normal', screen.mode)
|
|
end)
|
|
|
|
-- Change hl groups only, should update the styles
|
|
helpers.command('hi Cursor guibg=Red')
|
|
helpers.command('hi lCursor guibg=Green')
|
|
|
|
-- Update the expected values.
|
|
for _, m in ipairs(expected_mode_info) do
|
|
if m.hl_id then
|
|
m.attr = { background = Screen.colors.Red }
|
|
end
|
|
if m.id_lm then
|
|
m.attr_lm = { background = Screen.colors.Green }
|
|
end
|
|
end
|
|
-- Assert the new expectation.
|
|
screen:expect(function()
|
|
eq(expected_mode_info, screen._mode_info)
|
|
eq(true, screen._cursor_style_enabled)
|
|
eq('normal', screen.mode)
|
|
end)
|
|
|
|
-- update the highlight again to hide cursor
|
|
helpers.command('hi Cursor blend=100')
|
|
|
|
for _, m in ipairs(expected_mode_info) do
|
|
if m.hl_id then
|
|
m.attr = { background = Screen.colors.Red, blend = 100 }
|
|
end
|
|
end
|
|
screen:expect {
|
|
grid = [[
|
|
^ |
|
|
{1:~ }|*3
|
|
test |
|
|
]],
|
|
condition = function()
|
|
eq(expected_mode_info, screen._mode_info)
|
|
end,
|
|
}
|
|
|
|
-- Another cursor style.
|
|
api.nvim_set_option_value(
|
|
'guicursor',
|
|
'n-v-c:ver35-blinkwait171-blinkoff172-blinkon173'
|
|
.. ',ve:hor35,o:ver50,i-ci:block,r-cr:hor90,sm:ver42',
|
|
{}
|
|
)
|
|
screen:expect(function()
|
|
local named = {}
|
|
for _, m in ipairs(screen._mode_info) do
|
|
named[m.name] = m
|
|
end
|
|
eq('vertical', named.normal.cursor_shape)
|
|
eq(35, named.normal.cell_percentage)
|
|
eq('horizontal', named.visual_select.cursor_shape)
|
|
eq(35, named.visual_select.cell_percentage)
|
|
eq('vertical', named.operator.cursor_shape)
|
|
eq(50, named.operator.cell_percentage)
|
|
eq('block', named.insert.cursor_shape)
|
|
eq('vertical', named.showmatch.cursor_shape)
|
|
eq(90, named.cmdline_replace.cell_percentage)
|
|
eq(171, named.normal.blinkwait)
|
|
eq(172, named.normal.blinkoff)
|
|
eq(173, named.normal.blinkon)
|
|
eq(42, named.showmatch.cell_percentage)
|
|
end)
|
|
|
|
-- If there is no setting for guicursor, it becomes the default setting.
|
|
api.nvim_set_option_value(
|
|
'guicursor',
|
|
'n:ver35-blinkwait171-blinkoff172-blinkon173-Cursor/lCursor',
|
|
{}
|
|
)
|
|
screen:expect(function()
|
|
for _, m in ipairs(screen._mode_info) do
|
|
if m.name ~= 'normal' then
|
|
eq('block', m.cursor_shape or 'block')
|
|
eq(0, m.blinkon or 0)
|
|
eq(0, m.blinkoff or 0)
|
|
eq(0, m.blinkwait or 0)
|
|
eq(0, m.hl_id or 0)
|
|
eq(0, m.id_lm or 0)
|
|
end
|
|
end
|
|
end)
|
|
end)
|
|
|
|
it("empty 'guicursor' sets cursor_shape=block in all modes", function()
|
|
api.nvim_set_option_value('guicursor', '', {})
|
|
screen:expect(function()
|
|
-- Empty 'guicursor' sets enabled=false.
|
|
eq(false, screen._cursor_style_enabled)
|
|
for _, m in ipairs(screen._mode_info) do
|
|
if m['cursor_shape'] ~= nil then
|
|
eq('block', m.cursor_shape)
|
|
eq(0, m.blinkon)
|
|
eq(0, m.hl_id)
|
|
eq(0, m.id_lm)
|
|
end
|
|
end
|
|
end)
|
|
end)
|
|
end)
|