From 94d729170e95298ce86ba41ef66f8756f6062b34 Mon Sep 17 00:00:00 2001 From: haxibami Date: Tue, 7 Jan 2025 00:50:28 +0900 Subject: [PATCH] add support for multi byte chars (#19) --- lua/lsplinks.lua | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/lua/lsplinks.lua b/lua/lsplinks.lua index d3837fa..cd53426 100644 --- a/lua/lsplinks.lua +++ b/lua/lsplinks.lua @@ -204,15 +204,26 @@ function M.get(bufnr) return links_by_buf[bufnr] or {} end +--- Translate a character index to a byte index +---@param lnum integer +---@param index integer +---@return integer +local function translate(lnum, index) + local line = vim.api.nvim_buf_get_lines(0, lnum, lnum + 1, true) + return vim.fn.byteidx(line[1], index) +end + --- Highlight links in the current buffer function M.display() api.nvim_buf_clear_namespace(0, ns, 0, -1) for _, link in ipairs(M.get()) do + local start_lnum = link.range.start.line + local end_lnum = link.range["end"].line -- sometimes the buffer is changed before we get here and the link -- ranges are invalid, so we ignore the error. - pcall(api.nvim_buf_set_extmark, 0, ns, link.range.start.line, link.range.start.character, { - end_row = link.range["end"].line, - end_col = link.range["end"].character, + pcall(api.nvim_buf_set_extmark, 0, ns, start_lnum, translate(start_lnum, link.range.start.character), { + end_row = end_lnum, + end_col = translate(end_lnum, link.range["end"].character), hl_group = options.hl_group, }) end