diff --git a/doc/nvim-tree-lua.txt b/doc/nvim-tree-lua.txt index 8e588a14ab2..99316b54e0b 100644 --- a/doc/nvim-tree-lua.txt +++ b/doc/nvim-tree-lua.txt @@ -1170,8 +1170,9 @@ Only relevant when `git.show_on_dirs` is `true`. *nvim-tree.git.disable_for_dirs* Disable git integration when git top-level matches these paths. -May be relative, evaluated via |fnamemodify| `":p"` - Type: `table`, Default: `{}` +Strings may be relative, evaluated via |fnamemodify| `":p"` +Function is passed an absolute path and returns true for disable. + Type: `string[] | fun(path: string): boolean`, Default: `{}` *nvim-tree.git.timeout* Kills the git process after some time if it takes too long. @@ -1333,10 +1334,12 @@ Idle milliseconds between filesystem change and action. Type: `number`, Default: `50` (ms) *nvim-tree.filesystem_watchers.ignore_dirs* -List of vim regex for absolute directory paths that will not be watched. -Backslashes must be escaped e.g. `"my-project/\\.build$"`. See |string-match|. +List of vim regex for absolute directory paths that will not be watched or +function returning whether a path should be ignored. +Strings must be backslash escaped e.g. `"my-proj/\\.build$"`. See |string-match|. +Function is passed an absolute path. Useful when path is not in `.gitignore` or git integration is disabled. - Type: {string}, Default: `{}` + Type: `string[] | fun(path: string): boolean`, Default: `{}` ============================================================================== 5.13 OPTS: ACTIONS *nvim-tree-opts-actions* diff --git a/lua/nvim-tree.lua b/lua/nvim-tree.lua index 395dc3a96c2..1b295da982c 100644 --- a/lua/nvim-tree.lua +++ b/lua/nvim-tree.lua @@ -632,9 +632,15 @@ local ACCEPTED_TYPES = { update_focused_file = { exclude = { "function" }, }, + git = { + disable_for_dirs = { "function" }, + }, filters = { custom = { "function" }, }, + filesystem_watchers = { + ignore_dirs = { "function" }, + }, actions = { open_file = { window_picker = { diff --git a/lua/nvim-tree/explorer/watch.lua b/lua/nvim-tree/explorer/watch.lua index 79e3623ce9b..4995d31ebe9 100644 --- a/lua/nvim-tree/explorer/watch.lua +++ b/lua/nvim-tree/explorer/watch.lua @@ -40,10 +40,14 @@ local function is_folder_ignored(path) end end - for _, ignore_dir in ipairs(M.config.filesystem_watchers.ignore_dirs) do - if vim.fn.match(path, ignore_dir) ~= -1 then - return true + if type(M.config.filesystem_watchers.ignore_dirs) == "table" then + for _, ignore_dir in ipairs(M.config.filesystem_watchers.ignore_dirs) do + if vim.fn.match(path, ignore_dir) ~= -1 then + return true + end end + elseif type(M.config.filesystem_watchers.ignore_dirs) == "function" then + return M.config.filesystem_watchers.ignore_dirs(path) end return false diff --git a/lua/nvim-tree/git/init.lua b/lua/nvim-tree/git/init.lua index a301d8bd974..6c1dbc1b3a5 100644 --- a/lua/nvim-tree/git/init.lua +++ b/lua/nvim-tree/git/init.lua @@ -170,12 +170,18 @@ function M.get_toplevel(path) if not toplevel or not git_dir then return nil end + local toplevel_norm = vim.fn.fnamemodify(toplevel, ":p") -- ignore disabled paths - for _, disabled_for_dir in ipairs(M.config.git.disable_for_dirs) do - local toplevel_norm = vim.fn.fnamemodify(toplevel, ":p") - local disabled_norm = vim.fn.fnamemodify(disabled_for_dir, ":p") - if toplevel_norm == disabled_norm then + if type(M.config.git.disable_for_dirs) == "table" then + for _, disabled_for_dir in ipairs(M.config.git.disable_for_dirs) do + local disabled_norm = vim.fn.fnamemodify(disabled_for_dir, ":p") + if toplevel_norm == disabled_norm then + return nil + end + end + elseif type(M.config.git.disable_for_dirs) == "function" then + if M.config.git.disable_for_dirs(toplevel_norm) then return nil end end