From d27bcb8152b748cb7cb6b77a45f101d87f9c0049 Mon Sep 17 00:00:00 2001 From: evertonse Date: Sun, 14 Jul 2024 00:13:57 -0300 Subject: [PATCH 1/5] feat(icon_placement): Allow right_align icon_placemente for decorator using ext_marks nvim api --- doc/nvim-tree-lua.txt | 12 ++++++++---- lua/nvim-tree/enum.lua | 1 + lua/nvim-tree/renderer/builder.lua | 9 +++++++++ lua/nvim-tree/renderer/decorator/init.lua | 11 +++++++++++ lua/nvim-tree/renderer/init.lua | 13 +++++++++++-- 5 files changed, 40 insertions(+), 6 deletions(-) diff --git a/doc/nvim-tree-lua.txt b/doc/nvim-tree-lua.txt index 19fe4d60bf6..9acde94b9a2 100644 --- a/doc/nvim-tree-lua.txt +++ b/doc/nvim-tree-lua.txt @@ -974,25 +974,29 @@ Icon order and sign column precedence: *nvim-tree.renderer.icons.git_placement* Place where the git icons will be rendered. Can be `"after"` or `"before"` filename (after the file/folders icons) - or `"signcolumn"` (requires |nvim-tree.view.signcolumn| enabled). + or `"signcolumn"` (requires |nvim-tree.view.signcolumn| enabled) or + `"right_align"` (requires |nvim_buf_set_extmark|). Type: `string`, Default: `"before"` *nvim-tree.renderer.icons.diagnostics_placement* Place where the diagnostics icon will be rendered. Can be `"after"` or `"before"` filename (after the file/folders icons) - or `"signcolumn"` (requires |nvim-tree.view.signcolumn| enabled). + or `"signcolumn"` (requires |nvim-tree.view.signcolumn| enabled) or + `"right_align"` (requires |nvim_buf_set_extmark|). Type: `string`, Default: `"signcolumn"` *nvim-tree.renderer.icons.modified_placement* Place where the modified icon will be rendered. Can be `"after"` or `"before"` filename (after the file/folders icons) - or `"signcolumn"` (requires |nvim-tree.view.signcolumn| enabled). + or `"signcolumn"` (requires |nvim-tree.view.signcolumn| enabled) or + `"right_align"` (requires |nvim_buf_set_extmark|). Type: `string`, Default: `"after"` *nvim-tree.renderer.icons.bookmarks_placement* Place where the bookmarks icon will be rendered. Can be `"after"` or `"before"` filename (after the file/folders icons) - or `"signcolumn"` (requires |nvim-tree.view.signcolumn| enabled). + or `"signcolumn"` (requires |nvim-tree.view.signcolumn| enabled) or + `"right_align"` (requires |nvim_buf_set_extmark|). Type: `string`, Default: `signcolumn` *nvim-tree.renderer.icons.padding* diff --git a/lua/nvim-tree/enum.lua b/lua/nvim-tree/enum.lua index 92ea2bb4ca0..054c463f46c 100644 --- a/lua/nvim-tree/enum.lua +++ b/lua/nvim-tree/enum.lua @@ -16,6 +16,7 @@ M.ICON_PLACEMENT = { signcolumn = 1, before = 2, after = 3, + right_align = 4, } return M diff --git a/lua/nvim-tree/renderer/builder.lua b/lua/nvim-tree/renderer/builder.lua index 52c6c7e59c4..c3c2f14115b 100644 --- a/lua/nvim-tree/renderer/builder.lua +++ b/lua/nvim-tree/renderer/builder.lua @@ -60,6 +60,7 @@ function Builder:new() lines = {}, markers = {}, signs = {}, + extmarks = {}, } setmetatable(o, self) self.__index = self @@ -228,6 +229,14 @@ function Builder:format_line(indent_markers, arrows, icon, name, node) add_to_end(line, M.decorators[i]:icons_after(node)) end + local rights = {} + for i = #M.decorators, 1, -1 do + add_to_end(rights, M.decorators[i]:icons_right_align(node)) + end + if #rights > 0 then + self.extmarks[self.index] = rights + end + return line end diff --git a/lua/nvim-tree/renderer/decorator/init.lua b/lua/nvim-tree/renderer/decorator/init.lua index 7748b11cf49..f2d047767b5 100644 --- a/lua/nvim-tree/renderer/decorator/init.lua +++ b/lua/nvim-tree/renderer/decorator/init.lua @@ -74,6 +74,17 @@ function Decorator:icons_after(node) return self:calculate_icons(node) end +---Icons when ICON_PLACEMENT.right_align +---@param node Node +---@return HighlightedString[]|nil icons +function Decorator:icons_right_align(node) + if not self.enabled or self.icon_placement ~= ICON_PLACEMENT.right_align then + return + end + + return self:calculate_icons(node) +end + ---Maybe icons, optionally implemented ---@protected ---@param _ Node diff --git a/lua/nvim-tree/renderer/init.lua b/lua/nvim-tree/renderer/init.lua index 27ef3acaa71..b6c55e0fcdf 100644 --- a/lua/nvim-tree/renderer/init.lua +++ b/lua/nvim-tree/renderer/init.lua @@ -18,7 +18,7 @@ local namespace_id = vim.api.nvim_create_namespace "NvimTreeHighlights" ---@param lines string[] ---@param hl_args AddHighlightArgs[] ---@param signs string[] -local function _draw(bufnr, lines, hl_args, signs) +local function _draw(bufnr, lines, hl_args, signs, extmarks) if vim.fn.has "nvim-0.10" == 1 then vim.api.nvim_set_option_value("modifiable", true, { buf = bufnr }) else @@ -38,6 +38,15 @@ local function _draw(bufnr, lines, hl_args, signs) for i, sign_name in pairs(signs) do vim.fn.sign_place(0, SIGN_GROUP, sign_name, bufnr, { lnum = i + 1 }) end + for i, extname in pairs(extmarks) do + for _, mark in ipairs(extname) do + vim.api.nvim_buf_set_extmark(bufnr, namespace_id, i, -1, { + virt_text = { { mark.str, mark.hl } }, + virt_text_pos = "right_align", + hl_mode = "combine", + }) + end + end end function M.render_hl(bufnr, hl) @@ -67,7 +76,7 @@ function M.draw() local builder = Builder:new():build() - _draw(bufnr, builder.lines, builder.hl_args, builder.signs) + _draw(bufnr, builder.lines, builder.hl_args, builder.signs, builder.extmarks) if cursor and #builder.lines >= cursor[1] then vim.api.nvim_win_set_cursor(view.get_winnr() or 0, cursor) From 6d336de891589292ed0f760e975f46db77a2e5fd Mon Sep 17 00:00:00 2001 From: evertonse Date: Sun, 14 Jul 2024 00:13:57 -0300 Subject: [PATCH 2/5] feat(icon_placement): Allow right_align icon_placemente for decorator using ext_marks nvim api feat(icon_placement): Allow right_align icon_placemente for decorator using ext_marks nvim api --- lua/nvim-tree.lua | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lua/nvim-tree.lua b/lua/nvim-tree.lua index 343196a0f66..9feb6e55a05 100644 --- a/lua/nvim-tree.lua +++ b/lua/nvim-tree.lua @@ -672,10 +672,10 @@ local ACCEPTED_STRINGS = { highlight_diagnostics = { "none", "icon", "name", "all" }, highlight_clipboard = { "none", "icon", "name", "all" }, icons = { - git_placement = { "before", "after", "signcolumn" }, - modified_placement = { "before", "after", "signcolumn" }, - diagnostics_placement = { "before", "after", "signcolumn" }, - bookmarks_placement = { "before", "after", "signcolumn" }, + git_placement = { "before", "after", "signcolumn", "right_align" }, + modified_placement = { "before", "after", "signcolumn", "right_align" }, + diagnostics_placement = { "before", "after", "signcolumn", "right_align" }, + bookmarks_placement = { "before", "after", "signcolumn", "right_align" }, }, }, help = { From 6b7b4f25817f923134fd477bb937e106b9d6d07b Mon Sep 17 00:00:00 2001 From: Alexander Courtis Date: Sun, 21 Jul 2024 14:44:20 +1000 Subject: [PATCH 3/5] feat(icon_placement): consolidate doc --- doc/nvim-tree-lua.txt | 26 ++++++++++---------------- 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/doc/nvim-tree-lua.txt b/doc/nvim-tree-lua.txt index 9acde94b9a2..fd215fd5cf8 100644 --- a/doc/nvim-tree-lua.txt +++ b/doc/nvim-tree-lua.txt @@ -944,6 +944,12 @@ Configuration options for icons. Icon order and sign column precedence: git < modified < bookmarked < diagnostics +`renderer.icons.*_placement` options may be: +- `"before"` : before file/folder, after the file/folders icons +- `"after"` : after file/folder +- `"signcolumn"` : far left, requires |nvim-tree.view.signcolumn| enabled +- `"right_align"` : far right + *nvim-tree.renderer.icons.web_devicons* Configure optional plugin `"nvim-tree/nvim-web-devicons"` @@ -972,31 +978,19 @@ Icon order and sign column precedence: Type: `boolean`, Default: `true` *nvim-tree.renderer.icons.git_placement* - Place where the git icons will be rendered. - Can be `"after"` or `"before"` filename (after the file/folders icons) - or `"signcolumn"` (requires |nvim-tree.view.signcolumn| enabled) or - `"right_align"` (requires |nvim_buf_set_extmark|). + Git icons placement. Type: `string`, Default: `"before"` *nvim-tree.renderer.icons.diagnostics_placement* - Place where the diagnostics icon will be rendered. - Can be `"after"` or `"before"` filename (after the file/folders icons) - or `"signcolumn"` (requires |nvim-tree.view.signcolumn| enabled) or - `"right_align"` (requires |nvim_buf_set_extmark|). + Diganostic icon placement. Type: `string`, Default: `"signcolumn"` *nvim-tree.renderer.icons.modified_placement* - Place where the modified icon will be rendered. - Can be `"after"` or `"before"` filename (after the file/folders icons) - or `"signcolumn"` (requires |nvim-tree.view.signcolumn| enabled) or - `"right_align"` (requires |nvim_buf_set_extmark|). + Modified icon placement. Type: `string`, Default: `"after"` *nvim-tree.renderer.icons.bookmarks_placement* - Place where the bookmarks icon will be rendered. - Can be `"after"` or `"before"` filename (after the file/folders icons) - or `"signcolumn"` (requires |nvim-tree.view.signcolumn| enabled) or - `"right_align"` (requires |nvim_buf_set_extmark|). + Bookmark icon placement. Type: `string`, Default: `signcolumn` *nvim-tree.renderer.icons.padding* From cb56c0d76104db80aaf6fd35697ef34f0e483f5d Mon Sep 17 00:00:00 2001 From: evertonse Date: Mon, 22 Jul 2024 02:53:24 -0300 Subject: [PATCH 4/5] fix: extra namespace added to avoid colision between right_align and full_name features --- doc/nvim-tree-lua.txt | 4 +--- lua/nvim-tree/renderer/init.lua | 5 ++++- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/doc/nvim-tree-lua.txt b/doc/nvim-tree-lua.txt index f554ef7a87f..5eb96650e0e 100644 --- a/doc/nvim-tree-lua.txt +++ b/doc/nvim-tree-lua.txt @@ -1001,9 +1001,7 @@ Icon order and sign column precedence: Type: `string`, Default: `"after"` *nvim-tree.renderer.icons.hidden_placement* - Place where the hidden (dotfile) icon will be rendered. - Can be `"after"` or `"before"` filename (after the file/folders icons) - or `"signcolumn"` (requires |nvim-tree.view.signcolumn| enabled). + Hidden icon placement. Type: `string`, Default: `"after"` *nvim-tree.renderer.icons.bookmarks_placement* diff --git a/lua/nvim-tree/renderer/init.lua b/lua/nvim-tree/renderer/init.lua index b6c55e0fcdf..41c8fd21477 100644 --- a/lua/nvim-tree/renderer/init.lua +++ b/lua/nvim-tree/renderer/init.lua @@ -13,6 +13,7 @@ local M = {} local SIGN_GROUP = "NvimTreeRendererSigns" local namespace_id = vim.api.nvim_create_namespace "NvimTreeHighlights" +local namespace_extmarks_id = vim.api.nvim_create_namespace "NvimTreeExtmarks" ---@param bufnr number ---@param lines string[] @@ -38,9 +39,11 @@ local function _draw(bufnr, lines, hl_args, signs, extmarks) for i, sign_name in pairs(signs) do vim.fn.sign_place(0, SIGN_GROUP, sign_name, bufnr, { lnum = i + 1 }) end + + vim.api.nvim_buf_clear_namespace(bufnr, namespace_extmarks_id, 0, -1) for i, extname in pairs(extmarks) do for _, mark in ipairs(extname) do - vim.api.nvim_buf_set_extmark(bufnr, namespace_id, i, -1, { + vim.api.nvim_buf_set_extmark(bufnr, namespace_extmarks_id, i, -1, { virt_text = { { mark.str, mark.hl } }, virt_text_pos = "right_align", hl_mode = "combine", From bb666a5ac0ac9eefdc21433329f25c1347d9f03e Mon Sep 17 00:00:00 2001 From: evertonse Date: Sat, 27 Jul 2024 16:35:47 -0300 Subject: [PATCH 5/5] style: rename namespace_id --- lua/nvim-tree/renderer/init.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lua/nvim-tree/renderer/init.lua b/lua/nvim-tree/renderer/init.lua index 41c8fd21477..88ccae6b3f4 100644 --- a/lua/nvim-tree/renderer/init.lua +++ b/lua/nvim-tree/renderer/init.lua @@ -12,7 +12,7 @@ local M = {} local SIGN_GROUP = "NvimTreeRendererSigns" -local namespace_id = vim.api.nvim_create_namespace "NvimTreeHighlights" +local namespace_highlights_id = vim.api.nvim_create_namespace "NvimTreeHighlights" local namespace_extmarks_id = vim.api.nvim_create_namespace "NvimTreeExtmarks" ---@param bufnr number @@ -56,11 +56,11 @@ function M.render_hl(bufnr, hl) if not bufnr or not vim.api.nvim_buf_is_loaded(bufnr) then return end - vim.api.nvim_buf_clear_namespace(bufnr, namespace_id, 0, -1) + vim.api.nvim_buf_clear_namespace(bufnr, namespace_highlights_id, 0, -1) for _, data in ipairs(hl) do if type(data[1]) == "table" then for _, group in ipairs(data[1]) do - vim.api.nvim_buf_add_highlight(bufnr, namespace_id, group, data[2], data[3], data[4]) + vim.api.nvim_buf_add_highlight(bufnr, namespace_highlights_id, group, data[2], data[3], data[4]) end end end