diff --git a/configuration.nix b/configuration.nix index a2a337fd..99537987 100644 --- a/configuration.nix +++ b/configuration.nix @@ -89,6 +89,7 @@ isMaximal: { ruby.enable = false; fsharp.enable = false; just.enable = false; + qml.enable = false; tailwind.enable = false; svelte.enable = false; diff --git a/docs/release-notes/rl-0.8.md b/docs/release-notes/rl-0.8.md index 3a9c01eb..5a7a1b3c 100644 --- a/docs/release-notes/rl-0.8.md +++ b/docs/release-notes/rl-0.8.md @@ -483,6 +483,8 @@ [superhtml]: https://github.com/kristoff-it/superhtml [htmlHINT]: https://github.com/htmlhint/HTMLHint [qmk-nvim]: https://github.com/codethread/qmk.nvim +[qmlls]: https://doc.qt.io/qt-6/qtqml-tooling-qmlls.html +[qmlformat]: https://doc.qt.io/qt-6/qtqml-tooling-qmlformat.html - Add just support under `vim.languages.just` using [just-lsp]. - Add [roslyn-ls] to the `vim.languages.csharp` module. @@ -490,3 +492,4 @@ - Add advanced HTML support under `vim.languages.html` using [superhtml] and [htmlHINT]. - Add QMK support under `vim.utility.qmk-nvim` via [qmk-nvim]. +- Add QML support under `vim.languages.qml` using [qmlls] and [qmlformat] diff --git a/modules/plugins/languages/default.nix b/modules/plugins/languages/default.nix index f9bd9968..fd45758f 100644 --- a/modules/plugins/languages/default.nix +++ b/modules/plugins/languages/default.nix @@ -30,6 +30,7 @@ in { ./ocaml.nix ./php.nix ./python.nix + ./qml.nix ./r.nix ./rust.nix ./scala.nix diff --git a/modules/plugins/languages/qml.nix b/modules/plugins/languages/qml.nix new file mode 100644 index 00000000..6750a55a --- /dev/null +++ b/modules/plugins/languages/qml.nix @@ -0,0 +1,98 @@ +{ + config, + pkgs, + lib, + ... +}: let + inherit (builtins) attrNames; + inherit (lib.meta) getExe getExe'; + inherit (lib.options) mkEnableOption mkOption; + inherit (lib.modules) mkIf mkMerge; + inherit (lib.types) enum package; + inherit (lib.nvim.types) mkGrammarOption singleOrListOf; + inherit (lib.nvim.attrsets) mapListToAttrs; + + cfg = config.vim.languages.qml; + + qmlPackage = pkgs.kdePackages.qtdeclarative; + + defaultServers = ["qmlls"]; + servers = { + qmlls = { + cmd = [(getExe' qmlPackage "qmlls")]; + filetypes = ["qml" "qmljs"]; + rootmarkers = [".git"]; + }; + }; + + defaultFormat = "qmlformat"; + formats = { + qmlformat = { + package = pkgs.writeShellApplication { + name = "qmlformat"; + runtimeInputs = [qmlPackage]; + text = "qmlformat -"; + }; + }; + }; +in { + options.vim.languages.qml = { + enable = mkEnableOption "QML language support"; + treesitter = { + enable = mkEnableOption "QML treesitter support" // {default = config.vim.languages.enableTreesitter;}; + package = mkGrammarOption pkgs "qmljs"; + }; + + lsp = { + enable = mkEnableOption "QML LSP support" // {default = config.vim.lsp.enable;}; + servers = mkOption { + type = singleOrListOf (enum (attrNames servers)); + default = defaultServers; + description = "QML LSP server to use"; + }; + }; + + format = { + enable = mkEnableOption "QML formatting" // {default = config.vim.languages.enableFormat;}; + + type = mkOption { + type = enum (attrNames formats); + default = defaultFormat; + description = "QML formatter to use"; + }; + + package = mkOption { + type = package; + default = formats.${cfg.format.type}.package; + description = "QML formatter package"; + }; + }; + }; + + config = mkIf cfg.enable (mkMerge [ + (mkIf cfg.treesitter.enable { + vim.treesitter = { + enable = true; + grammars = [cfg.treesitter.package]; + }; + }) + (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.qml = [cfg.format.type]; + setupOpts.formatters.${cfg.format.type} = { + command = getExe cfg.format.package; + }; + }; + }) + ]); +}