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 @@ -57,6 +57,7 @@ isMaximal: {
clang.enable = isMaximal;
cmake.enable = isMaximal;
css.enable = isMaximal;
scss.enable = isMaximal;
html.enable = isMaximal;
json.enable = isMaximal;
sql.enable = isMaximal;
Expand Down
3 changes: 3 additions & 0 deletions docs/manual/release-notes/rl-0.9.md
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,9 @@
- Added [taplo](https://taplo.tamasfe.dev/) as the default formatter and lsp for
`languages.toml` so we don't default to AI-Slop.

- Split SCSS from `languages.css` into `languages.scss` and add extra tools for
SCSS/SASS.

## Changelog {#sec-release-0-9-changelog}

[taylrfnt](https://github.com/taylrfnt)
Expand Down
3 changes: 1 addition & 2 deletions modules/plugins/languages/css.nix
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,12 @@
servers = {
cssls = {
cmd = ["${pkgs.vscode-langservers-extracted}/bin/vscode-css-language-server" "--stdio"];
filetypes = ["css" "scss" "less"];
filetypes = ["css" "less"];
# needed to enable formatting
init_options = {provideFormatter = true;};
root_markers = [".git" "package.json"];
settings = {
css.validate = true;
scss.validate = true;
less.validate = true;
};
};
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 @@ -13,6 +13,7 @@ in {
./clojure.nix
./cmake.nix
./css.nix
./scss.nix
./elixir.nix
./fsharp.nix
./gleam.nix
Expand Down
129 changes: 129 additions & 0 deletions modules/plugins/languages/scss.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
{
config,
pkgs,
lib,
...
}: let
inherit (builtins) attrNames;
inherit (lib.options) mkEnableOption mkOption;
inherit (lib.meta) getExe;
inherit (lib.modules) mkIf mkMerge;
inherit (lib.types) enum listOf;
inherit (lib.nvim.types) mkGrammarOption diagnostics;
inherit (lib.nvim.attrsets) mapListToAttrs;

cfg = config.vim.languages.scss;

defaultServer = ["scss-cssls"];
Copy link
Contributor Author

@snoweuph snoweuph Feb 4, 2026

Choose a reason for hiding this comment

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

As soon as NixOS/nixpkgs#459753 is in nixos, I will add some-sass and make it default, as it's so much better for SCSS and also supports sass, unlike cssls.

servers = {
scss-cssls = {
Copy link
Contributor Author

Choose a reason for hiding this comment

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

without prefix, this conflicts with the css module, as an lsp can only be registered once with its name

cmd = ["${pkgs.vscode-langservers-extracted}/bin/vscode-css-language-server" "--stdio"];
filetypes = ["scss" "sass"];
# needed to enable formatting
init_options = {provideFormatter = true;};
root_markers = [".git" "package.json"];
settings = {
scss.validate = true;
};
};
};

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

prettierd = {
command = getExe pkgs.prettierd;
};
};

defaultDiagnosticsProvider = ["stylelint"];
diagnosticsProviders = {
stylelint = {
config = {
cmd = getExe pkgs.stylelint;
};
};
};
in {
options.vim.languages.scss = {
enable = mkEnableOption "SCSS/SASS language support";

treesitter = {
enable = mkEnableOption "SCSS treesitter" // {default = config.vim.languages.enableTreesitter;};
package = mkGrammarOption pkgs "scss";
};

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

format = {
enable = mkEnableOption "SCSS/SASS formatting" // {default = config.vim.languages.enableFormat;};
type = mkOption {
description = "SCSS/SASS formatter to use";
type = listOf (enum (attrNames formats));
default = defaultFormat;
};
};

extraDiagnostics = {
enable = mkEnableOption "extra SCSS/SASS diagnostics" // {default = config.vim.languages.enableExtraDiagnostics;};
types = diagnostics {
langDesc = "SCSS";
inherit diagnosticsProviders;
inherit defaultDiagnosticsProvider;
};
};
};

config = mkIf cfg.enable (mkMerge [
(mkIf cfg.treesitter.enable {
vim.treesitter.enable = true;
vim.treesitter.grammars = [cfg.treesitter.package];
})

(mkIf cfg.lsp.enable {
vim.lsp.servers =
mapListToAttrs (name: {
inherit name;
value = servers.${name};
})
cfg.lsp.servers;
})

(mkIf cfg.format.enable {
vim.formatter.conform-nvim = {
enable = true;
setupOpts = {
formatters_by_ft.scss = cfg.format.type;
formatters_by_ft.sass = 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.scss = cfg.extraDiagnostics.types;
linters_by_ft.sass = cfg.extraDiagnostics.types;
linters =
mkMerge (map (name: {${name} = diagnosticsProviders.${name}.config;})
cfg.extraDiagnostics.types);
};
})
]);
}