aboutsummaryrefslogtreecommitdiff
path: root/runtime/lua
diff options
context:
space:
mode:
authorRiley Bruins <ribru17@hotmail.com>2024-05-26 10:27:12 -0700
committerGitHub <noreply@github.com>2024-05-26 10:27:12 -0700
commiteb37241d38ad35b9e6bfac6379dd10e60aa0350c (patch)
tree8053934aee3aac93bf1a9bd33d9c135bae677a2c /runtime/lua
parentdd54e81551bd063a1ece46eba64c5ed45f172476 (diff)
downloadrneovim-eb37241d38ad35b9e6bfac6379dd10e60aa0350c.tar.gz
rneovim-eb37241d38ad35b9e6bfac6379dd10e60aa0350c.tar.bz2
rneovim-eb37241d38ad35b9e6bfac6379dd10e60aa0350c.zip
fix(tohtml): properly handle multiple hl groups #29012
Problem: :TOhtml doesn't properly handle virtual text when it has multiple highlight groups. It also improperly calculates position offset for multi-byte virt_text characters. Solution: Apply the `vim.api.nvim_strwidth` broadly to properly calculate character offset, and handle the cases where the `hl` argument can be a table of multiple hl groups.
Diffstat (limited to 'runtime/lua')
-rw-r--r--runtime/lua/tohtml.lua14
1 files changed, 9 insertions, 5 deletions
diff --git a/runtime/lua/tohtml.lua b/runtime/lua/tohtml.lua
index 0fc349e86d..5e145950b7 100644
--- a/runtime/lua/tohtml.lua
+++ b/runtime/lua/tohtml.lua
@@ -188,6 +188,8 @@ local background_color_cache = nil
--- @type string?
local foreground_color_cache = nil
+local len = vim.api.nvim_strwidth
+
--- @see https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h3-Operating-System-Commands
--- @param color "background"|"foreground"|integer
--- @return string?
@@ -312,9 +314,12 @@ local function style_line_insert_virt_text(style_line, col, val)
end
--- @param state vim.tohtml.state
---- @param hl string|integer|nil
+--- @param hl string|integer|string[]|integer[]?
--- @return nil|integer
local function register_hl(state, hl)
+ if type(hl) == 'table' then
+ hl = hl[#hl]
+ end
if type(hl) == 'nil' then
return
elseif type(hl) == 'string' then
@@ -537,7 +542,7 @@ local function _styletable_extmarks_virt_text(state, extmark, namespaces)
else
style_line_insert_virt_text(styletable[row + 1], col + 1, { i[1], hlid })
end
- virt_text_len = virt_text_len + #i[1]
+ virt_text_len = virt_text_len + len(i[1])
end
if extmark[4].virt_text_pos == 'overlay' then
styletable_insert_range(state, row + 1, col + 1, row + 1, col + virt_text_len + 1, HIDE_ID)
@@ -782,7 +787,7 @@ local function styletable_statuscolumn(state)
statuscolumn,
{ winid = state.winid, use_statuscol_lnum = row, highlights = true }
)
- local width = vim.api.nvim_strwidth(status.str)
+ local width = len(status.str)
if width > minwidth then
minwidth = width
end
@@ -797,7 +802,7 @@ local function styletable_statuscolumn(state)
for k, v in ipairs(hls) do
local text = str:sub(v.start + 1, hls[k + 1] and hls[k + 1].start or nil)
if k == #hls then
- text = text .. (' '):rep(minwidth - vim.api.nvim_strwidth(str))
+ text = text .. (' '):rep(minwidth - len(str))
end
if text ~= '' then
local hlid = register_hl(state, v.group)
@@ -817,7 +822,6 @@ local function styletable_listchars(state)
local function utf8_sub(str, i, j)
return vim.fn.strcharpart(str, i - 1, j and j - i + 1 or nil)
end
- local len = vim.api.nvim_strwidth
--- @type table<string,string>
local listchars = vim.opt_local.listchars:get()
local ids = setmetatable({}, {