Skip to content

Commit d27bcb8

Browse files
committed
feat(icon_placement): Allow right_align icon_placemente for decorator using ext_marks nvim api
1 parent f9ff00b commit d27bcb8

File tree

5 files changed

+40
-6
lines changed

5 files changed

+40
-6
lines changed

doc/nvim-tree-lua.txt

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -974,25 +974,29 @@ Icon order and sign column precedence:
974974
*nvim-tree.renderer.icons.git_placement*
975975
Place where the git icons will be rendered.
976976
Can be `"after"` or `"before"` filename (after the file/folders icons)
977-
or `"signcolumn"` (requires |nvim-tree.view.signcolumn| enabled).
977+
or `"signcolumn"` (requires |nvim-tree.view.signcolumn| enabled) or
978+
`"right_align"` (requires |nvim_buf_set_extmark|).
978979
Type: `string`, Default: `"before"`
979980

980981
*nvim-tree.renderer.icons.diagnostics_placement*
981982
Place where the diagnostics icon will be rendered.
982983
Can be `"after"` or `"before"` filename (after the file/folders icons)
983-
or `"signcolumn"` (requires |nvim-tree.view.signcolumn| enabled).
984+
or `"signcolumn"` (requires |nvim-tree.view.signcolumn| enabled) or
985+
`"right_align"` (requires |nvim_buf_set_extmark|).
984986
Type: `string`, Default: `"signcolumn"`
985987

986988
*nvim-tree.renderer.icons.modified_placement*
987989
Place where the modified icon will be rendered.
988990
Can be `"after"` or `"before"` filename (after the file/folders icons)
989-
or `"signcolumn"` (requires |nvim-tree.view.signcolumn| enabled).
991+
or `"signcolumn"` (requires |nvim-tree.view.signcolumn| enabled) or
992+
`"right_align"` (requires |nvim_buf_set_extmark|).
990993
Type: `string`, Default: `"after"`
991994

992995
*nvim-tree.renderer.icons.bookmarks_placement*
993996
Place where the bookmarks icon will be rendered.
994997
Can be `"after"` or `"before"` filename (after the file/folders icons)
995-
or `"signcolumn"` (requires |nvim-tree.view.signcolumn| enabled).
998+
or `"signcolumn"` (requires |nvim-tree.view.signcolumn| enabled) or
999+
`"right_align"` (requires |nvim_buf_set_extmark|).
9961000
Type: `string`, Default: `signcolumn`
9971001

9981002
*nvim-tree.renderer.icons.padding*

lua/nvim-tree/enum.lua

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ M.ICON_PLACEMENT = {
1616
signcolumn = 1,
1717
before = 2,
1818
after = 3,
19+
right_align = 4,
1920
}
2021

2122
return M

lua/nvim-tree/renderer/builder.lua

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ function Builder:new()
6060
lines = {},
6161
markers = {},
6262
signs = {},
63+
extmarks = {},
6364
}
6465
setmetatable(o, self)
6566
self.__index = self
@@ -228,6 +229,14 @@ function Builder:format_line(indent_markers, arrows, icon, name, node)
228229
add_to_end(line, M.decorators[i]:icons_after(node))
229230
end
230231

232+
local rights = {}
233+
for i = #M.decorators, 1, -1 do
234+
add_to_end(rights, M.decorators[i]:icons_right_align(node))
235+
end
236+
if #rights > 0 then
237+
self.extmarks[self.index] = rights
238+
end
239+
231240
return line
232241
end
233242

lua/nvim-tree/renderer/decorator/init.lua

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,17 @@ function Decorator:icons_after(node)
7474
return self:calculate_icons(node)
7575
end
7676

77+
---Icons when ICON_PLACEMENT.right_align
78+
---@param node Node
79+
---@return HighlightedString[]|nil icons
80+
function Decorator:icons_right_align(node)
81+
if not self.enabled or self.icon_placement ~= ICON_PLACEMENT.right_align then
82+
return
83+
end
84+
85+
return self:calculate_icons(node)
86+
end
87+
7788
---Maybe icons, optionally implemented
7889
---@protected
7990
---@param _ Node

lua/nvim-tree/renderer/init.lua

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ local namespace_id = vim.api.nvim_create_namespace "NvimTreeHighlights"
1818
---@param lines string[]
1919
---@param hl_args AddHighlightArgs[]
2020
---@param signs string[]
21-
local function _draw(bufnr, lines, hl_args, signs)
21+
local function _draw(bufnr, lines, hl_args, signs, extmarks)
2222
if vim.fn.has "nvim-0.10" == 1 then
2323
vim.api.nvim_set_option_value("modifiable", true, { buf = bufnr })
2424
else
@@ -38,6 +38,15 @@ local function _draw(bufnr, lines, hl_args, signs)
3838
for i, sign_name in pairs(signs) do
3939
vim.fn.sign_place(0, SIGN_GROUP, sign_name, bufnr, { lnum = i + 1 })
4040
end
41+
for i, extname in pairs(extmarks) do
42+
for _, mark in ipairs(extname) do
43+
vim.api.nvim_buf_set_extmark(bufnr, namespace_id, i, -1, {
44+
virt_text = { { mark.str, mark.hl } },
45+
virt_text_pos = "right_align",
46+
hl_mode = "combine",
47+
})
48+
end
49+
end
4150
end
4251

4352
function M.render_hl(bufnr, hl)
@@ -67,7 +76,7 @@ function M.draw()
6776

6877
local builder = Builder:new():build()
6978

70-
_draw(bufnr, builder.lines, builder.hl_args, builder.signs)
79+
_draw(bufnr, builder.lines, builder.hl_args, builder.signs, builder.extmarks)
7180

7281
if cursor and #builder.lines >= cursor[1] then
7382
vim.api.nvim_win_set_cursor(view.get_winnr() or 0, cursor)

0 commit comments

Comments
 (0)