mirror of
https://github.com/NotAShelf/nvf.git
synced 2024-11-27 07:26:46 +00:00
a452a0b0e7
mkEnableOption already adds the phrase "Whether to enable ..." to the beginning of the option description, such that the string argument should only be "thing to be enabled"
205 lines
5.3 KiB
Nix
205 lines
5.3 KiB
Nix
{
|
|
pkgs,
|
|
config,
|
|
lib,
|
|
...
|
|
}:
|
|
with lib;
|
|
with builtins; let
|
|
cfg = config.vim.languages.nix;
|
|
|
|
useFormat = "on_attach = default_on_attach";
|
|
noFormat = "on_attach = attach_keymaps";
|
|
|
|
defaultServer = "nil";
|
|
packageToCmd = package: defaultCmd:
|
|
if isList package
|
|
then lib.nvim.lua.expToLua package
|
|
else ''{"${package}/bin/${defaultCmd}"}'';
|
|
servers = {
|
|
rnix = {
|
|
package = pkgs.rnix-lsp;
|
|
internalFormatter = cfg.format.type == "nixpkgs-fmt";
|
|
lspConfig = ''
|
|
lspconfig.rnix.setup{
|
|
capabilities = capabilities,
|
|
${
|
|
if (cfg.format.enable && cfg.format.type == "nixpkgs-fmt")
|
|
then useFormat
|
|
else noFormat
|
|
},
|
|
cmd = ${packageToCmd cfg.lsp.package "rnix-lsp"},
|
|
}
|
|
'';
|
|
};
|
|
|
|
nil = {
|
|
package = pkgs.nil;
|
|
internalFormatter = true;
|
|
lspConfig = ''
|
|
lspconfig.nil_ls.setup{
|
|
capabilities = capabilities,
|
|
${
|
|
if cfg.format.enable
|
|
then useFormat
|
|
else noFormat
|
|
},
|
|
cmd = ${packageToCmd cfg.lsp.package "nil"},
|
|
${optionalString cfg.format.enable ''
|
|
settings = {
|
|
["nil"] = {
|
|
${optionalString (cfg.format.type == "alejandra")
|
|
''
|
|
formatting = {
|
|
command = {"${cfg.format.package}/bin/alejandra", "--quiet"},
|
|
},
|
|
''}
|
|
${optionalString (cfg.format.type == "nixpkgs-fmt")
|
|
''
|
|
formatting = {
|
|
command = {"${cfg.format.package}/bin/nixpkgs-fmt"},
|
|
},
|
|
''}
|
|
},
|
|
},
|
|
''}
|
|
}
|
|
'';
|
|
};
|
|
};
|
|
|
|
defaultFormat = "alejandra";
|
|
formats = {
|
|
alejandra = {
|
|
package = pkgs.alejandra;
|
|
nullConfig = ''
|
|
table.insert(
|
|
ls_sources,
|
|
null_ls.builtins.formatting.alejandra.with({
|
|
command = "${cfg.format.package}/bin/alejandra"
|
|
})
|
|
)
|
|
'';
|
|
};
|
|
nixpkgs-fmt = {
|
|
package = pkgs.nixpkgs-fmt;
|
|
# Never need to use null-ls for nixpkgs-fmt
|
|
};
|
|
};
|
|
|
|
defaultDiagnostics = ["statix" "deadnix"];
|
|
diagnostics = {
|
|
statix = {
|
|
package = pkgs.statix;
|
|
nullConfig = pkg: ''
|
|
table.insert(
|
|
ls_sources,
|
|
null_ls.builtins.diagnostics.statix.with({
|
|
command = "${pkg}/bin/statix",
|
|
})
|
|
)
|
|
'';
|
|
};
|
|
deadnix = {
|
|
package = pkgs.deadnix;
|
|
nullConfig = pkg: ''
|
|
table.insert(
|
|
ls_sources,
|
|
null_ls.builtins.diagnostics.deadnix.with({
|
|
command = "${pkg}/bin/deadnix",
|
|
})
|
|
)
|
|
'';
|
|
};
|
|
};
|
|
in {
|
|
options.vim.languages.nix = {
|
|
enable = mkEnableOption "Nix language support";
|
|
|
|
treesitter = {
|
|
enable = mkOption {
|
|
description = "Enable Nix treesitter";
|
|
type = types.bool;
|
|
default = config.vim.languages.enableTreesitter;
|
|
};
|
|
package = nvim.types.mkGrammarOption pkgs "nix";
|
|
};
|
|
|
|
lsp = {
|
|
enable = mkEnableOption "Nix LSP support" // {default = config.vim.languages.enableLSP;};
|
|
|
|
server = mkOption {
|
|
description = "Nix LSP server to use";
|
|
type = types.str;
|
|
default = defaultServer;
|
|
};
|
|
package = mkOption {
|
|
description = "Nix LSP server package, or the command to run as a list of strings";
|
|
example = ''[lib.getExe pkgs.jdt-language-server "-data" "~/.cache/jdtls/workspace"]'';
|
|
type = with types; either package (listOf str);
|
|
default = servers.${cfg.lsp.server}.package;
|
|
};
|
|
};
|
|
|
|
format = {
|
|
enable = mkEnableOption "Nix formatting" // {default = config.vim.languages.enableFormat;};
|
|
|
|
type = mkOption {
|
|
description = "Nix formatter to use";
|
|
type = with types; enum (attrNames formats);
|
|
default = defaultFormat;
|
|
};
|
|
package = mkOption {
|
|
description = "Nix formatter package";
|
|
type = types.package;
|
|
default = formats.${cfg.format.type}.package;
|
|
};
|
|
};
|
|
|
|
extraDiagnostics = {
|
|
enable = mkOption {
|
|
description = "Enable extra Nix diagnostics";
|
|
type = types.bool;
|
|
default = config.vim.languages.enableExtraDiagnostics;
|
|
};
|
|
types = lib.nvim.types.diagnostics {
|
|
langDesc = "Nix";
|
|
inherit diagnostics;
|
|
inherit defaultDiagnostics;
|
|
};
|
|
};
|
|
};
|
|
|
|
config = mkIf cfg.enable (mkMerge [
|
|
{
|
|
vim.configRC.nix = nvim.dag.entryAnywhere ''
|
|
autocmd filetype nix setlocal tabstop=2 shiftwidth=2 softtabstop=2
|
|
'';
|
|
}
|
|
|
|
(mkIf cfg.treesitter.enable {
|
|
vim.treesitter.enable = true;
|
|
vim.treesitter.grammars = [cfg.treesitter.package];
|
|
})
|
|
|
|
(mkIf cfg.lsp.enable {
|
|
vim.lsp.lspconfig.enable = true;
|
|
vim.lsp.lspconfig.sources.nix-lsp = servers.${cfg.lsp.server}.lspConfig;
|
|
})
|
|
|
|
(mkIf (cfg.format.enable && !servers.${cfg.lsp.server}.internalFormatter) {
|
|
vim.lsp.null-ls.enable = true;
|
|
vim.lsp.null-ls.sources.nix-format = formats.${cfg.format.type}.nullConfig;
|
|
})
|
|
|
|
(mkIf cfg.extraDiagnostics.enable {
|
|
vim.lsp.null-ls.enable = true;
|
|
vim.lsp.null-ls.sources = lib.nvim.languages.diagnosticsToLua {
|
|
lang = "nix";
|
|
config = cfg.extraDiagnostics.types;
|
|
inherit diagnostics;
|
|
};
|
|
})
|
|
]);
|
|
}
|