mirror of
https://github.com/SpaceVim/SpaceVim.git
synced 2025-01-24 02:40:05 +08:00
258 lines
7.2 KiB
Lua
258 lines
7.2 KiB
Lua
local vim = vim
|
|
local utils = require("neo-tree.utils")
|
|
local renderer = require("neo-tree.ui.renderer")
|
|
local log = require("neo-tree.log")
|
|
local manager = require("neo-tree.sources.manager")
|
|
local setup = require("neo-tree.setup")
|
|
|
|
-- If you add a new source, you need to add it to the sources table.
|
|
-- Each source should have a defaults module that contains the default values
|
|
-- for the source config, and a setup function that takes that config.
|
|
local sources = {
|
|
"filesystem",
|
|
"buffers",
|
|
"git_status",
|
|
}
|
|
|
|
local M = {}
|
|
|
|
local check_source = function(source_name)
|
|
if not utils.truthy(source_name) then
|
|
source_name = M.config.default_source
|
|
end
|
|
local success, result = pcall(require, "neo-tree.sources." .. source_name)
|
|
if not success then
|
|
error("Source " .. source_name .. " could not be loaded: ", result)
|
|
end
|
|
return source_name
|
|
end
|
|
|
|
local get_position = function(source_name)
|
|
local pos = utils.get_value(M, "config." .. source_name .. ".window.position", "left", false)
|
|
return pos
|
|
end
|
|
|
|
M.ensure_config = function()
|
|
if not M.config then
|
|
M.setup({ log_to_file = false }, true)
|
|
end
|
|
end
|
|
|
|
--DEPRECATED in v2.x
|
|
M.close_all_except = function(source_name)
|
|
-- this entire function is faulty now that position can be overriden at runtime
|
|
source_name = check_source(source_name)
|
|
local target_pos = get_position(source_name)
|
|
for _, name in ipairs(sources) do
|
|
if name ~= source_name then
|
|
local pos = utils.get_value(M, "config." .. name .. ".window.position", "left", false)
|
|
if pos == target_pos then
|
|
manager.close(name)
|
|
end
|
|
end
|
|
end
|
|
renderer.close_all_floating_windows()
|
|
end
|
|
|
|
--DEPRECATED in v2.x
|
|
M.close = manager.close
|
|
|
|
--DEPRECATED in v2.x, use manager.close_all()
|
|
M.close_all = function(at_position)
|
|
renderer.close_all_floating_windows()
|
|
if type(at_position) == "string" and at_position > "" then
|
|
for _, name in ipairs(sources) do
|
|
local pos = get_position(name)
|
|
if pos == at_position then
|
|
manager.close(name)
|
|
end
|
|
end
|
|
else
|
|
for _, name in ipairs(sources) do
|
|
manager.close(name)
|
|
end
|
|
end
|
|
end
|
|
|
|
--DEPRECATED in v2.x, use commands.execute()
|
|
M.float = function(source_name, toggle_if_open)
|
|
M.ensure_config()
|
|
source_name = check_source(source_name)
|
|
if toggle_if_open then
|
|
if renderer.close_floating_window(source_name) then
|
|
-- It was open, and now it's not.
|
|
return
|
|
end
|
|
end
|
|
renderer.close_all_floating_windows()
|
|
manager.close(source_name) -- in case this source is open in a sidebar
|
|
manager.float(source_name)
|
|
end
|
|
|
|
--DEPRECATED in v2.x, use commands.execute()
|
|
M.focus = function(source_name, close_others, toggle_if_open)
|
|
M.ensure_config()
|
|
source_name = check_source(source_name)
|
|
if get_position(source_name) == "current" then
|
|
M.show_in_split(source_name, toggle_if_open)
|
|
return
|
|
end
|
|
|
|
if toggle_if_open then
|
|
if manager.close(source_name) then
|
|
-- It was open, and now it's not.
|
|
return
|
|
end
|
|
end
|
|
if close_others == nil then
|
|
close_others = true
|
|
end
|
|
if close_others then
|
|
M.close_all_except(source_name)
|
|
end
|
|
manager.focus(source_name)
|
|
end
|
|
|
|
--DEPRECATED in v2.x, use commands.execute()
|
|
M.reveal_current_file = function(source_name, toggle_if_open, force_cwd)
|
|
M.ensure_config()
|
|
source_name = check_source(source_name)
|
|
if get_position(source_name) == "current" then
|
|
M.reveal_in_split(source_name, toggle_if_open)
|
|
return
|
|
end
|
|
if toggle_if_open then
|
|
if manager.close(source_name) then
|
|
-- It was open, and now it's not.
|
|
return
|
|
end
|
|
end
|
|
manager.reveal_current_file(source_name, nil, force_cwd)
|
|
end
|
|
|
|
--DEPRECATED in v2.x, use commands.execute()
|
|
M.reveal_in_split = function(source_name, toggle_if_open)
|
|
M.ensure_config()
|
|
source_name = check_source(source_name)
|
|
if toggle_if_open then
|
|
local state = manager.get_state(source_name, nil, vim.api.nvim_get_current_win())
|
|
if renderer.close(state) then
|
|
-- It was open, and now it's not.
|
|
return
|
|
end
|
|
end
|
|
--TODO: if we are currently in a sidebar, don't replace it with a split style
|
|
manager.reveal_in_split(source_name)
|
|
end
|
|
|
|
--DEPRECATED in v2.x, use commands.execute()
|
|
M.show_in_split = function(source_name, toggle_if_open)
|
|
M.ensure_config()
|
|
source_name = check_source(source_name)
|
|
if toggle_if_open then
|
|
local state = manager.get_state(source_name, nil, vim.api.nvim_get_current_win())
|
|
if renderer.close(state) then
|
|
-- It was open, and now it's not.
|
|
return
|
|
end
|
|
end
|
|
--TODO: if we are currently in a sidebar, don't replace it with a split style
|
|
manager.show_in_split(source_name)
|
|
end
|
|
|
|
M.get_prior_window = function(ignore_filetypes)
|
|
ignore_filetypes = ignore_filetypes or {}
|
|
local ignore = utils.list_to_dict(ignore_filetypes)
|
|
ignore["neo-tree"] = true
|
|
|
|
local tabid = vim.api.nvim_get_current_tabpage()
|
|
local wins = utils.get_value(M, "config.prior_windows", {}, true)[tabid]
|
|
if wins == nil then
|
|
return -1
|
|
end
|
|
local win_index = #wins
|
|
while win_index > 0 do
|
|
local last_win = wins[win_index]
|
|
if type(last_win) == "number" then
|
|
local success, is_valid = pcall(vim.api.nvim_win_is_valid, last_win)
|
|
if success and is_valid then
|
|
local buf = vim.api.nvim_win_get_buf(last_win)
|
|
local ft = vim.api.nvim_buf_get_option(buf, "filetype")
|
|
local bt = vim.api.nvim_buf_get_option(buf, "buftype") or "normal"
|
|
if ignore[ft] ~= true and ignore[bt] ~= true then
|
|
return last_win
|
|
end
|
|
end
|
|
end
|
|
win_index = win_index - 1
|
|
end
|
|
return -1
|
|
end
|
|
|
|
M.paste_default_config = function()
|
|
local base_path = debug.getinfo(utils.truthy).source:match("@(.*)/utils.lua$")
|
|
local config_path = base_path .. utils.path_separator .. "defaults.lua"
|
|
local lines = vim.fn.readfile(config_path)
|
|
if lines == nil then
|
|
error("Could not read neo-tree.defaults")
|
|
end
|
|
|
|
-- read up to the end of the config, jut to omit the final return
|
|
local config = {}
|
|
for _, line in ipairs(lines) do
|
|
table.insert(config, line)
|
|
if line == "}" then
|
|
break
|
|
end
|
|
end
|
|
|
|
vim.api.nvim_put(config, "l", true, false)
|
|
vim.schedule(function()
|
|
vim.cmd("normal! `[v`]=")
|
|
end)
|
|
end
|
|
|
|
M.buffer_enter_event = setup.buffer_enter_event
|
|
M.win_enter_event = setup.win_enter_event
|
|
|
|
--DEPRECATED in v2.x
|
|
--BREAKING CHANGE: Removed the do_not_focus and close_others options in 2.0
|
|
--M.show = function(source_name, do_not_focus, close_others, toggle_if_open)
|
|
M.show = function(source_name, toggle_if_open)
|
|
M.ensure_config()
|
|
source_name = check_source(source_name)
|
|
if get_position(source_name) == "current" then
|
|
M.show_in_split(source_name, toggle_if_open)
|
|
return
|
|
end
|
|
|
|
if toggle_if_open then
|
|
if manager.close(source_name) then
|
|
-- It was open, and now it's not.
|
|
return
|
|
end
|
|
end
|
|
|
|
M.close_all_except(source_name)
|
|
manager.show(source_name)
|
|
end
|
|
|
|
M.set_log_level = function(level)
|
|
log.set_level(level)
|
|
end
|
|
|
|
M.setup = function(config, is_auto_config)
|
|
M.config = require("neo-tree.setup").merge_config(config, is_auto_config)
|
|
local netrw = require("neo-tree.setup.netrw")
|
|
if not is_auto_config and netrw.get_hijack_netrw_behavior() ~= "disabled" then
|
|
vim.cmd("silent! autocmd! FileExplorer *")
|
|
netrw.hijack()
|
|
end
|
|
end
|
|
|
|
M.show_logs = function()
|
|
vim.cmd("tabnew " .. log.outfile)
|
|
end
|
|
|
|
return M
|