From c5bc6d503ef595745f77e2d9c550651c198879ac Mon Sep 17 00:00:00 2001 From: NotAShelf Date: Fri, 4 Apr 2025 09:52:23 +0300 Subject: [PATCH] neovim/diagnostics: init module --- docs/release-notes/rl-0.8.md | 8 ++- modules/neovim/init/default.nix | 1 + modules/neovim/init/diagnostics.nix | 102 ++++++++++++++++++++++++++++ 3 files changed, 109 insertions(+), 2 deletions(-) create mode 100644 modules/neovim/init/diagnostics.nix diff --git a/docs/release-notes/rl-0.8.md b/docs/release-notes/rl-0.8.md index 368df9f5..49da794b 100644 --- a/docs/release-notes/rl-0.8.md +++ b/docs/release-notes/rl-0.8.md @@ -87,6 +87,10 @@ - Add [oil.nvim] as an alternative file explorer. It will be available under `vim.utility.oil-nvim`. +- Add `vim.diagnostics` to interact with Neovim's diagnostics module. Available + options for `vim.diagnostic.config()` can now be customized through the + [](#opt-vim.diagnostics.config) in nvf. + [amadaluzia](https://github.com/amadaluzia): [haskell-tools.nvim]: https://github.com/MrcJkb/haskell-tools.nvim @@ -253,8 +257,8 @@ [friendly-snippets](https://github.com/rafamadriz/friendly-snippets) so blink.cmp can source snippets from it. - Fix [blink.cmp] breaking when built-in sources were modified. -- Fix [conform.nvim] not allowing disabling formatting on and after save. - Use `null` value to disable them if conform is enabled. +- Fix [conform.nvim] not allowing disabling formatting on and after save. Use + `null` value to disable them if conform is enabled. [TheColorman](https://github.com/TheColorman): diff --git a/modules/neovim/init/default.nix b/modules/neovim/init/default.nix index ac9d29e5..0e7a4c6b 100644 --- a/modules/neovim/init/default.nix +++ b/modules/neovim/init/default.nix @@ -3,6 +3,7 @@ ./autocmds.nix ./basic.nix ./debug.nix + ./diagnostics.nix ./highlight.nix ./spellcheck.nix ]; diff --git a/modules/neovim/init/diagnostics.nix b/modules/neovim/init/diagnostics.nix new file mode 100644 index 00000000..26ca6e84 --- /dev/null +++ b/modules/neovim/init/diagnostics.nix @@ -0,0 +1,102 @@ +{ + config, + lib, + ... +}: let + inherit (lib.modules) mkIf; + inherit (lib.options) mkOption mkEnableOption literalExpression; + inherit (lib.types) attrsOf anything oneOf bool submodule; + inherit (lib.nvim.dag) entryAfter; + inherit (lib.nvim.types) luaInline; + inherit (lib.nvim.lua) toLuaObject; + + cfg = config.vim.diagnostics; + + diagnosticType = oneOf [(attrsOf anything) bool luaInline]; + diagnosticsSubmodule = submodule { + freeformType = attrsOf diagnosticType; + underline = mkOption { + type = diagnosticType; + default = true; + description = "Use underline for diagnostics."; + }; + + virtual_text = mkOption { + type = diagnosticType; + default = false; + example = literalExpression '' + { + format = lib.generators.mkLuaInline ''' + function(diagnostic) + return string.format("%s (%s)", diagnostic.message, diagnostic.source) + end + '''; + } + ''; + + description = '' + Use virtual text for diagnostics. If multiple diagnostics are set for a namespace, + one prefix per diagnostic + the last diagnostic message are shown. + ''; + }; + + virtual_lines = mkOption { + type = diagnosticType; + default = false; + description = '' + Use virtual lines for diagnostics. + ''; + }; + + signs = mkOption { + type = diagnosticType; + default = false; + example = { + signs.text = { + "vim.diagnostic.severity.ERROR" = "󰅚 "; + "vim.diagnostic.severity.WARN" = "󰀪 "; + }; + }; + description = '' + Use signs for diagnostics. See {command}`:help diagnostic-signs`. + ''; + }; + + update_in_insert = mkOption { + type = bool; + default = false; + description = '' + Update diagnostics in Insert mode. If `false`, diagnostics will + be updated on InsertLeave ({command}`:help InsertLeave`). + ''; + }; + }; +in { + options.vim = { + diagnostics = { + enable = mkEnableOption "diagostics module for Neovim"; + config = mkOption { + type = diagnosticsSubmodule; + default = {}; + description = '' + Values that will be passed to `vim.diagnostic.config` after being converted + to a Lua table. Possible values for each key can be found in the help text + for `vim.diagnostics.Opts`. You may find more about the diagnostics API of + Neovim in {command}`:help diagnostic-api`. + + :::{.note} + This option is freeform. You may set values that are not present in nvf + documentation, but those values will not be fully type checked. Please + refer to the help text for `vim.diagnostic.Opts` for appropriate values. + ::: + ''; + }; + }; + }; + + config.vim = mkIf cfg.enable { + luaConfigRC.diagnostics = entryAfter ["basic"] '' + vim.diagnostic.config(${toLuaObject cfg.config}) + ''; + }; +}