From dbd395ad01040aacfa626cd0067b385dbeb57083 Mon Sep 17 00:00:00 2001 From: Cool-Game-Dev Date: Thu, 14 Aug 2025 09:10:25 -0500 Subject: [PATCH 1/6] languages/json: fix fix failing CI Make fixes to stop the JSON module from failing CI. --- modules/plugins/languages/json.nix | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/plugins/languages/json.nix b/modules/plugins/languages/json.nix index cd3ae17f..2c426a23 100644 --- a/modules/plugins/languages/json.nix +++ b/modules/plugins/languages/json.nix @@ -6,7 +6,7 @@ }: let inherit (builtins) attrNames; inherit (lib.options) mkOption mkEnableOption; - inherit (lib.meta) getExe; + inherit (lib.meta) getExe' getExe; inherit (lib.modules) mkIf mkMerge; inherit (lib.types) enum package; inherit (lib.nvim.types) mkGrammarOption singleOrListOf; @@ -17,7 +17,7 @@ defaultServers = ["jsonls"]; servers = { jsonls = { - cmd = [(getExe pkgs.vscode-json-languageserver) "--stdio"]; + cmd = [(getExe' "vscode-json-languageserver" pkgs.vscode-langservers-extracted) "--stdio"]; filetypes = ["json" "jsonc"]; init_options = {provideFormatter = true;}; root_markers = [".git"]; @@ -37,7 +37,7 @@ }; in { options.vim.languages.json = { - enable = mkEnableOption "JSON langauge support"; + enable = mkEnableOption "JSON language support"; treesitter = { enable = mkEnableOption "JSON treesitter" // {default = config.vim.languages.enableTreesitter;}; From 6efced0652158a2dc75b9db0f151515c2a9259f0 Mon Sep 17 00:00:00 2001 From: Cool-Game-Dev Date: Thu, 14 Aug 2025 09:22:13 -0500 Subject: [PATCH 2/6] languages/json: correct getExe' usage --- modules/plugins/languages/json.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/plugins/languages/json.nix b/modules/plugins/languages/json.nix index 2c426a23..26349710 100644 --- a/modules/plugins/languages/json.nix +++ b/modules/plugins/languages/json.nix @@ -17,7 +17,7 @@ defaultServers = ["jsonls"]; servers = { jsonls = { - cmd = [(getExe' "vscode-json-languageserver" pkgs.vscode-langservers-extracted) "--stdio"]; + cmd = [(getExe' pkgs.vscode-langservers-extracted "vscode-json-languageserver") "--stdio"]; filetypes = ["json" "jsonc"]; init_options = {provideFormatter = true;}; root_markers = [".git"]; From 2ab26691433e9c58c092ff2d6ed1729ed445fd2e Mon Sep 17 00:00:00 2001 From: Cool-Game-Dev Date: Wed, 13 Aug 2025 17:33:54 -0500 Subject: [PATCH 3/6] languages/html: add advanced support Add advanced features to the `vim.languages.html` module, including lsp, formatting, and extra diagnostics. --- docs/release-notes/rl-0.8.md | 5 ++ modules/plugins/languages/html.nix | 110 ++++++++++++++++++++++++++++- 2 files changed, 112 insertions(+), 3 deletions(-) diff --git a/docs/release-notes/rl-0.8.md b/docs/release-notes/rl-0.8.md index b677ae98..8032d719 100644 --- a/docs/release-notes/rl-0.8.md +++ b/docs/release-notes/rl-0.8.md @@ -480,9 +480,14 @@ [roslyn-ls]: https://github.com/dotnet/vscode-csharp [jsonls]: https://github.com/microsoft/vscode/tree/1.101.2/extensions/json-language-features/server [jsonfmt]: https://github.com/caarlos0/jsonfmt +[superhtml]: https://github.com/kristoff-it/superhtml +[htmlHTML]: https://github.com/htmlhint/HTMLHint - Add just support under `vim.languages.just` using [just-lsp]. - Add [roslyn-ls] to the `vim.languages.csharp` module. - Added json support under `vim.languages.json` using [jsonls] and [jsonfmt]. + +- Added advanced HTML support with [superhtml] for lsp and formatting and + [htmlHINT] for diagnostics. diff --git a/modules/plugins/languages/html.nix b/modules/plugins/languages/html.nix index 0bef2767..37227918 100644 --- a/modules/plugins/languages/html.nix +++ b/modules/plugins/languages/html.nix @@ -4,14 +4,53 @@ lib, ... }: let + inherit (builtins) attrNames; + inherit (lib.meta) getExe; inherit (lib.options) mkEnableOption mkOption; inherit (lib.modules) mkIf mkMerge; - inherit (lib.types) bool; + inherit (lib.types) bool enum package; inherit (lib.lists) optional; - inherit (lib.nvim.types) mkGrammarOption; + inherit (lib.nvim.types) mkGrammarOption diagnostics singleOrListOf; inherit (lib.nvim.dag) entryAnywhere; + inherit (lib.nvim.attrsets) mapListToAttrs; cfg = config.vim.languages.html; + + defaultServers = ["superhtml"]; + servers = { + superhtml = { + cmd = [(getExe pkgs.superhtml) "lsp"]; + filetypes = ["html" "shtml" "htm"]; + root_markers = ["index.html" ".git"]; + }; + }; + + defaultFormat = "superhtml"; + formats = { + superhtml = { + package = pkgs.writeShellApplication { + name = "superhtml_fmt"; + runtimeInputs = [pkgs.superhtml]; + text = "superhtml fmt -"; + }; + }; + }; + + defaultDiagnosticsProvider = ["htmlhint"]; + diagnosticsProviders = { + htmlhint = { + package = pkgs.htmlhint; + nullConfig = pkg: '' + table.insert( + ls_sources, + null_ls.builtins.diagnostics.htmlhint.with({ + command = "${pkg}/bin/htmlhint" + }) + ) + ''; + }; + }; + in { options.vim.languages.html = { enable = mkEnableOption "HTML language support"; @@ -24,8 +63,43 @@ in { default = true; }; }; - }; + lsp = { + enable = mkEnableOption "HTML LSP support" // {default = config.vim.lsp.enable;}; + servers = mkOption { + type = singleOrListOf (enum (attrNames servers)); + default = defaultServers; + description = "HTML LSP server to use"; + }; + }; + + format = { + enable = mkEnableOption "HTML formatting" // {default = config.vim.languages.enableFormat;}; + + type = mkOption { + description = "HTML formatter to use"; + type = enum (attrNames formats); + default = defaultFormat; + }; + + package = mkOption { + description = "HTML formatter package"; + type = package; + default = formats.${cfg.format.type}.package; + }; + }; + + extraDiagnostics = { + enable = mkEnableOption "extra HTML diagnostics" // {default = config.vim.languages.enableExtraDiagnostics;}; + + types = diagnostics { + langDesc = "HTML"; + inherit diagnosticsProviders; + inherit defaultDiagnosticsProvider; + }; + }; + }; + config = mkIf cfg.enable (mkMerge [ (mkIf cfg.treesitter.enable { vim = { @@ -41,5 +115,35 @@ in { ''); }; }) + + (mkIf cfg.lsp.enable { + vim.lsp.servers = + mapListToAttrs (n: { + name = n; + value = servers.${n}; + }) + cfg.lsp.servers; + }) + + (mkIf (cfg.format.enable && !cfg.lsp.enable) { + vim.formatter.conform-nvim = { + enable = true; + setupOpts.formatters_by_ft.html = [cfg.format.type]; + setupOpts.formatters.${cfg.format.type} = { + command = getExe cfg.format.package; + }; + }; + }) + + (mkIf cfg.extraDiagnostics.enable { + vim.diagnostics.nvim-lint = { + enable = true; + linters_by_ft.html = cfg.extraDiagnostics.types; + linters = mkMerge (map (name: { + ${name}.cmd = getExe diagnosticsProviders.${name}.package; + }) + cfg.extraDiagnostics.types); + }; + }) ]); } From 3aadd2f3ced2340fdd7ef3c00b9e8ad8523a08b4 Mon Sep 17 00:00:00 2001 From: Cool-Game-Dev Date: Wed, 13 Aug 2025 19:53:41 -0500 Subject: [PATCH 4/6] languages/html: remove null_ls usage Remove usage of null_ls and replace it with new standards. --- modules/plugins/languages/html.nix | 25 ++++++++----------------- 1 file changed, 8 insertions(+), 17 deletions(-) diff --git a/modules/plugins/languages/html.nix b/modules/plugins/languages/html.nix index 37227918..96dc9472 100644 --- a/modules/plugins/languages/html.nix +++ b/modules/plugins/languages/html.nix @@ -35,22 +35,13 @@ }; }; }; - + defaultDiagnosticsProvider = ["htmlhint"]; diagnosticsProviders = { htmlhint = { - package = pkgs.htmlhint; - nullConfig = pkg: '' - table.insert( - ls_sources, - null_ls.builtins.diagnostics.htmlhint.with({ - command = "${pkg}/bin/htmlhint" - }) - ) - ''; + config.cmd = getExe pkgs.htmlhint; }; }; - in { options.vim.languages.html = { enable = mkEnableOption "HTML language support"; @@ -91,7 +82,7 @@ in { extraDiagnostics = { enable = mkEnableOption "extra HTML diagnostics" // {default = config.vim.languages.enableExtraDiagnostics;}; - + types = diagnostics { langDesc = "HTML"; inherit diagnosticsProviders; @@ -99,7 +90,7 @@ in { }; }; }; - + config = mkIf cfg.enable (mkMerge [ (mkIf cfg.treesitter.enable { vim = { @@ -117,7 +108,7 @@ in { }) (mkIf cfg.lsp.enable { - vim.lsp.servers = + vim.lsp.servers = mapListToAttrs (n: { name = n; value = servers.${n}; @@ -140,9 +131,9 @@ in { enable = true; linters_by_ft.html = cfg.extraDiagnostics.types; linters = mkMerge (map (name: { - ${name}.cmd = getExe diagnosticsProviders.${name}.package; - }) - cfg.extraDiagnostics.types); + ${name} = diagnosticsProviders.${name}.config; + }) + cfg.extraDiagnostics.types); }; }) ]); From b6ecc7f19c159f69ae1a000fa2c6a105f99df18c Mon Sep 17 00:00:00 2001 From: Poseidon Date: Sun, 17 Aug 2025 17:22:31 -0500 Subject: [PATCH 5/6] languages/html: reorder parameters for consistency --- modules/plugins/languages/html.nix | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/plugins/languages/html.nix b/modules/plugins/languages/html.nix index 96dc9472..bcc6b842 100644 --- a/modules/plugins/languages/html.nix +++ b/modules/plugins/languages/html.nix @@ -49,9 +49,9 @@ in { enable = mkEnableOption "HTML treesitter support" // {default = config.vim.languages.enableTreesitter;}; package = mkGrammarOption pkgs "html"; autotagHtml = mkOption { - description = "Enable autoclose/autorename of html tags (nvim-ts-autotag)"; type = bool; default = true; + description = "Enable autoclose/autorename of html tags (nvim-ts-autotag)"; }; }; @@ -68,15 +68,15 @@ in { enable = mkEnableOption "HTML formatting" // {default = config.vim.languages.enableFormat;}; type = mkOption { - description = "HTML formatter to use"; type = enum (attrNames formats); default = defaultFormat; + description = "HTML formatter to use"; }; package = mkOption { - description = "HTML formatter package"; type = package; default = formats.${cfg.format.type}.package; + description = "HTML formatter package"; }; }; From b7d321fd88c674ec82d293dd3b51066f7aa1df0c Mon Sep 17 00:00:00 2001 From: Poseidon Date: Wed, 20 Aug 2025 01:19:57 -0500 Subject: [PATCH 6/6] binds/qmk: init (#1083) * binds/qmk: init Create the `vim.binds.qmk` module with `enable` and `setupOpts`. * Clean up release notes Add consistent style and formatting to release notes Co-authored-by: raf * Clean up release notes (again) * binks/qmk: remove unneeded function * binds/qmk: Rename to `vim.utility.qmk` Move the `vim.binds.qmk` module to `vim.utility.qmk`. * utility/qmk: add defaults and asserts Add default values and assertions for required options. * utility/qmk: rename to utility/qmk-nvim * utility/qmk-nvim: improve assertion readability * utility/qmk-nvim: Fix links broken in module rename * Fix release notes * Add final newline to release notes --------- Co-authored-by: raf --- configuration.nix | 1 + docs/release-notes/rl-0.8.md | 11 ++--- modules/plugins/utility/default.nix | 1 + modules/plugins/utility/qmk-nvim/config.nix | 36 ++++++++++++++ modules/plugins/utility/qmk-nvim/default.nix | 6 +++ modules/plugins/utility/qmk-nvim/qmk-nvim.nix | 49 +++++++++++++++++++ npins/sources.json | 13 +++++ 7 files changed, 111 insertions(+), 6 deletions(-) create mode 100644 modules/plugins/utility/qmk-nvim/config.nix create mode 100644 modules/plugins/utility/qmk-nvim/default.nix create mode 100644 modules/plugins/utility/qmk-nvim/qmk-nvim.nix diff --git a/configuration.nix b/configuration.nix index af62a944..a2a337fd 100644 --- a/configuration.nix +++ b/configuration.nix @@ -192,6 +192,7 @@ isMaximal: { vim-wakatime.enable = false; diffview-nvim.enable = true; yanky-nvim.enable = false; + qmk-nvim.enable = false; # requires hardware specific options icon-picker.enable = isMaximal; surround.enable = isMaximal; leetcode-nvim.enable = isMaximal; diff --git a/docs/release-notes/rl-0.8.md b/docs/release-notes/rl-0.8.md index 8032d719..61a13533 100644 --- a/docs/release-notes/rl-0.8.md +++ b/docs/release-notes/rl-0.8.md @@ -482,12 +482,11 @@ [jsonfmt]: https://github.com/caarlos0/jsonfmt [superhtml]: https://github.com/kristoff-it/superhtml [htmlHTML]: https://github.com/htmlhint/HTMLHint +[qmk-nvim]: https://github.com/codethread/qmk.nvim - Add just support under `vim.languages.just` using [just-lsp]. - - Add [roslyn-ls] to the `vim.languages.csharp` module. - -- Added json support under `vim.languages.json` using [jsonls] and [jsonfmt]. - -- Added advanced HTML support with [superhtml] for lsp and formatting and - [htmlHINT] for diagnostics. +- Add JSON support under `vim.languages.json` using [jsonls] and [jsonfmt]. +- Add advanced HTML support under `vim.languages.html` using [superhtml] and + [htmlHINT]. +- Add QMK support under `vim.utility.qmk-nvim` via [qmk-nvim]. diff --git a/modules/plugins/utility/default.nix b/modules/plugins/utility/default.nix index 8069b6c1..b49ef0b6 100644 --- a/modules/plugins/utility/default.nix +++ b/modules/plugins/utility/default.nix @@ -18,6 +18,7 @@ ./oil-nvim ./outline ./preview + ./qmk-nvim ./sleuth ./smart-splits ./snacks-nvim diff --git a/modules/plugins/utility/qmk-nvim/config.nix b/modules/plugins/utility/qmk-nvim/config.nix new file mode 100644 index 00000000..c86a483a --- /dev/null +++ b/modules/plugins/utility/qmk-nvim/config.nix @@ -0,0 +1,36 @@ +{ + config, + lib, + ... +}: let + inherit (lib.modules) mkIf; + inherit (lib.nvim.lua) toLuaObject; + inherit (lib.nvim.dag) entryAfter; + + cfg = config.vim.utility.qmk-nvim; +in { + config = mkIf cfg.enable { + vim = { + startPlugins = ["qmk-nvim"]; + + pluginRC.qmk-nvim = entryAfter ["nvim-notify"] '' + require('qmk').setup(${toLuaObject cfg.setupOpts}) + ''; + }; + + assertions = [ + { + assertion = cfg.setupOpts.variant == "qmk" && cfg.setupOpts.comment_preview.position != "inside"; + message = "comment_preview.position can only be set to inside when using the qmk layoyt"; + } + { + assertion = cfg.setupOpts.name != null; + message = "qmk-nvim requires 'vim.utility.qmk.setupOpts.name' to be set."; + } + { + assertion = cfg.setupOpts.layout != null; + message = "qmk-nvim requires 'vim.utility.qmk.setupOpts.layout' to be set."; + } + ]; + }; +} diff --git a/modules/plugins/utility/qmk-nvim/default.nix b/modules/plugins/utility/qmk-nvim/default.nix new file mode 100644 index 00000000..4162ff2e --- /dev/null +++ b/modules/plugins/utility/qmk-nvim/default.nix @@ -0,0 +1,6 @@ +{ + imports = [ + ./config.nix + ./qmk-nvim.nix + ]; +} diff --git a/modules/plugins/utility/qmk-nvim/qmk-nvim.nix b/modules/plugins/utility/qmk-nvim/qmk-nvim.nix new file mode 100644 index 00000000..2c541e64 --- /dev/null +++ b/modules/plugins/utility/qmk-nvim/qmk-nvim.nix @@ -0,0 +1,49 @@ +{lib, ...}: let + inherit (lib.options) mkOption mkEnableOption; + inherit (lib.types) attrsOf nullOr enum lines str; + inherit (lib.nvim.types) mkPluginSetupOption; +in { + options.vim.utility.qmk-nvim = { + enable = mkEnableOption "QMK and ZMK keymaps in nvim"; + + setupOpts = mkPluginSetupOption "qmk.nvim" { + name = mkOption { + type = nullOr str; + default = null; + description = "The name of the layout"; + }; + + layout = mkOption { + type = nullOr lines; + default = null; + description = '' + The keyboard key layout + see for more details + ''; + }; + + variant = mkOption { + type = enum ["qmk" "zmk"]; + default = "qmk"; + description = "Chooses the expected hardware target"; + }; + + comment_preview = { + position = mkOption { + type = enum ["top" "bottom" "inside" "none"]; + default = "top"; + description = "Controls the position of the preview"; + }; + + keymap_overrides = mkOption { + type = attrsOf str; + default = {}; + description = '' + Key codes to text replacements + see for more details + ''; + }; + }; + }; + }; +} diff --git a/npins/sources.json b/npins/sources.json index eec2fde9..0ec503ac 100644 --- a/npins/sources.json +++ b/npins/sources.json @@ -2186,6 +2186,19 @@ "url": "https://github.com/kevinhwang91/promise-async/archive/119e8961014c9bfaf1487bf3c2a393d254f337e2.tar.gz", "hash": "0q4a0rmy09hka6zvydzjj2gcm2j5mlbrhbxfcdjj33ngpblkmqzm" }, + "qmk-nvim": { + "type": "Git", + "repository": { + "type": "GitHub", + "owner": "codethread", + "repo": "qmk.nvim" + }, + "branch": "main", + "submodules": false, + "revision": "3c804c1480991e4837514900b22b9358cfd64fa1", + "url": "https://github.com/codethread/qmk.nvim/archive/3c804c1480991e4837514900b22b9358cfd64fa1.tar.gz", + "hash": "03fsx6qsn8b36jp5m0fkdla6gkkzdv2j18y378y3cqpjclgq995a" + }, "rainbow-delimiters-nvim": { "type": "Git", "repository": {