fix: allow multiline message for echoerr (#25380)

PROBLEM:

Currently `:echoerr` prints multi-line strings in a single line
as `:echom` does (Note: `:echon` can print multi-line strings well).
This makes stacktrace printed via echoerr difficult to read.

Example code:

    try
      lua error("lua stacktrace")
    catch
      echoerr v:exception
    endtry

Output:

    Error detected while processing a.vim[5]..a.vim:
    line    4:
    Vim(lua):E5108: Error executing lua [string ":lua"]:1: lua stacktrace^@stack traceback:^@^I[C]: in function 'error'^@^I[string ":lua"]:1: in main chunk

SOLUTION:

Allow echoerr to print multiline messages (e.g., lua exceptions),
because this command is usually used to print stacktraces.

Output after the fix:

    Error detected while processing a.vim[5]..a.vim:
    line    4:
    Vim(lua):E5108: Error executing lua [string ":lua"]:1: lua stacktrace
    stack traceback:
            [C]: in function 'error'
            [string ":lua"]:1: in main chunk
This commit is contained in:
Jongwook Choi 2023-10-12 19:27:45 -04:00 committed by GitHub
parent 2c9f22e7e4
commit ebe489d8f0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 31 additions and 1 deletions

View File

@ -8106,7 +8106,7 @@ void ex_execute(exarg_T *eap)
// We don't want to abort following commands, restore did_emsg. // We don't want to abort following commands, restore did_emsg.
int save_did_emsg = did_emsg; int save_did_emsg = did_emsg;
msg_ext_set_kind("echoerr"); msg_ext_set_kind("echoerr");
emsg(ga.ga_data); emsg_multiline(ga.ga_data, true);
if (!force_abort) { if (!force_abort) {
did_emsg = save_did_emsg; did_emsg = save_did_emsg;
} }

View File

@ -333,6 +333,36 @@ describe('ui/ext_messages', function()
]]} ]]}
end) end)
it(':echoerr multiline', function()
exec_lua([[vim.g.multi = table.concat({ "bork", "fail" }, "\n")]])
feed(':echoerr g:multi<cr>')
screen:expect{grid=[[
^ |
{1:~ }|
{1:~ }|
{1:~ }|
{1:~ }|
]], messages={{
content = {{ "bork\nfail", 2 }},
kind = "echoerr"
}}}
feed(':messages<cr>')
screen:expect{grid=[[
^ |
{1:~ }|
{1:~ }|
{1:~ }|
{1:~ }|
]], messages={{
content = {{ "Press ENTER or type command to continue", 4 }},
kind = "return_prompt"
}}, msg_history={{
content = {{ "bork\nfail", 2 }},
kind = "echoerr"
}}}
end)
it('shortmess-=S', function() it('shortmess-=S', function()
command('set shortmess-=S') command('set shortmess-=S')
feed('iline 1\nline 2<esc>') feed('iline 1\nline 2<esc>')