nix-community.nixvim/plugins/by-name/nvim-tree/default.nix
saygo-png a5f5eacbaa
plugins/nvim-tree: migrate to mkNeovimPlugin
Signed-off-by: saygo-png <saygo.mail@proton.me>
2025-07-26 12:59:55 +02:00

156 lines
4.8 KiB
Nix

{
lib,
helpers,
config,
...
}:
let
inherit (lib) mkOption types;
in
lib.nixvim.plugins.mkNeovimPlugin {
name = "nvim-tree";
packPathName = "nvim-tree.lua";
package = "nvim-tree-lua";
maintainers = [ lib.maintainers.saygo-png ];
description = "A file explorer tree for neovim written in lua.";
inherit (import ./deprecations.nix lib) optionsRenamedToSettings deprecateExtraOptions imports;
extraOptions = {
openOnSetup = mkOption {
type = types.bool;
default = false;
description = ''
Will automatically open the tree when running setup if startup buffer is a directory, is
empty or is unnamed. nvim-tree window will be focused.
'';
};
openOnSetupFile = mkOption {
type = types.bool;
default = false;
description = ''
Will automatically open the tree when running setup if startup buffer is a file.
File window will be focused.
File will be found if updateFocusedFile is enabled.
'';
};
ignoreBufferOnSetup = mkOption {
type = types.bool;
default = false;
description = ''
Will ignore the buffer, when deciding to open the tree on setup.
'';
};
ignoreFtOnSetup = mkOption {
type = types.listOf types.str;
default = [ ];
description = ''
List of filetypes that will prevent `open_on_setup` to open.
You can use this option if you don't want the tree to open
in some scenarios (eg using vim startify).
'';
};
autoClose = mkOption {
type = types.bool;
default = false;
description = "Automatically close";
};
};
dependencies = [
"git"
];
extraConfig =
cfg:
let
autoOpenEnabled = cfg.openOnSetup or cfg.openOnSetupFile;
openNvimTreeFunction = ''
local function open_nvim_tree(data)
------------------------------------------------------------------------------------------
-- buffer is a directory
local directory = vim.fn.isdirectory(data.file) == 1
-- buffer is a [No Name]
local no_name = data.file == "" and vim.bo[data.buf].buftype == ""
-- Will automatically open the tree when running setup if startup buffer is a directory,
-- is empty or is unnamed. nvim-tree window will be focused.
local open_on_setup = ${lib.nixvim.toLuaObject cfg.openOnSetup}
if (directory or no_name) and open_on_setup then
-- change to the directory
if directory then
vim.cmd.cd(data.file)
end
-- open the tree
require("nvim-tree.api").tree.open()
return
end
------------------------------------------------------------------------------------------
-- Will automatically open the tree when running setup if startup buffer is a file.
-- File window will be focused.
-- File will be found if updateFocusedFile is enabled.
local open_on_setup_file = ${lib.nixvim.toLuaObject cfg.openOnSetupFile}
-- buffer is a real file on the disk
local real_file = vim.fn.filereadable(data.file) == 1
if (real_file or no_name) and open_on_setup_file then
-- skip ignored filetypes
local filetype = vim.bo[data.buf].ft
local ignored_filetypes = ${lib.nixvim.toLuaObject cfg.ignoreFtOnSetup}
if not vim.tbl_contains(ignored_filetypes, filetype) then
-- open the tree but don't focus it
require("nvim-tree.api").tree.toggle({ focus = false })
return
end
end
------------------------------------------------------------------------------------------
-- Will ignore the buffer, when deciding to open the tree on setup.
local ignore_buffer_on_setup = ${lib.nixvim.toLuaObject cfg.ignoreBufferOnSetup}
if ignore_buffer_on_setup then
require("nvim-tree.api").tree.open()
end
end
'';
in
{
# TODO: added 2024-09-20 remove after 24.11
plugins.web-devicons = lib.mkIf (
!(
config.plugins.mini.enable
&& config.plugins.mini.modules ? icons
&& config.plugins.mini.mockDevIcons
)
) { enable = lib.mkOverride 1490 true; };
autoCmd =
(lib.optional autoOpenEnabled {
event = "VimEnter";
callback = helpers.mkRaw "open_nvim_tree";
})
++ (lib.optional cfg.autoClose {
event = "BufEnter";
command = "if winnr('$') == 1 && bufname() == 'NvimTree_' . tabpagenr() | quit | endif";
nested = true;
});
plugins.nvim-tree.luaConfig.pre = lib.optionalString autoOpenEnabled openNvimTreeFunction;
};
}