From 9e42ed619519638242ac954cfe5fd6401dc3c970 Mon Sep 17 00:00:00 2001 From: Alexander Courtis Date: Sat, 9 Sep 2023 14:20:13 +1000 Subject: [PATCH] feat(#2316): add NvimTreeFolderArrowClosed NvimTreeFolderArrowOpen --- doc/nvim-tree-lua.txt | 34 ++++++------- lua/nvim-tree/renderer/builder.lua | 12 +++-- lua/nvim-tree/renderer/components/padding.lua | 48 ++++++++++++------- 3 files changed, 55 insertions(+), 39 deletions(-) diff --git a/doc/nvim-tree-lua.txt b/doc/nvim-tree-lua.txt index ecbbc66cb9d..c6e175876d7 100644 --- a/doc/nvim-tree-lua.txt +++ b/doc/nvim-tree-lua.txt @@ -2142,27 +2142,29 @@ Icon: > NvimTreeOpenedFolderIcon NvimTreeFolderIcon NvimTreeClosedFolderIcon NvimTreeFolderIcon NvimTreeBookmark + NvimTreeFolderArrowClosed NvimTreeIndentMarker + NvimTreeFolderArrowOpen NvimTreeIndentMarker < Indent: > NvimTreeIndentMarker < Standard: > - NvimTreeNormal Normal - NvimTreeNormalFloat NormalFloat - NvimTreeNormalNC NormalFloat - - NvimTreeLineNr LineNr - NvimTreeWinSeparator WinSeparator - NvimTreeEndOfBuffer EndOfBuffer - NvimTreePopup Normal - NvimTreeSignColumn NvimTreeNormal - - NvimTreeCursorColumn CursorColumn - NvimTreeCursorLine CursorLine - NvimTreeCursorLineNr CursorLineNr - - NvimTreeStatusLine StatusLine - NvimTreeStatusLineNC StatusLineNC + NvimTreeNormal Normal + NvimTreeNormalFloat NormalFloat + NvimTreeNormalNC NormalFloat + + NvimTreeLineNr LineNr + NvimTreeWinSeparator WinSeparator + NvimTreeEndOfBuffer EndOfBuffer + NvimTreePopup Normal + NvimTreeSignColumn NvimTreeNormal + + NvimTreeCursorColumn CursorColumn + NvimTreeCursorLine CursorLine + NvimTreeCursorLineNr CursorLineNr + + NvimTreeStatusLine StatusLine + NvimTreeStatusLineNC StatusLineNC < Picker: > NvimTreeWindowPicker diff --git a/lua/nvim-tree/renderer/builder.lua b/lua/nvim-tree/renderer/builder.lua index 43c61ebf02a..ba5b5478dce 100644 --- a/lua/nvim-tree/renderer/builder.lua +++ b/lua/nvim-tree/renderer/builder.lua @@ -290,14 +290,15 @@ function Builder:_get_highlight_override(node, unloaded_bufnr) return icon_hl, name_hl end ----@param padding HighlightedString +---@param indent_markers HighlightedString[] +---@param arrows HighlightedString[]|nil ---@param icon HighlightedString ---@param name HighlightedString ---@param git_icons HighlightedString[]|nil ---@param diagnostics_icon HighlightedString|nil ---@param modified_icon HighlightedString|nil ---@return HighlightedString[] -function Builder:_format_line(padding, icon, name, git_icons, diagnostics_icon, modified_icon) +function Builder:_format_line(indent_markers, arrows, icon, name, git_icons, diagnostics_icon, modified_icon) local added_len = 0 local function add_to_end(t1, t2) for _, v in ipairs(t2) do @@ -315,7 +316,7 @@ function Builder:_format_line(padding, icon, name, git_icons, diagnostics_icon, end end - local line = { padding } + local line = { indent_markers, arrows } add_to_end(line, { icon }) if git_icons and self.git_placement == "before" then add_to_end(line, git_icons) @@ -344,7 +345,8 @@ end function Builder:_build_line(node, idx, num_children, unloaded_bufnr) -- various components - local padding = pad.get_padding(self.depth, idx, num_children, node, self.markers) + local indent_markers = pad.get_indent_markers(self.depth, idx, num_children, node, self.markers) + local arrows = pad.get_arrows(node) local git_icons = self:_get_git_icons(node) local modified_icon = self:_get_modified_icon(node) local diagnostics_icon = self:_get_diagnostics_icon(node) @@ -370,7 +372,7 @@ function Builder:_build_line(node, idx, num_children, unloaded_bufnr) name.hl = name_hl end - local line = self:_format_line(padding, icon, name, git_icons, diagnostics_icon, modified_icon) + local line = self:_format_line(indent_markers, arrows, icon, name, git_icons, diagnostics_icon, modified_icon) self:_insert_line(self:_unwrap_highlighted_strings(line)) self.index = self.index + 1 diff --git a/lua/nvim-tree/renderer/components/padding.lua b/lua/nvim-tree/renderer/components/padding.lua index 3ab7a9880e2..b20091f0c57 100644 --- a/lua/nvim-tree/renderer/components/padding.lua +++ b/lua/nvim-tree/renderer/components/padding.lua @@ -58,24 +58,14 @@ local function get_padding_indent_markers(depth, idx, nodes_number, markers, wit return padding end -local function get_padding_arrows(node, indent) - if node.nodes then - return M.config.icons.glyphs.folder[node.open and "arrow_open" or "arrow_closed"] .. " " - elseif indent then - return " " - else - return "" - end -end - ---@param depth integer ---@param idx integer ---@param nodes_number integer ---@param node table ---@param markers table ----@return HighlightedString -function M.get_padding(depth, idx, nodes_number, node, markers) - local padding = "" +---@return HighlightedString[] +function M.get_indent_markers(depth, idx, nodes_number, node, markers) + local str = "" local show_arrows = M.config.icons.show.folder_arrow local show_markers = M.config.indent_markers.enable @@ -83,16 +73,38 @@ function M.get_padding(depth, idx, nodes_number, node, markers) local indent_width = M.config.indent_width if show_markers then - padding = padding .. get_padding_indent_markers(depth, idx, nodes_number, markers, show_arrows, inline_arrows, node) + str = str .. get_padding_indent_markers(depth, idx, nodes_number, markers, show_arrows, inline_arrows, node) else - padding = padding .. string.rep(" ", depth * indent_width) + str = str .. string.rep(" ", depth * indent_width) + end + + return { str = str, hl = "NvimTreeIndentMarker" } +end + +---@param node table +---@return HighlightedString[]|nil +function M.get_arrows(node) + if not M.config.icons.show.folder_arrow then + return end - if show_arrows then - padding = padding .. get_padding_arrows(node, not show_markers) + local str + local hl = "NvimTreeFolderArrowClosed" + + if node.nodes then + if node.open then + str = M.config.icons.glyphs.folder["arrow_open"] .. " " + hl = "NvimTreeFolderArrowOpen" + else + str = M.config.icons.glyphs.folder["arrow_closed"] .. " " + end + elseif M.config.indent_markers.enable then + str = "" + else + str = " " end - return { str = padding, hl = "NvimTreeIndentMarker" } + return { str = str, hl = hl } end function M.setup(opts)