mirror of
https://github.com/NotAShelf/nvf.git
synced 2024-11-01 19:11:15 +00:00
feat: rename nvimtree.lua option and conform to new configuration format
This commit is contained in:
parent
9a956161b3
commit
5c7546a8fa
6 changed files with 1452 additions and 574 deletions
|
@ -1,5 +1,5 @@
|
||||||
_: {
|
_: {
|
||||||
imports = [
|
imports = [
|
||||||
./nvimtree-lua
|
./nvimtree
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,145 +0,0 @@
|
||||||
{
|
|
||||||
config,
|
|
||||||
lib,
|
|
||||||
pkgs,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
with lib;
|
|
||||||
with builtins; let
|
|
||||||
cfg = config.vim.filetree.nvimTreeLua;
|
|
||||||
self = import ./nvimtree-lua.nix {
|
|
||||||
inherit pkgs;
|
|
||||||
lib = lib;
|
|
||||||
};
|
|
||||||
mappings = self.options.vim.filetree.nvimTreeLua.mappings;
|
|
||||||
in {
|
|
||||||
config = mkIf cfg.enable {
|
|
||||||
vim.startPlugins = ["nvim-tree-lua"];
|
|
||||||
|
|
||||||
vim.maps.normal = mkMerge [
|
|
||||||
(mkBinding cfg.mappings.toggle ":NvimTreeToggle<cr>" mappings.toggle.description)
|
|
||||||
(mkBinding cfg.mappings.refresh ":NvimTreeRefresh<cr>" mappings.refresh.description)
|
|
||||||
(mkBinding cfg.mappings.findFile ":NvimTreeFindFile<cr>" mappings.findFile.description)
|
|
||||||
(mkBinding cfg.mappings.focus ":NvimTreeFocus<cr>" mappings.focus.description)
|
|
||||||
];
|
|
||||||
|
|
||||||
vim.luaConfigRC.nvimtreelua = nvim.dag.entryAnywhere ''
|
|
||||||
local function open_nvim_tree(data)
|
|
||||||
local IGNORED_FT = {
|
|
||||||
"markdown",
|
|
||||||
}
|
|
||||||
|
|
||||||
-- buffer is a real file on the disk
|
|
||||||
local real_file = vim.fn.filereadable(data.file) == 1
|
|
||||||
|
|
||||||
-- buffer is a [No Name]
|
|
||||||
local no_name = data.file == "" and vim.bo[data.buf].buftype == ""
|
|
||||||
|
|
||||||
-- &ft
|
|
||||||
local filetype = vim.bo[data.buf].ft
|
|
||||||
|
|
||||||
-- only files please
|
|
||||||
if not real_file and not no_name then
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
-- skip ignored filetypes
|
|
||||||
if vim.tbl_contains(IGNORED_FT, filetype) then
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
-- open the tree but don't focus it
|
|
||||||
require("nvim-tree.api").tree.toggle({ focus = false })
|
|
||||||
end
|
|
||||||
-- Open on startup has been deprecated
|
|
||||||
-- see https://github.com/nvim-tree/nvim-tree.lua/wiki/Open-At-Startup
|
|
||||||
-- use a nix eval to dynamically insert the open on startup function
|
|
||||||
${
|
|
||||||
# FIXME: this function is actually obslete due to the existence of the dashboard, I need to find an alternative logic
|
|
||||||
if (cfg.openOnSetup)
|
|
||||||
then ''
|
|
||||||
vim.api.nvim_create_autocmd({ "VimEnter" }, { callback = open_nvim_tree })
|
|
||||||
''
|
|
||||||
else ""
|
|
||||||
}
|
|
||||||
|
|
||||||
require'nvim-tree'.setup({
|
|
||||||
sort_by = ${"'" + cfg.sortBy + "'"},
|
|
||||||
disable_netrw = ${boolToString cfg.disableNetRW},
|
|
||||||
hijack_netrw = ${boolToString cfg.hijackNetRW},
|
|
||||||
hijack_cursor = ${boolToString cfg.hijackCursor},
|
|
||||||
open_on_tab = ${boolToString cfg.openTreeOnNewTab},
|
|
||||||
sync_root_with_cwd = ${boolToString cfg.syncRootWithCwd},
|
|
||||||
update_focused_file = {
|
|
||||||
enable = ${boolToString cfg.updateFocusedFile.enable},
|
|
||||||
update_cwd = ${boolToString cfg.updateFocusedFile.update_cwd},
|
|
||||||
},
|
|
||||||
|
|
||||||
view = {
|
|
||||||
width = ${toString cfg.view.width},
|
|
||||||
side = ${"'" + cfg.view.side + "'"},
|
|
||||||
adaptive_size = ${boolToString cfg.view.adaptiveSize},
|
|
||||||
cursorline = ${boolToString cfg.view.cursorline}
|
|
||||||
},
|
|
||||||
|
|
||||||
git = {
|
|
||||||
enable = ${boolToString cfg.git.enable},
|
|
||||||
ignore = ${boolToString cfg.git.ignore},
|
|
||||||
},
|
|
||||||
|
|
||||||
filesystem_watchers = {
|
|
||||||
enable = ${boolToString cfg.filesystemWatchers.enable},
|
|
||||||
},
|
|
||||||
|
|
||||||
actions = {
|
|
||||||
change_dir = {
|
|
||||||
global = ${boolToString cfg.actions.changeDir.global},
|
|
||||||
},
|
|
||||||
open_file = {
|
|
||||||
quit_on_open = ${boolToString cfg.actions.openFile.quitOnOpen},
|
|
||||||
resize_window = ${boolToString cfg.actions.openFile.resizeWindow},
|
|
||||||
window_picker = {
|
|
||||||
enable = ${boolToString cfg.actions.openFile.windowPicker.enable},
|
|
||||||
chars = ${toString cfg.actions.openFile.windowPicker.chars},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
expand_all = {
|
|
||||||
exclude = {
|
|
||||||
${builtins.concatStringsSep "\n" (builtins.map (s: "\"" + s + "\",") cfg.actions.expandAll.exclude)}
|
|
||||||
},
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
renderer = {
|
|
||||||
highlight_git = ${boolToString cfg.renderer.higlightGit},
|
|
||||||
highlight_opened_files = ${"'" + cfg.renderer.highlightOpenedFiles + "'"},
|
|
||||||
indent_markers = {
|
|
||||||
enable = ${boolToString cfg.renderer.indentMarkers},
|
|
||||||
},
|
|
||||||
-- TODO: those two
|
|
||||||
add_trailing = ${boolToString cfg.renderer.trailingSlash},
|
|
||||||
group_empty = ${boolToString cfg.renderer.groupEmptyFolders},
|
|
||||||
|
|
||||||
root_folder_label = ${
|
|
||||||
if cfg.renderer.rootFolderLabel == null
|
|
||||||
then "false"
|
|
||||||
else "''${toString cfg.rootFolderLabel}''"
|
|
||||||
},
|
|
||||||
},
|
|
||||||
|
|
||||||
system_open = {
|
|
||||||
cmd = ${"'" + cfg.systemOpenCmd + "'"},
|
|
||||||
},
|
|
||||||
diagnostics = {
|
|
||||||
enable = ${boolToString cfg.lspDiagnostics},
|
|
||||||
},
|
|
||||||
filters = {
|
|
||||||
dotfiles = ${boolToString cfg.hideDotFiles},
|
|
||||||
custom = {
|
|
||||||
${builtins.concatStringsSep "\n" (builtins.map (s: "\"" + s + "\",") cfg.hideFiles)}
|
|
||||||
},
|
|
||||||
},
|
|
||||||
})
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
}
|
|
|
@ -1,427 +0,0 @@
|
||||||
{
|
|
||||||
pkgs,
|
|
||||||
lib,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
with lib;
|
|
||||||
with builtins; {
|
|
||||||
options.vim.filetree.nvimTreeLua = {
|
|
||||||
enable = mkEnableOption "filetree via nvim-tree-lua" // {default = false;};
|
|
||||||
|
|
||||||
mappings = {
|
|
||||||
toggle = mkOption {
|
|
||||||
type = types.nullOr types.str;
|
|
||||||
default = "<C-n>";
|
|
||||||
description = "Toggle NvimTree";
|
|
||||||
};
|
|
||||||
refresh = mkOption {
|
|
||||||
type = types.nullOr types.str;
|
|
||||||
default = "<leader>tr";
|
|
||||||
description = "Refresh NvimTree";
|
|
||||||
};
|
|
||||||
findFile = mkOption {
|
|
||||||
type = types.nullOr types.str;
|
|
||||||
default = "<leader>tg";
|
|
||||||
description = "Find file in NvimTree";
|
|
||||||
};
|
|
||||||
focus = mkOption {
|
|
||||||
type = types.nullOr types.str;
|
|
||||||
default = "<leader>tf";
|
|
||||||
description = "Focus NvimTree";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
sortBy = mkOption {
|
|
||||||
default = "name";
|
|
||||||
description = "Sort by name or extension";
|
|
||||||
type = types.enum ["name" "extension" "modification_time" "case_sensitive"];
|
|
||||||
};
|
|
||||||
|
|
||||||
hideFiles = mkOption {
|
|
||||||
default = ["node_modules" ".cache"];
|
|
||||||
description = "Files to hide in the file view by default.";
|
|
||||||
type = with types; listOf str;
|
|
||||||
};
|
|
||||||
|
|
||||||
openOnSetup = mkOption {
|
|
||||||
default = true;
|
|
||||||
description = "Open when vim is started on a directory";
|
|
||||||
type = types.bool;
|
|
||||||
};
|
|
||||||
|
|
||||||
closeOnLastWindow = mkOption {
|
|
||||||
default = true;
|
|
||||||
description = "Close when tree is last window open";
|
|
||||||
type = types.bool;
|
|
||||||
};
|
|
||||||
|
|
||||||
ignoreFileTypes = mkOption {
|
|
||||||
default = [];
|
|
||||||
description = "Ignore file types";
|
|
||||||
type = with types; listOf str;
|
|
||||||
};
|
|
||||||
|
|
||||||
followBufferFile = mkOption {
|
|
||||||
default = true;
|
|
||||||
description = "Follow file that is in current buffer on tree";
|
|
||||||
type = types.bool;
|
|
||||||
};
|
|
||||||
|
|
||||||
indentMarkers = mkOption {
|
|
||||||
default = true;
|
|
||||||
description = "Show indent markers";
|
|
||||||
type = types.bool;
|
|
||||||
};
|
|
||||||
|
|
||||||
hideDotFiles = mkOption {
|
|
||||||
default = false;
|
|
||||||
description = "Hide dotfiles";
|
|
||||||
type = types.bool;
|
|
||||||
};
|
|
||||||
|
|
||||||
openTreeOnNewTab = mkOption {
|
|
||||||
default = true;
|
|
||||||
description = "Opens the tree view when opening a new tab";
|
|
||||||
type = types.bool;
|
|
||||||
};
|
|
||||||
|
|
||||||
disableNetRW = mkOption {
|
|
||||||
default = false;
|
|
||||||
description = "Disables netrw and replaces it with tree";
|
|
||||||
type = types.bool;
|
|
||||||
};
|
|
||||||
|
|
||||||
hijackNetRW = mkOption {
|
|
||||||
default = true;
|
|
||||||
description = "Prevents netrw from automatically opening when opening directories";
|
|
||||||
type = types.bool;
|
|
||||||
};
|
|
||||||
|
|
||||||
trailingSlash = mkOption {
|
|
||||||
default = true;
|
|
||||||
description = "Add a trailing slash to all folders";
|
|
||||||
type = types.bool;
|
|
||||||
};
|
|
||||||
|
|
||||||
groupEmptyFolders = mkOption {
|
|
||||||
default = true;
|
|
||||||
description = "Compact empty folders trees into a single item";
|
|
||||||
type = types.bool;
|
|
||||||
};
|
|
||||||
|
|
||||||
lspDiagnostics = mkOption {
|
|
||||||
default = true;
|
|
||||||
description = "Shows lsp diagnostics in the tree";
|
|
||||||
type = types.bool;
|
|
||||||
};
|
|
||||||
|
|
||||||
systemOpenCmd = mkOption {
|
|
||||||
default = "${pkgs.xdg-utils}/bin/xdg-open";
|
|
||||||
description = "The command used to open a file with the associated default program";
|
|
||||||
type = types.str;
|
|
||||||
};
|
|
||||||
|
|
||||||
updateCwd = mkOption {
|
|
||||||
# updateCwd has been deprecated in favor of syncRootWithCwd
|
|
||||||
# this option is kept for backwards compatibility
|
|
||||||
default = true;
|
|
||||||
description = "Updates the tree when changing nvim's directory (DirChanged event).";
|
|
||||||
type = types.bool;
|
|
||||||
};
|
|
||||||
|
|
||||||
ignore_ft_on_setup = mkOption {
|
|
||||||
default = [];
|
|
||||||
description = "Ignore file types on setup";
|
|
||||||
type = with types; listOf str;
|
|
||||||
};
|
|
||||||
|
|
||||||
hijackCursor = mkOption {
|
|
||||||
default = false;
|
|
||||||
description = "Hijack the cursor in the tree to put it at the start of the filename";
|
|
||||||
type = types.bool;
|
|
||||||
};
|
|
||||||
|
|
||||||
hijackUnnamedBufferWhenOpening = mkOption {
|
|
||||||
default = false;
|
|
||||||
description = "Open nvimtree in place of the unnamed buffer if it's empty.";
|
|
||||||
type = types.bool;
|
|
||||||
};
|
|
||||||
|
|
||||||
syncRootWithCwd = mkOption {
|
|
||||||
default = true;
|
|
||||||
description = "Changes the tree root directory on `DirChanged` and refreshes the tree";
|
|
||||||
type = types.bool;
|
|
||||||
};
|
|
||||||
|
|
||||||
updateFocusedFile = mkOption {
|
|
||||||
default = {
|
|
||||||
enable = true;
|
|
||||||
update_cwd = true;
|
|
||||||
};
|
|
||||||
description = "Updates the tree when changing nvim's directory (DirChanged event).";
|
|
||||||
type = with types; attrsOf (either bool (attrsOf bool));
|
|
||||||
};
|
|
||||||
|
|
||||||
view = {
|
|
||||||
adaptiveSize = mkOption {
|
|
||||||
default = true;
|
|
||||||
description = "Resize the tree when the window is resized";
|
|
||||||
type = types.bool;
|
|
||||||
};
|
|
||||||
side = mkOption {
|
|
||||||
default = "left";
|
|
||||||
description = "Side the tree will appear on left or right";
|
|
||||||
type = types.enum ["left" "right"];
|
|
||||||
};
|
|
||||||
width = mkOption {
|
|
||||||
default = 35;
|
|
||||||
description = "Width of the tree in charecters";
|
|
||||||
type = types.int;
|
|
||||||
};
|
|
||||||
cursorline = mkOption {
|
|
||||||
default = false;
|
|
||||||
description = "Whether to display the cursor line in NvimTree";
|
|
||||||
type = types.bool;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
git = {
|
|
||||||
enable = mkEnableOption "Git integration";
|
|
||||||
ignore = mkOption {
|
|
||||||
default = false;
|
|
||||||
description = "Ignore files in git";
|
|
||||||
type = types.bool;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
filesystemWatchers = {
|
|
||||||
enable = mkOption {
|
|
||||||
default = true;
|
|
||||||
description = "Enable filesystem watchers";
|
|
||||||
type = types.bool;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
actions = {
|
|
||||||
changeDir = {
|
|
||||||
global = mkOption {
|
|
||||||
default = true;
|
|
||||||
description = "Change directory when changing nvim's directory (DirChanged event).";
|
|
||||||
type = types.bool;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
openFile = {
|
|
||||||
resizeWindow = mkOption {
|
|
||||||
default = true;
|
|
||||||
description = "Resize the tree when opening a file";
|
|
||||||
type = types.bool;
|
|
||||||
};
|
|
||||||
quitOnOpen = mkOption {
|
|
||||||
default = false;
|
|
||||||
description = "Quit the tree when opening a file";
|
|
||||||
type = types.bool;
|
|
||||||
};
|
|
||||||
windowPicker = {
|
|
||||||
enable = mkEnableOption "Window picker";
|
|
||||||
|
|
||||||
chars = mkOption {
|
|
||||||
default = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
|
|
||||||
description = "A string of chars used as identifiers by the window picker";
|
|
||||||
type = types.str;
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
# FIXME: Can't get this to place the list items in a lua table
|
|
||||||
exclude = {
|
|
||||||
fileType = mkOption {
|
|
||||||
default = ["notify" "packer" "qf" "diff" "fugitive" "fugitiveblame"];
|
|
||||||
description = "File types to exclude from window picker";
|
|
||||||
type = with types; listOf str;
|
|
||||||
};
|
|
||||||
buftype = mkOption {
|
|
||||||
default = ["nofile" "terminal" "help"];
|
|
||||||
description = "Buffer types to exclude from window picker";
|
|
||||||
type = with types; listOf str;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
*/
|
|
||||||
};
|
|
||||||
};
|
|
||||||
expandAll = {
|
|
||||||
exclude = mkOption {
|
|
||||||
default = [];
|
|
||||||
description = "Exclude files from expand all";
|
|
||||||
type = with types; listOf str;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
renderer = {
|
|
||||||
higlightGit = mkOption {
|
|
||||||
default = false;
|
|
||||||
description = "Highlight git related files";
|
|
||||||
type = types.bool;
|
|
||||||
};
|
|
||||||
|
|
||||||
highlightOpenedFiles = mkOption {
|
|
||||||
default = "none";
|
|
||||||
description = "Highlight opened files";
|
|
||||||
type = types.enum ["none" "icon" "name" "all"];
|
|
||||||
};
|
|
||||||
|
|
||||||
indentMarkers = mkOption {
|
|
||||||
default = false;
|
|
||||||
description = "Show indent markers";
|
|
||||||
type = types.bool;
|
|
||||||
};
|
|
||||||
|
|
||||||
showHiddenFiles = mkOption {
|
|
||||||
default = true;
|
|
||||||
description = "Show hidden files";
|
|
||||||
type = types.bool;
|
|
||||||
};
|
|
||||||
|
|
||||||
trailingSlash = mkOption {
|
|
||||||
default = false;
|
|
||||||
description = "Add a trailing slash to all folders";
|
|
||||||
type = types.bool;
|
|
||||||
};
|
|
||||||
|
|
||||||
showParentFolder = mkOption {
|
|
||||||
default = false;
|
|
||||||
description = "Show parent folder";
|
|
||||||
type = types.bool;
|
|
||||||
};
|
|
||||||
|
|
||||||
groupEmptyFolders = mkOption {
|
|
||||||
default = false;
|
|
||||||
description = "Compact empty folders trees into a single item";
|
|
||||||
type = types.bool;
|
|
||||||
};
|
|
||||||
|
|
||||||
rootFolderLabel = mkOption {
|
|
||||||
default = null;
|
|
||||||
description = "Root folder label. Set null to disable";
|
|
||||||
type = with types; nullOr str;
|
|
||||||
};
|
|
||||||
|
|
||||||
icons = {
|
|
||||||
show = {
|
|
||||||
file = mkOption {
|
|
||||||
default = true;
|
|
||||||
description = "Show file icons";
|
|
||||||
type = types.bool;
|
|
||||||
};
|
|
||||||
folder = mkOption {
|
|
||||||
default = true;
|
|
||||||
description = "Show folder icons";
|
|
||||||
type = types.bool;
|
|
||||||
};
|
|
||||||
folderArrow = mkOption {
|
|
||||||
default = true;
|
|
||||||
description = "Show folder arrow icons";
|
|
||||||
type = types.bool;
|
|
||||||
};
|
|
||||||
git = mkOption {
|
|
||||||
default = false;
|
|
||||||
description = "Show git icons";
|
|
||||||
type = types.bool;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
glyphs = {
|
|
||||||
default = mkOption {
|
|
||||||
default = "";
|
|
||||||
description = "Default icon";
|
|
||||||
type = types.str;
|
|
||||||
};
|
|
||||||
symlink = mkOption {
|
|
||||||
default = "";
|
|
||||||
description = "Symlink icon";
|
|
||||||
type = types.str;
|
|
||||||
};
|
|
||||||
|
|
||||||
folder = {
|
|
||||||
default = mkOption {
|
|
||||||
default = "";
|
|
||||||
description = "Default folder icon";
|
|
||||||
type = types.str;
|
|
||||||
};
|
|
||||||
open = mkOption {
|
|
||||||
default = "";
|
|
||||||
description = "Open folder icon";
|
|
||||||
type = types.str;
|
|
||||||
};
|
|
||||||
empty = mkOption {
|
|
||||||
default = "";
|
|
||||||
description = "Empty folder icon";
|
|
||||||
type = types.str;
|
|
||||||
};
|
|
||||||
emptyOpen = mkOption {
|
|
||||||
default = "";
|
|
||||||
description = "Empty open folder icon";
|
|
||||||
type = types.str;
|
|
||||||
};
|
|
||||||
symlink = mkOption {
|
|
||||||
default = "";
|
|
||||||
description = "Symlink folder icon";
|
|
||||||
type = types.str;
|
|
||||||
};
|
|
||||||
symlinkOpen = mkOption {
|
|
||||||
default = "";
|
|
||||||
description = "Symlink open folder icon";
|
|
||||||
type = types.str;
|
|
||||||
};
|
|
||||||
arrowOpen = mkOption {
|
|
||||||
default = "";
|
|
||||||
description = "Open folder arrow icon";
|
|
||||||
type = types.str;
|
|
||||||
};
|
|
||||||
arrowClosed = mkOption {
|
|
||||||
default = "";
|
|
||||||
description = "Closed folder arrow icon";
|
|
||||||
type = types.str;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
git = {
|
|
||||||
unstaged = mkOption {
|
|
||||||
default = "✗";
|
|
||||||
description = "Unstaged git icon";
|
|
||||||
type = types.str;
|
|
||||||
};
|
|
||||||
staged = mkOption {
|
|
||||||
default = "✓";
|
|
||||||
description = "Staged git icon";
|
|
||||||
type = types.str;
|
|
||||||
};
|
|
||||||
unmerged = mkOption {
|
|
||||||
default = "";
|
|
||||||
description = "Unmerged git icon";
|
|
||||||
type = types.str;
|
|
||||||
};
|
|
||||||
renamed = mkOption {
|
|
||||||
default = "➜";
|
|
||||||
description = "Renamed git icon";
|
|
||||||
type = types.str;
|
|
||||||
};
|
|
||||||
untracked = mkOption {
|
|
||||||
default = "★";
|
|
||||||
description = "Untracked git icon";
|
|
||||||
type = types.str;
|
|
||||||
};
|
|
||||||
deleted = mkOption {
|
|
||||||
default = "";
|
|
||||||
description = "Deleted git icon";
|
|
||||||
type = types.str;
|
|
||||||
};
|
|
||||||
ignored = mkOption {
|
|
||||||
default = "◌";
|
|
||||||
description = "Ignored git icon";
|
|
||||||
type = types.str;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
293
modules/filetree/nvimtree/config.nix
Normal file
293
modules/filetree/nvimtree/config.nix
Normal file
|
@ -0,0 +1,293 @@
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
with lib;
|
||||||
|
with builtins; let
|
||||||
|
cfg = config.vim.filetree.nvimTree;
|
||||||
|
self = import ./nvimtree.nix {
|
||||||
|
inherit pkgs;
|
||||||
|
lib = lib;
|
||||||
|
};
|
||||||
|
mappings = self.options.vim.filetree.nvimTree.mappings;
|
||||||
|
in {
|
||||||
|
config = mkIf cfg.enable {
|
||||||
|
vim.startPlugins = ["nvim-tree-lua"];
|
||||||
|
|
||||||
|
vim.maps.normal = mkMerge [
|
||||||
|
(mkBinding cfg.mappings.toggle ":NvimTreeToggle<cr>" mappings.toggle.description)
|
||||||
|
(mkBinding cfg.mappings.refresh ":NvimTreeRefresh<cr>" mappings.refresh.description)
|
||||||
|
(mkBinding cfg.mappings.findFile ":NvimTreeFindFile<cr>" mappings.findFile.description)
|
||||||
|
(mkBinding cfg.mappings.focus ":NvimTreeFocus<cr>" mappings.focus.description)
|
||||||
|
];
|
||||||
|
|
||||||
|
vim.luaConfigRC.nvimtreelua = nvim.dag.entryAnywhere ''
|
||||||
|
${
|
||||||
|
lib.optionalString (cfg.openOnSetup) ''
|
||||||
|
-- Open on startup has been deprecated
|
||||||
|
-- see https://github.com/nvim-tree/nvim-tree.lua/wiki/Open-At-Startup
|
||||||
|
|
||||||
|
-- use a nix eval to dynamically insert the open on startup function
|
||||||
|
local function open_nvim_tree(data)
|
||||||
|
local IGNORED_FT = {
|
||||||
|
"markdown",
|
||||||
|
}
|
||||||
|
|
||||||
|
-- buffer is a real file on the disk
|
||||||
|
local real_file = vim.fn.filereadable(data.file) == 1
|
||||||
|
|
||||||
|
-- buffer is a [No Name]
|
||||||
|
local no_name = data.file == "" and vim.bo[data.buf].buftype == ""
|
||||||
|
|
||||||
|
-- &ft
|
||||||
|
local filetype = vim.bo[data.buf].ft
|
||||||
|
|
||||||
|
-- only files please
|
||||||
|
if not real_file and not no_name then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
-- skip ignored filetypes
|
||||||
|
if vim.tbl_contains(IGNORED_FT, filetype) then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
-- open the tree but don't focus it
|
||||||
|
require("nvim-tree.api").tree.toggle({ focus = false })
|
||||||
|
end
|
||||||
|
|
||||||
|
-- function to automatically open the tree on VimEnter
|
||||||
|
vim.api.nvim_create_autocmd({ "VimEnter" }, { callback = open_nvim_tree })
|
||||||
|
''
|
||||||
|
}
|
||||||
|
|
||||||
|
${
|
||||||
|
lib.optionalString (cfg.disableNetrw) ''
|
||||||
|
vim.g.loaded_netrw = 1
|
||||||
|
vim.g.loaded_netrwPlugin = 1
|
||||||
|
''
|
||||||
|
}
|
||||||
|
|
||||||
|
require'nvim-tree'.setup({
|
||||||
|
disable_netrw = ${boolToString cfg.disableNetrw},
|
||||||
|
hijack_netrw = ${boolToString cfg.hijackNetrw},
|
||||||
|
auto_reload_on_write = ${boolToString cfg.autoreloadOnWrite},
|
||||||
|
|
||||||
|
sort = {
|
||||||
|
sorter = "${cfg.sort.sorter}",
|
||||||
|
folders_first = ${boolToString cfg.sort.foldersFirst},
|
||||||
|
},
|
||||||
|
|
||||||
|
hijack_unnamed_buffer_when_opening = ${boolToString cfg.hijackUnnamedBufferWhenOpening},
|
||||||
|
hijack_cursor = ${boolToString cfg.hijackCursor},
|
||||||
|
root_dirs = ${nvim.lua.listToLuaTable cfg.rootDirs},
|
||||||
|
prefer_startup_root = ${boolToString cfg.preferStartupRoot},
|
||||||
|
sync_root_with_cwd = ${boolToString cfg.syncRootWithCwd},
|
||||||
|
reload_on_bufenter = ${boolToString cfg.reloadOnBufEnter},
|
||||||
|
respect_buf_cwd = ${boolToString cfg.respectBufCwd},
|
||||||
|
|
||||||
|
hijack_directories = {
|
||||||
|
enable = ${boolToString cfg.hijackDirectories.enable},
|
||||||
|
auto_open = ${boolToString cfg.hijackDirectories.autoOpen},
|
||||||
|
},
|
||||||
|
|
||||||
|
update_focused_file = {
|
||||||
|
enable = ${boolToString cfg.updateFocusedFile.enable},
|
||||||
|
update_root = ${boolToString cfg.updateFocusedFile.updateRoot},
|
||||||
|
ignore_list = ${nvim.lua.listToLuaTable cfg.updateFocusedFile.ignoreList},
|
||||||
|
},
|
||||||
|
|
||||||
|
system_open = {
|
||||||
|
cmd = "${cfg.systemOpen.cmd}",
|
||||||
|
args = ${nvim.lua.listToLuaTable cfg.systemOpen.args},
|
||||||
|
},
|
||||||
|
|
||||||
|
diagnostics = {
|
||||||
|
enable = ${boolToString cfg.diagnostics.enable},
|
||||||
|
icons = {
|
||||||
|
hint = "${cfg.diagnostics.icons.hint}",
|
||||||
|
info = "${cfg.diagnostics.icons.info}",
|
||||||
|
warning = "${cfg.diagnostics.icons.warning}",
|
||||||
|
error = "${cfg.diagnostics.icons.error}",
|
||||||
|
},
|
||||||
|
|
||||||
|
severity = {
|
||||||
|
min = "vim.diagnostic.severity.${cfg.diagnostics.severity.min}",
|
||||||
|
max = "vim.diagnostic.severity.${cfg.diagnostics.severity.max}",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
git = {
|
||||||
|
enable = ${boolToString cfg.git.enable},
|
||||||
|
show_on_dirs = ${boolToString cfg.git.showOnDirs},
|
||||||
|
show_on_open_dirs = ${boolToString cfg.git.showOnOpenDirs},
|
||||||
|
disable_for_dirs = ${nvim.lua.listToLuaTable cfg.git.disableForDirs},
|
||||||
|
timeout = ${toString cfg.git.timeOut},
|
||||||
|
},
|
||||||
|
|
||||||
|
modified = {
|
||||||
|
enable = ${boolToString cfg.modified.enable},
|
||||||
|
show_on_dirs = ${boolToString cfg.modified.showOnDirs},
|
||||||
|
show_on_open_dirs = ${boolToString cfg.modified.showOnOpenDirs},
|
||||||
|
},
|
||||||
|
|
||||||
|
filesystem_watchers = {
|
||||||
|
enable = ${boolToString cfg.filesystemWatchers.enable},
|
||||||
|
debounce_delay = ${toString cfg.filesystemWatchers.debounceDelay},
|
||||||
|
ignore_dirs = ${nvim.lua.listToLuaTable cfg.filesystemWatchers.ignoreDirs},
|
||||||
|
},
|
||||||
|
|
||||||
|
select_prompts = ${boolToString cfg.selectPrompts},
|
||||||
|
|
||||||
|
view = {
|
||||||
|
width = ${nvim.lua.expToLua cfg.view.width},
|
||||||
|
centralize_selection = ${boolToString cfg.view.centralizeSelection},
|
||||||
|
cursorline = ${boolToString cfg.view.cursorline},
|
||||||
|
debounce_delay = ${toString cfg.view.debounceDelay},
|
||||||
|
side = "${cfg.view.side}",
|
||||||
|
preserve_window_proportions = ${boolToString cfg.view.preserveWindowProportions},
|
||||||
|
number = ${boolToString cfg.view.number},
|
||||||
|
relativenumber = ${boolToString cfg.view.relativeNumber},
|
||||||
|
signcolumn = ${cfg.view.signcolumn},
|
||||||
|
|
||||||
|
float = {
|
||||||
|
enable = ${boolToString cfg.view.float.enable},
|
||||||
|
quit_on_focus_loss = ${boolToString cfg.view.float.quitOnFocusLoss},
|
||||||
|
open_win_config = ${nvim.lua.expToLua cfg.view.float.openWinConfig},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
renderer = {
|
||||||
|
add_trailing = ${boolToString cfg.renderer.addTrailing},
|
||||||
|
group_empty = ${boolToString cfg.renderer.groupEmpty},
|
||||||
|
full_name = ${boolToString cfg.renderer.fullName},
|
||||||
|
highlight_git = ${boolToString cfg.renderer.highlightGit},
|
||||||
|
highlight_opened_files = ${cfg.renderer.highlightOpenedFiles},
|
||||||
|
highlight_modified = ${cfg.renderer.highlightModified},
|
||||||
|
root_folder_label = ${nvim.lua.expToLua cfg.renderer.rootFolderLabel},
|
||||||
|
indent_width = ${toString cfg.renderer.indentWidth},
|
||||||
|
indent_markers = {
|
||||||
|
enable = ${boolToString cfg.renderer.indentMarkers.enable},
|
||||||
|
inline_arrows = ${boolToString cfg.renderer.indentMarkers.inlineArrows},
|
||||||
|
icons = ${nvim.lua.expToLua cfg.renderer.indentMarkers.icons},
|
||||||
|
},
|
||||||
|
|
||||||
|
icons = {
|
||||||
|
webdev_colors = ${boolToString cfg.renderer.icons.webdevColors},
|
||||||
|
git_placement = "${cfg.renderer.icons.gitPlacement}",
|
||||||
|
modified_placement = "${cfg.renderer.icons.modifiedPlacement}",
|
||||||
|
padding = "${cfg.renderer.icons.padding}",
|
||||||
|
symlink_arrow = "${cfg.renderer.icons.symlinkArrow}",
|
||||||
|
|
||||||
|
show = {
|
||||||
|
git = ${boolToString cfg.renderer.icons.show.git},
|
||||||
|
folder = ${boolToString cfg.renderer.icons.show.folder},
|
||||||
|
folder_arrow = ${boolToString cfg.renderer.icons.show.folderArrow},
|
||||||
|
file = ${boolToString cfg.renderer.icons.show.file},
|
||||||
|
modified = ${boolToString cfg.renderer.icons.show.modified},
|
||||||
|
},
|
||||||
|
|
||||||
|
glyphs = {
|
||||||
|
default = "${cfg.renderer.icons.glyphs.default}",
|
||||||
|
symlink = "${cfg.renderer.icons.glyphs.symlink}",
|
||||||
|
modified = "${cfg.renderer.icons.glyphs.modified}",
|
||||||
|
|
||||||
|
folder = {
|
||||||
|
default = "${cfg.renderer.icons.glyphs.folder.default}",
|
||||||
|
open = "${cfg.renderer.icons.glyphs.folder.open}",
|
||||||
|
arrow_open = "${cfg.renderer.icons.glyphs.folder.arrowOpen}",
|
||||||
|
arrow_closed = "${cfg.renderer.icons.glyphs.folder.arrowClosed}",
|
||||||
|
empty = "${cfg.renderer.icons.glyphs.folder.empty}",
|
||||||
|
empty_open = "${cfg.renderer.icons.glyphs.folder.emptyOpen}",
|
||||||
|
symlink = "${cfg.renderer.icons.glyphs.folder.symlink}",
|
||||||
|
symlink_open = "${cfg.renderer.icons.glyphs.folder.symlinkOpen}",
|
||||||
|
},
|
||||||
|
|
||||||
|
git = {
|
||||||
|
unstaged = "${cfg.renderer.icons.glyphs.git.unstaged}",
|
||||||
|
staged = "${cfg.renderer.icons.glyphs.git.staged}",
|
||||||
|
unmerged = "${cfg.renderer.icons.glyphs.git.unmerged}",
|
||||||
|
renamed = "${cfg.renderer.icons.glyphs.git.renamed}",
|
||||||
|
untracked = "${cfg.renderer.icons.glyphs.git.untracked}",
|
||||||
|
deleted = "${cfg.renderer.icons.glyphs.git.deleted}",
|
||||||
|
ignored = "${cfg.renderer.icons.glyphs.git.ignored}",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
special_files = ${nvim.lua.listToLuaTable cfg.renderer.specialFiles},
|
||||||
|
symlink_destination = ${boolToString cfg.renderer.symlinkDestination},
|
||||||
|
},
|
||||||
|
filters = {
|
||||||
|
git_ignored = ${boolToString cfg.filters.gitIgnored},
|
||||||
|
dotfiles = ${boolToString cfg.filters.dotfiles},
|
||||||
|
git_clean = ${boolToString cfg.filters.gitClean},
|
||||||
|
no_buffer = ${boolToString cfg.filters.noBuffer},
|
||||||
|
exclude = ${nvim.lua.listToLuaTable cfg.filters.exclude},
|
||||||
|
},
|
||||||
|
trash = {
|
||||||
|
cmd = "${cfg.trash.cmd}",
|
||||||
|
},
|
||||||
|
actions = {
|
||||||
|
use_system_clipboard = ${boolToString cfg.actions.useSystemClipboard},
|
||||||
|
change_dir = {
|
||||||
|
enable = ${boolToString cfg.actions.changeDir.enable},
|
||||||
|
global = ${boolToString cfg.actions.changeDir.global},
|
||||||
|
restrict_above_cwd = ${boolToString cfg.actions.changeDir.restrictAboveCwd},
|
||||||
|
},
|
||||||
|
|
||||||
|
expand_all = {
|
||||||
|
max_folder_discovery = ${toString cfg.actions.expandAll.maxFolderDiscovery},
|
||||||
|
exclude = ${nvim.lua.listToLuaTable cfg.actions.expandAll.exclude},
|
||||||
|
},
|
||||||
|
|
||||||
|
file_popup = {
|
||||||
|
open_win_config = ${nvim.lua.expToLua cfg.actions.filePopup.openWinConfig},
|
||||||
|
},
|
||||||
|
|
||||||
|
open_file = {
|
||||||
|
quit_on_open = ${boolToString cfg.actions.openFile.quitOnOpen},
|
||||||
|
eject = ${boolToString cfg.actions.openFile.eject},
|
||||||
|
resize_window = ${boolToString cfg.actions.openFile.resizeWindow},
|
||||||
|
window_picker = {
|
||||||
|
enable = ${boolToString cfg.actions.openFile.windowPicker.enable},
|
||||||
|
picker = "${cfg.actions.openFile.windowPicker.picker}",
|
||||||
|
chars = "${cfg.actions.openFile.windowPicker.chars}",
|
||||||
|
exclude = {
|
||||||
|
filetype = ${nvim.lua.listToLuaTable cfg.actions.openFile.windowPicker.exclude.filetype},
|
||||||
|
buftype = ${nvim.lua.listToLuaTable cfg.actions.openFile.windowPicker.exclude.buftype},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
remove_file = {
|
||||||
|
close_window = ${boolToString cfg.actions.removeFile.closeWindow},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
live_filter = {
|
||||||
|
prefix = "${cfg.liveFilter.prefix}",
|
||||||
|
always_show_folders = ${boolToString cfg.liveFilter.alwaysShowFolders},
|
||||||
|
},
|
||||||
|
|
||||||
|
tab = {
|
||||||
|
sync = {
|
||||||
|
open = ${boolToString cfg.tab.sync.open},
|
||||||
|
close = ${boolToString cfg.tab.sync.close},
|
||||||
|
ignore = ${nvim.lua.listToLuaTable cfg.tab.sync.ignore},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
notify = {
|
||||||
|
threshold = vim.log.levels.${cfg.notify.threshold},
|
||||||
|
absolute_path = ${boolToString cfg.notify.absolutePath},
|
||||||
|
},
|
||||||
|
ui = {
|
||||||
|
confirm = {
|
||||||
|
remove = ${boolToString cfg.ui.confirm.remove},
|
||||||
|
trash = ${boolToString cfg.ui.confirm.trash},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
})'';
|
||||||
|
};
|
||||||
|
}
|
|
@ -1,6 +1,6 @@
|
||||||
_: {
|
_: {
|
||||||
imports = [
|
imports = [
|
||||||
./config.nix
|
./config.nix
|
||||||
./nvimtree-lua.nix
|
./nvimtree.nix
|
||||||
];
|
];
|
||||||
}
|
}
|
1157
modules/filetree/nvimtree/nvimtree.nix
Normal file
1157
modules/filetree/nvimtree/nvimtree.nix
Normal file
File diff suppressed because it is too large
Load diff
Loading…
Reference in a new issue