1
0
Fork 0
mirror of https://github.com/nix-community/nixvim.git synced 2025-11-08 19:46:06 +01:00

plugins/navbuddy: migrate to mkNeovimPlugin

Signed-off-by: saygo-png <saygo.mail@proton.me>
This commit is contained in:
saygo-png 2025-10-09 18:46:32 +02:00 committed by Gaétan Lepage
parent c660702482
commit 92793f84ca
3 changed files with 279 additions and 367 deletions

View file

@ -1,273 +1,32 @@
{ { lib, ... }:
lib,
helpers,
config,
pkgs,
...
}:
with lib;
let let
cfg = config.plugins.navbuddy; inherit (lib.nixvim) nestedLiteralLua;
percentageType = types.ints.between 0 100;
mkPercentageOpt = default: helpers.defaultNullOpts.mkNullable percentageType (toString default);
in in
{ lib.nixvim.plugins.mkNeovimPlugin {
options.plugins.navbuddy = lib.nixvim.plugins.neovim.extraOptionsOptions // { name = "navbuddy";
enable = mkEnableOption "nvim-navbuddy"; package = "nvim-navbuddy";
moduleName = "nvim-navbuddy";
description = "A simple popup display that provides a breadcrumbs feature using an LSP server.";
maintainers = [ ];
package = lib.mkPackageOption pkgs "nvim-navbuddy" { # TODO: introduced 2025-10-10: remove after 26.05
default = [ inherit (import ./deprecations.nix lib) deprecateExtraOptions optionsRenamedToSettings imports;
"vimPlugins"
"nvim-navbuddy" settingsExample = {
]; lsp.auto_attach = true;
use_default_mapping = true;
mappings = {
"<esc>" = nestedLiteralLua "require('nvim-navbuddy.actions').close()";
"q" = nestedLiteralLua "require('nvim-navbuddy.actions').close()";
"j" = nestedLiteralLua "require('nvim-navbuddy.actions').next_sibling()";
"k" = nestedLiteralLua "require('nvim-navbuddy.actions').previous_sibling()";
"<C-v>" = nestedLiteralLua "require('nvim-navbuddy.actions').vsplit()";
"<C-s>" = nestedLiteralLua "require('nvim-navbuddy.actions').hsplit()";
}; };
icons = {
window = { Array = "> ";
border = helpers.defaultNullOpts.mkBorder "rounded" "window border" '' Boolean = "> ";
"rounded", "double", "solid", "none" or an array with eight chars building up the border in a clockwise fashion Class = "> ";
starting with the top-left corner. eg: { "", "" ,"", "", "", "", "", "" }.
'';
size = helpers.defaultNullOpts.mkNullable (
with types;
either percentageType (submodule {
options = {
height = mkPercentageOpt 40 "The height size (in %).";
width = mkPercentageOpt 100 "The width size (in %).";
};
})
) 60 "The size of the window.";
position = helpers.defaultNullOpts.mkNullable (
with types;
either percentageType (submodule {
options = {
height = mkPercentageOpt 40 "The height size (in %).";
width = mkPercentageOpt 100 "The width size (in %).";
};
})
) 50 "The position of the window.";
scrolloff = helpers.mkNullOrOption types.int ''
scrolloff value within navbuddy window
'';
sections = {
left = {
size = mkPercentageOpt 20 "The height size (in %).";
border = helpers.defaultNullOpts.mkBorder "rounded" "left section border" ''
"rounded", "double", "solid", "none" or an array with eight chars building up the border in a clockwise fashion
starting with the top-left corner. eg: { "", "" ,"", "", "", "", "", "" }.
'';
};
mid = {
size = mkPercentageOpt 40 "The height size (in %).";
border = helpers.defaultNullOpts.mkBorder "rounded" "mid section border" ''
"rounded", "double", "solid", "none" or an array with eight chars building up the border in a clockwise fashion
starting with the top-left corner. eg: { "", "" ,"", "", "", "", "", "" }.
'';
};
right = {
border = helpers.defaultNullOpts.mkBorder "rounded" "right section border" ''
"rounded", "double", "solid", "none" or an array with eight chars building up the border in a clockwise fashion
starting with the top-left corner. eg: { "", "" ,"", "", "", "", "", "" }.
'';
preview =
helpers.defaultNullOpts.mkEnumFirstDefault
[
"leaf"
"always"
"never"
]
''
Right section can show previews too.
Options: "leaf", "always" or "never"
'';
};
};
};
nodeMarkers = {
enabled = helpers.defaultNullOpts.mkBool true "Enable node markers.";
icons = {
leaf = helpers.defaultNullOpts.mkStr " " ''
The icon to use for leaf nodes.
'';
leafSelected = helpers.defaultNullOpts.mkStr " " ''
The icon to use for selected leaf node.
'';
branch = helpers.defaultNullOpts.mkStr " " ''
The icon to use for branch nodes.
'';
};
};
icons = mapAttrs (name: default: helpers.defaultNullOpts.mkStr default "icon for ${name}.") {
File = "󰈙 ";
Module = " ";
Namespace = "󰌗 ";
Package = " ";
Class = "󰌗 ";
Method = "󰆧 ";
Property = " ";
Field = " ";
Constructor = " ";
Enum = "󰕘";
Interface = "󰕘";
Function = "󰊕 ";
Variable = "󰆧 ";
Constant = "󰏿 ";
String = "󰀬 ";
Number = "󰎠 ";
Boolean = " ";
Array = "󰅪 ";
Object = "󰅩 ";
Key = "󰌋 ";
Null = "󰟢 ";
EnumMember = " ";
Struct = "󰌗 ";
Event = " ";
Operator = "󰆕 ";
TypeParameter = "󰊄 ";
};
useDefaultMapping = helpers.defaultNullOpts.mkBool true ''
If set to false, only mappings set by user are set. Else default mappings are used for keys that are not set by user
'';
keymapsSilent = mkOption {
type = types.bool;
description = "Whether navbuddy keymaps should be silent";
default = false;
};
mappings =
helpers.defaultNullOpts.mkAttrsOf types.str
{
"<esc>" = "close";
"q" = "close";
"j" = "next_sibling";
"k" = "previous_sibling";
"h" = "parent";
"l" = "children";
"0" = "root";
"v" = "visual_name";
"V" = "visual_scope";
"y" = "yank_name";
"Y" = "yank_scope";
"i" = "insert_name";
"I" = "insert_scope";
"a" = "append_name";
"A" = "append_scope";
"r" = "rename";
"d" = "delete";
"f" = "fold_create";
"F" = "fold_delete";
"c" = "comment";
"<enter>" = "select";
"o" = "select";
"J" = "move_down";
"K" = "move_up";
"s" = "toggle_preview";
"<C-v>" = "vsplit";
"<C-s>" = "hsplit";
}
''
Actions to be triggered for specified keybindings. It can take either action name i.e `toggle_preview`
Or it can a `rawLua`.
'';
lsp = {
autoAttach = helpers.defaultNullOpts.mkBool false ''
If set to true, you don't need to manually use attach function
'';
preference = helpers.mkNullOrOption (with types; listOf str) ''
list of lsp server names in order of preference
'';
};
sourceBuffer = {
followNode = helpers.defaultNullOpts.mkBool true "Keep the current node in focus on the source buffer";
highlight = helpers.defaultNullOpts.mkBool true "Highlight the currently focused node";
reorient =
helpers.defaultNullOpts.mkEnumFirstDefault
[
"smart"
"top"
"mid"
"none"
]
''
Right section can show previews too.
Options: "leaf", "always" or "never"
'';
scrolloff = helpers.defaultNullOpts.mkInt null ''
scrolloff value when navbuddy is open.
'';
}; };
}; };
config =
let
setupOptions =
with cfg;
{
inherit window;
node_markers = with nodeMarkers; {
inherit enabled;
icons = with icons; {
inherit leaf branch;
leaf_selected = leafSelected;
};
};
inherit icons;
use_default_mapping = useDefaultMapping;
lsp = with lsp; {
auto_attach = autoAttach;
inherit preference;
};
source_buffer = sourceBuffer;
mappings = helpers.ifNonNull' cfg.mappings (
mapAttrs (
key: action: if isString action then helpers.mkRaw "actions.${action}()" else action
) mappings
);
}
// cfg.extraOptions;
in
mkIf cfg.enable {
extraPlugins = [ cfg.package ];
extraConfigLua = ''
local actions = require("nvim-navbuddy.actions")
require('nvim-navbuddy').setup(${lib.nixvim.toLuaObject setupOptions})
'';
};
} }

