fix(messages): list_cmd kind for :registers, :au[g] #32531

Problem:  No kind for `:registers/autocmd/augroup` messages. `:registers`
          chunks are emitted as separate `msg_show` events.

Solution: Add the `list_cmd` kind to the message. Introduce a new
          `msg_ext_skip_flush` variable to set to true around a
          group of to be paired message chunks.
This commit is contained in:
luukvbaal
2025-02-21 01:40:21 +01:00
committed by GitHub
parent f4cd5a33b6
commit 08f7c22377
5 changed files with 82 additions and 50 deletions

View File

@@ -554,6 +554,7 @@ void do_augroup(char *arg, bool del_group)
current_augroup = augroup_add(arg); current_augroup = augroup_add(arg);
} else { // ":aug": list the group names } else { // ":aug": list the group names
msg_start(); msg_start();
msg_ext_set_kind("list_cmd");
String name; String name;
int value; int value;
@@ -855,6 +856,7 @@ void do_autocmd(exarg_T *eap, char *arg_in, int forceit)
// Print header when showing autocommands. // Print header when showing autocommands.
if (is_showing) { if (is_showing) {
// Highlight title // Highlight title
msg_ext_set_kind("list_cmd");
msg_puts_title(_("\n--- Autocommands ---")); msg_puts_title(_("\n--- Autocommands ---"));
if (*arg == '*' || *arg == '|' || *arg == NUL) { if (*arg == '*' || *arg == '|' || *arg == NUL) {

View File

@@ -3162,6 +3162,8 @@ void msg_ext_ui_flush(void)
if (!ui_has(kUIMessages)) { if (!ui_has(kUIMessages)) {
msg_ext_kind = NULL; msg_ext_kind = NULL;
return; return;
} else if (msg_ext_skip_flush) {
return;
} }
msg_ext_emit_chunk(); msg_ext_emit_chunk();

View File

@@ -34,6 +34,8 @@ extern MessageHistoryEntry *first_msg_hist;
extern MessageHistoryEntry *last_msg_hist; extern MessageHistoryEntry *last_msg_hist;
EXTERN bool msg_ext_need_clear INIT( = false); EXTERN bool msg_ext_need_clear INIT( = false);
// Set to true to force grouping a set of message chunks into a single `cmdline_show` event.
EXTERN bool msg_ext_skip_flush INIT( = false);
/// allocated grid for messages. Used when display+=msgsep is set, or /// allocated grid for messages. Used when display+=msgsep is set, or
/// ext_multigrid is active. See also the description at msg_scroll_flush() /// ext_multigrid is active. See also the description at msg_scroll_flush()

View File

@@ -3770,10 +3770,16 @@ void ex_display(exarg_T *eap)
} }
int hl_id = HLF_8; int hl_id = HLF_8;
msg_ext_set_kind("list_cmd");
msg_ext_skip_flush = true;
// Highlight title // Highlight title
msg_puts_title(_("\nType Name Content")); msg_puts_title(_("\nType Name Content"));
for (int i = -1; i < NUM_REGISTERS && !got_int; i++) { for (int i = -1; i < NUM_REGISTERS && !got_int; i++) {
int name = get_register_name(i); int name = get_register_name(i);
if (arg != NULL && vim_strchr(arg, name) == NULL) {
continue; // did not ask for this register
}
switch (get_reg_type(name, NULL)) { switch (get_reg_type(name, NULL)) {
case kMTLineWise: case kMTLineWise:
type = 'l'; break; type = 'l'; break;
@@ -3783,10 +3789,6 @@ void ex_display(exarg_T *eap)
type = 'b'; break; type = 'b'; break;
} }
if (arg != NULL && vim_strchr(arg, name) == NULL) {
continue; // did not ask for this register
}
if (i == -1) { if (i == -1) {
if (y_previous != NULL) { if (y_previous != NULL) {
yb = y_previous; yb = y_previous;
@@ -3890,6 +3892,7 @@ void ex_display(exarg_T *eap)
msg_puts("\n c \"= "); msg_puts("\n c \"= ");
dis_msg(expr_line, false); dis_msg(expr_line, false);
} }
msg_ext_skip_flush = false;
} }
/// display a string for do_dis() /// display a string for do_dis()

View File

@@ -43,11 +43,12 @@ describe('ui/ext_messages', function()
it('msg_clear follows msg_show kind of confirm', function() it('msg_clear follows msg_show kind of confirm', function()
feed('iline 1<esc>') feed('iline 1<esc>')
feed(':call confirm("test")<cr>') feed(':call confirm("test")<cr>')
local s1 = [[
line ^1 |
{1:~ }|*4
]]
screen:expect({ screen:expect({
grid = [[ grid = s1,
line ^1 |
{1:~ }|*4
]],
cmdline = { cmdline = {
{ {
content = { { '' } }, content = { { '' } },
@@ -65,13 +66,7 @@ describe('ui/ext_messages', function()
}, },
}) })
feed('<cr>') feed('<cr>')
screen:expect({ screen:expect({ grid = s1, cmdline = { { abort = false } } })
grid = [[
line ^1 |
{1:~ }|*4
]],
cmdline = { { abort = false } },
})
end) end)
it('msg_show kinds', function() it('msg_show kinds', function()
@@ -79,12 +74,13 @@ describe('ui/ext_messages', function()
-- confirm is now cmdline prompt -- confirm is now cmdline prompt
feed(':echo confirm("test")<cr>') feed(':echo confirm("test")<cr>')
local s1 = [[
line 1 |
line ^2 |
{1:~ }|*3
]]
screen:expect({ screen:expect({
grid = [[ grid = s1,
line 1 |
line ^2 |
{1:~ }|*3
]],
cmdline = { cmdline = {
{ {
content = { { '' } }, content = { { '' } },
@@ -103,11 +99,7 @@ describe('ui/ext_messages', function()
}) })
feed('<cr>') feed('<cr>')
screen:expect({ screen:expect({
grid = [[ grid = s1,
line 1 |
line ^2 |
{1:~ }|*3
]],
cmdline = { { abort = false } }, cmdline = { { abort = false } },
messages = { messages = {
{ {
@@ -169,13 +161,9 @@ describe('ui/ext_messages', function()
}) })
-- kind=wmsg ('wrapscan' after search reaches EOF) -- kind=wmsg ('wrapscan' after search reaches EOF)
feed('uG$/i<cr>') feed('uG$/i<CR>G$')
screen:expect { screen:expect {
grid = [[ grid = s1,
l^ine 1 |
line 2 |
{1:~ }|*3
]],
cmdline = { { abort = false } }, cmdline = { { abort = false } },
messages = { messages = {
{ {
@@ -189,6 +177,7 @@ describe('ui/ext_messages', function()
-- kind=emsg after :throw -- kind=emsg after :throw
feed(':throw "foo"<cr>') feed(':throw "foo"<cr>')
screen:expect { screen:expect {
grid = s1,
cmdline = { { abort = false } }, cmdline = { { abort = false } },
messages = { messages = {
{ {
@@ -212,13 +201,9 @@ describe('ui/ext_messages', function()
-- kind=quickfix after :cnext -- kind=quickfix after :cnext
feed('<c-c>') feed('<c-c>')
command("caddexpr [expand('%').':1:line1',expand('%').':2:line2']") command("caddexpr [expand('%').':1:line1',expand('%').':2:line2']")
feed(':cnext<cr>') feed(':cnext<CR>$')
screen:expect { screen:expect {
grid = [[ grid = s1,
line 1 |
^line 2 |
{1:~ }|*3
]],
cmdline = { { abort = false } }, cmdline = { { abort = false } },
messages = { messages = {
{ {
@@ -230,13 +215,9 @@ describe('ui/ext_messages', function()
} }
-- search_cmd -- search_cmd
feed('?line<cr>') feed('?line<CR>G$')
screen:expect({ screen:expect({
grid = [[ grid = s1,
^line 1 |
line 2 |
{1:~ }|*3
]],
cmdline = { { abort = false } }, cmdline = { { abort = false } },
messages = { messages = {
{ {
@@ -248,8 +229,9 @@ describe('ui/ext_messages', function()
}) })
-- highlight -- highlight
feed(':filter character highlight<CR>') feed('G$:filter character highlight<CR>')
screen:expect({ screen:expect({
grid = s1,
cmdline = { { abort = false } }, cmdline = { { abort = false } },
messages = { messages = {
{ {
@@ -287,12 +269,13 @@ describe('ui/ext_messages', function()
}) })
feed('<C-r><C-r><C-r>') feed('<C-r><C-r><C-r>')
local s2 = [[
line 1 |
line^ |
{1:~ }|*3
]]
screen:expect({ screen:expect({
grid = [[ grid = s2,
line 1 |
line^ |
{1:~ }|*3
]],
messages = { messages = {
{ {
content = { { 'Already at newest change' } }, content = { { 'Already at newest change' } },
@@ -306,6 +289,7 @@ describe('ui/ext_messages', function()
command('set noshowmode') command('set noshowmode')
feed('i<C-n>') feed('i<C-n>')
screen:expect({ screen:expect({
grid = s2,
messages = { messages = {
{ {
content = { { 'The only match' } }, content = { { 'The only match' } },
@@ -314,12 +298,13 @@ describe('ui/ext_messages', function()
}, },
}, },
}) })
feed('<Esc>') feed('<Esc>l')
command('set showmode') command('set showmode')
-- kind=echoerr for nvim_echo() err -- kind=echoerr for nvim_echo() err
feed(':call nvim_echo([["Error"], ["Message", "Special"]], 1, #{ err:1 })<CR>') feed(':call nvim_echo([["Error"], ["Message", "Special"]], 1, #{ err:1 })<CR>')
screen:expect({ screen:expect({
grid = s2,
cmdline = { { abort = false } }, cmdline = { { abort = false } },
messages = { messages = {
{ {
@@ -333,6 +318,7 @@ describe('ui/ext_messages', function()
-- kind=verbose for nvim_echo() verbose -- kind=verbose for nvim_echo() verbose
feed(':call nvim_echo([["Verbose Message"]], 1, #{ verbose:1 })<CR>') feed(':call nvim_echo([["Verbose Message"]], 1, #{ verbose:1 })<CR>')
screen:expect({ screen:expect({
grid = s2,
cmdline = { { abort = false } }, cmdline = { { abort = false } },
messages = { messages = {
{ {
@@ -346,6 +332,7 @@ describe('ui/ext_messages', function()
-- kind=verbose for :verbose messages -- kind=verbose for :verbose messages
feed(':1verbose filter Diff[AC] hi<CR>') feed(':1verbose filter Diff[AC] hi<CR>')
screen:expect({ screen:expect({
grid = s2,
cmdline = { { abort = false } }, cmdline = { { abort = false } },
messages = { messages = {
{ {
@@ -439,6 +426,7 @@ describe('ui/ext_messages', function()
or '{ echo stdout; echo stderr >&2; exit 3; }' or '{ echo stdout; echo stderr >&2; exit 3; }'
feed((':!%s<CR>'):format(cmd)) feed((':!%s<CR>'):format(cmd))
screen:expect({ screen:expect({
grid = s2,
cmdline = { { abort = false } }, cmdline = { { abort = false } },
messages = { messages = {
{ {
@@ -468,6 +456,41 @@ describe('ui/ext_messages', function()
}, },
}, },
}) })
feed('<CR>:registers .<CR>')
screen:expect({
grid = s2,
cmdline = { {
abort = false,
} },
messages = {
{
content = { { '\nType Name Content', 101, 23 }, { '\n c ". ' } },
history = false,
kind = 'list_cmd',
},
},
})
feed(':au ChanInfo * foo<CR>:au ChanInfo<CR>')
screen:expect({
grid = s2,
cmdline = { {
abort = false,
} },
messages = {
{
content = {
{ '\n--- Autocommands ---', 101, 23 },
{ '\n' },
{ 'ChanInfo', 101, 23 },
{ '\n*foo' },
},
history = false,
kind = 'list_cmd',
},
},
})
end) end)
it(':echoerr', function() it(':echoerr', function()