From 70ddcccbca045c2e88bb16bb7877cb252ac90636 Mon Sep 17 00:00:00 2001 From: Matthew Schauer Date: Wed, 2 Feb 2022 21:01:31 -0800 Subject: [PATCH] Highlight icons using highlight regions rather than matching rules --- lua/symbols-outline/parser.lua | 10 ++++++++-- lua/symbols-outline/ui.lua | 6 ------ lua/symbols-outline/writer.lua | 12 +++++++++++- 3 files changed, 19 insertions(+), 9 deletions(-) diff --git a/lua/symbols-outline/parser.lua b/lua/symbols-outline/parser.lua index 4ebea02..081db8c 100644 --- a/lua/symbols-outline/parser.lua +++ b/lua/symbols-outline/parser.lua @@ -161,6 +161,7 @@ end function M.get_lines(flattened_outline_items) local lines = {} + local hl_info = {} for _, value in ipairs(flattened_outline_items) do local line = str_to_table(string.rep(" ", value.depth)) @@ -194,10 +195,15 @@ function M.get_lines(flattened_outline_items) table.insert(final_prefix, " ") end - table.insert(lines, table_to_str(final_prefix) .. value.icon .. " " .. + local string_prefix = table_to_str(final_prefix) + local hl_start = #string_prefix + 1 + local hl_end = #string_prefix + #value.icon + table.insert(lines, string_prefix .. value.icon .. " " .. value.name) + hl_type = config.options.symbols[symbols.kinds[value.kind]].hl + table.insert(hl_info, {hl_start, hl_end, hl_type}) end - return lines + return lines, hl_info end function M.get_details(flattened_outline_items) diff --git a/lua/symbols-outline/ui.lua b/lua/symbols-outline/ui.lua index 11b7b3c..f8bdc4b 100644 --- a/lua/symbols-outline/ui.lua +++ b/lua/symbols-outline/ui.lua @@ -52,12 +52,6 @@ function M.setup_highlights() highlight_text("markers_horizontal", M.markers.horizontal, "SymbolsOutlineConnector") highlight_text("markers_bottom", M.markers.bottom, "SymbolsOutlineConnector") - - for _, value in ipairs(symbol_kinds) do - local symbol = symbols[value] - highlight_text(value, symbol.icon, symbol.hl) - end - end return M diff --git a/lua/symbols-outline/writer.lua b/lua/symbols-outline/writer.lua index 43b77e2..a435a89 100644 --- a/lua/symbols-outline/writer.lua +++ b/lua/symbols-outline/writer.lua @@ -12,6 +12,8 @@ local function is_buffer_outline(bufnr) return string.match(name, "OUTLINE") ~= nil and ft == "Outline" and isValid end +local hlns = vim.api.nvim_create_namespace("symbols-outline-icon-highlight") + function M.write_outline(bufnr, lines) if not is_buffer_outline(bufnr) then return end vim.api.nvim_buf_set_option(bufnr, "modifiable", true) @@ -19,6 +21,13 @@ function M.write_outline(bufnr, lines) vim.api.nvim_buf_set_option(bufnr, "modifiable", false) end +function M.add_highlights(bufnr, hl_info) + for line, line_hl in ipairs(hl_info) do + hl_start, hl_end, hl_type = unpack(line_hl) + vim.api.nvim_buf_add_highlight(bufnr, hlns, hl_type, line - 1, hl_start - 1, hl_end) + end +end + local ns = vim.api.nvim_create_namespace("symbols-outline-virt-text") function M.write_details(bufnr, lines) @@ -41,11 +50,12 @@ end -- runs the whole writing routine where the text is cleared, new data is parsed -- and then written function M.parse_and_write(bufnr, flattened_outline_items) - local lines = parser.get_lines(flattened_outline_items) + local lines, hl_info = parser.get_lines(flattened_outline_items) M.write_outline(bufnr, lines) clear_virt_text(bufnr) local details = parser.get_details(flattened_outline_items) + M.add_highlights(bufnr, hl_info) M.write_details(bufnr, details) end