View file

@ -0,0 +1,114 @@
lib:
let
inherit (lib)
const
genAttrs
mapAttrs
;
inherit (lib.nixvim) ifNonNull' mkRaw;
in
{
deprecateExtraOptions = true;
optionsRenamedToSettings =
map (lib.splitString ".") [
"window.border"
"window.size"
"window.position"
"window.scrolloff"
"window.sections.left.size"
"window.sections.left.border"
"window.sections.mid.size"
"window.sections.mid.border"
"window.sections.right.border"
"window.sections.right.preview"
"nodeMarkers.enabled"
"nodeMarkers.icons.leaf"
"nodeMarkers.icons.leafSelected"
"nodeMarkers.icons.branch"
"useDefaultMapping"
"lsp.autoAttach"
"lsp.preference"
"sourceBuffer.followNode"
"sourceBuffer.highlight"
"sourceBuffer.reorient"
"sourceBuffer.scrolloff"
]
# Move icons to settings without changing case as icons are PascalCase in the plugin config
++
map
(
x:
genAttrs [ "old" "new" ] (const [
"icons"
x
])
)
[
"File"
"Module"
"Namespace"
"Package"
"Class"
"Method"
"Property"
"Field"
"Constructor"
"Enum"
"Interface"
"Function"
"Variable"
"Constant"
"String"
"Number"
"Boolean"
"Array"
"Object"
"Key"
"Null"
"EnumMember"
"Struct"
"Event"
"Operator"
"TypeParameter"
];
imports =
let
basePathAnd = lib.concat [
"plugins"
"navbuddy"
];
in
[
(lib.mkRemovedOptionModule (basePathAnd [ "keymapsSilent" ]) ''
This option has never had any effect.
Please remove it.
'')
(
let
oldOptPath = basePathAnd [ "mappings" ];
in
lib.mkChangedOptionModule oldOptPath
(basePathAnd [
"settings"
"mappings"
])
(
config:
let
old = lib.getAttrFromPath oldOptPath config;
in
ifNonNull' old (
mapAttrs (
_: action:
if builtins.isString action then mkRaw "require('nvim-navbuddy.actions').${action}()" else action
) old
)
)
)
];
}

