nvim-tree.lua/lua/nvim-tree/lib.lua
2022-02-16 21:10:28 +01:00

156 lines
3.9 KiB
Lua

local api = vim.api
local renderer = require'nvim-tree.renderer'
local diagnostics = require'nvim-tree.diagnostics'
local explorer = require'nvim-tree.explorer'
local view = require'nvim-tree.view'
local events = require'nvim-tree.events'
local first_init_done = false
local M = {
target_winid = nil,
}
TreeExplorer = nil
function M.init(with_open, foldername)
TreeExplorer = explorer.Explorer.new(foldername)
TreeExplorer:init(function()
if with_open then
if M.hijack_unnamed_buffer_when_opening then
view.open_in_current_win()
else
view.open()
end
end
renderer.draw()
if not first_init_done then
events._dispatch_ready()
first_init_done = true
end
end)
end
local function get_node_at_line(line)
local index = view.View.hide_root_folder and 1 or 2
local function iter(nodes)
for _, node in ipairs(nodes) do
if index == line then
return node
end
index = index + 1
if node.open == true then
local child = iter(node.nodes)
if child ~= nil then return child end
end
end
end
return iter
end
function M.get_node_at_cursor()
if not TreeExplorer then return end
local winnr = view.get_winnr()
local hide_root_folder = view.View.hide_root_folder
if not winnr then
return
end
local cursor = api.nvim_win_get_cursor(view.get_winnr())
local line = cursor[1]
if view.is_help_ui() then
local help_lines = require'nvim-tree.renderer.help'.compute_lines()
local help_text = get_node_at_line(line+1)(help_lines)
return {name = help_text}
else
if line == 1 and TreeExplorer.cwd ~= "/" and not hide_root_folder then
return { name = ".." }
end
if TreeExplorer.cwd == "/" then
line = line + 1
end
return get_node_at_line(line)(TreeExplorer.nodes)
end
end
-- If node is grouped, return the last node in the group. Otherwise, return the given node.
function M.get_last_group_node(node)
local next = node
while next.group_next do
next = next.group_next
end
return next
end
function M.expand_or_collapse(node)
node.open = not node.open
if node.has_children then node.has_children = false end
if #node.nodes == 0 then
TreeExplorer:expand(node)
else
renderer.draw()
end
diagnostics.update()
end
function M.set_target_win()
local id = api.nvim_get_current_win()
local tree_id = view.get_winnr()
if tree_id and id == tree_id then
M.target_winid = 0
return
end
M.target_winid = id
end
local function handle_buf_cwd(cwd)
local respect_buf_cwd = vim.g.nvim_tree_respect_buf_cwd or 0
if respect_buf_cwd == 1 and cwd ~= TreeExplorer.cwd then
require'nvim-tree.actions.change-dir'.fn(cwd)
end
end
local function open_view_and_draw()
local cwd = vim.fn.getcwd()
view.open()
handle_buf_cwd(cwd)
renderer.draw()
end
function M.open(cwd)
M.set_target_win()
if not TreeExplorer or cwd then
M.init(false, cwd or vim.loop.cwd())
end
local bufnr = api.nvim_get_current_buf()
if api.nvim_buf_get_name(bufnr) == "" and api.nvim_buf_get_option(bufnr, "ft") == "" then
view.open_in_current_win()
renderer.draw()
else
open_view_and_draw()
end
end
-- @deprecated: use nvim-tree.actions.collapse-all.fn
M.collapse_all = require'nvim-tree.actions.collapse-all'.fn
-- @deprecated: use nvim-tree.actions.dir-up.fn
M.dir_up = require'nvim-tree.actions.dir-up'.fn
-- @deprecated: use nvim-tree.actions.change-dir.fn
M.change_dir = require'nvim-tree.actions.change-dir'.fn
-- @deprecated: use nvim-tree.actions.reloaders.reload_explorer
M.refresh_tree = require'nvim-tree.actions.reloaders'.reload_explorer
-- @deprecated: use nvim-tree.actions.reloaders.reload_git
M.reload_git = require'nvim-tree.actions.reloaders'.reload_git
-- @deprecated: use nvim-tree.actions.find-file.fn
M.set_index_and_redraw = require'nvim-tree.actions.find-file'.fn
function M.setup(opts)
M.hijack_unnamed_buffer_when_opening = opts.hijack_unnamed_buffer_when_opening
end
return M