snacks.nvim/lua/snacks/explorer/init.lua

99 lines
2.9 KiB
Lua

---@class snacks.explorer
---@overload fun(opts?: snacks.picker.explorer.Config): snacks.Picker
local M = setmetatable({}, {
__call = function(M, ...)
return M.open(...)
end,
})
M.meta = {
desc = "A file explorer (picker in disguise)",
needs_setup = true,
}
--- These are just the general explorer settings.
--- To configure the explorer picker, see `snacks.picker.explorer.Config`
---@class snacks.explorer.Config
local defaults = {
replace_netrw = true, -- Replace netrw with the snacks explorer
}
---@private
---@param event? vim.api.keyset.create_autocmd.callback_args
function M.setup(event)
local opts = Snacks.config.get("explorer", defaults)
if opts.replace_netrw then
-- Disable netrw
pcall(vim.api.nvim_del_augroup_by_name, "FileExplorer")
local group = vim.api.nvim_create_augroup("snacks.explorer", { clear = true })
local function handle(ev)
if ev.file ~= "" and vim.fn.isdirectory(ev.file) == 1 then
local picker = M.open({ cwd = ev.file })
if picker and vim.v.vim_did_enter == 0 then
-- clear bufname so we don't try loading this one again
vim.api.nvim_buf_set_name(ev.buf, "")
picker:show()
local ref = picker:ref()
-- focus on UIEnter, since focusing before doesn't work
vim.api.nvim_create_autocmd("UIEnter", {
once = true,
group = group,
callback = function()
local p = ref()
if p then
p:focus()
end
end,
})
else
-- after vim has entered, we also need to delete the directory buffer
-- use bufdelete to keep the window layout
Snacks.bufdelete.delete(ev.buf)
end
end
end
-- event from snacks loader
if event then
handle(event)
end
-- Open the explorer when opening a directory
vim.api.nvim_create_autocmd("BufEnter", {
group = group,
callback = handle,
})
end
end
--- Shortcut to open the explorer picker
---@param opts? snacks.picker.explorer.Config|{}
function M.open(opts)
return Snacks.picker.explorer(opts)
end
--- Reveals the given file/buffer or the current buffer in the explorer
---@param opts? {file?:string, buf?:number}
function M.reveal(opts)
local Actions = require("snacks.explorer.actions")
local Tree = require("snacks.explorer.tree")
opts = opts or {}
local file = svim.fs.normalize(opts.file or vim.api.nvim_buf_get_name(opts.buf or 0))
local explorer = Snacks.picker.get({ source = "explorer" })[1] or M.open()
local cwd = explorer:cwd()
if not Tree:in_cwd(cwd, file) then
for parent in vim.fs.parents(file) do
if Tree:in_cwd(parent, cwd) then
explorer:set_cwd(parent)
break
end
end
end
Tree:open(file)
Actions.update(explorer, { target = file, refresh = true })
return explorer
end
return M