modules/lsp/servers: move the * server to its own module

Introduce a bespoke `global-server.nix` module. This is less DRY, but
much simpler.

The `lsp.servers."*"` options are different enough from the other
`lsp.servers.<name>` options that it is simpler to just declare them
separately.

Now that we have a dedicated `global-server.nix` module, we no longer
need to split the normal server module into `server.nix`+`server-base.nix`

This partially reverts f2e96b67a3
This commit is contained in:
Matt Sturgeon 2025-05-03 20:04:28 +01:00
parent 8b3107ad6f
commit 90eb4e681c
No known key found for this signature in database
GPG key ID: 4F91844CED1A8299
5 changed files with 98 additions and 82 deletions

View file

@ -85,28 +85,12 @@ in
{ {
# `*` is effectively a meta server, where shared config & defaults can be set. # `*` is effectively a meta server, where shared config & defaults can be set.
# It shouldn't have options like `activate` or `package` which relate to "real" servers. # It shouldn't have options like `activate` or `package` which relate to "real" servers.
# Therefore, we'll use `server-base.nix` directly, instead of the full `server.nix` module. # Therefore, we use a bespoke `global-server.nix`, which is inspired by the full `server.nix` module.
options."*" = lib.mkOption { options."*" = lib.mkOption {
description = '' description = ''
Global configuration applied to all language servers. Global configuration applied to all language servers.
''; '';
type = types.submodule ( type = types.submodule ./global-server.nix;
lib.modules.importApply ./server-base.nix {
displayName = "all servers";
enable.name = "the `*` server config";
enable.default = true;
settings.extraDescription = ''
Will be merged by neovim using the behaviour of [`vim.tbl_deep_extend()`](https://neovim.io/doc/user/lua.html#vim.tbl_deep_extend()).
'';
settings.example = {
root_markers = [ ".git" ];
capabilities.textDocument.semanticTokens = {
multilineTokenSupport = true;
};
};
}
);
apply = value: value // { name = "*"; };
default = { }; default = { };
}; };
} }

View file

@ -0,0 +1,49 @@
{ lib, ... }:
let
inherit (lib) types;
in
{
options = {
enable = lib.mkOption {
type = types.bool;
description = "Whether to enable global defaults shared by all servers.";
default = true;
example = false;
};
name = lib.mkOption {
type = types.str;
description = ''
The name to use for global defaults shared by all servers.
Supplied to functions like `vim.lsp.config()`.
Will always be `"*"`.
'';
readOnly = true;
};
settings = lib.mkOption {
type = with types; attrsOf anything;
description = ''
Default configuration shared by all servers.
Will be merged by neovim using the behaviour of [`vim.tbl_deep_extend()`](https://neovim.io/doc/user/lua.html#vim.tbl_deep_extend()).
'';
default = { };
example = {
root_markers = [ ".git" ];
capabilities.textDocument.semanticTokens = {
multilineTokenSupport = true;
};
};
};
};
imports = [
./server-renames.nix
];
# Define the read-only `name` here, instead of via `default`, to avoid documenting it twice
config.name = "*";
}

View file

@ -1,61 +0,0 @@
# Usage: lib.importApply ./server-base.nix { /*args*/ }
{
displayName ? "the language server",
settings ? null,
enable ? null,
}:
{ lib, ... }:
let
inherit (lib) types;
in
{
options = {
enable = lib.mkOption rec {
type = types.bool;
description = "Whether to enable ${enable.name or displayName}. ${enable.extraDescription or ""}";
default = enable.default or false;
example = enable.example or (!default);
};
settings = lib.mkOption {
type = with types; attrsOf anything;
description = ''
Configurations for ${displayName}. ${settings.extraDescription or ""}
'';
default = { };
example =
settings.example or {
cmd = [
"clangd"
"--background-index"
];
root_markers = [
"compile_commands.json"
"compile_flags.txt"
];
filetypes = [
"c"
"cpp"
];
};
};
# NOTE: we need a warnings option for `mkRenamedOptionModule` to warn about unexpected definitions
# This can be removed when all rename aliases are gone
warnings = lib.mkOption {
type = with types; listOf str;
description = "Warnings to propagate to nixvim's `warnings` option.";
default = [ ];
internal = true;
visible = false;
};
};
imports = [
# TODO: rename added 2025-04-30 (during the 25.05 cycle)
# The previous name `config` was introduced 2025-04-28 (during the 25.05 cycle)
# Because the previous name `config` never made it into a stable release,
# we could consider dropping this alias sooner than normal.
(lib.mkRenamedOptionModule [ "config" ] [ "settings" ])
];
}

View file

@ -0,0 +1,21 @@
{ lib, ... }:
{
# NOTE: we need a warnings option for `mkRenamedOptionModule` to warn about unexpected definitions
# This can be removed when all rename aliases are gone
options.warnings = lib.mkOption {
type = with lib.types; listOf str;
description = "Warnings to propagate to nixvim's `warnings` option.";
default = [ ];
internal = true;
visible = false;
};
imports = [
# TODO: rename added 2025-04-30 (during the 25.05 cycle)
# The previous name `config` was introduced 2025-04-28 (during the 25.05 cycle)
# Because the previous name `config` never made it into a stable release,
# we could consider dropping this alias sooner than normal.
(lib.mkRenamedOptionModule [ "config" ] [ "settings" ])
];
}

View file

@ -18,6 +18,8 @@ let
in in
{ {
options = { options = {
enable = lib.mkEnableOption displayName;
name = lib.mkOption { name = lib.mkOption {
type = types.maybeRaw types.str; type = types.maybeRaw types.str;
description = '' description = ''
@ -51,11 +53,32 @@ in
Alternatively, ${displayName} should be installed on your `$PATH`. Alternatively, ${displayName} should be installed on your `$PATH`.
''; '';
}; };
settings = lib.mkOption {
type = with types; attrsOf anything;
description = ''
Configurations for ${displayName}. ${settings.extraDescription or ""}
'';
default = { };
example =
settings.example or {
cmd = [
"clangd"
"--background-index"
];
root_markers = [
"compile_commands.json"
"compile_flags.txt"
];
filetypes = [
"c"
"cpp"
];
};
};
}; };
imports = [ imports = [
(lib.modules.importApply ./server-base.nix { ./server-renames.nix
inherit displayName settings;
})
]; ];
} }