View file

@ -3,114 +3,153 @@
plugins.navbuddy.enable = true; plugins.navbuddy.enable = true;
}; };
example = {
plugins.navbuddy = {
settings = {
lsp.auto_attach = true;
use_default_mapping = true;
mappings = {
"<esc>".__raw = "require('nvim-navbuddy.actions').close()";
"q".__raw = "require('nvim-navbuddy.actions').close()";
"j".__raw = "require('nvim-navbuddy.actions').next_sibling()";
"k".__raw = "require('nvim-navbuddy.actions').previous_sibling()";
"<C-v>".__raw = "require('nvim-navbuddy.actions').vsplit()";
"<C-s>".__raw = "require('nvim-navbuddy.actions').hsplit()";
};
icons = {
Array = "> ";
Boolean = "> ";
Class = "> ";
};
};
};
};
defaults = { defaults = {
plugins.navbuddy = { plugins.navbuddy = {
enable = true; enable = true;
settings = {
window = { window = {
border = "rounded"; border = "single";
size = { size = "60%";
height = 50; position = "50%";
width = 50; scrolloff.__raw = "nil";
}; sections = {
position = { left = {
height = 50; border.__raw = "nil";
width = 50; size = "20%";
}; win_options.__raw = "nil";
scrolloff = 8; };
sections = { mid = {
left = { border.__raw = "nil";
size = 50; size = "40%";
border = "rounded"; win_options.__empty = { };
}; };
mid = { right = {
size = 50; border.__raw = "nil";
border = "rounded"; preview = "leaf";
}; win_options.__raw = "nil";
right = { };
preview = "always";
border = "rounded";
}; };
}; };
};
nodeMarkers = {
enabled = true;
icons = { icons = {
leaf = " ... "; "1" = "󰈙 ";
leafSelected = " "; "2" = " ";
branch = " 󰆧 "; "3" = "󰌗 ";
"4" = " ";
"5" = "󰌗 ";
"6" = "󰆧 ";
"7" = " ";
"8" = " ";
"9" = " ";
"10" = "󰕘";
"11" = "󰕘";
"12" = "󰊕 ";
"13" = "󰆧 ";
"14" = "󰏿 ";
"15" = " ";
"16" = "󰎠 ";
"17" = " ";
"18" = "󰅪 ";
"19" = "󰅩 ";
"20" = "󰌋 ";
"21" = "󰟢 ";
"22" = " ";
"23" = "󰌗 ";
"24" = " ";
"25" = "󰆕 ";
"26" = "󰊄 ";
"255" = "󰉨 ";
}; };
}; use_default_mappings = true;
icons = { integrations = {
File = "󰆧 "; telescope.__raw = "nil";
Module = " "; snacks.__raw = "nil";
Namespace = "󰌗 "; };
Package = " "; mappings = {
Class = "󰌗 "; "<esc>".__raw = "require('nvim-navbuddy.actions').close()";
Method = "󰆧 "; q.__raw = "require('nvim-navbuddy.actions').close()";
Property = " ";
Field = " "; j.__raw = "require('nvim-navbuddy.actions').next_sibling()";
Constructor = " "; k.__raw = "require('nvim-navbuddy.actions').previous_sibling()";
Enum = "󰕘";
Interface = "󰕘"; h.__raw = "require('nvim-navbuddy.actions').parent()";
Function = "󰊕 "; l.__raw = "require('nvim-navbuddy.actions').children()";
Variable = "󰆧 "; "0".__raw = "require('nvim-navbuddy.actions').root()";
Constant = "󰏿 ";
String = "󰀬 "; v.__raw = "require('nvim-navbuddy.actions').visual_name()";
Number = "󰎠 "; V.__raw = "require('nvim-navbuddy.actions').visual_scope()";
Boolean = " ";
Array = "󰅪 "; y.__raw = "require('nvim-navbuddy.actions').yank_name()";
Object = "󰅩 "; Y.__raw = "require('nvim-navbuddy.actions').yank_scope()";
Key = "󰌋 ";
Null = "󰟢 "; i.__raw = "require('nvim-navbuddy.actions').insert_name()";
EnumMember = " "; I.__raw = "require('nvim-navbuddy.actions').insert_scope()";
Struct = "󰌗 ";
Event = " "; a.__raw = "require('nvim-navbuddy.actions').append_name()";
Operator = "󰆕 "; A.__raw = "require('nvim-navbuddy.actions').append_scope()";
TypeParameter = "󰊄 ";
}; r.__raw = "require('nvim-navbuddy.actions').rename()";
useDefaultMapping = false;
mappings = { d.__raw = "require('nvim-navbuddy.actions').delete()";
"<esc>" = "close";
"q" = "close"; f.__raw = "require('nvim-navbuddy.actions').fold_create()";
"j" = "next_sibling"; F.__raw = "require('nvim-navbuddy.actions').fold_delete()";
"k" = "previous_sibling";
"h" = "parent"; c.__raw = "require('nvim-navbuddy.actions').comment()";
"l" = "children";
"0" = "root"; "<enter>".__raw = "require('nvim-navbuddy.actions').select()";
"v" = "visual_name"; o.__raw = "require('nvim-navbuddy.actions').select()";
"V" = "visual_scope";
"y" = "yank_name"; J.__raw = "require('nvim-navbuddy.actions').move_down()";
"Y" = "yank_scope"; K.__raw = "require('nvim-navbuddy.actions').move_up()";
"i" = "insert_name";
"I" = "insert_scope"; s.__raw = "require('nvim-navbuddy.actions').toggle_preview()";
"a" = "append_name";
"A" = "append_scope"; "<C-v>".__raw = "require('nvim-navbuddy.actions').vsplit()";
"r" = "rename"; "<C-s>".__raw = "require('nvim-navbuddy.actions').hsplit()";
"d" = "delete";
"f" = "fold_create"; "g?".__raw = "require('nvim-navbuddy.actions').help()";
"F" = "fold_delete"; };
"c" = "comment"; lsp = {
"<enter>" = "select"; auto_attach = false;
"o" = "select"; preference.__raw = "nil";
"J" = "move_down"; };
"K" = "move_up"; source_buffer = {
"s" = "toggle_preview"; follow_node = true;
"<C-v>" = "vsplit"; highlight = true;
"<C-s>" = "hsplit"; reorient = "smart";
}; scrolloff.__raw = "nil";
lsp = { };
autoAttach = true; node_markers = {
preference = [ enabled = true;
"clang" icons = {
"pyright" leaf = " ";
]; leaf_selected = " ";
}; branch = " ";
sourceBuffer = { };
followNode = true; };
highlight = true; custom_hl_group.__raw = "nil";
reorient = "top";
scrolloff = 8;
}; };
}; };
}; };