Skip to content

Commit 48a9290

Browse files
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 <[email protected]>
1 parent b264068 commit 48a9290

File tree

8 files changed

+121
-2
lines changed

8 files changed

+121
-2
lines changed

.gitignore

+2
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,4 @@
11
/luals-out/
22
/luals/
3+
# backup vim files
4+
*~

doc/nvim-tree-lua.txt

+37-2
Original file line numberDiff line numberDiff line change
@@ -428,6 +428,7 @@ Following is the default configuration. See |nvim-tree-opts| for details.
428428
highlight_diagnostics = "none",
429429
highlight_opened_files = "none",
430430
highlight_modified = "none",
431+
highlight_hidden = "none",
431432
highlight_bookmarks = "none",
432433
highlight_clipboard = "name",
433434
indent_markers = {
@@ -454,6 +455,7 @@ Following is the default configuration. See |nvim-tree-opts| for details.
454455
},
455456
git_placement = "before",
456457
modified_placement = "after",
458+
hidden_placement = "after",
457459
diagnostics_placement = "signcolumn",
458460
bookmarks_placement = "signcolumn",
459461
padding = " ",
@@ -464,6 +466,7 @@ Following is the default configuration. See |nvim-tree-opts| for details.
464466
folder_arrow = true,
465467
git = true,
466468
modified = true,
469+
hidden = false,
467470
diagnostics = true,
468471
bookmarks = true,
469472
},
@@ -472,6 +475,7 @@ Following is the default configuration. See |nvim-tree-opts| for details.
472475
symlink = "",
473476
bookmark = "󰆤",
474477
modified = "●",
478+
hidden = "󰜌",
475479
folder = {
476480
arrow_closed = "",
477481
arrow_open = "",
@@ -904,6 +908,13 @@ Requires |nvim-tree.modified.enable|
904908
Value can be `"none"`, `"icon"`, `"name"` or `"all"`
905909
Type: `string`, Default `"none"`
906910

911+
*nvim-tree.renderer.highlight_hidden*
912+
Highlight icons and/or names for hidden files (dotfiles) using the
913+
`NvimTreeHiddenFileHL` highlight group.
914+
Requires |nvim-tree.hidden.enable|
915+
Value can be `"none"`, `"icon"`, `"name"` or `"all"`
916+
Type: `string`, Default `"none"`
917+
907918
*nvim-tree.renderer.highlight_bookmarks*
908919
Highlight bookmarked using the `NvimTreeBookmarkHL` group.
909920
Value can be `"none"`, `"icon"`, `"name"` or `"all"`
@@ -942,7 +953,7 @@ Configuration options for tree indent markers.
942953
Configuration options for icons.
943954

944955
Icon order and sign column precedence:
945-
git < modified < bookmarked < diagnostics
956+
git < hidden < modified < bookmarked < diagnostics
946957

947958
*nvim-tree.renderer.icons.web_devicons*
948959
Configure optional plugin `"nvim-tree/nvim-web-devicons"`
@@ -989,6 +1000,12 @@ Icon order and sign column precedence:
9891000
or `"signcolumn"` (requires |nvim-tree.view.signcolumn| enabled).
9901001
Type: `string`, Default: `"after"`
9911002

1003+
*nvim-tree.renderer.icons.hidden_placement*
1004+
Place where the hidden (dotfile) icon will be rendered.
1005+
Can be `"after"` or `"before"` filename (after the file/folders icons)
1006+
or `"signcolumn"` (requires |nvim-tree.view.signcolumn| enabled).
1007+
Type: `string`, Default: `"after"`
1008+
9921009
*nvim-tree.renderer.icons.bookmarks_placement*
9931010
Place where the bookmarks icon will be rendered.
9941011
Can be `"after"` or `"before"` filename (after the file/folders icons)
@@ -1005,7 +1022,7 @@ Icon order and sign column precedence:
10051022

10061023
*nvim-tree.renderer.icons.show*
10071024
Configuration options for showing icon types.
1008-
Left to right order: file/folder, git, modified, diagnostics, bookmarked.
1025+
Left to right order: file/folder, git, modified, hidden, diagnostics, bookmarked.
10091026

10101027
*nvim-tree.renderer.icons.show.file*
10111028
Show an icon before the file name.
@@ -1030,6 +1047,11 @@ Icon order and sign column precedence:
10301047
Requires |modified.enable| `= true`
10311048
Type: `boolean`, Default: `true`
10321049

1050+
*nvim-tree.renderer.icons.show.hidden*
1051+
Show a hidden icon, see |renderer.icons.hidden_placement|
1052+
Requires |hidden.enable| `= true`
1053+
Type: `boolean`, Default: `true`
1054+
10331055
*nvim-tree.renderer.icons.show.diagnostics*
10341056
Show a diagnostics status icon, see |renderer.icons.diagnostics_placement|
10351057
Requires |diagnostics.enable| `= true`
@@ -1057,6 +1079,10 @@ Icon order and sign column precedence:
10571079
Icon to display for modified files.
10581080
Type: `string`, Default: `""`
10591081

1082+
*nvim-tree.renderer.icons.glyphs.hidden*
1083+
Icon to display for hidden files.
1084+
Type: `string`, Default: `"󰜌""`
1085+
10601086
*nvim-tree.renderer.icons.glyphs.folder*
10611087
Glyphs for directories.
10621088
Overridden by |nvim-tree.renderer.icons.web_devicons| if available.
@@ -2433,6 +2459,11 @@ Modified: >
24332459
NvimTreeModifiedIcon Type
24342460
NvimTreeModifiedFileHL NvimTreeModifiedIcon
24352461
NvimTreeModifiedFolderHL NvimTreeModifiedIcon
2462+
2463+
Hidden: >
2464+
NvimTreeModifiedIcon Conceal
2465+
NvimTreeModifiedFileHL NvimTreeHiddenIcon
2466+
NvimTreeModifiedFolderHL NvimTreeHiddenFileHL
24362467
<
24372468
Opened: >
24382469
NvimTreeOpenedHL Special
@@ -2853,6 +2884,7 @@ highlight group is not, hard linking as follows: >
28532884
|nvim-tree.renderer.highlight_clipboard|
28542885
|nvim-tree.renderer.highlight_diagnostics|
28552886
|nvim-tree.renderer.highlight_git|
2887+
|nvim-tree.renderer.highlight_hidden|
28562888
|nvim-tree.renderer.highlight_modified|
28572889
|nvim-tree.renderer.highlight_opened_files|
28582890
|nvim-tree.renderer.icons|
@@ -2863,8 +2895,10 @@ highlight group is not, hard linking as follows: >
28632895
|nvim-tree.renderer.icons.glyphs.default|
28642896
|nvim-tree.renderer.icons.glyphs.folder|
28652897
|nvim-tree.renderer.icons.glyphs.git|
2898+
|nvim-tree.renderer.icons.glyphs.hidden|
28662899
|nvim-tree.renderer.icons.glyphs.modified|
28672900
|nvim-tree.renderer.icons.glyphs.symlink|
2901+
|nvim-tree.renderer.icons.hidden_placement|
28682902
|nvim-tree.renderer.icons.modified_placement|
28692903
|nvim-tree.renderer.icons.padding|
28702904
|nvim-tree.renderer.icons.show|
@@ -2874,6 +2908,7 @@ highlight group is not, hard linking as follows: >
28742908
|nvim-tree.renderer.icons.show.folder|
28752909
|nvim-tree.renderer.icons.show.folder_arrow|
28762910
|nvim-tree.renderer.icons.show.git|
2911+
|nvim-tree.renderer.icons.show.hidden|
28772912
|nvim-tree.renderer.icons.show.modified|
28782913
|nvim-tree.renderer.icons.symlink_arrow|
28792914
|nvim-tree.renderer.icons.web_devicons|

lua/nvim-tree.lua

+6
Original file line numberDiff line numberDiff line change
@@ -392,6 +392,7 @@ local DEFAULT_OPTS = { -- BEGIN_DEFAULT_OPTS
392392
highlight_diagnostics = "none",
393393
highlight_opened_files = "none",
394394
highlight_modified = "none",
395+
highlight_hidden = "none",
395396
highlight_bookmarks = "none",
396397
highlight_clipboard = "name",
397398
indent_markers = {
@@ -418,6 +419,7 @@ local DEFAULT_OPTS = { -- BEGIN_DEFAULT_OPTS
418419
},
419420
git_placement = "before",
420421
modified_placement = "after",
422+
hidden_placement = "after",
421423
diagnostics_placement = "signcolumn",
422424
bookmarks_placement = "signcolumn",
423425
padding = " ",
@@ -428,6 +430,7 @@ local DEFAULT_OPTS = { -- BEGIN_DEFAULT_OPTS
428430
folder_arrow = true,
429431
git = true,
430432
modified = true,
433+
hidden = false,
431434
diagnostics = true,
432435
bookmarks = true,
433436
},
@@ -436,6 +439,7 @@ local DEFAULT_OPTS = { -- BEGIN_DEFAULT_OPTS
436439
symlink = "",
437440
bookmark = "󰆤",
438441
modified = "",
442+
hidden = "󰜌",
439443
folder = {
440444
arrow_closed = "",
441445
arrow_open = "",
@@ -668,12 +672,14 @@ local ACCEPTED_STRINGS = {
668672
highlight_git = { "none", "icon", "name", "all" },
669673
highlight_opened_files = { "none", "icon", "name", "all" },
670674
highlight_modified = { "none", "icon", "name", "all" },
675+
highlight_hidden = { "none", "icon", "name", "all" },
671676
highlight_bookmarks = { "none", "icon", "name", "all" },
672677
highlight_diagnostics = { "none", "icon", "name", "all" },
673678
highlight_clipboard = { "none", "icon", "name", "all" },
674679
icons = {
675680
git_placement = { "before", "after", "signcolumn" },
676681
modified_placement = { "before", "after", "signcolumn" },
682+
hidden_placement = { "before", "after", "signcolumn" },
677683
diagnostics_placement = { "before", "after", "signcolumn" },
678684
bookmarks_placement = { "before", "after", "signcolumn" },
679685
},

lua/nvim-tree/appearance/init.lua

+5
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,11 @@ M.HIGHLIGHT_GROUPS = {
7676
{ group = "NvimTreeModifiedFileHL", link = "NvimTreeModifiedIcon" },
7777
{ group = "NvimTreeModifiedFolderHL", link = "NvimTreeModifiedFileHL" },
7878

79+
-- Hidden
80+
{ group = "NvimTreeHiddenIcon", link = "Conceal" },
81+
{ group = "NvimTreeHiddenFileHL", link = "NvimTreeHiddenIcon" },
82+
{ group = "NvimTreeHiddenFolderHL", link = "NvimTreeHiddenFileHL" },
83+
7984
-- Opened
8085
{ group = "NvimTreeOpenedHL", link = "Special" },
8186

lua/nvim-tree/explorer/node.lua

+13
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,19 @@ function M.is_git_ignored(node)
128128
return node and node.git_status ~= nil and node.git_status.file == "!!"
129129
end
130130

131+
---@param node Node
132+
---@return boolean
133+
function M.is_dotfile(node)
134+
if node == nil then
135+
return false
136+
end
137+
if node.is_dot or (node.name and (node.name:sub(1, 1) == ".")) or M.is_dotfile(node.parent) then
138+
node.is_dot = true
139+
return true
140+
end
141+
return false
142+
end
143+
131144
---@param node Node
132145
function M.node_destroy(node)
133146
if not node then

lua/nvim-tree/node.lua

+1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
---@field fs_stat uv.fs_stat.result|nil
1010
---@field git_status GitStatus|nil
1111
---@field hidden boolean
12+
---@field is_dot boolean
1213
---@field name string
1314
---@field parent DirNode
1415
---@field type string

lua/nvim-tree/renderer/builder.lua

+2
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ local DecoratorCut = require "nvim-tree.renderer.decorator.cut"
1010
local DecoratorDiagnostics = require "nvim-tree.renderer.decorator.diagnostics"
1111
local DecoratorGit = require "nvim-tree.renderer.decorator.git"
1212
local DecoratorModified = require "nvim-tree.renderer.decorator.modified"
13+
local DecoratorHidden = require "nvim-tree.renderer.decorator.hidden"
1314
local DecoratorOpened = require "nvim-tree.renderer.decorator.opened"
1415

1516
local pad = require "nvim-tree.renderer.components.padding"
@@ -442,6 +443,7 @@ function Builder.setup(opts)
442443
DecoratorDiagnostics:new(opts),
443444
DecoratorBookmarks:new(opts),
444445
DecoratorModified:new(opts),
446+
DecoratorHidden:new(opts),
445447
DecoratorOpened:new(opts),
446448
DecoratorGit:new(opts),
447449
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
local HL_POSITION = require("nvim-tree.enum").HL_POSITION
2+
local ICON_PLACEMENT = require("nvim-tree.enum").ICON_PLACEMENT
3+
local explorer_node = require "nvim-tree.explorer.node"
4+
local Decorator = require "nvim-tree.renderer.decorator"
5+
6+
---@class DecoratorHidden: Decorator
7+
---@field icon HighlightedString|nil
8+
local DecoratorHidden = Decorator:new()
9+
10+
---@param opts table
11+
---@return DecoratorHidden
12+
function DecoratorHidden:new(opts)
13+
local o = Decorator.new(self, {
14+
enabled = true,
15+
hl_pos = HL_POSITION[opts.renderer.highlight_hidden] or HL_POSITION.none,
16+
icon_placement = ICON_PLACEMENT[opts.renderer.icons.hidden_placement] or ICON_PLACEMENT.none,
17+
})
18+
---@cast o DecoratorHidden
19+
20+
if opts.renderer.icons.show.hidden then
21+
o.icon = {
22+
str = opts.renderer.icons.glyphs.hidden,
23+
hl = { "NvimTreeHiddenIcon" },
24+
}
25+
o:define_sign(o.icon)
26+
end
27+
28+
return o
29+
end
30+
31+
---Hidden icon: hidden.enable, renderer.icons.show.hidden and node starts with `.` (dotfile).
32+
---@param node Node
33+
---@return HighlightedString[]|nil icons
34+
function DecoratorHidden:calculate_icons(node)
35+
if self.enabled and explorer_node.is_dotfile(node) then
36+
return { self.icon }
37+
end
38+
end
39+
40+
---Hidden highlight: hidden.enable, renderer.highlight_hidden and node starts with `.` (dotfile).
41+
---@param node Node
42+
---@return string|nil group
43+
function DecoratorHidden:calculate_highlight(node)
44+
if not self.enabled or self.hl_pos == HL_POSITION.none or (not explorer_node.is_dotfile(node)) then
45+
return nil
46+
end
47+
48+
if node.nodes then
49+
return "NvimTreeHiddenFolderHL"
50+
else
51+
return "NvimTreeHiddenFileHL"
52+
end
53+
end
54+
55+
return DecoratorHidden

0 commit comments

Comments
 (0)