feat: add renderer.highlight_hidden, renderer.icons.show.hidden and renderer.icons.hidden_placement for dotfile icons/highlights (#2840)
* feat(hidden_decorator): Allow hidden (dotfiles) to be highlighted, both icon and name (this not related to git highlights). Better defaults squashed docs(hidden) docs(hidden) docs(hidden) * fix(typo): small typo on hl groups * feat(hidden_dotfile_highlight): make a file that has a dotfile parent be also a dotfile * docs: update docs on hidden highlight --------- Co-authored-by: Alexander Courtis <alex@courtis.org>
This commit is contained in:
@@ -76,6 +76,11 @@ M.HIGHLIGHT_GROUPS = {
|
||||
{ group = "NvimTreeModifiedFileHL", link = "NvimTreeModifiedIcon" },
|
||||
{ group = "NvimTreeModifiedFolderHL", link = "NvimTreeModifiedFileHL" },
|
||||
|
||||
-- Hidden
|
||||
{ group = "NvimTreeHiddenIcon", link = "Conceal" },
|
||||
{ group = "NvimTreeHiddenFileHL", link = "NvimTreeHiddenIcon" },
|
||||
{ group = "NvimTreeHiddenFolderHL", link = "NvimTreeHiddenFileHL" },
|
||||
|
||||
-- Opened
|
||||
{ group = "NvimTreeOpenedHL", link = "Special" },
|
||||
|
||||
|
||||
@@ -128,6 +128,19 @@ function M.is_git_ignored(node)
|
||||
return node and node.git_status ~= nil and node.git_status.file == "!!"
|
||||
end
|
||||
|
||||
---@param node Node
|
||||
---@return boolean
|
||||
function M.is_dotfile(node)
|
||||
if node == nil then
|
||||
return false
|
||||
end
|
||||
if node.is_dot or (node.name and (node.name:sub(1, 1) == ".")) or M.is_dotfile(node.parent) then
|
||||
node.is_dot = true
|
||||
return true
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
---@param node Node
|
||||
function M.node_destroy(node)
|
||||
if not node then
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
---@field fs_stat uv.fs_stat.result|nil
|
||||
---@field git_status GitStatus|nil
|
||||
---@field hidden boolean
|
||||
---@field is_dot boolean
|
||||
---@field name string
|
||||
---@field parent DirNode
|
||||
---@field type string
|
||||
|
||||
@@ -10,6 +10,7 @@ local DecoratorCut = require "nvim-tree.renderer.decorator.cut"
|
||||
local DecoratorDiagnostics = require "nvim-tree.renderer.decorator.diagnostics"
|
||||
local DecoratorGit = require "nvim-tree.renderer.decorator.git"
|
||||
local DecoratorModified = require "nvim-tree.renderer.decorator.modified"
|
||||
local DecoratorHidden = require "nvim-tree.renderer.decorator.hidden"
|
||||
local DecoratorOpened = require "nvim-tree.renderer.decorator.opened"
|
||||
|
||||
local pad = require "nvim-tree.renderer.components.padding"
|
||||
@@ -442,6 +443,7 @@ function Builder.setup(opts)
|
||||
DecoratorDiagnostics:new(opts),
|
||||
DecoratorBookmarks:new(opts),
|
||||
DecoratorModified:new(opts),
|
||||
DecoratorHidden:new(opts),
|
||||
DecoratorOpened:new(opts),
|
||||
DecoratorGit:new(opts),
|
||||
}
|
||||
|
||||
55
lua/nvim-tree/renderer/decorator/hidden.lua
Normal file
55
lua/nvim-tree/renderer/decorator/hidden.lua
Normal file
@@ -0,0 +1,55 @@
|
||||
local HL_POSITION = require("nvim-tree.enum").HL_POSITION
|
||||
local ICON_PLACEMENT = require("nvim-tree.enum").ICON_PLACEMENT
|
||||
local explorer_node = require "nvim-tree.explorer.node"
|
||||
local Decorator = require "nvim-tree.renderer.decorator"
|
||||
|
||||
---@class DecoratorHidden: Decorator
|
||||
---@field icon HighlightedString|nil
|
||||
local DecoratorHidden = Decorator:new()
|
||||
|
||||
---@param opts table
|
||||
---@return DecoratorHidden
|
||||
function DecoratorHidden:new(opts)
|
||||
local o = Decorator.new(self, {
|
||||
enabled = true,
|
||||
hl_pos = HL_POSITION[opts.renderer.highlight_hidden] or HL_POSITION.none,
|
||||
icon_placement = ICON_PLACEMENT[opts.renderer.icons.hidden_placement] or ICON_PLACEMENT.none,
|
||||
})
|
||||
---@cast o DecoratorHidden
|
||||
|
||||
if opts.renderer.icons.show.hidden then
|
||||
o.icon = {
|
||||
str = opts.renderer.icons.glyphs.hidden,
|
||||
hl = { "NvimTreeHiddenIcon" },
|
||||
}
|
||||
o:define_sign(o.icon)
|
||||
end
|
||||
|
||||
return o
|
||||
end
|
||||
|
||||
---Hidden icon: hidden.enable, renderer.icons.show.hidden and node starts with `.` (dotfile).
|
||||
---@param node Node
|
||||
---@return HighlightedString[]|nil icons
|
||||
function DecoratorHidden:calculate_icons(node)
|
||||
if self.enabled and explorer_node.is_dotfile(node) then
|
||||
return { self.icon }
|
||||
end
|
||||
end
|
||||
|
||||
---Hidden highlight: hidden.enable, renderer.highlight_hidden and node starts with `.` (dotfile).
|
||||
---@param node Node
|
||||
---@return string|nil group
|
||||
function DecoratorHidden:calculate_highlight(node)
|
||||
if not self.enabled or self.hl_pos == HL_POSITION.none or (not explorer_node.is_dotfile(node)) then
|
||||
return nil
|
||||
end
|
||||
|
||||
if node.nodes then
|
||||
return "NvimTreeHiddenFolderHL"
|
||||
else
|
||||
return "NvimTreeHiddenFileHL"
|
||||
end
|
||||
end
|
||||
|
||||
return DecoratorHidden
|
||||
Reference in New Issue
Block a user