From 7d077f43f72f959c84fe02e0d2141d3268dc767c Mon Sep 17 00:00:00 2001 From: NotAShelf Date: Fri, 17 May 2024 19:03:05 +0300 Subject: [PATCH] neovim/global: begin adding `vim.diagnostics.config()` options --- modules/neovim/global/default.nix | 12 ++- modules/neovim/global/diagnostics.nix | 115 ++++++++++++++++++++++++++ modules/neovim/global/ui/borders.nix | 20 +++-- modules/neovim/global/ui/icons.nix | 40 ++++----- 4 files changed, 157 insertions(+), 30 deletions(-) create mode 100644 modules/neovim/global/diagnostics.nix diff --git a/modules/neovim/global/default.nix b/modules/neovim/global/default.nix index 94b5788..bbb0c42 100644 --- a/modules/neovim/global/default.nix +++ b/modules/neovim/global/default.nix @@ -1,6 +1,12 @@ -{lib}: { - imports = lib.concatLists [ +{lib, ...}: let + inherit (lib.lists) concatLists; + inherit (lib.filesystem) listFilesRecursive; +in { + imports = concatLists [ # Configuration options for Neovim UI - (lib.filesystem.listFilesRecursive ./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 index 7021301..f40dbd0 100644 --- a/modules/neovim/global/ui/borders.nix +++ b/modules/neovim/global/ui/borders.nix @@ -10,14 +10,18 @@ cfg = config.vim.ui.borders; - defaultStyles = ["none" "single" "double" "rounded"]; + # 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 most windows"; + 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 = "rounded"; + default = "single"; description = '' The global border style to use. ''; @@ -37,11 +41,11 @@ 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 = mkPluginStyleOption "which-key"; - lspsaga = mkPluginStyleOption "lspsaga"; - nvim-cmp = mkPluginStyleOption "nvim-cmp"; - lsp-signature = mkPluginStyleOption "lsp-signature"; - code-action-menu = mkPluginStyleOption "code-actions-menu"; + 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 index 76c1e3c..710fb96 100644 --- a/modules/neovim/global/ui/icons.nix +++ b/modules/neovim/global/ui/icons.nix @@ -3,28 +3,30 @@ inherit (lib.types) str; in { options.vim.ui.icons = { - ERROR = mkOption { - type = str; - default = " "; - description = "The icon to use for error messages"; - }; + 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"; - }; + 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"; - }; + 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"; + HINT = mkOption { + type = str; + default = " "; + description = "The icon to use for hint messages"; + }; }; }; }