From 4301ade29aee15d3ceab6cda7cafd9ff4194c301 Mon Sep 17 00:00:00 2001 From: NotAShelf Date: Thu, 20 Jul 2023 18:34:36 +0300 Subject: [PATCH] feat: make most navbuddy options configurable --- modules/ui/breadcrumbs/breadcrumbs.nix | 136 ++++++++++++++++++++++++- modules/ui/breadcrumbs/config.nix | 73 ++++++------- 2 files changed, 174 insertions(+), 35 deletions(-) diff --git a/modules/ui/breadcrumbs/breadcrumbs.nix b/modules/ui/breadcrumbs/breadcrumbs.nix index 6583b8f6..b8246741 100644 --- a/modules/ui/breadcrumbs/breadcrumbs.nix +++ b/modules/ui/breadcrumbs/breadcrumbs.nix @@ -1,5 +1,139 @@ -{lib, ...}: { +{ + lib, + config, + ... +}: let + inherit (lib) mkEnableOption mkOption types; +in { options.vim.ui.breadcrumbs = { enable = lib.mkEnableOption "breadcrumbs"; + + navbuddy = { + enable = mkEnableOption "navbuddy LSP UI"; + useDefaultMappings = mkEnableOption "default Navbuddy keybindings (disables user keybinds)"; + + window = { + # size = {} + # position = {} + + border = mkOption { + # TODO: let this type accept a custom string + type = types.enum ["single" "rounded" "double" "solid" "none"]; + default = "single"; + description = "border style to use"; + }; + + scrolloff = mkOption { + type = with types; nullOr int; + default = null; + description = "Scrolloff value within navbuddy window"; + }; + + sections = { + # left section + left = { + #size = {} + border = mkOption { + # TODO: let this type accept a custom string + type = with types; nullOr (enum ["single" "rounded" "double" "solid" "none"]); + default = null; + description = "border style to use for the left section of Navbuddy UI"; + }; + }; + + # middle section + mid = { + #size = {} + border = mkOption { + # TODO: let this type accept a custom string + type = with types; nullOr (enum ["single" "rounded" "double" "solid" "none"]); + default = null; + description = "border style to use for the middle section of Navbuddy UI"; + }; + }; + + # right section + # there is no size option for the right section, it fills the remaining space + right = { + border = mkOption { + # TODO: let this type accept a custom string + type = with types; nullOr (enum ["single" "rounded" "double" "solid" "none"]); + default = null; + description = "border style to use for the right section of Navbuddy UI"; + }; + + preview = mkOption { + type = types.enum ["leaf" "always" "never"]; + default = "leaf"; + description = "display mode of the preview on the right section"; + }; + }; + }; + }; + + nodeMarkers = { + enable = mkEnableOption "node markers"; + icons = { + leaf = mkOption { + type = types.str; + default = " "; + description = ""; + }; + + leafSelected = mkOption { + type = types.str; + default = " → "; + description = ""; + }; + + branch = mkOption { + type = types.str; + default = " "; + description = ""; + }; + }; + }; + + lsp = { + autoAttach = mkOption { + type = types.bool; + default = true; + description = "Whether to attach to LSP server manually"; + }; + + preference = mkOption { + type = with types; nullOr (listOf str); + default = null; + description = "list of lsp server names in order of preference"; + }; + }; + + sourceBuffer = { + followNode = mkOption { + type = types.bool; + default = true; + description = "keep the current node in focus on the source buffer"; + }; + + highlight = mkOption { + type = types.bool; + default = true; + description = "highlight the currently focused node"; + }; + + reorient = mkOption { + type = types.enum ["smart" "top" "mid" "none"]; + default = "smart"; + }; + + scrolloff = mkOption { + type = with types; nullOr int; + default = null; + description = "scrolloff value when navbuddy is open"; + }; + }; + + icons = {}; + }; }; } diff --git a/modules/ui/breadcrumbs/config.nix b/modules/ui/breadcrumbs/config.nix index 8ea2d7e7..83eecb3f 100644 --- a/modules/ui/breadcrumbs/config.nix +++ b/modules/ui/breadcrumbs/config.nix @@ -6,6 +6,12 @@ with lib; with builtins; let cfg = config.vim.ui.breadcrumbs; + nb = cfg.navbuddy; + + nilOrStr = v: + if v == null + then "nil" + else toString v; in { config = mkIf cfg.enable { vim.startPlugins = [ @@ -19,41 +25,52 @@ in { local navic = require("nvim-navic") local actions = require("nvim-navbuddy.actions") - + -- TODO: wrap this in an optional string with navbuddy as the enable condition navbuddy.setup { window = { - border = "single", -- "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: { "╔", "═" ,"╗", "║", "╝", "═", "╚", "║" }. - size = "60%", -- Or table format example: { height = "40%", width = "100%"} - position = "50%", -- Or table format example: { row = "100%", col = "0%"} - scrolloff = nil, -- scrolloff value within navbuddy window + border = "${nb.window.border}", -- "rounded", "double", "solid", "none" + size = "60%", + position = "50%", + scrolloff = ${(nilOrStr nb.window.scrolloff)}, sections = { left = { size = "20%", - border = nil, -- You can set border style for each section individually as well. + border = ${(nilOrStr nb.window.sections.left.border)}, }, + mid = { size = "40%", - border = nil, + border = ${(nilOrStr nb.window.sections.mid.border)}, }, + right = { - -- No size option for right most section. It fills to - -- remaining area. - border = nil, - preview = "leaf", -- Right section can show previews too. - -- Options: "leaf", "always" or "never" + border = ${(nilOrStr nb.window.sections.right.border)}, + preview = "leaf", } }, }, node_markers = { - enabled = true, + enabled = ${boolToString nb.nodeMarkers.enable}, icons = { - leaf = " ", - leaf_selected = " → ", - branch = " ", + leaf = "${nb.nodeMarkers.icons.leaf}", + leaf_selected = "${nb.nodeMarkers.icons.leafSelected}", + branch = "${nb.nodeMarkers.icons.branch}", }, }, + + lsp = { + auto_attach = ${boolToString nb.lsp.autoAttach}, + preference = nil, -- TODO: convert list to lua table if not null + }, + + source_buffer = { + follow_node = ${boolToString nb.sourceBuffer.followNode}, + highlight = ${boolToString nb.sourceBuffer.highlight}, + reorient = "${nb.sourceBuffer.reorient}", + scrolloff = ${nilOrStr nb.sourceBuffer.scrolloff} + }, + + -- TODO: make those configurable icons = { File = "󰈙 ", Module = " ", @@ -82,10 +99,9 @@ in { Operator = "󰆕 ", TypeParameter = "󰊄 ", }, - use_default_mappings = 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 + + -- make those configurable + use_default_mappings = true, mappings = { [""] = actions.close(), -- Close and cursor to original location ["q"] = actions.close(), @@ -135,19 +151,8 @@ in { }), ["g?"] = actions.help(), -- Open mappings help window - }, - lsp = { - auto_attach = true, -- If set to true, you don't need to manually use attach function - preference = nil, -- list of lsp server names in order of preference - }, - source_buffer = { - follow_node = true, -- Keep the current node in focus on the source buffer - highlight = true, -- Highlight the currently focused node - reorient = "smart", -- "smart", "top", "mid" or "none" - scrolloff = nil -- scrolloff value when navbuddy is open } - } - + } ''; }; }