local utils = require "nvim-tree.utils" local view = require "nvim-tree.view" local renderer = require "nvim-tree.renderer" local core = require "nvim-tree.core" local M = {} function M.fn() if not core.get_explorer() then return end local input_path = vim.fn.input("Search node: ", "", "file") utils.clear_prompt() local absolute_input_path = utils.path_join { core.get_cwd(), input_path, } local function count_visible_nodes(nodes) local visible_nodes = 0 for _, node in ipairs(nodes) do visible_nodes = visible_nodes + 1 if node.open and node.nodes then visible_nodes = visible_nodes + count_visible_nodes(node.nodes) end end return visible_nodes end local tree_altered = false local found_something = false local function search_node(nodes) local index = 0 for _, node in ipairs(nodes) do index = index + 1 if absolute_input_path == node.absolute_path then found_something = true if node.nodes and not node.open then node.open = true core.get_explorer():expand(node) tree_altered = true end return index end if node.nodes then -- e.g. user searches for "/foo/bar.txt", than directory "/foo/bar" should not match with filename local matches = utils.str_find(absolute_input_path, node.absolute_path .. "/") if matches then found_something = true -- if node is not open -> open it if not node.open then node.open = true core.get_explorer():expand(node) tree_altered = true end return index + search_node(node.nodes) end end if node.open then index = index + count_visible_nodes(node.nodes) end end return index end local index = search_node(core.get_explorer().nodes) if tree_altered then renderer.draw() end if found_something and view.is_visible() then if view.is_root_folder_visible() then index = index + 1 end view.set_cursor { index, 0 } end end return M