mirror of
https://github.com/neovim/neovim.git
synced 2024-12-19 10:45:16 -07:00
Compare commits
6 Commits
c0c283968c
...
2ba46fcdd8
Author | SHA1 | Date | |
---|---|---|---|
![]() |
2ba46fcdd8 | ||
![]() |
02bc40c194 | ||
![]() |
160cbd0ef4 | ||
![]() |
35cea0b28d | ||
![]() |
b037af3f2c | ||
![]() |
3db3947b0e |
@ -60,7 +60,7 @@ hi('PmenuMatch', { link = 'Pmenu' })
|
||||
hi('PmenuMatchSel', { link = 'PmenuSel' })
|
||||
hi('PmenuExtra', { link = 'Pmenu' })
|
||||
hi('PmenuExtraSel', { link = 'PmenuSel' })
|
||||
hi('ComplMatchIns', { link = 'Normal' })
|
||||
hi('ComplMatchIns', {})
|
||||
hi('Substitute', { link = 'Search' })
|
||||
hi('Whitespace', { link = 'NonText' })
|
||||
hi('MsgSeparator', { link = 'StatusLine' })
|
||||
|
@ -955,7 +955,7 @@ int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, int col_rows, s
|
||||
bool area_highlighting = false; // Visual or incsearch highlighting in this line
|
||||
int vi_attr = 0; // attributes for Visual and incsearch highlighting
|
||||
int area_attr = 0; // attributes desired by highlighting
|
||||
int search_attr = 0; // attributes desired by 'hlsearch'
|
||||
int search_attr = 0; // attributes desired by 'hlsearch' or ComplMatchIns
|
||||
int vcol_save_attr = 0; // saved attr for 'cursorcolumn'
|
||||
int decor_attr = 0; // attributes desired by syntax and extmarks
|
||||
bool has_syntax = false; // this buffer has syntax highl.
|
||||
@ -969,7 +969,7 @@ int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, int col_rows, s
|
||||
int spell_attr = 0; // attributes desired by spelling
|
||||
int word_end = 0; // last byte with same spell_attr
|
||||
int cur_checked_col = 0; // checked column for current line
|
||||
bool extra_check = 0; // has syntax or linebreak
|
||||
bool extra_check = false; // has extra highlighting
|
||||
int multi_attr = 0; // attributes desired by multibyte
|
||||
int mb_l = 1; // multi-byte byte length
|
||||
int mb_c = 0; // decoded multi-byte character
|
||||
@ -1485,16 +1485,13 @@ int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, int col_rows, s
|
||||
}
|
||||
|
||||
// Call it here since we need to invalidate the line pointer anyway.
|
||||
bool added_decor = false;
|
||||
decor_providers_invoke_line(wp, lnum - 1, &added_decor);
|
||||
has_decor |= added_decor;
|
||||
decor_providers_invoke_line(wp, lnum - 1, &has_decor);
|
||||
|
||||
decor_provider_end_col = invoke_range_next(wp, lnum, col, rem_vcols + 1, &has_decor);
|
||||
|
||||
line = ml_get_buf(wp->w_buffer, lnum);
|
||||
ptr = line + col;
|
||||
}
|
||||
|
||||
if (has_decor) {
|
||||
extra_check = true;
|
||||
}
|
||||
@ -1526,6 +1523,10 @@ int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, int col_rows, s
|
||||
ptr = line + v; // "line" may have been updated
|
||||
}
|
||||
|
||||
if ((State & MODE_INSERT) && in_curline && ins_compl_active()) {
|
||||
area_highlighting = true;
|
||||
}
|
||||
|
||||
win_line_start(wp, &wlv);
|
||||
bool draw_cols = true;
|
||||
int leftcols_width = 0;
|
||||
@ -1781,6 +1782,14 @@ int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, int col_rows, s
|
||||
if (*ptr == NUL) {
|
||||
has_match_conc = 0;
|
||||
}
|
||||
|
||||
// Check if ComplMatchIns highlight is needed.
|
||||
if ((State & MODE_INSERT) && in_curline && ins_compl_active()) {
|
||||
int ins_match_attr = ins_compl_col_range_attr((int)(ptr - line));
|
||||
if (ins_match_attr > 0) {
|
||||
search_attr = hl_combine_attr(search_attr, ins_match_attr);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (wlv.diff_hlf != (hlf_T)0) {
|
||||
@ -1828,16 +1837,6 @@ int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, int col_rows, s
|
||||
wlv.char_attr = hl_combine_attr(char_attr_base, char_attr_pri);
|
||||
}
|
||||
|
||||
// Apply ComplMatchIns highlight if needed.
|
||||
if (wlv.filler_todo <= 0
|
||||
&& (State & MODE_INSERT) && in_curline && ins_compl_active()) {
|
||||
int ins_match_attr = ins_compl_col_range_attr((int)(ptr - line));
|
||||
if (ins_match_attr > 0) {
|
||||
char_attr_pri = hl_combine_attr(char_attr_pri, ins_match_attr);
|
||||
wlv.char_attr = hl_combine_attr(char_attr_base, char_attr_pri);
|
||||
}
|
||||
}
|
||||
|
||||
if (draw_folded && has_foldtext && wlv.n_extra == 0 && wlv.col == win_col_offset) {
|
||||
const int v = (int)(ptr - line);
|
||||
linenr_T lnume = lnum + foldinfo.fi_lines - 1;
|
||||
@ -3049,18 +3048,16 @@ static int invoke_range_next(win_T *wp, int lnum, colnr_T begin_col, colnr_T col
|
||||
int const line_len = ml_get_buf_len(wp->w_buffer, lnum);
|
||||
col_off = MAX(col_off, 1);
|
||||
|
||||
bool added_decor = false;
|
||||
colnr_T new_col;
|
||||
if (col_off <= line_len - begin_col) {
|
||||
int end_col = begin_col + col_off;
|
||||
end_col += mb_off_next(line, line + end_col);
|
||||
decor_providers_invoke_range(wp, lnum - 1, begin_col, lnum - 1, end_col, &added_decor);
|
||||
decor_providers_invoke_range(wp, lnum - 1, begin_col, lnum - 1, end_col, has_decor);
|
||||
new_col = end_col;
|
||||
} else {
|
||||
decor_providers_invoke_range(wp, lnum - 1, begin_col, lnum, 0, &added_decor);
|
||||
decor_providers_invoke_range(wp, lnum - 1, begin_col, lnum, 0, has_decor);
|
||||
new_col = INT_MAX;
|
||||
}
|
||||
|
||||
*has_decor |= added_decor;
|
||||
return new_col;
|
||||
}
|
||||
|
@ -173,7 +173,7 @@ static const char *highlight_init_both[] = {
|
||||
"default link PmenuKind Pmenu",
|
||||
"default link PmenuKindSel PmenuSel",
|
||||
"default link PmenuSbar Pmenu",
|
||||
"default link ComplMatchIns Normal",
|
||||
"default link ComplMatchIns NONE",
|
||||
"default link Substitute Search",
|
||||
"default link StatusLineTerm StatusLine",
|
||||
"default link StatusLineTermNC StatusLineNC",
|
||||
|
@ -958,7 +958,7 @@ static void ins_compl_insert_bytes(char *p, int len)
|
||||
}
|
||||
assert(len >= 0);
|
||||
ins_bytes_len(p, (size_t)len);
|
||||
compl_ins_end_col = curwin->w_cursor.col - 1;
|
||||
compl_ins_end_col = curwin->w_cursor.col;
|
||||
}
|
||||
|
||||
/// Checks if the column is within the currently inserted completion text
|
||||
@ -2147,6 +2147,8 @@ static bool ins_compl_stop(const int c, const int prev_mode, bool retval)
|
||||
&& pum_visible()) {
|
||||
word = xstrdup(compl_shown_match->cp_str);
|
||||
retval = true;
|
||||
// May need to remove ComplMatchIns highlight.
|
||||
redrawWinline(curwin, curwin->w_cursor.lnum);
|
||||
}
|
||||
|
||||
// CTRL-E means completion is Ended, go back to the typed text.
|
||||
@ -3648,6 +3650,7 @@ void ins_compl_delete(bool new_leader)
|
||||
return;
|
||||
}
|
||||
backspace_until_column(col);
|
||||
compl_ins_end_col = curwin->w_cursor.col;
|
||||
}
|
||||
|
||||
// TODO(vim): is this sufficient for redrawing? Redrawing everything
|
||||
|
@ -1291,23 +1291,22 @@ static inline bool set_uint32(lua_State *L, int idx, char const *name, uint32_t
|
||||
FUNC_ATTR_ALWAYS_INLINE FUNC_ATTR_NONNULL_ALL
|
||||
{
|
||||
lua_getfield(L, idx, name);
|
||||
|
||||
if (!lua_isnil(L, -1)) {
|
||||
int64_t value = lua_tointeger(L, -1);
|
||||
if (value < 0U) {
|
||||
*res = 0U;
|
||||
return true;
|
||||
} else if (value > UINT32_MAX) {
|
||||
*res = UINT32_MAX;
|
||||
return true;
|
||||
} else {
|
||||
*res = (uint32_t)value;
|
||||
return true;
|
||||
}
|
||||
if (lua_isnil(L, -1)) {
|
||||
lua_pop(L, 1);
|
||||
return false;
|
||||
}
|
||||
|
||||
int64_t value = lua_tointeger(L, -1);
|
||||
lua_pop(L, 1);
|
||||
|
||||
return false;
|
||||
if (value < 0U) {
|
||||
*res = 0U;
|
||||
} else if (value > UINT32_MAX) {
|
||||
*res = UINT32_MAX;
|
||||
} else {
|
||||
*res = (uint32_t)value;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
int tslua_push_querycursor(lua_State *L)
|
||||
|
@ -641,9 +641,6 @@ bool terminal_enter(void)
|
||||
curwin->w_p_so = 0;
|
||||
curwin->w_p_siso = 0;
|
||||
|
||||
// Save the existing cursor entry since it may be modified by the application
|
||||
cursorentry_T save_cursorentry = shape_table[SHAPE_IDX_TERM];
|
||||
|
||||
// Update the cursor shape table and flush changes to the UI
|
||||
s->term->pending.cursor = true;
|
||||
refresh_cursor(s->term);
|
||||
@ -674,8 +671,8 @@ bool terminal_enter(void)
|
||||
RedrawingDisabled = s->save_rd;
|
||||
apply_autocmds(EVENT_TERMLEAVE, NULL, NULL, false, curbuf);
|
||||
|
||||
shape_table[SHAPE_IDX_TERM] = save_cursorentry;
|
||||
ui_mode_info_set();
|
||||
// Restore the terminal cursor to what is set in 'guicursor'
|
||||
(void)parse_shape_opt(SHAPE_CURSOR);
|
||||
|
||||
if (save_curwin == curwin->handle) { // Else: window was closed.
|
||||
curwin->w_p_cul = save_w_p_cul;
|
||||
|
@ -8,7 +8,7 @@ describe('decor perf', function()
|
||||
it('can handle long lines', function()
|
||||
Screen.new(100, 101)
|
||||
|
||||
local result = exec_lua [==[
|
||||
local result = exec_lua(function()
|
||||
local ephemeral_pattern = {
|
||||
{ 0, 4, 'Comment', 11 },
|
||||
{ 0, 3, 'Keyword', 12 },
|
||||
@ -61,7 +61,7 @@ describe('decor perf', function()
|
||||
return true
|
||||
end,
|
||||
on_line = function()
|
||||
add_pattern(ephemeral_pattern, true)
|
||||
add_pattern(ephemeral_pattern, true)
|
||||
end,
|
||||
})
|
||||
|
||||
@ -69,16 +69,16 @@ describe('decor perf', function()
|
||||
|
||||
local total = {}
|
||||
local provider = {}
|
||||
for i = 1, 100 do
|
||||
for _ = 1, 100 do
|
||||
local tic = vim.uv.hrtime()
|
||||
vim.cmd'redraw!'
|
||||
vim.cmd 'redraw!'
|
||||
local toc = vim.uv.hrtime()
|
||||
table.insert(total, toc - tic)
|
||||
table.insert(provider, pe - ps)
|
||||
end
|
||||
|
||||
return { total, provider }
|
||||
]==]
|
||||
end)
|
||||
|
||||
local total, provider = unpack(result)
|
||||
table.sort(total)
|
||||
@ -102,22 +102,22 @@ describe('decor perf', function()
|
||||
it('can handle long lines with treesitter highlighting', function()
|
||||
Screen.new(100, 51)
|
||||
|
||||
local result = exec_lua [==[
|
||||
local result = exec_lua(function()
|
||||
local long_line = 'local a = { ' .. ('a = 5, '):rep(2000) .. '}'
|
||||
vim.api.nvim_buf_set_lines(0, 0, 0, false, { long_line })
|
||||
vim.api.nvim_win_set_cursor(0, { 1, 0 })
|
||||
vim.treesitter.start(0, 'lua')
|
||||
|
||||
local total = {}
|
||||
for i = 1, 50 do
|
||||
for _ = 1, 50 do
|
||||
local tic = vim.uv.hrtime()
|
||||
vim.cmd'redraw!'
|
||||
vim.cmd 'redraw!'
|
||||
local toc = vim.uv.hrtime()
|
||||
table.insert(total, toc - tic)
|
||||
end
|
||||
|
||||
return { total }
|
||||
]==]
|
||||
end)
|
||||
|
||||
local total = unpack(result)
|
||||
table.sort(total)
|
||||
|
@ -49,33 +49,28 @@ describe('treesitter perf', function()
|
||||
]]
|
||||
end)
|
||||
|
||||
local function test_long_line(pos, wrap, line, grid)
|
||||
local function test_long_line(_pos, _wrap, _line, grid)
|
||||
local screen = Screen.new(20, 11)
|
||||
|
||||
local result = exec_lua(
|
||||
[==[
|
||||
local pos, wrap, line = ...
|
||||
local result = exec_lua(function(...)
|
||||
local pos, wrap, line = ...
|
||||
|
||||
vim.api.nvim_buf_set_lines(0, 0, 0, false, { line })
|
||||
vim.api.nvim_win_set_cursor(0, pos)
|
||||
vim.api.nvim_set_option_value('wrap', wrap, { win = 0 })
|
||||
vim.api.nvim_buf_set_lines(0, 0, 0, false, { line })
|
||||
vim.api.nvim_win_set_cursor(0, pos)
|
||||
vim.api.nvim_set_option_value('wrap', wrap, { win = 0 })
|
||||
|
||||
vim.treesitter.start(0, 'lua')
|
||||
vim.treesitter.start(0, 'lua')
|
||||
|
||||
local total = {}
|
||||
for i = 1, 100 do
|
||||
local tic = vim.uv.hrtime()
|
||||
vim.cmd'redraw!'
|
||||
local toc = vim.uv.hrtime()
|
||||
table.insert(total, toc - tic)
|
||||
end
|
||||
local total = {}
|
||||
for _ = 1, 100 do
|
||||
local tic = vim.uv.hrtime()
|
||||
vim.cmd 'redraw!'
|
||||
local toc = vim.uv.hrtime()
|
||||
table.insert(total, toc - tic)
|
||||
end
|
||||
|
||||
return { total }
|
||||
]==],
|
||||
pos,
|
||||
wrap,
|
||||
line
|
||||
)
|
||||
return { total }
|
||||
end, _pos, _wrap, _line)
|
||||
|
||||
screen:expect({ grid = grid or '' })
|
||||
|
||||
|
@ -15,9 +15,20 @@ local skip = t.skip
|
||||
describe(':terminal cursor', function()
|
||||
local screen
|
||||
|
||||
local terminal_mode_idx ---@type number
|
||||
|
||||
before_each(function()
|
||||
clear()
|
||||
screen = tt.setup_screen()
|
||||
|
||||
if terminal_mode_idx == nil then
|
||||
for i, v in ipairs(screen._mode_info) do
|
||||
if v.name == 'terminal' then
|
||||
terminal_mode_idx = i
|
||||
end
|
||||
end
|
||||
assert(terminal_mode_idx)
|
||||
end
|
||||
end)
|
||||
|
||||
it('moves the screen cursor when focused', function()
|
||||
@ -143,13 +154,6 @@ describe(':terminal cursor', function()
|
||||
|
||||
it('can be modified by application #3681', function()
|
||||
skip(is_os('win'), '#31587')
|
||||
local idx ---@type number
|
||||
for i, v in ipairs(screen._mode_info) do
|
||||
if v.name == 'terminal' then
|
||||
idx = i
|
||||
end
|
||||
end
|
||||
assert(idx)
|
||||
|
||||
local states = {
|
||||
[1] = { blink = true, shape = 'block' },
|
||||
@ -171,13 +175,13 @@ describe(':terminal cursor', function()
|
||||
]],
|
||||
condition = function()
|
||||
if v.blink then
|
||||
eq(500, screen._mode_info[idx].blinkon)
|
||||
eq(500, screen._mode_info[idx].blinkoff)
|
||||
eq(500, screen._mode_info[terminal_mode_idx].blinkon)
|
||||
eq(500, screen._mode_info[terminal_mode_idx].blinkoff)
|
||||
else
|
||||
eq(0, screen._mode_info[idx].blinkon)
|
||||
eq(0, screen._mode_info[idx].blinkoff)
|
||||
eq(0, screen._mode_info[terminal_mode_idx].blinkon)
|
||||
eq(0, screen._mode_info[terminal_mode_idx].blinkoff)
|
||||
end
|
||||
eq(v.shape, screen._mode_info[idx].cursor_shape)
|
||||
eq(v.shape, screen._mode_info[terminal_mode_idx].cursor_shape)
|
||||
end,
|
||||
})
|
||||
end
|
||||
@ -191,20 +195,13 @@ describe(':terminal cursor', function()
|
||||
]])
|
||||
|
||||
-- Cursor returns to default on TermLeave
|
||||
eq(500, screen._mode_info[idx].blinkon)
|
||||
eq(500, screen._mode_info[idx].blinkoff)
|
||||
eq('block', screen._mode_info[idx].cursor_shape)
|
||||
eq(500, screen._mode_info[terminal_mode_idx].blinkon)
|
||||
eq(500, screen._mode_info[terminal_mode_idx].blinkoff)
|
||||
eq('block', screen._mode_info[terminal_mode_idx].cursor_shape)
|
||||
end)
|
||||
|
||||
it('can be modified per terminal', function()
|
||||
skip(is_os('win'), '#31587')
|
||||
local idx ---@type number
|
||||
for i, v in ipairs(screen._mode_info) do
|
||||
if v.name == 'terminal' then
|
||||
idx = i
|
||||
end
|
||||
end
|
||||
assert(idx)
|
||||
|
||||
-- Set cursor to vertical bar with blink
|
||||
tt.feed_csi('5 q')
|
||||
@ -216,9 +213,9 @@ describe(':terminal cursor', function()
|
||||
{3:-- TERMINAL --} |
|
||||
]],
|
||||
condition = function()
|
||||
eq(500, screen._mode_info[idx].blinkon)
|
||||
eq(500, screen._mode_info[idx].blinkoff)
|
||||
eq('vertical', screen._mode_info[idx].cursor_shape)
|
||||
eq(500, screen._mode_info[terminal_mode_idx].blinkon)
|
||||
eq(500, screen._mode_info[terminal_mode_idx].blinkoff)
|
||||
eq('vertical', screen._mode_info[terminal_mode_idx].cursor_shape)
|
||||
end,
|
||||
})
|
||||
|
||||
@ -231,9 +228,9 @@ describe(':terminal cursor', function()
|
||||
{3:-- TERMINAL --} |
|
||||
]],
|
||||
condition = function()
|
||||
eq(500, screen._mode_info[idx].blinkon)
|
||||
eq(500, screen._mode_info[idx].blinkoff)
|
||||
eq('vertical', screen._mode_info[idx].cursor_shape)
|
||||
eq(500, screen._mode_info[terminal_mode_idx].blinkon)
|
||||
eq(500, screen._mode_info[terminal_mode_idx].blinkoff)
|
||||
eq('vertical', screen._mode_info[terminal_mode_idx].cursor_shape)
|
||||
end,
|
||||
})
|
||||
|
||||
@ -256,9 +253,9 @@ describe(':terminal cursor', function()
|
||||
]],
|
||||
condition = function()
|
||||
-- New terminal, cursor resets to defaults
|
||||
eq(500, screen._mode_info[idx].blinkon)
|
||||
eq(500, screen._mode_info[idx].blinkoff)
|
||||
eq('block', screen._mode_info[idx].cursor_shape)
|
||||
eq(500, screen._mode_info[terminal_mode_idx].blinkon)
|
||||
eq(500, screen._mode_info[terminal_mode_idx].blinkoff)
|
||||
eq('block', screen._mode_info[terminal_mode_idx].cursor_shape)
|
||||
end,
|
||||
})
|
||||
|
||||
@ -275,9 +272,9 @@ describe(':terminal cursor', function()
|
||||
{3:-- TERMINAL --} |
|
||||
]],
|
||||
condition = function()
|
||||
eq(0, screen._mode_info[idx].blinkon)
|
||||
eq(0, screen._mode_info[idx].blinkoff)
|
||||
eq('horizontal', screen._mode_info[idx].cursor_shape)
|
||||
eq(0, screen._mode_info[terminal_mode_idx].blinkon)
|
||||
eq(0, screen._mode_info[terminal_mode_idx].blinkoff)
|
||||
eq('horizontal', screen._mode_info[terminal_mode_idx].cursor_shape)
|
||||
end,
|
||||
})
|
||||
|
||||
@ -294,9 +291,9 @@ describe(':terminal cursor', function()
|
||||
{3:-- TERMINAL --} |
|
||||
]],
|
||||
condition = function()
|
||||
eq(500, screen._mode_info[idx].blinkon)
|
||||
eq(500, screen._mode_info[idx].blinkoff)
|
||||
eq('vertical', screen._mode_info[idx].cursor_shape)
|
||||
eq(500, screen._mode_info[terminal_mode_idx].blinkon)
|
||||
eq(500, screen._mode_info[terminal_mode_idx].blinkoff)
|
||||
eq('vertical', screen._mode_info[terminal_mode_idx].cursor_shape)
|
||||
end,
|
||||
})
|
||||
end)
|
||||
@ -326,6 +323,32 @@ describe(':terminal cursor', function()
|
||||
{3:-- TERMINAL --} |
|
||||
]])
|
||||
end)
|
||||
|
||||
it('preserves guicursor value on TermLeave #31612', function()
|
||||
eq(3, screen._mode_info[terminal_mode_idx].hl_id)
|
||||
|
||||
-- Change 'guicursor' while terminal mode is active
|
||||
command('set guicursor+=t:Error')
|
||||
|
||||
local error_hl_id = call('hlID', 'Error')
|
||||
|
||||
screen:expect({
|
||||
condition = function()
|
||||
eq(error_hl_id, screen._mode_info[terminal_mode_idx].hl_id)
|
||||
end,
|
||||
})
|
||||
|
||||
-- Exit terminal mode
|
||||
feed([[<C-\><C-N>]])
|
||||
|
||||
screen:expect([[
|
||||
tty ready |
|
||||
^ |
|
||||
|*5
|
||||
]])
|
||||
|
||||
eq(error_hl_id, screen._mode_info[terminal_mode_idx].hl_id)
|
||||
end)
|
||||
end)
|
||||
|
||||
describe('buffer cursor position is correct in terminal without number column', function()
|
||||
@ -350,12 +373,6 @@ describe('buffer cursor position is correct in terminal without number column',
|
||||
}, {
|
||||
cols = 70,
|
||||
})
|
||||
screen:set_default_attr_ids({
|
||||
[1] = { foreground = 253, background = 11 },
|
||||
[2] = { reverse = true },
|
||||
[3] = { bold = true },
|
||||
[4] = { background = 11 },
|
||||
})
|
||||
-- Also check for real cursor position, as it is used for stuff like input methods
|
||||
screen._handle_busy_start = function() end
|
||||
screen._handle_busy_stop = function() end
|
||||
@ -667,13 +684,6 @@ describe('buffer cursor position is correct in terminal with number column', fun
|
||||
}, {
|
||||
cols = 70,
|
||||
})
|
||||
screen:set_default_attr_ids({
|
||||
[1] = { foreground = 253, background = 11 },
|
||||
[2] = { reverse = true },
|
||||
[3] = { bold = true },
|
||||
[4] = { background = 11 },
|
||||
[7] = { foreground = 130 },
|
||||
})
|
||||
-- Also check for real cursor position, as it is used for stuff like input methods
|
||||
screen._handle_busy_start = function() end
|
||||
screen._handle_busy_stop = function() end
|
||||
|
@ -716,46 +716,44 @@ describe('decorations providers', function()
|
||||
setup_screen(screen)
|
||||
|
||||
local function record()
|
||||
exec_lua [[
|
||||
p_min = { math.huge, math.huge }
|
||||
p_max = { -math.huge, -math.huge }
|
||||
function pos_gt(a, b)
|
||||
exec_lua(function()
|
||||
_G.p_min = { math.huge, math.huge }
|
||||
_G.p_max = { -math.huge, -math.huge }
|
||||
function _G.pos_gt(a, b)
|
||||
return a[1] > b[1] or (a[1] == b[1] and a[2] > b[2])
|
||||
end
|
||||
function pos_lt(a, b)
|
||||
function _G.pos_lt(a, b)
|
||||
return a[1] < b[1] or (a[1] == b[1] and a[2] < b[2])
|
||||
end
|
||||
]]
|
||||
end)
|
||||
setup_provider [[
|
||||
local function on_do(kind, _, bufnr, br, bc, er, ec)
|
||||
if kind == 'range' then
|
||||
local b = { br, bc }
|
||||
local e = { er, ec }
|
||||
if pos_gt(p_min, b) then
|
||||
p_min = b
|
||||
if _G.pos_gt(_G.p_min, b) then
|
||||
_G.p_min = b
|
||||
end
|
||||
if pos_lt(p_max, e) then
|
||||
p_max = e
|
||||
if _G.pos_lt(_G.p_max, e) then
|
||||
_G.p_max = e
|
||||
end
|
||||
end
|
||||
end
|
||||
]]
|
||||
end
|
||||
local function check(min, max)
|
||||
local function pos_gt(a, b)
|
||||
return a[1] > b[1] or (a[1] == b[1] and a[2] > b[2])
|
||||
end
|
||||
local function pos_lt(a, b)
|
||||
return a[1] < b[1] or (a[1] == b[1] and a[2] < b[2])
|
||||
end
|
||||
local p_min = exec_lua('return p_min')
|
||||
assert(not pos_gt(p_min, min),
|
||||
local p_min = exec_lua('return _G.p_min')
|
||||
assert(
|
||||
p_min[1] < min[1] or (p_min[1] == min[1] and p_min[2] <= min[2]),
|
||||
"minimum position " .. vim.inspect(p_min)
|
||||
.. " should be before the first char")
|
||||
local p_max = exec_lua('return p_max')
|
||||
assert(not pos_lt(p_max, max),
|
||||
.. " should be before the first char"
|
||||
)
|
||||
local p_max = exec_lua('return _G.p_max')
|
||||
assert(
|
||||
p_max[1] > max[1] or (p_max[1] == max[1] and p_max[2] >= max[2]),
|
||||
"maximum position " .. vim.inspect(p_max)
|
||||
.. " should be on or after the last char")
|
||||
.. " should be on or after the last char"
|
||||
)
|
||||
end
|
||||
|
||||
-- Multiple lines.
|
||||
|
@ -94,7 +94,7 @@ describe('ui mode_change event', function()
|
||||
}
|
||||
end)
|
||||
|
||||
-- oldtest: Test_indent_norm_with_gq()
|
||||
-- oldtest: Test_mouse_shape_indent_norm_with_gq()
|
||||
it('is restored to Normal mode after "gq" indents using :normal #12309', function()
|
||||
screen:try_resize(60, 6)
|
||||
n.exec([[
|
||||
|
@ -1162,6 +1162,8 @@ describe('builtin popupmenu', function()
|
||||
[6] = { foreground = Screen.colors.White, background = Screen.colors.Red },
|
||||
[7] = { background = Screen.colors.Yellow }, -- Search
|
||||
[8] = { foreground = Screen.colors.Red },
|
||||
[9] = { foreground = Screen.colors.Yellow, background = Screen.colors.Green },
|
||||
[10] = { foreground = Screen.colors.White, background = Screen.colors.Green },
|
||||
ks = { foreground = Screen.colors.Red, background = Screen.colors.Grey },
|
||||
kn = { foreground = Screen.colors.Red, background = Screen.colors.Plum1 },
|
||||
xs = { foreground = Screen.colors.Black, background = Screen.colors.Grey },
|
||||
@ -5625,6 +5627,114 @@ describe('builtin popupmenu', function()
|
||||
{2:-- INSERT --} |
|
||||
]])
|
||||
feed('<Esc>')
|
||||
|
||||
-- text after the inserted text shouldn't be highlighted
|
||||
feed('0ea <C-X><C-O>')
|
||||
screen:expect([[
|
||||
αβγ {8:foo}^ foo |
|
||||
{1:~ }{s: foo }{1: }|
|
||||
{1:~ }{n: bar }{1: }|
|
||||
{1:~ }{n: 你好 }{1: }|
|
||||
{1:~ }|*15
|
||||
{2:-- }{5:match 1 of 3} |
|
||||
]])
|
||||
feed('<C-P>')
|
||||
screen:expect([[
|
||||
αβγ ^ foo |
|
||||
{1:~ }{n: foo }{1: }|
|
||||
{1:~ }{n: bar }{1: }|
|
||||
{1:~ }{n: 你好 }{1: }|
|
||||
{1:~ }|*15
|
||||
{2:-- }{8:Back at original} |
|
||||
]])
|
||||
feed('<C-P>')
|
||||
screen:expect([[
|
||||
αβγ {8:你好}^ foo |
|
||||
{1:~ }{n: foo }{1: }|
|
||||
{1:~ }{n: bar }{1: }|
|
||||
{1:~ }{s: 你好 }{1: }|
|
||||
{1:~ }|*15
|
||||
{2:-- }{5:match 3 of 3} |
|
||||
]])
|
||||
feed('<C-Y>')
|
||||
screen:expect([[
|
||||
αβγ 你好^ foo |
|
||||
{1:~ }|*18
|
||||
{2:-- INSERT --} |
|
||||
]])
|
||||
feed('<Esc>')
|
||||
end)
|
||||
|
||||
-- oldtest: Test_pum_matchins_highlight_combine()
|
||||
it('with ComplMatchIns, Normal and CursorLine highlights', function()
|
||||
exec([[
|
||||
func Omni_test(findstart, base)
|
||||
if a:findstart
|
||||
return col(".")
|
||||
endif
|
||||
return [#{word: "foo"}, #{word: "bar"}, #{word: "你好"}]
|
||||
endfunc
|
||||
set omnifunc=Omni_test
|
||||
hi Normal guibg=blue
|
||||
hi CursorLine guibg=green guifg=white
|
||||
set cursorline
|
||||
call setline(1, 'aaa bbb')
|
||||
]])
|
||||
|
||||
-- when ComplMatchIns is not set, CursorLine applies normally
|
||||
feed('0ea <C-X><C-O>')
|
||||
screen:expect([[
|
||||
{10:aaa foo^ bbb }|
|
||||
{1:~ }{s: foo }{1: }|
|
||||
{1:~ }{n: bar }{1: }|
|
||||
{1:~ }{n: 你好 }{1: }|
|
||||
{1:~ }|*15
|
||||
{2:-- }{5:match 1 of 3} |
|
||||
]])
|
||||
feed('<C-E>')
|
||||
screen:expect([[
|
||||
{10:aaa ^ bbb }|
|
||||
{1:~ }|*18
|
||||
{2:-- INSERT --} |
|
||||
]])
|
||||
feed('<BS><Esc>')
|
||||
|
||||
-- when ComplMatchIns is set, it is applied over CursorLine
|
||||
command('hi ComplMatchIns guifg=Yellow')
|
||||
feed('0ea <C-X><C-O>')
|
||||
screen:expect([[
|
||||
{10:aaa }{9:foo}{10:^ bbb }|
|
||||
{1:~ }{s: foo }{1: }|
|
||||
{1:~ }{n: bar }{1: }|
|
||||
{1:~ }{n: 你好 }{1: }|
|
||||
{1:~ }|*15
|
||||
{2:-- }{5:match 1 of 3} |
|
||||
]])
|
||||
feed('<C-P>')
|
||||
screen:expect([[
|
||||
{10:aaa ^ bbb }|
|
||||
{1:~ }{n: foo }{1: }|
|
||||
{1:~ }{n: bar }{1: }|
|
||||
{1:~ }{n: 你好 }{1: }|
|
||||
{1:~ }|*15
|
||||
{2:-- }{8:Back at original} |
|
||||
]])
|
||||
feed('<C-P>')
|
||||
screen:expect([[
|
||||
{10:aaa }{9:你好}{10:^ bbb }|
|
||||
{1:~ }{n: foo }{1: }|
|
||||
{1:~ }{n: bar }{1: }|
|
||||
{1:~ }{s: 你好 }{1: }|
|
||||
{1:~ }|*15
|
||||
{2:-- }{5:match 3 of 3} |
|
||||
]])
|
||||
feed('<C-E>')
|
||||
screen:expect([[
|
||||
{10:aaa ^ bbb }|
|
||||
{1:~ }|*18
|
||||
{2:-- INSERT --} |
|
||||
]])
|
||||
feed('<Esc>')
|
||||
end)
|
||||
end
|
||||
end
|
||||
|
@ -308,7 +308,7 @@ endfunc
|
||||
|
||||
" Test that mouse shape is restored to Normal mode after using "gq" when
|
||||
" 'indentexpr' executes :normal.
|
||||
func Test_indent_norm_with_gq()
|
||||
func Test_mouse_shape_indent_norm_with_gq()
|
||||
CheckFeature mouseshape
|
||||
CheckCanRunGui
|
||||
|
||||
|
@ -1747,13 +1747,67 @@ func Test_pum_matchins_highlight()
|
||||
call TermWait(buf)
|
||||
call term_sendkeys(buf, "Sαβγ \<C-X>\<C-O>\<C-Y>")
|
||||
call VerifyScreenDump(buf, 'Test_pum_matchins_04', {})
|
||||
call term_sendkeys(buf, "\<C-E>\<Esc>")
|
||||
call term_sendkeys(buf, "\<Esc>")
|
||||
|
||||
" restore after cancel completion
|
||||
call TermWait(buf)
|
||||
call term_sendkeys(buf, "Sαβγ \<C-X>\<C-O>\<Space>")
|
||||
call VerifyScreenDump(buf, 'Test_pum_matchins_05', {})
|
||||
call term_sendkeys(buf, "\<C-E>\<Esc>")
|
||||
call term_sendkeys(buf, "\<Esc>")
|
||||
|
||||
" text after the inserted text shouldn't be highlighted
|
||||
call TermWait(buf)
|
||||
call term_sendkeys(buf, "0ea \<C-X>\<C-O>")
|
||||
call VerifyScreenDump(buf, 'Test_pum_matchins_07', {})
|
||||
call term_sendkeys(buf, "\<C-P>")
|
||||
call VerifyScreenDump(buf, 'Test_pum_matchins_08', {})
|
||||
call term_sendkeys(buf, "\<C-P>")
|
||||
call VerifyScreenDump(buf, 'Test_pum_matchins_09', {})
|
||||
call term_sendkeys(buf, "\<C-Y>")
|
||||
call VerifyScreenDump(buf, 'Test_pum_matchins_10', {})
|
||||
call term_sendkeys(buf, "\<Esc>")
|
||||
|
||||
call StopVimInTerminal(buf)
|
||||
endfunc
|
||||
|
||||
func Test_pum_matchins_highlight_combine()
|
||||
CheckScreendump
|
||||
let lines =<< trim END
|
||||
func Omni_test(findstart, base)
|
||||
if a:findstart
|
||||
return col(".")
|
||||
endif
|
||||
return [#{word: "foo"}, #{word: "bar"}, #{word: "你好"}]
|
||||
endfunc
|
||||
set omnifunc=Omni_test
|
||||
hi Normal ctermbg=blue
|
||||
hi CursorLine cterm=underline ctermbg=green
|
||||
set cursorline
|
||||
call setline(1, 'aaa bbb')
|
||||
END
|
||||
call writefile(lines, 'Xscript', 'D')
|
||||
let buf = RunVimInTerminal('-S Xscript', {})
|
||||
|
||||
" when ComplMatchIns is not set, CursorLine applies normally
|
||||
call term_sendkeys(buf, "0ea \<C-X>\<C-O>")
|
||||
call VerifyScreenDump(buf, 'Test_pum_matchins_combine_01', {})
|
||||
call term_sendkeys(buf, "\<C-E>")
|
||||
call VerifyScreenDump(buf, 'Test_pum_matchins_combine_02', {})
|
||||
call term_sendkeys(buf, "\<BS>\<Esc>")
|
||||
|
||||
" when ComplMatchIns is set, it is applied over CursorLine
|
||||
call TermWait(buf)
|
||||
call term_sendkeys(buf, ":hi ComplMatchIns ctermbg=red ctermfg=yellow\<CR>")
|
||||
call TermWait(buf)
|
||||
call term_sendkeys(buf, "0ea \<C-X>\<C-O>")
|
||||
call VerifyScreenDump(buf, 'Test_pum_matchins_combine_03', {})
|
||||
call term_sendkeys(buf, "\<C-P>")
|
||||
call VerifyScreenDump(buf, 'Test_pum_matchins_combine_04', {})
|
||||
call term_sendkeys(buf, "\<C-P>")
|
||||
call VerifyScreenDump(buf, 'Test_pum_matchins_combine_05', {})
|
||||
call term_sendkeys(buf, "\<C-E>")
|
||||
call VerifyScreenDump(buf, 'Test_pum_matchins_combine_06', {})
|
||||
call term_sendkeys(buf, "\<Esc>")
|
||||
|
||||
call StopVimInTerminal(buf)
|
||||
endfunc
|
||||
|
Loading…
Reference in New Issue
Block a user