Skip to content

Commit 8f92e1e

Browse files
authored
feat(#1850): add "no bookmark" filter (#2571)
* feat(#1850): add no bookmark filter * feat(#1850): add no bookmark filter - style
1 parent 141c0f9 commit 8f92e1e

File tree

6 files changed

+47
-7
lines changed

6 files changed

+47
-7
lines changed

Diff for: doc/nvim-tree-lua.txt

+17-4
Original file line numberDiff line numberDiff line change
@@ -170,14 +170,15 @@ Show the mappings: `g?`
170170
`e` Rename: Basename |nvim-tree-api.fs.rename_basename()|
171171
`]e` Next Diagnostic |nvim-tree-api.node.navigate.diagnostics.next()|
172172
`[e` Prev Diagnostic |nvim-tree-api.node.navigate.diagnostics.prev()|
173-
`F` Clean Filter |nvim-tree-api.live_filter.clear()|
174-
`f` Filter |nvim-tree-api.live_filter.start()|
173+
`F` Live Filter: Clear |nvim-tree-api.live_filter.clear()|
174+
`f` Live Filter: Start |nvim-tree-api.live_filter.start()|
175175
`g?` Help |nvim-tree-api.tree.toggle_help()|
176176
`gy` Copy Absolute Path |nvim-tree-api.fs.copy.absolute_path()|
177177
`H` Toggle Filter: Dotfiles |nvim-tree-api.tree.toggle_hidden_filter()|
178178
`I` Toggle Filter: Git Ignore |nvim-tree-api.tree.toggle_gitignore_filter()|
179179
`J` Last Sibling |nvim-tree-api.node.navigate.sibling.last()|
180180
`K` First Sibling |nvim-tree-api.node.navigate.sibling.first()|
181+
`M` Toggle Filter: No Bookmark |nvim-tree-api.tree.toggle_no_bookmark_filter()|
181182
`m` Toggle Bookmark |nvim-tree-api.marks.toggle()|
182183
`o` Open |nvim-tree-api.node.open.edit()|
183184
`O` Open: No Window Picker |nvim-tree-api.node.open.no_window_picker()|
@@ -502,6 +503,7 @@ Following is the default configuration. See |nvim-tree-opts| for details.
502503
dotfiles = false,
503504
git_clean = false,
504505
no_buffer = false,
506+
no_bookmark = false,
505507
custom = {},
506508
exclude = {},
507509
},
@@ -1223,6 +1225,12 @@ For performance reasons this may not immediately update on buffer
12231225
delete/wipe. A reload or filesystem event will result in an update.
12241226
Type: `boolean`, Default: `false`
12251227

1228+
*nvim-tree.filters.no_bookmark*
1229+
Do not show files that are not bookarked.
1230+
Toggle via |nvim-tree-api.tree.toggle_no_bookmark_filter()|, default `M`
1231+
Enabling this is not useful as there is no means yet to persist bookmarks.
1232+
Type: `boolean`, Default: `false`
1233+
12261234
*nvim-tree.filters.custom*
12271235
Custom list of vim regex for file/directory names that will not be shown.
12281236
Backslashes must be escaped e.g. "^\\.git". See |string-match|.
@@ -1666,6 +1674,10 @@ tree.toggle_git_clean_filter()
16661674
tree.toggle_no_buffer_filter()
16671675
Toggle |nvim-tree.filters.no_buffer| filter.
16681676

1677+
*nvim-tree-api.tree.toggle_no_bookmark_filter()*
1678+
tree.toggle_no_bookmark_filter()
1679+
Toggle |nvim-tree.filters.no_bookmark| filter.
1680+
16691681
*nvim-tree-api.tree.toggle_custom_filter()*
16701682
tree.toggle_custom_filter()
16711683
Toggle |nvim-tree.filters.custom| filter.
@@ -2138,14 +2150,15 @@ You are encouraged to copy these to your own |nvim-tree.on_attach| function.
21382150
vim.keymap.set('n', 'e', api.fs.rename_basename, opts('Rename: Basename'))
21392151
vim.keymap.set('n', ']e', api.node.navigate.diagnostics.next, opts('Next Diagnostic'))
21402152
vim.keymap.set('n', '[e', api.node.navigate.diagnostics.prev, opts('Prev Diagnostic'))
2141-
vim.keymap.set('n', 'F', api.live_filter.clear, opts('Clean Filter'))
2142-
vim.keymap.set('n', 'f', api.live_filter.start, opts('Filter'))
2153+
vim.keymap.set('n', 'F', api.live_filter.clear, opts('Live Filter: Clear'))
2154+
vim.keymap.set('n', 'f', api.live_filter.start, opts('Live Filter: Start'))
21432155
vim.keymap.set('n', 'g?', api.tree.toggle_help, opts('Help'))
21442156
vim.keymap.set('n', 'gy', api.fs.copy.absolute_path, opts('Copy Absolute Path'))
21452157
vim.keymap.set('n', 'H', api.tree.toggle_hidden_filter, opts('Toggle Filter: Dotfiles'))
21462158
vim.keymap.set('n', 'I', api.tree.toggle_gitignore_filter, opts('Toggle Filter: Git Ignore'))
21472159
vim.keymap.set('n', 'J', api.node.navigate.sibling.last, opts('Last Sibling'))
21482160
vim.keymap.set('n', 'K', api.node.navigate.sibling.first, opts('First Sibling'))
2161+
vim.keymap.set('n', 'M', api.tree.toggle_no_bookmark_filter, opts('Toggle Filter: No Bookmark'))
21492162
vim.keymap.set('n', 'm', api.marks.toggle, opts('Toggle Bookmark'))
21502163
vim.keymap.set('n', 'o', api.node.open.edit, opts('Open'))
21512164
vim.keymap.set('n', 'O', api.node.open.no_window_picker, opts('Open: No Window Picker'))

Diff for: lua/nvim-tree.lua

+1
Original file line numberDiff line numberDiff line change
@@ -507,6 +507,7 @@ local DEFAULT_OPTS = { -- BEGIN_DEFAULT_OPTS
507507
dotfiles = false,
508508
git_clean = false,
509509
no_buffer = false,
510+
no_bookmark = false,
510511
custom = {},
511512
exclude = {},
512513
},

Diff for: lua/nvim-tree/actions/tree-modifiers/toggles.lua

+5
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,11 @@ function M.no_buffer()
3131
reload()
3232
end
3333

34+
function M.no_bookmark()
35+
filters.config.filter_no_bookmark = not filters.config.filter_no_bookmark
36+
reload()
37+
end
38+
3439
function M.dotfiles()
3540
filters.config.filter_dotfiles = not filters.config.filter_dotfiles
3641
reload()

Diff for: lua/nvim-tree/api.lua

+2
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,8 @@ Api.tree.toggle_custom_filter = wrap(require("nvim-tree.actions.tree-modifiers.t
136136

137137
Api.tree.toggle_hidden_filter = wrap(require("nvim-tree.actions.tree-modifiers.toggles").dotfiles)
138138

139+
Api.tree.toggle_no_bookmark_filter = wrap(require("nvim-tree.actions.tree-modifiers.toggles").no_bookmark)
140+
139141
Api.tree.toggle_help = wrap(require("nvim-tree.help").toggle)
140142

141143
Api.tree.is_tree_buf = wrap(require("nvim-tree.utils").is_nvim_tree_buf)

Diff for: lua/nvim-tree/explorer/filters.lua

+19-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
local utils = require "nvim-tree.utils"
2+
local marks = require "nvim-tree.marks"
23

34
local M = {
45
ignore_list = {},
@@ -69,6 +70,12 @@ local function dotfile(path)
6970
return M.config.filter_dotfiles and utils.path_basename(path):sub(1, 1) == "."
7071
end
7172

73+
---@param path string
74+
---@param bookmarks table<string, boolean> absolute paths bookmarked
75+
local function bookmark(path, bookmarks)
76+
return M.config.filter_no_bookmark and not bookmarks[path]
77+
end
78+
7279
---@param path string
7380
---@return boolean
7481
local function custom(path)
@@ -103,17 +110,23 @@ end
103110
--- git_status: reference
104111
--- unloaded_bufnr: copy
105112
--- bufinfo: empty unless no_buffer set: vim.fn.getbufinfo { buflisted = 1 }
113+
--- bookmarks: absolute paths to boolean
106114
function M.prepare(git_status, unloaded_bufnr)
107115
local status = {
108116
git_status = git_status or {},
109117
unloaded_bufnr = unloaded_bufnr,
110118
bufinfo = {},
119+
bookmarks = {},
111120
}
112121

113122
if M.config.filter_no_buffer then
114123
status.bufinfo = vim.fn.getbufinfo { buflisted = 1 }
115124
end
116125

126+
for _, node in pairs(marks.get_marks()) do
127+
status.bookmarks[node.absolute_path] = true
128+
end
129+
117130
return status
118131
end
119132

@@ -127,7 +140,11 @@ function M.should_filter(path, status)
127140
return false
128141
end
129142

130-
return git(path, status.git_status) or buf(path, status.bufinfo, status.unloaded_bufnr) or dotfile(path) or custom(path)
143+
return git(path, status.git_status)
144+
or buf(path, status.bufinfo, status.unloaded_bufnr)
145+
or dotfile(path)
146+
or custom(path)
147+
or bookmark(path, status.bookmarks)
131148
end
132149

133150
function M.setup(opts)
@@ -137,6 +154,7 @@ function M.setup(opts)
137154
filter_git_ignored = opts.filters.git_ignored,
138155
filter_git_clean = opts.filters.git_clean,
139156
filter_no_buffer = opts.filters.no_buffer,
157+
filter_no_bookmark = opts.filters.no_bookmark,
140158
}
141159

142160
M.ignore_list = {}

Diff for: lua/nvim-tree/keymap.lua

+3-2
Original file line numberDiff line numberDiff line change
@@ -64,14 +64,15 @@ function M.default_on_attach(bufnr)
6464
vim.keymap.set('n', 'e', api.fs.rename_basename, opts('Rename: Basename'))
6565
vim.keymap.set('n', ']e', api.node.navigate.diagnostics.next, opts('Next Diagnostic'))
6666
vim.keymap.set('n', '[e', api.node.navigate.diagnostics.prev, opts('Prev Diagnostic'))
67-
vim.keymap.set('n', 'F', api.live_filter.clear, opts('Clean Filter'))
68-
vim.keymap.set('n', 'f', api.live_filter.start, opts('Filter'))
67+
vim.keymap.set('n', 'F', api.live_filter.clear, opts('Live Filter: Clear'))
68+
vim.keymap.set('n', 'f', api.live_filter.start, opts('Live Filter: Start'))
6969
vim.keymap.set('n', 'g?', api.tree.toggle_help, opts('Help'))
7070
vim.keymap.set('n', 'gy', api.fs.copy.absolute_path, opts('Copy Absolute Path'))
7171
vim.keymap.set('n', 'H', api.tree.toggle_hidden_filter, opts('Toggle Filter: Dotfiles'))
7272
vim.keymap.set('n', 'I', api.tree.toggle_gitignore_filter, opts('Toggle Filter: Git Ignore'))
7373
vim.keymap.set('n', 'J', api.node.navigate.sibling.last, opts('Last Sibling'))
7474
vim.keymap.set('n', 'K', api.node.navigate.sibling.first, opts('First Sibling'))
75+
vim.keymap.set('n', 'M', api.tree.toggle_no_bookmark_filter, opts('Toggle Filter: No Bookmark'))
7576
vim.keymap.set('n', 'm', api.marks.toggle, opts('Toggle Bookmark'))
7677
vim.keymap.set('n', 'o', api.node.open.edit, opts('Open'))
7778
vim.keymap.set('n', 'O', api.node.open.no_window_picker, opts('Open: No Window Picker'))

0 commit comments

Comments
 (0)