fix(messages): add append parameter to history entries (#34467)

Problem:  The "append" parameter added in abb40ece is missing from
          history entries, resulting in different message formatting
          for "g<".
Solution: Add "append" field to message history entries.

Co-authored-by: phanium <91544758+phanen@users.noreply.github.com>
This commit is contained in:
luukvbaal
2025-06-15 23:36:41 +02:00
committed by GitHub
parent 5ea6a022c0
commit 29f2cb89f0
7 changed files with 30 additions and 16 deletions

View File

@@ -892,7 +892,7 @@ must handle.
["msg_history_show", entries] ~ ["msg_history_show", entries] ~
Sent when |:messages| command is invoked. History is sent as a list of Sent when |:messages| command is invoked. History is sent as a list of
entries, where each entry is a `[kind, content]` tuple. entries, where each entry is a `[kind, content, append]` tuple.
["msg_history_clear"] ~ ["msg_history_clear"] ~
Clear the |:messages| history. Clear the |:messages| history.

View File

@@ -420,7 +420,7 @@ function M.msg_ruler(content)
set_virttext('last') set_virttext('last')
end end
---@alias MsgHistory [string, MsgContent] ---@alias MsgHistory [string, MsgContent, boolean]
--- Open the message history in the pager. --- Open the message history in the pager.
--- ---
---@param entries MsgHistory[] ---@param entries MsgHistory[]
@@ -431,7 +431,7 @@ function M.msg_history_show(entries)
api.nvim_buf_set_lines(ext.bufs.pager, 0, -1, false, {}) api.nvim_buf_set_lines(ext.bufs.pager, 0, -1, false, {})
for i, entry in ipairs(entries) do for i, entry in ipairs(entries) do
M.show_msg('pager', entry[2], i == 1, false) M.show_msg('pager', entry[2], i == 1, entry[3])
end end
M.set_pos('pager') M.set_pos('pager')

View File

@@ -1053,6 +1053,11 @@ static void msg_hist_add_multihl(HlMessage msg, bool temp)
entry->kind = msg_ext_kind; entry->kind = msg_ext_kind;
entry->prev = msg_hist_last; entry->prev = msg_hist_last;
entry->next = NULL; entry->next = NULL;
// NOTE: this does not encode if the message was actually appended to the
// previous entry in the message history. However append is currently only
// true for :echon, which is stored in the history as a temporary entry for
// "g<" where it is guaranteed to be after the entry it was appended to.
entry->append = msg_ext_append;
if (msg_hist_first == NULL) { if (msg_hist_first == NULL) {
msg_hist_first = entry; msg_hist_first = entry;
@@ -1206,6 +1211,7 @@ void ex_messages(exarg_T *eap)
ADD(content, ARRAY_OBJ(content_entry)); ADD(content, ARRAY_OBJ(content_entry));
} }
ADD(entry, ARRAY_OBJ(content)); ADD(entry, ARRAY_OBJ(content));
ADD(entry, BOOLEAN_OBJ(p->append));
ADD(entries, ARRAY_OBJ(entry)); ADD(entries, ARRAY_OBJ(entry));
} }
if (redirecting() || !ui_has(kUIMessages)) { if (redirecting() || !ui_has(kUIMessages)) {

View File

@@ -18,4 +18,6 @@ typedef struct msg_hist {
HlMessage msg; ///< Highlighted message. HlMessage msg; ///< Highlighted message.
const char *kind; ///< Message kind (for msg_ext) const char *kind; ///< Message kind (for msg_ext)
bool temp; ///< Temporary message since last command ("g<") bool temp; ///< Temporary message since last command ("g<")
bool append; ///< Message should be appended to previous entry, as opposed
///< to on a new line (|ui-messages|->msg_show->append).
} MessageHistoryEntry; } MessageHistoryEntry;

View File

@@ -136,9 +136,9 @@ describe('vim.ui_attach', function()
{ {
'msg_history_show', 'msg_history_show',
{ {
{ 'echomsg', { { 0, 'message1', 0 } } }, { 'echomsg', { { 0, 'message1', 0 } }, false },
{ 'lua_print', { { 0, 'message2', 0 } } }, { 'lua_print', { { 0, 'message2', 0 } }, false },
{ 'echomsg', { { 0, 'message3', 0 } } }, { 'echomsg', { { 0, 'message3', 0 } }, false },
}, },
}, },
}, actual, vim.inspect(actual)) }, actual, vim.inspect(actual))

View File

@@ -1604,14 +1604,21 @@ stack traceback:
end) end)
it('g< mapping shows recent messages', function() it('g< mapping shows recent messages', function()
command('echo "foo" | echo "bar"') feed(':echo "foo" | echo "bar" | echon "baz"<CR>')
screen:expect({ screen:expect({
grid = [[ grid = [[
^ | ^ |
{1:~ }|*4 {1:~ }|*4
]], ]],
cmdline = { { abort = false } },
messages = { messages = {
{ content = { { 'foo' } }, kind = 'echo' },
{ content = { { 'bar' } }, kind = 'echo' }, { content = { { 'bar' } }, kind = 'echo' },
{ content = { { 'baz' } }, kind = 'echo', append = true },
{
content = { { 'Press ENTER or type command to continue', 6, 18 } },
kind = 'return_prompt',
},
}, },
}) })
feed('g<lt>') feed('g<lt>')
@@ -1627,14 +1634,9 @@ stack traceback:
}, },
}, },
msg_history = { msg_history = {
{ { content = { { 'foo' } }, kind = 'echo' },
content = { { 'foo' } }, { content = { { 'bar' } }, kind = 'echo' },
kind = 'echo', { content = { { 'baz' } }, kind = 'echo', append = true },
},
{
content = { { 'bar' } },
kind = 'echo',
},
}, },
}) })
feed('Q') feed('Q')

View File

@@ -1515,7 +1515,11 @@ function Screen:_extstate_repr(attr_state)
local msg_history = {} local msg_history = {}
for i, entry in ipairs(self.msg_history) do for i, entry in ipairs(self.msg_history) do
msg_history[i] = { kind = entry[1], content = self:_chunks_repr(entry[2], attr_state) } msg_history[i] = {
kind = entry[1],
content = self:_chunks_repr(entry[2], attr_state),
append = entry[3] or nil,
}
end end
local win_viewport = (next(self.win_viewport) and self.win_viewport) or nil local win_viewport = (next(self.win_viewport) and self.win_viewport) or nil