From b08003f54640f2015e54dfcd39685862908bfc6a Mon Sep 17 00:00:00 2001 From: lixvbnet Date: Sat, 18 Jun 2022 13:32:56 +0800 Subject: [PATCH] feat: add NvimTreeFindFile!, root_dirs and prefer_startup_root --- doc/nvim-tree-lua.txt | 21 ++++++++++++ lua/nvim-tree.lua | 75 +++++++++++++++++++++++++++++++------------ 2 files changed, 76 insertions(+), 20 deletions(-) diff --git a/doc/nvim-tree-lua.txt b/doc/nvim-tree-lua.txt index d8e15598..821bce33 100644 --- a/doc/nvim-tree-lua.txt +++ b/doc/nvim-tree-lua.txt @@ -165,6 +165,8 @@ Setup may only be run once; subsequent calls will result in a warning. open_on_setup_file = false, open_on_tab = false, sort_by = "name", + root_dirs = {}, + prefer_startup_root = false, update_cwd = false, reload_on_bufenter = false, respect_buf_cwd = false, @@ -246,6 +248,7 @@ Setup may only be run once; subsequent calls will result in a warning. update_focused_file = { enable = false, update_cwd = false, + update_root = false, ignore_list = {}, }, ignore_ft_on_setup = {}, @@ -385,6 +388,16 @@ Opens in place of the unnamed buffer if it's empty. Keeps the cursor on the first letter of the filename when moving in the tree. Type: `boolean`, Default: `false` +*nvim-tree.root_dirs* +Preferred root directories. +Only relevant when `update_focused_file.update_root` is `true` + Type: `{string}`, Default: `{}` + +*nvim-tree.prefer_startup_root* +Prefer startup root directory when updating root directory of the tree. +Only relevant when `update_focused_file.update_root` is `true` + Type: `boolean`, Default: `false` + *nvim-tree.update_cwd* Changes the tree root directory on `DirChanged` and refreshes the tree. Type: `boolean`, Default: `false` @@ -419,11 +432,19 @@ until it finds the file. Type: `boolean`, Default: `false` *nvim-tree.update_focused_file.update_cwd* + (deprecated, use `update_focused_file.update_root`) Update the root directory of the tree to the one of the folder containing the file if the file is not under the current root directory. Only relevant when `update_focused_file.enable` is `true` Type: `boolean`, Default: `false` + *nvim-tree.update_focused_file.update_root* + Update the root directory of the tree if the file is not under current + root directory. It prefers vim's cwd and `root_dirs`. + Otherwise it falls back to the folder containing the file. + Only relevant when `update_focused_file.enable` is `true` + Type: `boolean`, Default: `false` + *nvim-tree.update_focused_file.ignore_list* List of buffer names and filetypes that will not update the root dir of the tree if the file isn't found under the current root directory. diff --git a/lua/nvim-tree.lua b/lua/nvim-tree.lua index faeeb387..dd7544a2 100644 --- a/lua/nvim-tree.lua +++ b/lua/nvim-tree.lua @@ -18,6 +18,7 @@ local _config = {} local M = { setup_called = false, + init_root = "", } function M.focus() @@ -25,6 +26,47 @@ function M.focus() view.focus() end +function M.change_root(filepath, bufnr) + -- skip if current file is in ignore_list + local ft = api.nvim_buf_get_option(bufnr, "filetype") or "" + for _, value in pairs(_config.update_focused_file.ignore_list) do + if utils.str_find(filepath, value) or utils.str_find(ft, value) then + return + end + end + + local cwd = core.get_cwd() + local vim_cwd = vim.fn.getcwd() + + -- test if in vim_cwd + if utils.path_relative(filepath, vim_cwd) ~= filepath then + if vim_cwd ~= cwd then + lib.open(vim_cwd) + end + return + end + -- test if in cwd + if utils.path_relative(filepath, cwd) ~= filepath then + return + end + + -- otherwise test M.init_root + if _config.prefer_startup_root and utils.path_relative(filepath, M.init_root) ~= filepath then + lib.open(M.init_root) + return + end + -- otherwise root_dirs + for _, dir in pairs(_config.root_dirs) do + dir = vim.fn.fnamemodify(dir, ":p") + if utils.path_relative(filepath, dir) ~= filepath then + lib.open(dir) + return + end + end + -- finally fall back to the folder containing the file + lib.open(vim.fn.fnamemodify(filepath, ":p:h")) +end + ---@deprecated M.on_keypress = require("nvim-tree.actions").on_keypress @@ -96,20 +138,7 @@ local function is_file_readable(fname) return stat and stat.type == "file" and luv.fs_access(fname, "R") end -local function update_base_dir_with_filepath(filepath, bufnr) - local ft = api.nvim_buf_get_option(bufnr, "filetype") or "" - for _, value in pairs(_config.update_focused_file.ignore_list) do - if utils.str_find(filepath, value) or utils.str_find(ft, value) then - return - end - end - - if not vim.startswith(filepath, core.get_cwd()) then - change_dir.fn(vim.fn.fnamemodify(filepath, ":p:h")) - end -end - -function M.find_file(with_open, bufnr) +function M.find_file(with_open, bufnr, bang) if not with_open and not core.get_explorer() then return end @@ -125,10 +154,10 @@ function M.find_file(with_open, bufnr) M.open() end + -- if we don't schedule, it will search for NvimTree vim.schedule(function() - -- if we don't schedule, it will search for NvimTree - if _config.update_focused_file.update_cwd then - update_base_dir_with_filepath(filepath, bufnr) + if bang or _config.update_focused_file.update_cwd or _config.update_focused_file.update_root then + M.change_root(filepath, bufnr) end require("nvim-tree.actions.find-file").fn(filepath) end) @@ -267,9 +296,9 @@ local function setup_vim_commands() api.nvim_create_user_command("NvimTreeFocus", M.focus, {}) api.nvim_create_user_command("NvimTreeRefresh", reloaders.reload_explorer, {}) api.nvim_create_user_command("NvimTreeClipboard", copy_paste.print_clipboard, {}) - api.nvim_create_user_command("NvimTreeFindFile", function() - M.find_file(true) - end, {}) + api.nvim_create_user_command("NvimTreeFindFile", function(res) + M.find_file(true, nil, res.bang) + end, { bang = true }) api.nvim_create_user_command("NvimTreeFindFileToggle", function(res) M.toggle(true, false, res.args) end, { nargs = "?", complete = "dir" }) @@ -373,6 +402,8 @@ local DEFAULT_OPTS = { -- BEGIN_DEFAULT_OPTS open_on_setup_file = false, open_on_tab = false, sort_by = "name", + root_dirs = {}, + prefer_startup_root = false, update_cwd = false, reload_on_bufenter = false, respect_buf_cwd = false, @@ -454,6 +485,7 @@ local DEFAULT_OPTS = { -- BEGIN_DEFAULT_OPTS update_focused_file = { enable = false, update_cwd = false, + update_root = false, ignore_list = {}, }, ignore_ft_on_setup = {}, @@ -594,6 +626,7 @@ function M.setup(conf) return end M.setup_called = true + M.init_root = vim.fn.getcwd() legacy.migrate_legacy_options(conf or {}) @@ -602,6 +635,8 @@ function M.setup(conf) local opts = merge_options(conf) local netrw_disabled = opts.disable_netrw or opts.hijack_netrw + _config.root_dirs = opts.root_dirs + _config.prefer_startup_root = opts.prefer_startup_root _config.update_focused_file = opts.update_focused_file _config.open_on_setup = opts.open_on_setup _config.open_on_setup_file = opts.open_on_setup_file