commit
1c12503ebf
15 changed files with 1434 additions and 0 deletions
266
plugins/neo-tree.nix
Normal file
266
plugins/neo-tree.nix
Normal file
|
|
@ -0,0 +1,266 @@
|
|||
# homepage: https://github.com/nvim-neo-tree/neo-tree.nvim
|
||||
# nixvim doc: https://nix-community.github.io/nixvim/plugins/neo-tree/index.html
|
||||
_:
|
||||
|
||||
{
|
||||
opts = {
|
||||
enable = true;
|
||||
|
||||
# Automatically clean up broken neo-tree buffers saved in sessions
|
||||
autoCleanAfterSessionRestore = true;
|
||||
|
||||
# Close Neo-tree if it is the last window left in the tab
|
||||
closeIfLastWindow = true;
|
||||
|
||||
# Disable fold column (gutter)
|
||||
eventHandlers = {
|
||||
neo_tree_buffer_enter = ''
|
||||
function(_)
|
||||
vim.opt_local.signcolumn = "auto"
|
||||
vim.opt_local.foldcolumn = "0"
|
||||
end
|
||||
'';
|
||||
};
|
||||
|
||||
# Extra options not exposed by the plugin
|
||||
extraOptions = {
|
||||
# Custom functions (taken from AstroNvim)
|
||||
commands = {
|
||||
# Focus first directory child item or open directory
|
||||
# https://github.com/AstroNvim/AstroNvim/blob/v4.7.7/lua/astronvim/plugins/neo-tree.lua#L120-L135
|
||||
child_or_open.__raw = ''
|
||||
function(state)
|
||||
local node = state.tree:get_node()
|
||||
if node:has_children() then
|
||||
if not node:is_expanded() then -- if unexpanded, expand
|
||||
state.commands.toggle_node(state)
|
||||
else -- if expanded and has children, select the next child
|
||||
if node.type == "file" then
|
||||
state.commands.open(state)
|
||||
else
|
||||
require("neo-tree.ui.renderer").focus_node(state, node:get_child_ids()[1])
|
||||
end
|
||||
end
|
||||
else -- if has no children
|
||||
state.commands.open(state)
|
||||
end
|
||||
end
|
||||
'';
|
||||
|
||||
# Copy various path format of currently focused item
|
||||
# https://github.com/AstroNvim/AstroNvim/blob/v4.7.7/lua/astronvim/plugins/neo-tree.lua#L136-L168
|
||||
copy_selector.__raw = ''
|
||||
function(state)
|
||||
local node = state.tree:get_node()
|
||||
local filepath = node:get_id()
|
||||
local filename = node.name
|
||||
local modify = vim.fn.fnamemodify
|
||||
|
||||
local vals = {
|
||||
["BASENAME"] = modify(filename, ":r"),
|
||||
["EXTENSION"] = modify(filename, ":e"),
|
||||
["FILENAME"] = filename,
|
||||
["PATH (CWD)"] = modify(filepath, ":."),
|
||||
["PATH (HOME)"] = modify(filepath, ":~"),
|
||||
["PATH"] = filepath,
|
||||
["URI"] = vim.uri_from_fname(filepath),
|
||||
}
|
||||
|
||||
local options = vim.tbl_filter(function(val) return vals[val] ~= "" end, vim.tbl_keys(vals))
|
||||
if vim.tbl_isempty(options) then
|
||||
return
|
||||
end
|
||||
table.sort(options)
|
||||
vim.ui.select(options, {
|
||||
prompt = "Choose to copy to clipboard:",
|
||||
format_item = function(item) return ("%s: %s"):format(item, vals[item]) end,
|
||||
}, function(choice)
|
||||
local result = vals[choice]
|
||||
if result then
|
||||
vim.fn.setreg("+", result)
|
||||
end
|
||||
end)
|
||||
end
|
||||
'';
|
||||
|
||||
# Find file in currently focused item if it is a directory, or its closest parent directory
|
||||
# https://github.com/AstroNvim/AstroNvim/blob/v4.7.7/lua/astronvim/plugins/neo-tree.lua#L205-L209
|
||||
find_file_in_dir.__raw = ''
|
||||
function(state)
|
||||
local node = state.tree:get_node()
|
||||
local path = node.type == "file" and node:get_parent_id() or node:get_id()
|
||||
TelescopeWithTheme('find_files', { cwd = path })
|
||||
end
|
||||
'';
|
||||
|
||||
# Live grep in currently focused item if it is a directory, or its closest parent directory
|
||||
grep_in_dir.__raw = ''
|
||||
function(state)
|
||||
local node = state.tree:get_node()
|
||||
local path = node.type == "file" and node:get_parent_id() or node:get_id()
|
||||
TelescopeWithTheme('live_grep', { cwd = path })
|
||||
end
|
||||
'';
|
||||
|
||||
# Focus parent directory of currently focused item or close directory
|
||||
# https://github.com/AstroNvim/AstroNvim/blob/v4.7.7/lua/astronvim/plugins/neo-tree.lua#L112-L119
|
||||
parent_or_close.__raw = ''
|
||||
function(state)
|
||||
local node = state.tree:get_node()
|
||||
if node:has_children() and node:is_expanded() then
|
||||
state.commands.toggle_node(state)
|
||||
else
|
||||
require("neo-tree.ui.renderer").focus_node(state, node:get_parent_id())
|
||||
end
|
||||
end
|
||||
'';
|
||||
};
|
||||
|
||||
window = {
|
||||
# Keymaps for filter popup window in fuzzy finder mode (ie. "/")
|
||||
fuzzy_finder_mappings = {
|
||||
"<C-J>" = "move_cursor_down";
|
||||
"<C-K>" = "move_cursor_up";
|
||||
};
|
||||
|
||||
# Keymaps when neotree window is focused
|
||||
mappings = {
|
||||
"[b" = "prev_source";
|
||||
"]b" = "next_source";
|
||||
|
||||
# Disable default behavior to toggle node on Space keypress
|
||||
"<Space>".__raw = "false";
|
||||
|
||||
# See extraOptions.commands for details on following keymaps
|
||||
h = "parent_or_close";
|
||||
l = "child_or_open";
|
||||
F = "find_file_in_dir";
|
||||
W = "grep_in_dir";
|
||||
Y = "copy_selector";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
defaultComponentConfigs = {
|
||||
gitStatus.symbols = {
|
||||
added = "";
|
||||
conflict = "";
|
||||
deleted = "";
|
||||
ignored = "◌";
|
||||
modified = "";
|
||||
renamed = "";
|
||||
staged = "";
|
||||
unstaged = "";
|
||||
untracked = "★";
|
||||
};
|
||||
};
|
||||
|
||||
filesystem = {
|
||||
# Find and focus file in active buffer
|
||||
followCurrentFile.enabled = true;
|
||||
|
||||
# Open neotree "fullscreen" when opening a directory
|
||||
hijackNetrwBehavior = "open_current";
|
||||
};
|
||||
|
||||
# Sources tabs
|
||||
sourceSelector = {
|
||||
# Label position
|
||||
contentLayout.__raw = "'center'";
|
||||
|
||||
# No tabs separator
|
||||
separator = "";
|
||||
|
||||
# Show tabs on winbar
|
||||
winbar = true;
|
||||
|
||||
# Sources to show and their labels
|
||||
sources = [
|
||||
{
|
||||
displayName = " Files";
|
||||
source = "filesystem";
|
||||
}
|
||||
{
|
||||
displayName = " Bufs";
|
||||
source = "buffers";
|
||||
}
|
||||
{
|
||||
displayName = " Git";
|
||||
source = "git_status";
|
||||
}
|
||||
];
|
||||
};
|
||||
};
|
||||
|
||||
rootOpts = {
|
||||
# Enable catppuccin colors
|
||||
# https://github.com/catppuccin/nvim/blob/main/lua/catppuccin/groups/integrations/neotree.lua
|
||||
colorschemes.catppuccin.settings.integrations.neotree = true;
|
||||
autoGroups.neotree = { };
|
||||
|
||||
# Custom autocommands (taken from AstroNvim)
|
||||
autoCmd = [
|
||||
# https://github.com/AstroNvim/AstroNvim/blob/v4.7.7/lua/astronvim/plugins/neo-tree.lua#L21-L37
|
||||
{
|
||||
desc = "Open explorer on startup with directory";
|
||||
event = "BufEnter";
|
||||
group = "neotree";
|
||||
|
||||
callback.__raw = ''
|
||||
function()
|
||||
if package.loaded["neo-tree"] then
|
||||
return true
|
||||
else
|
||||
local stats = vim.loop.fs_stat(vim.api.nvim_buf_get_name(0))
|
||||
if stats and stats.type == "directory" then
|
||||
return true
|
||||
end
|
||||
end
|
||||
end
|
||||
'';
|
||||
}
|
||||
# https://github.com/AstroNvim/AstroNvim/blob/v4.7.7/lua/astronvim/plugins/neo-tree.lua#L25-L35
|
||||
{
|
||||
desc = "Refresh explorer sources when closing lazygit";
|
||||
event = "TermClose";
|
||||
group = "neotree";
|
||||
pattern = "*lazygit*";
|
||||
|
||||
callback.__raw = ''
|
||||
function()
|
||||
local manager_avail, manager = pcall(require, "neo-tree.sources.manager")
|
||||
if manager_avail then
|
||||
for _, source in ipairs { "filesystem", "git_status", "document_symbols" } do
|
||||
local module = "neo-tree.sources." .. source
|
||||
if package.loaded[module] then manager.refresh(require(module).name) end
|
||||
end
|
||||
end
|
||||
end
|
||||
'';
|
||||
}
|
||||
];
|
||||
|
||||
keymaps = [
|
||||
{
|
||||
key = "<leader>e";
|
||||
action = "<cmd>Neotree toggle<cr>";
|
||||
options.desc = "Toggle explorer";
|
||||
}
|
||||
{
|
||||
key = "<leader>o";
|
||||
options.desc = "Toggle explorer focus";
|
||||
|
||||
# https://github.com/AstroNvim/AstroNvim/blob/v4.7.7/lua/astronvim/plugins/neo-tree.lua#L12-L18
|
||||
action.__raw = ''
|
||||
function()
|
||||
if vim.bo.filetype == "neo-tree" then
|
||||
vim.cmd.wincmd "p"
|
||||
else
|
||||
vim.cmd.Neotree "focus"
|
||||
end
|
||||
end
|
||||
'';
|
||||
}
|
||||
];
|
||||
};
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue