diff --git a/modules/filetree/default.nix b/modules/filetree/default.nix index 18441b5..c9a44c3 100644 --- a/modules/filetree/default.nix +++ b/modules/filetree/default.nix @@ -1,10 +1,5 @@ -{ - pkgs, - lib, - config, - ... -}: { +_: { imports = [ - ./nvimtreelua.nix + ./nvimtree-lua ]; } diff --git a/modules/filetree/nvimtree-lua/config.nix b/modules/filetree/nvimtree-lua/config.nix new file mode 100644 index 0000000..fd72530 --- /dev/null +++ b/modules/filetree/nvimtree-lua/config.nix @@ -0,0 +1,131 @@ +{ + pkgs, + config, + lib, + ... +}: +with lib; +with builtins; let + cfg = config.vim.filetree.nvimTreeLua; +in { + config = mkIf cfg.enable { + vim.startPlugins = ["nvim-tree-lua"]; + + vim.nnoremap = { + "" = ":NvimTreeToggle"; + "tr" = ":NvimTreeRefresh"; + "tg" = ":NvimTreeFindFile"; + "tf" = ":NvimTreeFocus"; + }; + + 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}, + hide_root_folder = ${boolToString cfg.view.hideRootFolder}, + }, + git = { + enable = ${boolToString cfg.git.enable}, + ignore = ${boolToString cfg.git.ignore}, + }, + + filesystem_watchers = { + enable = ${boolToString cfg.filesystemWatchers.enable}, + }, + + actions = { + 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}, + }, + + 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/default.nix b/modules/filetree/nvimtree-lua/default.nix new file mode 100644 index 0000000..a041720 --- /dev/null +++ b/modules/filetree/nvimtree-lua/default.nix @@ -0,0 +1,6 @@ +_: { + imports = [ + ./config.nix + ./nvimtree-lua.nix + ]; +} diff --git a/modules/filetree/nvimtreelua.nix b/modules/filetree/nvimtree-lua/nvimtree-lua.nix similarity index 78% rename from modules/filetree/nvimtreelua.nix rename to modules/filetree/nvimtree-lua/nvimtree-lua.nix index 2aa0792..cf3ee4f 100644 --- a/modules/filetree/nvimtreelua.nix +++ b/modules/filetree/nvimtree-lua/nvimtree-lua.nix @@ -15,6 +15,12 @@ in { description = "Enable nvim-tree-lua"; }; + sortBy = mkOption { + default = "name"; + description = "Sort by name or extension"; + type = types.enum ["name" "extension" "modification_time" "case_sensitive"]; + }; + treeSide = mkOption { default = "left"; description = "Side the tree will appear on left or right"; @@ -132,7 +138,7 @@ in { }; hijackCursor = mkOption { - default = true; + default = false; description = "Hijack the cursor in the tree to put it at the start of the filename"; type = types.bool; }; @@ -211,6 +217,38 @@ in { 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; + }; }; }; @@ -280,7 +318,6 @@ in { type = types.bool; }; }; - glyphs = { default = mkOption { default = ""; @@ -377,79 +414,4 @@ in { }; }; }; - - config = mkIf cfg.enable { - vim.startPlugins = ["nvim-tree-lua"]; - - vim.nnoremap = { - "" = ":NvimTreeToggle"; - "tr" = ":NvimTreeRefresh"; - "tg" = ":NvimTreeFindFile"; - "tf" = ":NvimTreeFocus"; - }; - - vim.luaConfigRC.nvimtreelua = nvim.dag.entryAnywhere '' - require'nvim-tree'.setup({ - disable_netrw = ${boolToString cfg.disableNetRW}, - hijack_netrw = ${boolToString cfg.hijackNetRW}, - hijack_cursor = ${boolToString cfg.hijackCursor}, - open_on_tab = ${boolToString cfg.openTreeOnNewTab}, - -- FIXME: Open on startup has been deprecated - -- needs an alternative, see https://github.com/nvim-tree/nvim-tree.lua/wiki/Open-At-Startup3 - -- open_on_setup = ${boolToString cfg.openOnSetup}, - -- open_on_setup_file = ${boolToString cfg.openOnSetup}, - 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}, - hide_root_folder = ${boolToString cfg.view.hideRootFolder}, - }, - git = { - enable = ${boolToString cfg.git.enable}, - ignore = ${boolToString cfg.git.ignore}, - }, - - filesystem_watchers = { - enable = ${boolToString cfg.filesystemWatchers.enable}, - }, - - actions = { - open_file = { - quit_on_open = ${boolToString cfg.actions.openFile.quitOnOpen}, - resize_window = ${boolToString cfg.actions.openFile.resizeWindow}, - }, - }, - - 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}, - }, - - 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)} - }, - }, - }) - ''; - }; }