feat(#2799): filesystem_watchers.ignore_dirs and git.disable_for_dirs may be functions (#2800)

feat(#2799): filesystem_watchers.ignore_dirs and git.disable_for_dirs may be functions
This commit is contained in:
Alexander Courtis
2024-06-23 11:44:45 +10:00
committed by GitHub
parent 2086e564c4
commit 8b2c5c678b
4 changed files with 31 additions and 12 deletions

View File

@@ -1170,8 +1170,9 @@ Only relevant when `git.show_on_dirs` is `true`.
*nvim-tree.git.disable_for_dirs* *nvim-tree.git.disable_for_dirs*
Disable git integration when git top-level matches these paths. Disable git integration when git top-level matches these paths.
May be relative, evaluated via |fnamemodify| `":p"` Strings may be relative, evaluated via |fnamemodify| `":p"`
Type: `table`, Default: `{}` Function is passed an absolute path and returns true for disable.
Type: `string[] | fun(path: string): boolean`, Default: `{}`
*nvim-tree.git.timeout* *nvim-tree.git.timeout*
Kills the git process after some time if it takes too long. 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) Type: `number`, Default: `50` (ms)
*nvim-tree.filesystem_watchers.ignore_dirs* *nvim-tree.filesystem_watchers.ignore_dirs*
List of vim regex for absolute directory paths that will not be watched. List of vim regex for absolute directory paths that will not be watched or
Backslashes must be escaped e.g. `"my-project/\\.build$"`. See |string-match|. 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. 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* 5.13 OPTS: ACTIONS *nvim-tree-opts-actions*

View File

@@ -632,9 +632,15 @@ local ACCEPTED_TYPES = {
update_focused_file = { update_focused_file = {
exclude = { "function" }, exclude = { "function" },
}, },
git = {
disable_for_dirs = { "function" },
},
filters = { filters = {
custom = { "function" }, custom = { "function" },
}, },
filesystem_watchers = {
ignore_dirs = { "function" },
},
actions = { actions = {
open_file = { open_file = {
window_picker = { window_picker = {

View File

@@ -40,11 +40,15 @@ local function is_folder_ignored(path)
end end
end end
if type(M.config.filesystem_watchers.ignore_dirs) == "table" then
for _, ignore_dir in ipairs(M.config.filesystem_watchers.ignore_dirs) do for _, ignore_dir in ipairs(M.config.filesystem_watchers.ignore_dirs) do
if vim.fn.match(path, ignore_dir) ~= -1 then if vim.fn.match(path, ignore_dir) ~= -1 then
return true return true
end end
end end
elseif type(M.config.filesystem_watchers.ignore_dirs) == "function" then
return M.config.filesystem_watchers.ignore_dirs(path)
end
return false return false
end end

View File

@@ -170,15 +170,21 @@ function M.get_toplevel(path)
if not toplevel or not git_dir then if not toplevel or not git_dir then
return nil return nil
end end
local toplevel_norm = vim.fn.fnamemodify(toplevel, ":p")
-- ignore disabled paths -- ignore disabled paths
if type(M.config.git.disable_for_dirs) == "table" then
for _, disabled_for_dir in ipairs(M.config.git.disable_for_dirs) do 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") local disabled_norm = vim.fn.fnamemodify(disabled_for_dir, ":p")
if toplevel_norm == disabled_norm then if toplevel_norm == disabled_norm then
return nil return nil
end end
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
M._toplevels_by_path[path] = toplevel M._toplevels_by_path[path] = toplevel
M._git_dirs_by_toplevel[toplevel] = git_dir M._git_dirs_by_toplevel[toplevel] = git_dir