Skip to content

Commit 17af35a

Browse files
committed
languages/scss: WIP
1 parent 618cbe6 commit 17af35a

5 files changed

Lines changed: 135 additions & 2 deletions

File tree

configuration.nix

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ isMaximal: {
5757
clang.enable = isMaximal;
5858
cmake.enable = isMaximal;
5959
css.enable = isMaximal;
60+
scss.enable = isMaximal;
6061
html.enable = isMaximal;
6162
json.enable = isMaximal;
6263
sql.enable = isMaximal;

docs/manual/release-notes/rl-0.9.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,9 @@
5353

5454
- Added `json5` into `languages.json`. Some options where renamed.
5555

56+
- Split SCSS from `languages.css` into `languages.scss` and add extra tools for
57+
SCSS/SASS.
58+
5659
## Changelog {#sec-release-0-9-changelog}
5760

5861
[midischwarz12](https://github.com/midischwarz12):

modules/plugins/languages/css.nix

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,12 @@
1818
servers = {
1919
cssls = {
2020
cmd = ["${pkgs.vscode-langservers-extracted}/bin/vscode-css-language-server" "--stdio"];
21-
filetypes = ["css" "scss" "less"];
21+
filetypes = ["css" "less"];
2222
# needed to enable formatting
2323
init_options = {provideFormatter = true;};
2424
root_markers = [".git" "package.json"];
2525
settings = {
2626
css.validate = true;
27-
scss.validate = true;
2827
less.validate = true;
2928
};
3029
};

modules/plugins/languages/default.nix

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ in {
1313
./clojure.nix
1414
./cmake.nix
1515
./css.nix
16+
./scss.nix
1617
./elixir.nix
1718
./elm.nix
1819
./fsharp.nix

modules/plugins/languages/scss.nix

Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
{
2+
config,
3+
pkgs,
4+
lib,
5+
...
6+
}: let
7+
inherit (builtins) attrNames;
8+
inherit (lib.options) mkEnableOption mkOption;
9+
inherit (lib.meta) getExe;
10+
inherit (lib.modules) mkIf mkMerge;
11+
inherit (lib.types) enum listOf;
12+
inherit (lib.nvim.types) mkGrammarOption diagnostics;
13+
inherit (lib.nvim.attrsets) mapListToAttrs;
14+
15+
cfg = config.vim.languages.scss;
16+
17+
defaultServer = ["scss-cssls"];
18+
servers = {
19+
scss-cssls = {
20+
cmd = ["${pkgs.vscode-langservers-extracted}/bin/vscode-css-language-server" "--stdio"];
21+
filetypes = ["scss" "sass"];
22+
# needed to enable formatting
23+
init_options = {provideFormatter = true;};
24+
root_markers = [".git" "package.json"];
25+
settings = {
26+
scss.validate = true;
27+
};
28+
};
29+
};
30+
31+
defaultFormat = ["prettier"];
32+
formats = {
33+
prettier = {
34+
command = getExe pkgs.prettier;
35+
};
36+
37+
prettierd = {
38+
command = getExe pkgs.prettierd;
39+
};
40+
};
41+
42+
defaultDiagnosticsProvider = ["stylelint"];
43+
diagnosticsProviders = {
44+
stylelint = {
45+
config = {
46+
cmd = getExe pkgs.stylelint;
47+
};
48+
};
49+
};
50+
in {
51+
options.vim.languages.scss = {
52+
enable = mkEnableOption "SCSS/SASS language support";
53+
54+
treesitter = {
55+
enable = mkEnableOption "SCSS treesitter" // {default = config.vim.languages.enableTreesitter;};
56+
package = mkGrammarOption pkgs "scss";
57+
};
58+
59+
lsp = {
60+
enable = mkEnableOption "SCSS/SASS LSP support" // {default = config.vim.lsp.enable;};
61+
servers = mkOption {
62+
type = listOf (enum (attrNames servers));
63+
default = defaultServer;
64+
description = "SCSS/SASS LSP server to use";
65+
};
66+
};
67+
68+
format = {
69+
enable = mkEnableOption "SCSS/SASS formatting" // {default = config.vim.languages.enableFormat;};
70+
type = mkOption {
71+
description = "SCSS/SASS formatter to use";
72+
type = listOf (enum (attrNames formats));
73+
default = defaultFormat;
74+
};
75+
};
76+
77+
extraDiagnostics = {
78+
enable = mkEnableOption "extra SCSS/SASS diagnostics" // {default = config.vim.languages.enableExtraDiagnostics;};
79+
types = diagnostics {
80+
langDesc = "SCSS";
81+
inherit diagnosticsProviders;
82+
inherit defaultDiagnosticsProvider;
83+
};
84+
};
85+
};
86+
87+
config = mkIf cfg.enable (mkMerge [
88+
(mkIf cfg.treesitter.enable {
89+
vim.treesitter.enable = true;
90+
vim.treesitter.grammars = [cfg.treesitter.package];
91+
})
92+
93+
(mkIf cfg.lsp.enable {
94+
vim.lsp.servers =
95+
mapListToAttrs (name: {
96+
inherit name;
97+
value = servers.${name};
98+
})
99+
cfg.lsp.servers;
100+
})
101+
102+
(mkIf cfg.format.enable {
103+
vim.formatter.conform-nvim = {
104+
enable = true;
105+
setupOpts = {
106+
formatters_by_ft.scss = cfg.format.type;
107+
formatters_by_ft.sass = cfg.format.type;
108+
formatters =
109+
mapListToAttrs (name: {
110+
inherit name;
111+
value = formats.${name};
112+
})
113+
cfg.format.type;
114+
};
115+
};
116+
})
117+
118+
(mkIf cfg.extraDiagnostics.enable {
119+
vim.diagnostics.nvim-lint = {
120+
enable = true;
121+
linters_by_ft.scss = cfg.extraDiagnostics.types;
122+
linters_by_ft.sass = cfg.extraDiagnostics.types;
123+
linters =
124+
mkMerge (map (name: {${name} = diagnosticsProviders.${name}.config;})
125+
cfg.extraDiagnostics.types);
126+
};
127+
})
128+
]);
129+
}

0 commit comments

Comments
 (0)