Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions configuration.nix
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ isMaximal: {
};
toml.enable = isMaximal;
xml.enable = isMaximal;
docker.enable = isMaximal;

# Language modules that are not as common.
arduino.enable = false;
Expand Down
4 changes: 4 additions & 0 deletions docs/manual/release-notes/rl-0.9.md
Original file line number Diff line number Diff line change
Expand Up @@ -186,6 +186,10 @@
- Added [Selenen](https://github.com/kampfkarren/selene) for more diagnostics in
`languages.lua`.

- Added `languages.docker` for Docker and Docker-Compose support. Thanks to
[poseidon-rises](https://github.com/poseidon-rises) for creating most of it in
[!1104](https://github.com/NotAShelf/nvf/pull/1104).

- Added [`mdformat`](https://mdformat.rtfd.io/) support to `languages.markdown`
with the extensions for [GFM](https://github.github.com/gfm/),
[front matter](https://www.markdownlang.com/advanced/frontmatter.html) and
Expand Down
1 change: 1 addition & 0 deletions modules/plugins/languages/default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ in {
./just.nix
./make.nix
./xml.nix
./docker.nix

# This is now a hard deprecation.
(mkRenamedOptionModule ["vim" "languages" "enableLSP"] ["vim" "lsp" "enable"])
Expand Down
156 changes: 156 additions & 0 deletions modules/plugins/languages/docker.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,156 @@
{
config,
pkgs,
lib,
...
}: let
inherit (builtins) attrNames;
inherit (lib.meta) getExe;
inherit (lib.options) mkEnableOption mkOption;
inherit (lib.modules) mkIf mkMerge;
inherit (lib.types) enum package listOf;
inherit (lib.nvim.types) mkGrammarOption diagnostics;
inherit (lib.nvim.attrsets) mapListToAttrs;

cfg = config.vim.languages.docker;
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Still open for discussion if this should be a languages.docker which has the YAML and HCL support, or if it should be languages.dockerfile and YAML and HCL support should be moved into the respective modules.


defaultServers = ["docker-language-server"];
servers = {
docker-language-server = {
cmd = [
(getExe pkgs.docker-language-server)
"start"
"--stdio"
];
filetypes = [
"dockerfile"
"dockercompose"
Copy link
Contributor Author

@snoweuph snoweuph Feb 27, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

like we talked about on matrix:

Note

As soon as we have the new filetype API (#1365),
turn all (docker-)?compose\.ya?ml into the filetype dockercompose otherwise the LSP is to stupid...

];
root_markers = [
".git"
"Dockerfile"
"docker-compose.yaml"
"docker-compose.yml"
"compose.yaml"
"compose.yml"
"docker-bake.json"
"docker-bake.hcl"
];
};
};

defaultFormat = ["dockerfmt"];
formats = {
dockerfmt = {
command = getExe pkgs.dockerfmt;
};
};

defaultDiagnosticsProvider = ["hadolint"];
diagnosticsProviders = {
hadolint = {
config.cmd = getExe (
pkgs.writeShellApplication {
name = "hadolint";
runtimeInputs = [pkgs.hadolint];
text = "hadolint -";
}
);
};
};
in {
options.vim.languages.docker = {
enable = mkEnableOption "Docker language support";
treesitter = {
enable = mkEnableOption "Docker treesitter support";
package = mkGrammarOption pkgs "dockerfile";
};

lsp = {
enable =
mkEnableOption "Docker LSP support"
// {
default = config.vim.lsp.enable;
};
servers = mkOption {
type = listOf (enum (attrNames servers));
default = defaultServers;
description = "Docker LSP server to use";
};
};

format = {
enable =
mkEnableOption "Dockerfile formatting"
// {
default = config.vim.languages.enableFormat;
};

type = mkOption {
type = listOf (enum (attrNames formats));
default = defaultFormat;
description = "Dockerfile formatter to use";
};
};

extraDiagnostics = {
enable =
mkEnableOption "extra Dockerfile diagnostics"
// {
default = config.vim.languages.enableExtraDiagnostics;
};

types = diagnostics {
langDesc = "Dockerfile";
inherit diagnosticsProviders;
inherit defaultDiagnosticsProvider;
};
};
};

config = 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 {
vim.formatter.conform-nvim = {
enable = true;
setupOpts = {
formatters_by_ft.dockerfile = cfg.format.type;
formatters =
mapListToAttrs (name: {
inherit name;
value = formats.${name};
})
cfg.format.type;
};
};
})

(mkIf cfg.extraDiagnostics.enable {
vim.diagnostics.nvim-lint = {
enable = true;
linters_by_ft.dockerfile = cfg.extraDiagnostics.types;
linters = mkMerge (
map (name: {
${name} = diagnosticsProviders.${name}.config;
})
cfg.extraDiagnostics.types
);
};
})
];
}
Loading