diff --git a/configuration.nix b/configuration.nix index 8b308036..76acd904 100644 --- a/configuration.nix +++ b/configuration.nix @@ -79,6 +79,7 @@ isMaximal: { toml.enable = isMaximal; xml.enable = isMaximal; tex.enable = isMaximal; + env.enable = isMaximal; # Language modules that are not as common. openscad.enable = false; diff --git a/docs/manual/release-notes/rl-0.9.md b/docs/manual/release-notes/rl-0.9.md index ffdccb8e..28c79c94 100644 --- a/docs/manual/release-notes/rl-0.9.md +++ b/docs/manual/release-notes/rl-0.9.md @@ -400,6 +400,8 @@ - Add `languages.gettext`. This only provides highlighting. +- Add `languages.env`. This provides extra filetype hooks and diagnostics. + - 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 diff --git a/modules/plugins/languages/default.nix b/modules/plugins/languages/default.nix index 368287a7..1efabf28 100644 --- a/modules/plugins/languages/default.nix +++ b/modules/plugins/languages/default.nix @@ -7,6 +7,7 @@ in { ./asm.nix ./astro.nix ./bash.nix + ./env.nix ./cue.nix ./dart.nix ./clang.nix diff --git a/modules/plugins/languages/env.nix b/modules/plugins/languages/env.nix new file mode 100644 index 00000000..1209b005 --- /dev/null +++ b/modules/plugins/languages/env.nix @@ -0,0 +1,70 @@ +{ + config, + pkgs, + lib, + ... +}: let + inherit (lib.options) mkEnableOption literalExpression; + inherit (lib.meta) getExe; + inherit (lib.modules) mkIf mkMerge; + inherit (lib.nvim.types) diagnostics; + + cfg = config.vim.languages.env; + + defaultDiagnosticsProvider = ["dotenv-linter"]; + diagnosticsProviders = { + dotenv-linter = let + pkg = pkgs.dotenv-linter; + in { + package = pkg; + config = { + cmd = getExe pkg; + }; + }; + }; +in { + options.vim.languages.env = { + enable = mkEnableOption "Env language support"; + + extraDiagnostics = { + enable = + mkEnableOption "extra Env diagnostics" + // { + default = config.vim.languages.enableExtraDiagnostics; + defaultText = literalExpression "config.vim.languages.enableExtraDiagnostics"; + }; + types = diagnostics { + langDesc = "Env"; + inherit diagnosticsProviders; + inherit defaultDiagnosticsProvider; + }; + }; + }; + + config = mkIf cfg.enable (mkMerge [ + { + vim.autocmds = [ + { + event = ["BufRead" "BufNewFile"]; + pattern = [ + # support common names like `dist.env` + "*.env" + # support weird env files names like symfony ones. + ".env.*" + ]; + command = "set filetype=env"; + } + ]; + } + + (mkIf cfg.extraDiagnostics.enable { + vim.diagnostics.nvim-lint = { + enable = true; + linters_by_ft.env = cfg.extraDiagnostics.types; + linters = + mkMerge (map (name: {${name} = diagnosticsProviders.${name}.config;}) + cfg.extraDiagnostics.types); + }; + }) + ]); +}