90 lines
1.9 KiB
Lua
90 lines
1.9 KiB
Lua
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
|
|
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
|