diff --git a/configuration.nix b/configuration.nix index f8fcafe..718b4d2 100644 --- a/configuration.nix +++ b/configuration.nix @@ -113,15 +113,8 @@ inputs: let }; vim.filetree = { - nvimTreeLua = { + nvimTree = { enable = true; - renderer = { - rootFolderLabel = null; - }; - view = { - width = 25; - cursorline = false; - }; }; }; @@ -218,7 +211,7 @@ inputs: let }; vim.session = { - nvim-session-manager.enable = isMaximal; + nvim-session-manager.enable = false; }; vim.gestures = { diff --git a/docs/release-notes/rl-0.4.adoc b/docs/release-notes/rl-0.4.adoc index 32e0b1f..0f65fea 100644 --- a/docs/release-notes/rl-0.4.adoc +++ b/docs/release-notes/rl-0.4.adoc @@ -43,7 +43,7 @@ https://github.com/notashelf[notashelf]: * Added <> for configuring Neovim's cursorlineOpt. -* Added <>, default false, to enable cursorline in nvimtre. +* Added `filetree.nvimTreeLua.view.cursorline`, default false, to enable cursorline in nvimtre. * Added Fidget.nvim support for the Catppuccin theme. diff --git a/lib/lua.nix b/lib/lua.nix index 75f96e1..1d4cdb9 100644 --- a/lib/lua.nix +++ b/lib/lua.nix @@ -13,12 +13,17 @@ else "'${value}'"; # convert an expression to lua + expToLua = exp: if builtins.isList exp - then listToLuaTable exp + then listToLuaTable exp # if list, convert to lua table else if builtins.isAttrs exp - then attrsetToLuaTable exp - else ("\"" + builtins.toJSON exp + "\""); + then attrsetToLuaTable exp # if attrs, convert to table + else if builtins.isBool exp + then lib.boolToString exp # if bool, convert to string + else if builtins.isInt exp + then builtins.toString exp # if int, convert to string + else (builtins.toJSON exp); # otherwise jsonify the value and print as is # convert list to a lua table listToLuaTable = list: diff --git a/modules/filetree/default.nix b/modules/filetree/default.nix index c9a44c3..fdceb6a 100644 --- a/modules/filetree/default.nix +++ b/modules/filetree/default.nix @@ -1,5 +1,5 @@ _: { imports = [ - ./nvimtree-lua + ./nvimtree ]; } diff --git a/modules/filetree/nvimtree-lua/config.nix b/modules/filetree/nvimtree-lua/config.nix deleted file mode 100644 index 3267d47..0000000 --- a/modules/filetree/nvimtree-lua/config.nix +++ /dev/null @@ -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" mappings.toggle.description) - (mkBinding cfg.mappings.refresh ":NvimTreeRefresh" mappings.refresh.description) - (mkBinding cfg.mappings.findFile ":NvimTreeFindFile" mappings.findFile.description) - (mkBinding cfg.mappings.focus ":NvimTreeFocus" 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)} - }, - }, - }) - ''; - }; -} diff --git a/modules/filetree/nvimtree-lua/nvimtree-lua.nix b/modules/filetree/nvimtree-lua/nvimtree-lua.nix deleted file mode 100644 index 4fe9d6f..0000000 --- a/modules/filetree/nvimtree-lua/nvimtree-lua.nix +++ /dev/null @@ -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 = ""; - description = "Toggle NvimTree"; - }; - refresh = mkOption { - type = types.nullOr types.str; - default = "tr"; - description = "Refresh NvimTree"; - }; - findFile = mkOption { - type = types.nullOr types.str; - default = "tg"; - description = "Find file in NvimTree"; - }; - focus = mkOption { - type = types.nullOr types.str; - default = "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; - }; - }; - }; - }; - }; - }; -} diff --git a/modules/filetree/nvimtree/config.nix b/modules/filetree/nvimtree/config.nix new file mode 100644 index 0000000..79ae21f --- /dev/null +++ b/modules/filetree/nvimtree/config.nix @@ -0,0 +1,308 @@ +{ + 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" mappings.toggle.description) + (mkBinding cfg.mappings.refresh ":NvimTreeRefresh" mappings.refresh.description) + (mkBinding cfg.mappings.findFile ":NvimTreeFindFile" mappings.findFile.description) + (mkBinding cfg.mappings.focus ":NvimTreeFocus" mappings.focus.description) + ]; + + vim.luaConfigRC.nvimtreelua = nvim.dag.entryAnywhere '' + ${ + lib.optionalString (cfg.disableNetrw) '' + -- disable netrew completely + 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 = { + centralize_selection = ${boolToString cfg.view.centralizeSelection}, + cursorline = ${boolToString cfg.view.cursorline}, + debounce_delay = ${toString cfg.view.debounceDelay}, + width = ${nvim.lua.expToLua cfg.view.width}, + 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 = { + relative = "${cfg.view.float.openWinConfig.relative}", + border = "${cfg.view.float.openWinConfig.border}", + width = ${toString cfg.view.float.openWinConfig.width}, + height = ${toString cfg.view.float.openWinConfig.height}, + row = ${toString cfg.view.float.openWinConfig.row}, + col = ${toString cfg.view.float.openWinConfig.col}, + }, + }, + }, + + 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}, + }, + + special_files = ${nvim.lua.listToLuaTable cfg.renderer.specialFiles}, + symlink_destination = ${boolToString cfg.renderer.symlinkDestination}, + + 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}", + }, + }, + }, + }, + + 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}, + }, + }, + }) + + -- autostart behaviour + ${ + 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 }) + '' + } + ''; + }; +} diff --git a/modules/filetree/nvimtree-lua/default.nix b/modules/filetree/nvimtree/default.nix similarity index 65% rename from modules/filetree/nvimtree-lua/default.nix rename to modules/filetree/nvimtree/default.nix index a041720..730ee5f 100644 --- a/modules/filetree/nvimtree-lua/default.nix +++ b/modules/filetree/nvimtree/default.nix @@ -1,6 +1,6 @@ _: { imports = [ ./config.nix - ./nvimtree-lua.nix + ./nvimtree.nix ]; } diff --git a/modules/filetree/nvimtree/nvimtree.nix b/modules/filetree/nvimtree/nvimtree.nix new file mode 100644 index 0000000..034c794 --- /dev/null +++ b/modules/filetree/nvimtree/nvimtree.nix @@ -0,0 +1,1109 @@ +{ + pkgs, + lib, + ... +}: +with lib; +with builtins; { + options.vim.filetree.nvimTree = { + enable = mkEnableOption "filetree via nvim-tree.lua"; + + mappings = { + toggle = mkOption { + type = types.nullOr types.str; + default = "t"; + description = "Toggle NvimTree"; + }; + refresh = mkOption { + type = types.nullOr types.str; + default = "tr"; + description = "Refresh NvimTree"; + }; + findFile = mkOption { + type = types.nullOr types.str; + default = "tg"; + description = "Find file in NvimTree"; + }; + focus = mkOption { + type = types.nullOr types.str; + default = "tf"; + description = "Focus NvimTree"; + }; + }; + + 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; + }; + + autoreloadOnWrite = mkOption { + default = true; + description = "Auto reload tree on write"; + type = types.bool; + }; + + updateFocusedFile = mkOption { + description = '' + Update the focused file on `BufEnter`, un-collapses the folders recursively + until it finds the file. + ''; + default = {}; + type = types.submodule { + options = { + enable = mkOption { + type = types.bool; + default = false; + description = "update focused file"; + }; + + updateRoot = mkOption { + type = types.bool; + default = false; + description = '' + Update the root directory of the tree if the file is not under current + root directory. It prefers vim's cwd and `root_dirs`. + Otherwise it falls back to the folder containing the file. + Only relevant when `update_focused_file.enable` is `true` + ''; + }; + + ignoreList = mkOption { + type = with types; listOf str; + default = []; + description = '' + List of buffer names and filetypes that will not update the root dir + of the tree if the file isn't found under the current root directory. + Only relevant when `update_focused_file.update_root` and + `update_focused_file.enable` are `true`. + ''; + }; + }; + }; + }; + + sort = { + # TODO: function as a possible type + sorter = mkOption { + default = "name"; + description = "How files within the same directory are sorted."; + type = types.enum ["name" "extension" "modification_time" "case_sensitive" "suffix" "filetype"]; + }; + + foldersFirst = mkOption { + default = true; + description = "Sort folders before files. Has no effect when `sort.sorter` is a function."; + type = types.bool; + }; + }; + + 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; + }; + + rootDirs = mkOption { + default = []; + description = '' + Preferred root directories. Only relevant when `updateFocusedFile.updateRoot` is `true` + ''; + type = with types; listOf str; + }; + + preferStartupRoot = mkOption { + default = false; + description = '' + Prefer startup root directory when updating root directory of the tree. + Only relevant when `update_focused_file.update_root` is `true` + ''; + type = types.bool; + }; + + syncRootWithCwd = mkOption { + type = types.bool; + default = false; + description = '' + Changes the tree root directory on `DirChanged` and refreshes the tree. + Only relevant when `updateFocusedFile.updateRoot` is `true` + + (previously `update_cwd`) + ''; + }; + + reloadOnBufEnter = mkOption { + default = false; + type = types.bool; + description = "Automatically reloads the tree on `BufEnter` nvim-tree."; + }; + + respectBufCwd = mkOption { + default = false; + type = types.bool; + description = "Will change cwd of nvim-tree to that of new buffer's when opening nvim-tree."; + }; + + hijackDirectories = mkOption { + description = "hijack new directory buffers when they are opened (`:e dir`)."; + + default = { + enable = true; + autoOpen = false; + }; + + type = types.submodule { + options = { + enable = mkOption { + type = types.bool; + description = '' + Enable the `hijack_directories` feature. Disable this option if you use vim-dirvish or dirbuf.nvim. + If `hijack_netrw` and `disable_netrw` are `false`, this feature will be disabled. + ''; + }; + + autoOpen = mkOption { + type = types.bool; + description = '' + Opens the tree if the tree was previously closed. + ''; + }; + }; + }; + }; + + systemOpen = { + args = mkOption { + default = []; + description = "Optional argument list."; + type = with types; listOf str; + }; + + cmd = mkOption { + default = "${pkgs.xdg-utils}/bin/xdg-open"; + description = "The open command itself"; + type = types.str; + }; + }; + + diagnostics = mkOption { + description = '' + Show LSP and COC diagnostics in the signcolumn + Note that the modified sign will take precedence over the diagnostics signs. + ''; + + default = {}; + + type = types.submodule { + options = { + enable = mkEnableOption "Enable diagnostics view in the signcolumn."; + + debounceDelay = mkOption { + description = "Idle milliseconds between diagnostic event and update."; + type = types.int; + default = 50; + }; + + showOnDirs = mkOption { + description = "Show diagnostic icons on parent directories."; + default = false; + }; + + showOnOpenDirs = mkOption { + type = types.bool; + default = true; + description = '' + Show diagnostics icons on directories that are open. + Only relevant when `diagnostics.show_on_dirs` is `true`. + ''; + }; + + icons = mkOption { + description = "Icons for diagnostic severity."; + default = {}; + type = types.submodule { + options = { + hint = mkOption { + description = "Icon used for `hint` diagnostic."; + type = types.str; + default = ""; + }; + info = mkOption { + description = "Icon used for `info` diagnostic."; + type = types.str; + default = ""; + }; + warning = mkOption { + description = "Icon used for `warning` diagnostic."; + type = types.str; + default = ""; + }; + error = mkOption { + description = "Icon used for `error` diagnostic."; + type = types.str; + default = ""; + }; + }; + }; + }; + + severity = mkOption { + description = "Severity for which the diagnostics will be displayed. See `:help diagnostic-severity`"; + default = {}; + type = types.submodule { + options = { + min = mkOption { + description = "Minimum severity."; + type = types.enum ["HINT" "INFO" "WARNING" "ERROR"]; + default = "HINT"; + }; + + max = mkOption { + description = "Maximum severity."; + type = types.enum ["HINT" "INFO" "WARNING" "ERROR"]; + default = "ERROR"; + }; + }; + }; + }; + }; + }; + }; + + git = { + enable = mkEnableOption "Git integration with icons and colors."; + + showOnDirs = mkOption { + type = types.bool; + default = true; + description = "Show git icons on parent directories."; + }; + + showOnOpenDirs = mkOption { + type = types.bool; + default = true; + description = "Show git icons on directories that are open."; + }; + + disableForDirs = mkOption { + type = with types; listOf str; + default = []; + description = '' + Disable git integration when git top-level matches these paths. + May be relative, evaluated via `":p"` + ''; + }; + + timeout = mkOption { + type = types.int; + default = 400; + description = '' + Kills the git process after some time if it takes too long. + Git integration will be disabled after 10 git jobs exceed this timeout. + ''; + }; + }; + + modified = mkOption { + description = "Indicate which file have unsaved modification."; + default = {}; + type = types.submodule { + options = { + enable = mkEnableOption "Modified files with icons and color highlight."; + + showOnDirs = mkOption { + type = types.bool; + description = "Show modified icons on parent directories."; + default = true; + }; + + showOnOpenDirs = mkOption { + type = types.bool; + description = "Show modified icons on directories that are open."; + default = true; + }; + }; + }; + }; + + filesystemWatchers = mkOption { + description = '' + Will use file system watcher (libuv fs_event) to watch the filesystem for changes. + Using this will disable BufEnter / BufWritePost events in nvim-tree which + were used to update the whole tree. With this feature, the tree will be + updated only for the appropriate folder change, resulting in better + performance. + ''; + default = {}; + type = types.submodule { + options = { + enable = mkOption { + description = "Enable filesystem watchers."; + type = types.bool; + default = true; + }; + + debounceDelay = mkOption { + description = "Idle milliseconds between filesystem change and action."; + type = types.int; + default = 50; + }; + + ignoreDirs = mkOption { + type = with types; listOf str; + default = []; + description = '' + List of vim regex for absolute directory paths that will not be watched. + Backslashes must be escaped e.g. `"my-project/\\.build$"`. + Useful when path is not in `.gitignore` or git integration is disabled. + ''; + }; + }; + }; + }; + + selectPrompts = mkEnableOption '' + Use `vim.ui.select` style prompts. Necessary when using a UI prompt decorator such as dressing.nvim or telescope-ui-select.nvim + ''; + + view = mkOption { + description = "Window / buffer setup."; + default = {}; + type = types.submodule { + options = { + centralizeSelection = mkOption { + description = "If true, reposition the view so that the current node is initially centralized when entering nvim-tree."; + type = types.bool; + default = false; + }; + + cursorline = mkOption { + description = "Enable cursorline in nvim-tree window."; + type = types.bool; + default = true; + }; + + debounceDelay = mkOption { + type = types.int; + default = 15; + description = '' + Idle milliseconds before some reload / refresh operations. + Increase if you experience performance issues around screen refresh. + ''; + }; + + width = mkOption { + description = '' + Width of the window: can be a `%` string, a number representing columns, a + function or a table. + + A table (an attribute set in our case, see example) indicates that the view should be dynamically sized based on the + longest line. + ''; + type = with types; oneOf [int attrs]; + default = 30; + example = literalExpression '' + { + min = 30; + max = -1; + padding = 1; + } + ''; + }; + + side = mkOption { + description = "Side of the tree."; + type = types.enum ["left" "right"]; + default = "left"; + }; + + preserveWindowProportions = mkOption { + description = '' + Preserves window proportions when opening a file. + If `false`, the height and width of windows other than nvim-tree will be equalized. + ''; + type = types.bool; + default = false; + }; + + number = mkOption { + description = "Print the line number in front of each line."; + type = types.bool; + default = false; + }; + + relativenumber = mkOption { + description = '' + Show the line number relative to the line with the cursor in front of each line. + If the option `view.number` is also `true`, the number on the cursor line + will be the line number instead of `0`. + ''; + type = types.bool; + default = false; + }; + + signcolumn = mkOption { + description = ''Show diagnostic sign column. Value can be `"yes"`, `"auto"` or`"no"`.''; + type = types.enum ["yes" "auto" "no"]; + default = "yes"; + }; + + float = mkOption { + description = "Configuration options for floating window."; + + default = {}; + type = types.submodule { + options = { + enable = mkOption { + description = "If true, tree window will be floating."; + type = types.bool; + default = false; + }; + + quitOnFocusLoss = mkOption { + description = "Close the floating tree window when it loses focus."; + type = types.bool; + default = true; + }; + + openWinConfig = mkOption { + description = "Floating window config. See `:h nvim_open_win()` for more details."; + type = types.attrs; + default = { + relative = "editor"; + border = "rounded"; + width = 30; + height = 30; + row = 1; + col = 1; + }; + }; + }; + }; + }; + }; + }; + }; + + renderer = { + addTrailing = mkOption { + default = false; + description = "Appends a trailing slash to folder names."; + type = types.bool; + }; + + groupEmpty = mkOption { + default = false; + description = "Compact folders that only contain a single folder into one node in the file tree."; + type = types.bool; + }; + + fullName = mkOption { + default = false; + description = "Display node whose name length is wider than the width of nvim-tree window in floating window."; + type = types.bool; + }; + + highlightGit = mkOption { + type = types.bool; + default = false; + description = '' + Enable file highlight for git attributes using `NvimTreeGit` highlight groups. + Requires `nvim-tree.git.enable` + This can be used with or without the icons. + ''; + }; + + highlightOpenedFiles = mkOption { + type = types.enum ["none" "icon" "name" "all"]; + default = "none"; + description = '' + Highlight icons and/or names for bufloaded() files using the + `NvimTreeOpenedFile` highlight group. + ''; + }; + + highlightModified = mkOption { + type = types.enum ["none" "icon" "name" "all"]; + default = "none"; + description = '' + Highlight modified files in the tree using `NvimTreeNormal` highlight group. + Requires `nvim-tree.view.highlightOpenedFiles` + ''; + }; + + rootFolderLabel = mkOption { + type = with types; oneOf [str bool]; + default = false; + example = ''"":~:s?$?/..?"''; + description = '' + In what format to show root folder. See `:help filename-modifiers` for + available `string` options. + Set to `false` to hide the root folder. + + Function is passed the absolute path of the root folder and should + return a string. e.g. + my_root_folder_label = function(path) + return ".../" .. vim.fn.fnamemodify(path, ":t") + end + ''; + }; + + indentWidth = mkOption { + type = with types; addCheck int (x: x >= 1); + default = 2; + description = "Number of spaces for an each tree nesting level. Minimum 1."; + }; + + indentMarkers = mkOption { + description = "Configuration options for tree indent markers."; + default = {}; + type = types.submodule { + options = { + enable = mkEnableOption "Display indent markers when folders are open."; + inlineArrows = mkOption { + type = types.bool; + default = true; + description = "Display folder arrows in the same column as indent marker when using `renderer.icons.show.folder_arrow`"; + }; + + icons = mkOption { + type = types.attrs; + default = { + corner = "└"; + edge = "│"; + item = "│"; + bottom = "─"; + none = ""; + }; + }; + }; + }; + }; + + specialFiles = mkOption { + type = with types; listOf str; + default = ["Cargo.toml" "README.md" "readme.md" "Makefile" "MAKEFILE" "flake.nix"]; # ;) + description = "A list of filenames that gets highlighted with `NvimTreeSpecialFile"; + }; + + symlinkDestination = mkOption { + type = types.bool; + default = true; + description = "Whether to show the destination of the symlink."; + }; + + icons = mkOption { + description = "Configuration options for icons."; + default = {}; + type = types.submodule { + options = { + webdevColors = mkOption { + type = types.bool; + description = " Use the webdev icon colors, otherwise `NvimTreeFileIcon`"; + default = true; + }; + + gitPlacement = mkOption { + type = types.enum ["before" "after" "signcolumn"]; + description = "Place where the git icons will be rendered. `signcolumn` requires `view.signcolumn` to be enabled."; + default = "before"; + }; + + modifiedPlacement = mkOption { + type = types.enum ["before" "after" "signcolumn"]; + description = "Place where the modified icons will be rendered. `signcolumn` requires `view.signcolumn` to be enabled."; + default = "after"; + }; + + padding = mkOption { + type = types.str; + description = "Inserted between icon and filename"; + default = " "; + }; + + symlinkArrow = mkOption { + type = types.str; + description = "Used as a separator between symlinks' source and target."; + default = " ➛ "; + }; + + show = { + file = mkOption { + type = types.bool; + description = "Show an icon before the file name. `nvim-web-devicons` will be used if available."; + default = true; + }; + + folder = mkOption { + type = types.bool; + description = "Show an icon before the folder name."; + default = true; + }; + + folderArrow = mkOption { + type = types.bool; + default = true; + description = '' + Show a small arrow before the folder node. Arrow will be a part of the + node when using `renderer.indent_markers`. + ''; + }; + + git = mkOption { + type = types.bool; + default = false; + description = '' + Show a git status icon, see `renderer.icons.gitPlacement` + Requires `git.enable` to be true. + ''; + }; + + modified = mkOption { + type = types.bool; + default = true; + description = '' + Show a modified icon, see `renderer.icons.modifiedPlacement` + Requires `modified.enable` to be true. + ''; + }; + }; + glyphs = mkOption { + description = '' + Configuration options for icon glyphs. + NOTE: Do not set any glyphs to more than two characters if it's going + to appear in the signcolumn. + ''; + default = {}; + type = types.submodule { + options = { + default = mkOption { + type = types.str; + description = "Glyph for files. Will be overridden by `nvim-web-devicons` if available."; + default = ""; + }; + + symlink = mkOption { + type = types.str; + description = "Glyph for symlinks."; + default = ""; + }; + + modified = mkOption { + type = types.str; + description = "Icon to display for modified files."; + default = ""; + }; + + # TODO: hardcode each attribute + folder = mkOption { + type = types.attrs; + description = "Glyphs for directories. Recommended to use the defaults unless you know what you are doing."; + default = { + default = ""; + open = ""; + arrowOpen = ""; + arrowClosed = ""; + empty = ""; + emptyOpen = ""; + symlink = ""; + symlinkOpen = ""; + }; + }; + + git = mkOption { + type = types.attrs; + description = "Glyphs for git status."; + default = { + unstaged = "✗"; + staged = "✓"; + unmerged = ""; + renamed = "➜"; + untracked = "★"; + deleted = ""; + ignored = "◌"; + }; + }; + }; + }; + }; + }; + }; + }; + }; + + filters = mkOption { + description = "Filtering options."; + + default = { + gitIgnored = false; + dotfiles = false; + gitClean = false; + noBuffer = false; + exclude = []; + }; + type = types.submodule { + options = { + gitIgnored = mkOption { + type = types.bool; + description = "Ignore files based on `.gitignore`. Requires git.enable` to be `true`"; + default = false; + }; + + dotfiles = mkOption { + type = types.bool; + description = "Do not show dotfiles: files starting with a `.`"; + default = false; + }; + + gitClean = mkOption { + type = types.bool; + default = false; + + description = '' + Do not show files with no git status. This will show ignored files when + `nvim-tree.filters.git_ignored` is set, as they are effectively dirty. + ''; + }; + + noBuffer = mkOption { + type = types.bool; + default = false; + description = "Do not show files that have no `buflisted()` buffer."; + }; + + exclude = mkOption { + type = with types; listOf str; + default = []; + description = "List of directories or files to exclude from filtering: always show them."; + }; + }; + }; + }; + + trash = mkOption { + description = "Configuration options for trashing."; + default = { + cmd = "${pkgs.glib}/bin/gio trash"; + }; + + type = types.submodule { + options = { + cmd = mkOption { + type = types.str; + description = "The command used to trash items"; + }; + }; + }; + }; + + actions = mkOption { + description = "Configuration for various actions."; + default = {}; + type = types.submodule { + options = { + useSystemClipboard = mkOption { + type = types.bool; + default = true; + description = '' + A boolean value that toggle the use of system clipboard when copy/paste + function are invoked. When enabled, copied text will be stored in registers + '+' (system), otherwise, it will be stored in '1' and '"'. + ''; + }; + + # change_dir actions + changeDir = mkOption { + description = "vim `change-directory` behaviour"; + default = {}; + type = types.submodule { + options = { + enable = mkOption { + type = types.bool; + default = true; + description = "Change the working directory when changing directories in the tree."; + }; + + global = mkOption { + type = types.bool; + default = false; + description = '' + Use `:cd` instead of `:lcd` when changing directories. + Consider that this might cause issues with the `nvim-tree.syncRootWithCwd` option. + ''; + }; + + restrictAboveCwd = mkOption { + type = types.bool; + default = false; + description = '' + Restrict changing to a directory above the global current working directory. + ''; + }; + }; + }; + }; + + # expand_all actions + expandAll = mkOption { + description = "Configuration for expand_all behaviour."; + default = {}; + type = types.submodule { + options = { + maxFolderDiscovery = mkOption { + type = types.int; + default = 300; + description = '' + Limit the number of folders being explored when expanding every folders. + Avoids hanging neovim when running this action on very large folders. + ''; + }; + exclude = mkOption { + type = with types; listOf str; + description = "A list of directories that should not be expanded automatically."; + default = [".git" "target" "build" "result"]; + }; + }; + }; + }; + + # file_popup actions + filePopup = mkOption { + description = "Configuration for file_popup behaviour."; + default = {}; + type = types.submodule { + options = { + openWinConfig = mkOption { + type = types.attrs; + default = { + col = 1; + row = 1; + relative = "cursor"; + border = "rounded"; + style = "minimal"; + }; + description = "Floating window config for file_popup. See |nvim_open_win| for more details."; + }; + }; + }; + }; + + # open_file actions + openFile = mkOption { + description = "Configuration options for opening a file from nvim-tree."; + default = {}; + type = types.submodule { + options = { + quitOnOpen = mkOption { + type = types.bool; + description = "Closes the explorer when opening a file."; + default = false; + }; + + eject = mkOption { + type = types.bool; + description = "Prevent new opened file from opening in the same window as the tree."; + default = false; + }; + + resizeWindow = mkOption { + type = types.bool; + default = false; + + description = "Resizes the tree when opening a file. Previously `view.auto_resize`"; + }; + + windowPicker = mkOption { + description = "window_picker"; + default = {}; + type = types.submodule { + options = { + enable = mkOption { + type = types.bool; + description = "Enable the window picker. If this feature is not enabled, files will open in window from which you last opened the tree."; + default = false; + }; + + picker = mkOption { + type = types.str; + default = "default"; + description = '' + Change the default window picker, can be a string `"default"` or a function. + The function should return the window id that will open the node, + or `nil` if an invalid window is picked or user cancelled the action. + + The picker may create a new window. + ''; + + example = literalExpression '' + -- with s1n7ax/nvim-window-picker plugin + require('window-picker').pick_window, + ''; + }; + + chars = mkOption { + type = types.str; + description = "A string of chars used as identifiers by the window picker."; + default = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"; + }; + + exclude = { + filetype = mkOption { + type = with types; listOf str; + description = "A list of filetypes to exclude from the window picker."; + default = ["notify" "packer" "qf" "diff" "fugitive" "fugitiveblame"]; + }; + + buftype = mkOption { + type = with types; listOf str; + description = "A list of buftypes to exclude from the window picker."; + default = ["nofile" "terminal" "help"]; + }; + }; + }; + }; + }; + }; + }; + }; + + removeFile = { + closeWindow = mkOption { + type = types.bool; + default = true; + description = "Close any window displaying a file when removing the file from the tree"; + }; + }; + }; + }; + }; + + liveFilter = mkOption { + description = '' + Configurations for the live_filtering feature. + The live filter allows you to filter the tree nodes dynamically, based on + regex matching (see `vim.regex`). + This feature is bound to the `f` key by default. + The filter can be cleared with the `F` key by default. + ''; + default = {}; + type = types.submodule { + options = { + prefix = mkOption { + type = types.str; + description = "Prefix of the filter displayed in the buffer."; + default = "[FILTER]: "; + }; + + alwaysShowFolders = mkOption { + type = types.bool; + description = "Whether to filter folders or not."; + default = true; + }; + }; + }; + }; + + tab = mkOption { + description = "Configuration for tab behaviour."; + default = {}; + type = types.submodule { + options = { + sync = mkOption { + description = "Configuration for syncing nvim-tree across tabs."; + default = {}; + type = types.submodule { + options = { + open = mkOption { + type = types.bool; + default = false; + description = '' + Opens the tree automatically when switching tabpage or opening a new + tabpage if the tree was previously open. + ''; + }; + + close = mkOption { + type = types.bool; + default = false; + description = '' + Closes the tree across all tabpages when the tree is closed. + ''; + }; + + ignore = mkOption { + type = with types; listOf str; + default = []; + description = '' + List of filetypes or buffer names on new tab that will prevent + `nvim-tree.tab.sync.open` and `nvim-tree.tab.sync.close` + ''; + }; + }; + }; + }; + }; + }; + }; + + notify = mkOption { + description = "Configuration for notifications."; + default = {}; + type = types.submodule { + options = { + threshold = mkOption { + type = types.enum ["ERROR" "WARNING" "INFO" "DEBUG"]; + description = "Specify minimum notification level, uses the values from `vim.log.levels`"; + default = "INFO"; + }; + + absolutePath = mkOption { + type = types.bool; + description = "Whether to use absolute paths or item names in fs action notifications."; + default = true; + }; + }; + }; + }; + + ui = mkOption { + description = "General UI configuration."; + default = {}; + type = types.submodule { + options = { + confirm = { + remove = mkOption { + type = types.bool; + description = "Prompt before removing."; + default = true; + }; + + trash = mkOption { + type = types.bool; + description = "Prompt before trash."; + default = true; + }; + }; + }; + }; + }; + + # kept for backwards compatibility + openOnSetup = mkOption { + default = true; + description = "Open when vim is started on a directory"; + type = types.bool; + }; + }; +} diff --git a/modules/statusline/lualine/config.nix b/modules/statusline/lualine/config.nix index cff8596..9b10824 100644 --- a/modules/statusline/lualine/config.nix +++ b/modules/statusline/lualine/config.nix @@ -23,7 +23,7 @@ in { always_divide_middle = true, globalstatus = ${boolToString cfg.globalStatus}, ignore_focus = {'NvimTree'}, - extensions = {${optionalString config.vim.filetree.nvimTreeLua.enable "'nvim-tree'"}}, + extensions = {${optionalString config.vim.filetree.nvimTree.enable "'nvim-tree'"}}, refresh = { statusline = ${toString cfg.refresh.statusline}, tabline = ${toString cfg.refresh.tabline}, @@ -60,11 +60,6 @@ in { } }, ''} - extensions = {${ - if (config.vim.filetree.nvimTreeLua.enable) - then "\"nvim-tree\"" - else "" - }}, } ''; }; diff --git a/modules/utility/binds/which-key/config.nix b/modules/utility/binds/which-key/config.nix index 8b0fa6c..506d888 100644 --- a/modules/utility/binds/which-key/config.nix +++ b/modules/utility/binds/which-key/config.nix @@ -95,7 +95,7 @@ in { ${ # TODO: This probably will need to be reworked for custom-keybinds - if config.vim.filetree.nvimTreeLua.enable + if config.vim.filetree.nvimTree.enable then '' -- NvimTree ["t"] = { name = "+NvimTree" },