blob: d8b357505ec59187782364b02fb004a27de5fd1c (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
|
{
config,
pkgs,
lib,
...
}: let
inherit (lib) genAttrs;
inherit (lib.options) mkEnableOption mkOption literalExpression;
inherit (lib.modules) mkIf mkMerge;
inherit (lib.types) enum listOf;
inherit (lib.nvim.types) mkGrammarOption;
cfg = config.vim.languages.docker;
defaultServers = ["docker-language-server"];
servers = ["docker-language-server"];
defaultFormat = ["dockerfmt"];
formats = ["dockerfmt" "injected"];
defaultDiagnosticsProvider = ["hadolint"];
diagnosticsProviders = ["hadolint"];
in {
options.vim.languages.docker = {
enable = mkEnableOption "Docker language support";
treesitter = {
enable =
mkEnableOption "Docker treesitter support"
// {
default = config.vim.languages.enableTreesitter;
defaultText = literalExpression "config.vim.languages.enableTreesitter";
};
package = mkGrammarOption pkgs "dockerfile";
};
lsp = {
enable =
mkEnableOption "Docker LSP support"
// {
default = config.vim.lsp.enable;
defaultText = literalExpression "config.vim.lsp.enable";
};
servers = mkOption {
type = listOf (enum servers);
default = defaultServers;
description = "Docker LSP server to use";
};
};
format = {
enable =
mkEnableOption "Dockerfile formatting"
// {
default = config.vim.languages.enableFormat;
defaultText = literalExpression "config.vim.languages.enableFormat";
};
type = mkOption {
type = listOf (enum formats);
default = defaultFormat;
description = "Dockerfile formatter to use";
};
};
extraDiagnostics = {
enable =
mkEnableOption "extra Docker diagnostics via nvim-lint"
// {
default = config.vim.languages.enableExtraDiagnostics;
defaultText = literalExpression "config.vim.languages.enableExtraDiagnostic";
};
types = mkOption {
type = listOf (enum diagnosticsProviders);
default = defaultDiagnosticsProvider;
description = "extra Docker diagnostics providers";
};
};
};
config = mkIf cfg.enable (mkMerge [
{
# Without this the LSP doesn't understand them correctly
# and there are conflicts with the YAML LSP,
# thus this module is "stealing" those files.
vim.filetype.pattern = {
"compose%.ya?ml" = "dockercompose";
"docker%-compose%.ya?ml" = "dockercompose";
};
}
(mkIf cfg.treesitter.enable {
vim.treesitter = {
enable = true;
grammars = [cfg.treesitter.package];
filetypeMappings = {
yaml = ["dockercompose"];
};
};
})
(mkIf cfg.lsp.enable {
vim.lsp = {
presets = genAttrs cfg.lsp.servers (_: {enable = true;});
servers = genAttrs cfg.lsp.servers (_: {
filetypes = [
"dockerfile"
"dockercompose"
];
});
};
})
(mkIf cfg.format.enable {
vim.formatter.conform-nvim = {
enable = true;
presets = genAttrs cfg.format.type (_: {enable = true;});
setupOpts.formatters_by_ft.dockerfile = cfg.format.type;
};
})
(mkIf cfg.extraDiagnostics.enable {
vim.diagnostics = {
presets = genAttrs cfg.extraDiagnostics.types (_: {enable = true;});
nvim-lint = {
enable = true;
linters_by_ft.dockerfile = cfg.extraDiagnostics.types;
};
};
})
]);
}
|