diff --git a/configuration.nix b/configuration.nix index 656f74ad..11f3fa10 100644 --- a/configuration.nix +++ b/configuration.nix @@ -77,6 +77,7 @@ isMaximal: { tex.enable = isMaximal; # Language modules that are not as common. + openscad.enable = false; arduino.enable = false; assembly.enable = false; astro.enable = false; diff --git a/docs/manual/release-notes/rl-0.9.md b/docs/manual/release-notes/rl-0.9.md index 0a0d9d9f..b0a424fc 100644 --- a/docs/manual/release-notes/rl-0.9.md +++ b/docs/manual/release-notes/rl-0.9.md @@ -259,6 +259,11 @@ - Add `languages.fluent` using the official plugin. This only provides highlighting. +- Add `languages.openscad` using + [`openscad-lsp`](https://github.com/Leathong/openscad-LSP). This currently + relies on neovim builtin syntax for highlighting, and the lsp for formatting + and diagnostics. + - Added Debugging support to `languages.php`. - Added Formatting support to `languages.php` via diff --git a/modules/plugins/languages/default.nix b/modules/plugins/languages/default.nix index 56896e41..c47e39ab 100644 --- a/modules/plugins/languages/default.nix +++ b/modules/plugins/languages/default.nix @@ -61,6 +61,7 @@ in { ./make.nix ./xml.nix ./fluent.nix + ./openscad.nix # This is now a hard deprecation. (mkRenamedOptionModule ["vim" "languages" "enableLSP"] ["vim" "lsp" "enable"]) diff --git a/modules/plugins/languages/openscad.nix b/modules/plugins/languages/openscad.nix new file mode 100644 index 00000000..e1ca096d --- /dev/null +++ b/modules/plugins/languages/openscad.nix @@ -0,0 +1,62 @@ +{ + config, + pkgs, + lib, + ... +}: let + inherit (builtins) attrNames; + inherit (lib.options) mkEnableOption mkOption literalExpression; + inherit (lib.modules) mkIf mkMerge; + inherit (lib.types) enum listOf; + inherit (lib.meta) getExe; + inherit (lib.nvim.attrsets) mapListToAttrs; + + cfg = config.vim.languages.openscad; + /* + There is no Treesitter module for OpenSCAD yet. + Luckily vim already ships with a builtin syntax that is used by default. + + The LSP already ships with diagnostics, but there is also an experimental analyzer called sca2d + + But it isn't packaged for nvim-lint and would need extra work. + */ + + defaultServers = ["openscad-lsp"]; + servers = { + openscad-lsp = { + enable = true; + cmd = [(getExe pkgs.openscad-lsp) "--stdio"]; + filetypes = ["openscad"]; + }; + }; +in { + options.vim.languages.openscad = { + enable = mkEnableOption "OpenSCAD language support"; + + lsp = { + enable = + mkEnableOption "OpenSCAD LSP support" + // { + default = config.vim.lsp.enable; + defaultText = literalExpression "config.vim.lsp.enable"; + }; + + servers = mkOption { + type = listOf (enum (attrNames servers)); + default = defaultServers; + description = "OpenSCAD LSP server to use"; + }; + }; + }; + + config = mkIf cfg.enable (mkMerge [ + (mkIf cfg.lsp.enable { + vim.lsp.servers = + mapListToAttrs (n: { + name = n; + value = servers.${n}; + }) + cfg.lsp.servers; + }) + ]); +}