neovim

Neovim text editor
git clone https://git.dasho.dev/neovim.git
Log | Files | Refs | README

commit 912388f51786eab37ad92235f9baf762232d9cf1
parent 2d75ea6afeed6a52ced17318aa7786a5d56cbf45
Author: luukvbaal <luukvbaal@gmail.com>
Date:   Mon,  5 May 2025 14:04:09 +0200

fix(messages): list_cmd kind for buffer line messages (#33855)

Problem:  Missing kind and separate event for each line for message
          containing buffer lines for e.g. `:print`.
Solution: Set the `list_cmd` kind and only `msg_start()` for the first
          message, print a newline instead.
Diffstat:
Msrc/nvim/ex_cmds.c | 17+++++++++++------
Msrc/nvim/ex_docmd.c | 13++++++-------
Mtest/functional/ui/messages_spec.lua | 17+++++++++++++++++
3 files changed, 34 insertions(+), 13 deletions(-)

diff --git a/src/nvim/ex_cmds.c b/src/nvim/ex_cmds.c @@ -1470,7 +1470,7 @@ void append_redir(char *const buf, const size_t buflen, const char *const opt, } } -void print_line_no_prefix(linenr_T lnum, int use_number, bool list) +void print_line_no_prefix(linenr_T lnum, bool use_number, bool list) { char numbuf[30]; @@ -1483,7 +1483,7 @@ void print_line_no_prefix(linenr_T lnum, int use_number, bool list) } /// Print a text line. Also in silent mode ("ex -s"). -void print_line(linenr_T lnum, int use_number, bool list) +void print_line(linenr_T lnum, bool use_number, bool list, bool first) { bool save_silent = silent_mode; @@ -1492,12 +1492,17 @@ void print_line(linenr_T lnum, int use_number, bool list) return; } - msg_start(); silent_mode = false; info_message = true; // use stdout, not stderr + if (first) { + msg_start(); + msg_ext_set_kind("list_cmd"); + } else if (!save_silent) { + msg_putchar('\n'); // don't want trailing newline with regular messaging + } print_line_no_prefix(lnum, use_number, list); if (save_silent) { - msg_putchar('\n'); + msg_putchar('\n'); // batch mode message should always end in newline silent_mode = save_silent; } info_message = false; @@ -3039,7 +3044,7 @@ void ex_z(exarg_T *eap) } } - print_line(i, eap->flags & EXFLAG_NR, eap->flags & EXFLAG_LIST); + print_line(i, eap->flags & EXFLAG_NR, eap->flags & EXFLAG_LIST, i == start); if (minus && i == lnum) { msg_putchar('\n'); @@ -4259,7 +4264,7 @@ skip: global_need_beginline = true; } if (subflags.do_print) { - print_line(curwin->w_cursor.lnum, subflags.do_number, subflags.do_list); + print_line(curwin->w_cursor.lnum, subflags.do_number, subflags.do_list, true); } } else if (!global_busy) { if (got_int) { diff --git a/src/nvim/ex_docmd.c b/src/nvim/ex_docmd.c @@ -5129,14 +5129,13 @@ static void ex_print(exarg_T *eap) if (curbuf->b_ml.ml_flags & ML_EMPTY) { emsg(_(e_empty_buffer)); } else { - for (; !got_int; os_breakcheck()) { - print_line(eap->line1, + for (linenr_T line = eap->line1; line <= eap->line2 && !got_int; os_breakcheck()) { + print_line(line, (eap->cmdidx == CMD_number || eap->cmdidx == CMD_pound || (eap->flags & EXFLAG_NR)), - eap->cmdidx == CMD_list || (eap->flags & EXFLAG_LIST)); - if (++eap->line1 > eap->line2) { - break; - } + eap->cmdidx == CMD_list || (eap->flags & EXFLAG_LIST), + line == eap->line1); + line++; } setpcmark(); // put cursor at last line @@ -6360,7 +6359,7 @@ void ex_may_print(exarg_T *eap) { if (eap->flags != 0) { print_line(curwin->w_cursor.lnum, (eap->flags & EXFLAG_NR), - (eap->flags & EXFLAG_LIST)); + (eap->flags & EXFLAG_LIST), true); ex_no_reprint = true; } } diff --git a/test/functional/ui/messages_spec.lua b/test/functional/ui/messages_spec.lua @@ -522,6 +522,23 @@ describe('ui/ext_messages', function() }, }, }) + + feed(':1,2p<CR>') + screen:expect({ + grid = [[ + line 1 | + ^line | + {1:~ }|*3 + ]], + cmdline = { { abort = false } }, + messages = { + { + content = { { 'line 1\nline ' } }, + history = false, + kind = 'list_cmd', + }, + }, + }) end) it(':echoerr', function()