diff --git a/modules/modules.nix b/modules/modules.nix index a00cea6..2d82f87 100644 --- a/modules/modules.nix +++ b/modules/modules.nix @@ -10,6 +10,7 @@ # Contains configuration for core neovim features # such as spellchecking, mappings, and the init script (init.vim). neovim = map (p: ./neovim + "/${p}") [ + "global" "init" "mappings" ]; diff --git a/modules/neovim/global/default.nix b/modules/neovim/global/default.nix new file mode 100644 index 0000000..bbb0c42 --- /dev/null +++ b/modules/neovim/global/default.nix @@ -0,0 +1,12 @@ +{lib, ...}: let + inherit (lib.lists) concatLists; + inherit (lib.filesystem) listFilesRecursive; +in { + imports = concatLists [ + # Configuration options for Neovim UI + (listFilesRecursive ./ui) + + # vim.diagnostics + [./diagnostics.nix] + ]; +} diff --git a/modules/neovim/global/diagnostics.nix b/modules/neovim/global/diagnostics.nix new file mode 100644 index 0000000..bac4611 --- /dev/null +++ b/modules/neovim/global/diagnostics.nix @@ -0,0 +1,115 @@ +{ + config, + lib, + ... +}: let + inherit (lib.options) mkOption mkEnableOption; + inherit (lib.types) str bool enum either; +in { + options.vim.diagnostics = { + virtual_text = mkOption { + type = bool; + default = true; + description = '' + Whether to use virtual text for diagnostics. + + If multiple diagnostics are set for a namespace, one + prefix per diagnostic + the last diagnostic message + are shown. + ''; + }; + + update_in_insert = mkOption { + type = bool; + default = false; + description = '' + Whether to update diagnostics in insert mode. + + This is useful for slow diagnostics sources, but can + also cause lag in insert mode. + ''; + }; + + underline = mkOption { + type = bool; + default = true; + description = '' + Whether to underline diagnostics. + ''; + }; + + severity_sort = mkOption { + type = bool; + default = false; + description = '' + Whether to sort diagnostics by severity. + + This affects the order in which signs and + virtual text are displayed. When true, higher + severities are displayed before lower severities (e.g. + ERROR is displayed before WARN) + ''; + }; + + float = { + focusable = mkOption { + type = bool; + default = false; + description = '' + Whether the floating window is focusable. + When true, the floating window can be focused and + interacted with. When false, the floating window is + not focusable and will not receive input. + ''; + }; + + border = mkOption { + type = enum ["none" "single" "double" "rounded" "solid" "shadow"]; + default = config.vim.ui.border.globalStyle; + description = '' + The border style of the floating window. + + Possible values: + - none + - single + - double + - rounded + - solid + - shadow + + See `:h nvim_open_win` for the available border + styles and their definitions. + ''; + }; + + source = mkOption { + type = either bool (enum ["always" "if_many"]); + default = "auto"; + description = '' + The source of the floating window. + Possible values: + - auto: Use the same source as the diagnostics + window. + - window: Use the window source. + - buffer: Use the buffer source. + ''; + }; + + prefix = mkOption { + type = str; + default = ""; + description = '' + Prefix string for each diagnostic in the floating window + ''; + }; + + suffix = mkOption { + type = str; + default = ""; + description = '' + Suffix string for each diagnostic in the floating window + ''; + }; + }; + }; +} diff --git a/modules/neovim/global/ui/borders.nix b/modules/neovim/global/ui/borders.nix new file mode 100644 index 0000000..f40dbd0 --- /dev/null +++ b/modules/neovim/global/ui/borders.nix @@ -0,0 +1,51 @@ +{ + config, + lib, + ... +}: let + inherit (lib.options) mkOption mkEnableOption; + inherit (lib.attrsets) mapAttrs; + inherit (lib.lists) optionals; + inherit (lib.types) enum; + + cfg = config.vim.ui.borders; + + # See `:h nvim_open_win` for the available border styles + # this list can be updated if additional styles are added. + defaultStyles = ["none" "single" "double" "rounded" "solid" "shadow"]; +in { + options.vim.ui.borders = { + enable = mkEnableOption "visible borders for windows that support configurable borders"; + + # TODO: support configurable border elements with a lua table converted from a list of str + # e.g. [ "╔" "═" "╗" "║" "╝" "═" "╚" "║" ] + globalStyle = mkOption { + type = enum defaultStyles; + default = "single"; + description = '' + The global border style to use. + ''; + }; + + plugins = let + mkPluginStyleOption = name: { + enable = mkEnableOption "borders for the ${name} plugin" // {default = cfg.enable;}; + + style = mkOption { + type = enum (defaultStyles ++ optionals (name != "which-key") ["shadow"]); + default = cfg.globalStyle; + description = "The border style to use for the ${name} plugin"; + }; + }; + in + mapAttrs (_: mkPluginStyleOption) { + # despite not having it listed in example configuration, which-key does support the rounded type + # additionally, it supports a "shadow" type that is similar to none but is of higher contrast + which-key = "which-key"; + lspsaga = "lspsaga"; + nvim-cmp = "nvim-cmp"; + lsp-signature = "lsp-signature"; + code-action-menu = "code-actions-menu"; + }; + }; +} diff --git a/modules/neovim/global/ui/icons.nix b/modules/neovim/global/ui/icons.nix new file mode 100644 index 0000000..710fb96 --- /dev/null +++ b/modules/neovim/global/ui/icons.nix @@ -0,0 +1,32 @@ +{lib, ...}: let + inherit (lib.options) mkOption; + inherit (lib.types) str; +in { + options.vim.ui.icons = { + diagnostics = { + ERROR = mkOption { + type = str; + default = " "; + description = "The icon to use for error messages"; + }; + + WARN = mkOption { + type = str; + default = " "; + description = "The icon to use for warning messages"; + }; + + INFO = mkOption { + type = str; + default = " "; + description = "The icon to use for info messages"; + }; + + HINT = mkOption { + type = str; + default = " "; + description = "The icon to use for hint messages"; + }; + }; + }; +} diff --git a/modules/plugins/ui/borders/borders.nix b/modules/plugins/ui/borders/borders.nix deleted file mode 100644 index 37589dc..0000000 --- a/modules/plugins/ui/borders/borders.nix +++ /dev/null @@ -1,46 +0,0 @@ -{ - config, - lib, - ... -}: let - inherit (lib.options) mkOption mkEnableOption; - inherit (lib.lists) optionals; - inherit (lib.types) enum; - - cfg = config.vim.ui.borders; - - defaultStyles = ["none" "single" "double" "rounded"]; -in { - options.vim.ui.borders = { - enable = mkEnableOption "visible borders for most windows"; - - globalStyle = mkOption { - type = enum defaultStyles; - default = "rounded"; - description = '' - The global border style to use. - ''; - }; - - # TODO: make per-plugin borders configurable - plugins = let - mkPluginStyleOption = name: { - enable = mkEnableOption "borders for the ${name} plugin" // {default = cfg.enable;}; - - style = mkOption { - type = enum (defaultStyles ++ optionals (name != "which-key") ["shadow"]); - default = cfg.globalStyle; - description = "The border style to use for the ${name} plugin"; - }; - }; - in { - # despite not having it listed in example configuration, which-key does support the rounded type - # additionally, it supports a "shadow" type that is similar to none but is of higher contrast - which-key = mkPluginStyleOption "which-key"; - lspsaga = mkPluginStyleOption "lspsaga"; - nvim-cmp = mkPluginStyleOption "nvim-cmp"; - lsp-signature = mkPluginStyleOption "lsp-signature"; - code-action-menu = mkPluginStyleOption "code-actions-menu"; - }; - }; -} diff --git a/modules/plugins/ui/borders/default.nix b/modules/plugins/ui/borders/default.nix deleted file mode 100644 index 38b02b8..0000000 --- a/modules/plugins/ui/borders/default.nix +++ /dev/null @@ -1,5 +0,0 @@ -{ - imports = [ - ./borders.nix - ]; -} diff --git a/modules/plugins/ui/default.nix b/modules/plugins/ui/default.nix index 262cdbb..214e09f 100644 --- a/modules/plugins/ui/default.nix +++ b/modules/plugins/ui/default.nix @@ -1,12 +1,11 @@ { imports = [ - ./noice - ./modes - ./notifications - ./smartcolumn + ./breadcrumbs ./colorizer ./illuminate - ./breadcrumbs - ./borders + ./modes + ./noice + ./notifications + ./smartcolumn ]; }