diff --git a/doc/nvim-tree-lua.txt b/doc/nvim-tree-lua.txt index ceddd542afd..de832eb8cb3 100644 --- a/doc/nvim-tree-lua.txt +++ b/doc/nvim-tree-lua.txt @@ -170,14 +170,15 @@ Show the mappings: `g?` `e` Rename: Basename |nvim-tree-api.fs.rename_basename()| `]e` Next Diagnostic |nvim-tree-api.node.navigate.diagnostics.next()| `[e` Prev Diagnostic |nvim-tree-api.node.navigate.diagnostics.prev()| -`F` Clean Filter |nvim-tree-api.live_filter.clear()| -`f` Filter |nvim-tree-api.live_filter.start()| +`F` Live Filter: Clear |nvim-tree-api.live_filter.clear()| +`f` Live Filter: Start |nvim-tree-api.live_filter.start()| `g?` Help |nvim-tree-api.tree.toggle_help()| `gy` Copy Absolute Path |nvim-tree-api.fs.copy.absolute_path()| `H` Toggle Filter: Dotfiles |nvim-tree-api.tree.toggle_hidden_filter()| `I` Toggle Filter: Git Ignore |nvim-tree-api.tree.toggle_gitignore_filter()| `J` Last Sibling |nvim-tree-api.node.navigate.sibling.last()| `K` First Sibling |nvim-tree-api.node.navigate.sibling.first()| +`M` Toggle Filter: No Bookmark |nvim-tree-api.tree.toggle_no_bookmark_filter()| `m` Toggle Bookmark |nvim-tree-api.marks.toggle()| `o` Open |nvim-tree-api.node.open.edit()| `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. dotfiles = false, git_clean = false, no_buffer = false, + no_bookmark = false, custom = {}, exclude = {}, }, @@ -1223,6 +1225,12 @@ For performance reasons this may not immediately update on buffer delete/wipe. A reload or filesystem event will result in an update. Type: `boolean`, Default: `false` +*nvim-tree.filters.no_bookmark* +Do not show files that are not bookarked. +Toggle via |nvim-tree-api.tree.toggle_no_bookmark_filter()|, default `M` +Enabling this is not useful as there is no means yet to persist bookmarks. + Type: `boolean`, Default: `false` + *nvim-tree.filters.custom* Custom list of vim regex for file/directory names that will not be shown. Backslashes must be escaped e.g. "^\\.git". See |string-match|. @@ -1666,6 +1674,10 @@ tree.toggle_git_clean_filter() tree.toggle_no_buffer_filter() Toggle |nvim-tree.filters.no_buffer| filter. + *nvim-tree-api.tree.toggle_no_bookmark_filter()* +tree.toggle_no_bookmark_filter() + Toggle |nvim-tree.filters.no_bookmark| filter. + *nvim-tree-api.tree.toggle_custom_filter()* tree.toggle_custom_filter() Toggle |nvim-tree.filters.custom| filter. @@ -2138,14 +2150,15 @@ You are encouraged to copy these to your own |nvim-tree.on_attach| function. vim.keymap.set('n', 'e', api.fs.rename_basename, opts('Rename: Basename')) vim.keymap.set('n', ']e', api.node.navigate.diagnostics.next, opts('Next Diagnostic')) vim.keymap.set('n', '[e', api.node.navigate.diagnostics.prev, opts('Prev Diagnostic')) - vim.keymap.set('n', 'F', api.live_filter.clear, opts('Clean Filter')) - vim.keymap.set('n', 'f', api.live_filter.start, opts('Filter')) + vim.keymap.set('n', 'F', api.live_filter.clear, opts('Live Filter: Clear')) + vim.keymap.set('n', 'f', api.live_filter.start, opts('Live Filter: Start')) vim.keymap.set('n', 'g?', api.tree.toggle_help, opts('Help')) vim.keymap.set('n', 'gy', api.fs.copy.absolute_path, opts('Copy Absolute Path')) vim.keymap.set('n', 'H', api.tree.toggle_hidden_filter, opts('Toggle Filter: Dotfiles')) vim.keymap.set('n', 'I', api.tree.toggle_gitignore_filter, opts('Toggle Filter: Git Ignore')) vim.keymap.set('n', 'J', api.node.navigate.sibling.last, opts('Last Sibling')) vim.keymap.set('n', 'K', api.node.navigate.sibling.first, opts('First Sibling')) + vim.keymap.set('n', 'M', api.tree.toggle_no_bookmark_filter, opts('Toggle Filter: No Bookmark')) vim.keymap.set('n', 'm', api.marks.toggle, opts('Toggle Bookmark')) vim.keymap.set('n', 'o', api.node.open.edit, opts('Open')) vim.keymap.set('n', 'O', api.node.open.no_window_picker, opts('Open: No Window Picker')) diff --git a/lua/nvim-tree.lua b/lua/nvim-tree.lua index 61cdf4131ed..ead71c33b4b 100644 --- a/lua/nvim-tree.lua +++ b/lua/nvim-tree.lua @@ -507,6 +507,7 @@ local DEFAULT_OPTS = { -- BEGIN_DEFAULT_OPTS dotfiles = false, git_clean = false, no_buffer = false, + no_bookmark = false, custom = {}, exclude = {}, }, diff --git a/lua/nvim-tree/actions/tree-modifiers/toggles.lua b/lua/nvim-tree/actions/tree-modifiers/toggles.lua index 56b39d92063..00ffaedb958 100644 --- a/lua/nvim-tree/actions/tree-modifiers/toggles.lua +++ b/lua/nvim-tree/actions/tree-modifiers/toggles.lua @@ -31,6 +31,11 @@ function M.no_buffer() reload() end +function M.no_bookmark() + filters.config.filter_no_bookmark = not filters.config.filter_no_bookmark + reload() +end + function M.dotfiles() filters.config.filter_dotfiles = not filters.config.filter_dotfiles reload() diff --git a/lua/nvim-tree/api.lua b/lua/nvim-tree/api.lua index be7d3854f56..de1e1450b7c 100644 --- a/lua/nvim-tree/api.lua +++ b/lua/nvim-tree/api.lua @@ -136,6 +136,8 @@ Api.tree.toggle_custom_filter = wrap(require("nvim-tree.actions.tree-modifiers.t Api.tree.toggle_hidden_filter = wrap(require("nvim-tree.actions.tree-modifiers.toggles").dotfiles) +Api.tree.toggle_no_bookmark_filter = wrap(require("nvim-tree.actions.tree-modifiers.toggles").no_bookmark) + Api.tree.toggle_help = wrap(require("nvim-tree.help").toggle) Api.tree.is_tree_buf = wrap(require("nvim-tree.utils").is_nvim_tree_buf) diff --git a/lua/nvim-tree/explorer/filters.lua b/lua/nvim-tree/explorer/filters.lua index 7c8d4723d78..18bce0281b5 100644 --- a/lua/nvim-tree/explorer/filters.lua +++ b/lua/nvim-tree/explorer/filters.lua @@ -1,4 +1,5 @@ local utils = require "nvim-tree.utils" +local marks = require "nvim-tree.marks" local M = { ignore_list = {}, @@ -69,6 +70,12 @@ local function dotfile(path) return M.config.filter_dotfiles and utils.path_basename(path):sub(1, 1) == "." end +---@param path string +---@param bookmarks table absolute paths bookmarked +local function bookmark(path, bookmarks) + return M.config.filter_no_bookmark and not bookmarks[path] +end + ---@param path string ---@return boolean local function custom(path) @@ -103,17 +110,23 @@ end --- git_status: reference --- unloaded_bufnr: copy --- bufinfo: empty unless no_buffer set: vim.fn.getbufinfo { buflisted = 1 } +--- bookmarks: absolute paths to boolean function M.prepare(git_status, unloaded_bufnr) local status = { git_status = git_status or {}, unloaded_bufnr = unloaded_bufnr, bufinfo = {}, + bookmarks = {}, } if M.config.filter_no_buffer then status.bufinfo = vim.fn.getbufinfo { buflisted = 1 } end + for _, node in pairs(marks.get_marks()) do + status.bookmarks[node.absolute_path] = true + end + return status end @@ -127,7 +140,11 @@ function M.should_filter(path, status) return false end - return git(path, status.git_status) or buf(path, status.bufinfo, status.unloaded_bufnr) or dotfile(path) or custom(path) + return git(path, status.git_status) + or buf(path, status.bufinfo, status.unloaded_bufnr) + or dotfile(path) + or custom(path) + or bookmark(path, status.bookmarks) end function M.setup(opts) @@ -137,6 +154,7 @@ function M.setup(opts) filter_git_ignored = opts.filters.git_ignored, filter_git_clean = opts.filters.git_clean, filter_no_buffer = opts.filters.no_buffer, + filter_no_bookmark = opts.filters.no_bookmark, } M.ignore_list = {} diff --git a/lua/nvim-tree/keymap.lua b/lua/nvim-tree/keymap.lua index 991b9b338f9..700a479461e 100644 --- a/lua/nvim-tree/keymap.lua +++ b/lua/nvim-tree/keymap.lua @@ -64,14 +64,15 @@ function M.default_on_attach(bufnr) vim.keymap.set('n', 'e', api.fs.rename_basename, opts('Rename: Basename')) vim.keymap.set('n', ']e', api.node.navigate.diagnostics.next, opts('Next Diagnostic')) vim.keymap.set('n', '[e', api.node.navigate.diagnostics.prev, opts('Prev Diagnostic')) - vim.keymap.set('n', 'F', api.live_filter.clear, opts('Clean Filter')) - vim.keymap.set('n', 'f', api.live_filter.start, opts('Filter')) + vim.keymap.set('n', 'F', api.live_filter.clear, opts('Live Filter: Clear')) + vim.keymap.set('n', 'f', api.live_filter.start, opts('Live Filter: Start')) vim.keymap.set('n', 'g?', api.tree.toggle_help, opts('Help')) vim.keymap.set('n', 'gy', api.fs.copy.absolute_path, opts('Copy Absolute Path')) vim.keymap.set('n', 'H', api.tree.toggle_hidden_filter, opts('Toggle Filter: Dotfiles')) vim.keymap.set('n', 'I', api.tree.toggle_gitignore_filter, opts('Toggle Filter: Git Ignore')) vim.keymap.set('n', 'J', api.node.navigate.sibling.last, opts('Last Sibling')) vim.keymap.set('n', 'K', api.node.navigate.sibling.first, opts('First Sibling')) + vim.keymap.set('n', 'M', api.tree.toggle_no_bookmark_filter, opts('Toggle Filter: No Bookmark')) vim.keymap.set('n', 'm', api.marks.toggle, opts('Toggle Bookmark')) vim.keymap.set('n', 'o', api.node.open.edit, opts('Open')) vim.keymap.set('n', 'O', api.node.open.no_window_picker, opts('Open: No Window Picker'))