fix(showcmd): clear the rest properly (#28420)

This commit is contained in:
zeertzjq 2024-04-20 08:12:45 +08:00 committed by GitHub
parent 52d2851ca4
commit 4d52b0cf67
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 25 additions and 6 deletions

View File

@ -436,9 +436,8 @@ int grid_line_puts(int col, const char *text, int textlen, int attr)
? utfc_ptr2schar_len(ptr, (int)((text + len) - ptr), &firstc)
: utfc_ptr2schar(ptr, &firstc);
int mbyte_cells = utf_char2cells(firstc);
if (mbyte_cells > 2) {
if (mbyte_cells > 2 || schar == 0) {
mbyte_cells = 1;
schar = schar_from_char(0xFFFD);
}

View File

@ -2043,8 +2043,7 @@ void pop_showcmd(void)
static void display_showcmd(void)
{
int len = vim_strsize(showcmd_buf);
showcmd_is_clear = (len == 0);
showcmd_is_clear = (showcmd_buf[0] == NUL);
if (*p_sloc == 's') {
if (showcmd_is_clear) {
@ -2069,7 +2068,7 @@ static void display_showcmd(void)
if (ui_has(kUIMessages)) {
MAXSIZE_TEMP_ARRAY(content, 1);
MAXSIZE_TEMP_ARRAY(chunk, 2);
if (len > 0) {
if (!showcmd_is_clear) {
// placeholder for future highlight support
ADD_C(chunk, INTEGER_OBJ(0));
ADD_C(chunk, CSTR_AS_OBJ(showcmd_buf));
@ -2086,8 +2085,9 @@ static void display_showcmd(void)
int showcmd_row = Rows - 1;
grid_line_start(&msg_grid_adj, showcmd_row);
int len = 0;
if (!showcmd_is_clear) {
grid_line_puts(sc_col, showcmd_buf, -1, HL_ATTR(HLF_MSG));
len = grid_line_puts(sc_col, showcmd_buf, -1, HL_ATTR(HLF_MSG));
}
// clear the rest of an old message by outputting up to SHOWCMD_COLS spaces

View File

@ -1,6 +1,7 @@
-- Normal mode tests.
local t = require('test.functional.testutil')()
local Screen = require('test.functional.ui.screen')
local clear = t.clear
local feed = t.feed
local fn = t.fn
@ -19,4 +20,23 @@ describe('Normal mode', function()
feed('k')
eq(pos, fn.getcurpos())
end)
it('&showcmd does not crash with :startinsert #28419', function()
local screen = Screen.new(60, 17)
screen:attach()
fn.termopen(
{ t.nvim_prog, '--clean', '--cmd', 'startinsert' },
{ env = { VIMRUNTIME = os.getenv('VIMRUNTIME') } }
)
screen:expect({
grid = [[
^ |
~ |*13
[No Name] 0,1 All|
-- INSERT -- |
|
]],
attr_ids = {},
})
end)
end)