mirror of
https://github.com/neovim/neovim.git
synced 2025-09-05 19:08:15 +00:00
fix(extui): better message highlighting after carriage return (#34034)
Problem: Incorrect message highlighting for highlighted message chunks containing carriage returns. Solution: Add a highlight for each substring ending in a newline or carriage return separately.
This commit is contained in:
@@ -203,7 +203,7 @@ function M.show_msg(tar, content, replace_last, more)
|
|||||||
---this is the first message, or in case of a repeated or replaced message.
|
---this is the first message, or in case of a repeated or replaced message.
|
||||||
local row = M[tar] and count <= 1 and (tar == 'cmd' and ext.cmd.row or 0)
|
local row = M[tar] and count <= 1 and (tar == 'cmd' and ext.cmd.row or 0)
|
||||||
or api.nvim_buf_line_count(ext.bufs[tar]) - ((replace_last or cr or dupe > 0) and 1 or 0)
|
or api.nvim_buf_line_count(ext.bufs[tar]) - ((replace_last or cr or dupe > 0) and 1 or 0)
|
||||||
local start_row, col, width = row, 0, M.box.width
|
local start_row, width = row, M.box.width
|
||||||
---@type string[] Overwrite the last line of the previous message if this one starts with CR.
|
---@type string[] Overwrite the last line of the previous message if this one starts with CR.
|
||||||
local lines = { cr and api.nvim_buf_get_lines(ext.bufs[tar], -2, -1, false)[1] or nil }
|
local lines = { cr and api.nvim_buf_get_lines(ext.bufs[tar], -2, -1, false)[1] or nil }
|
||||||
local marks = {} ---@type [integer, integer, vim.api.keyset.set_extmark][]
|
local marks = {} ---@type [integer, integer, vim.api.keyset.set_extmark][]
|
||||||
@@ -211,7 +211,7 @@ function M.show_msg(tar, content, replace_last, more)
|
|||||||
-- Accumulate to be inserted and highlighted message chunks for a non-repeated message.
|
-- Accumulate to be inserted and highlighted message chunks for a non-repeated message.
|
||||||
for _, chunk in ipairs(dupe > 0 and tar == ext.cfg.msg.pos and {} or content) do
|
for _, chunk in ipairs(dupe > 0 and tar == ext.cfg.msg.pos and {} or content) do
|
||||||
local idx = (#lines == 0 and 1 or #lines)
|
local idx = (#lines == 0 and 1 or #lines)
|
||||||
local srow, scol, head = row, col, lines[idx] or ''
|
local head = lines[idx] or ''
|
||||||
|
|
||||||
-- Split at newline and write to start of line after carriage return.
|
-- Split at newline and write to start of line after carriage return.
|
||||||
for str in (chunk[2] .. '\0'):gmatch('.-[\n\r%z]') do
|
for str in (chunk[2] .. '\0'):gmatch('.-[\n\r%z]') do
|
||||||
@@ -221,7 +221,7 @@ function M.show_msg(tar, content, replace_last, more)
|
|||||||
width = tar == 'box' and math.max(width, api.nvim_strwidth(lines[idx])) or 0
|
width = tar == 'box' and math.max(width, api.nvim_strwidth(lines[idx])) or 0
|
||||||
|
|
||||||
-- Remove previous highlight from overwritten text.
|
-- Remove previous highlight from overwritten text.
|
||||||
if #head == 0 and marks[#marks] and marks[#marks][3].end_row == row then
|
if #head == 0 and marks[#marks] and marks[#marks][1] == row then
|
||||||
if marks[#marks][1] < row then
|
if marks[#marks][1] < row then
|
||||||
marks[#marks + 1] = { row, 0, vim.deepcopy(marks[#marks][3]) }
|
marks[#marks + 1] = { row, 0, vim.deepcopy(marks[#marks][3]) }
|
||||||
marks[#marks - 1][3].end_col = 0
|
marks[#marks - 1][3].end_col = 0
|
||||||
@@ -229,15 +229,14 @@ function M.show_msg(tar, content, replace_last, more)
|
|||||||
marks[#marks][2] = math.max(marks[#marks][2], #mid)
|
marks[#marks][2] = math.max(marks[#marks][2], #mid)
|
||||||
end
|
end
|
||||||
|
|
||||||
row = row + (str:sub(-1) == '\n' and 1 or 0)
|
if chunk[3] > 0 then
|
||||||
idx = idx + (str:sub(-1) == '\n' and 1 or 0)
|
marks[#marks + 1] = { row, #head, { end_col = #head + #mid, hl_group = chunk[3] } }
|
||||||
|
end
|
||||||
|
if str:sub(-1) == '\n' then
|
||||||
|
row, idx = row + 1, idx + 1
|
||||||
|
end
|
||||||
head = ''
|
head = ''
|
||||||
end
|
end
|
||||||
|
|
||||||
col = #lines[idx]
|
|
||||||
if chunk[3] > 0 then
|
|
||||||
marks[#marks + 1] = { srow, scol, { end_col = col, end_row = row, hl_group = chunk[3] } }
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
if not M[tar] or dupe == 0 then
|
if not M[tar] or dupe == 0 then
|
||||||
|
Reference in New Issue
Block a user