2023-08-27 20:49:23 +02:00
|
|
|
{
|
2023-11-06 15:04:08 +01:00
|
|
|
lib,
|
|
|
|
helpers,
|
2023-08-27 20:49:23 +02:00
|
|
|
config,
|
|
|
|
pkgs,
|
|
|
|
...
|
|
|
|
}:
|
2024-05-05 19:39:35 +02:00
|
|
|
with lib;
|
|
|
|
let
|
2023-11-06 23:07:55 +01:00
|
|
|
tools = trivial.importJSON "${pkgs.vimPlugins.efmls-configs-nvim.src}/doc/supported-list.json";
|
2023-08-27 20:49:23 +02:00
|
|
|
|
2023-11-06 23:07:55 +01:00
|
|
|
languages = builtins.attrNames tools;
|
2023-11-16 23:26:44 +01:00
|
|
|
|
|
|
|
# Mapping of tool name to the nixpkgs package (if any)
|
2023-11-19 14:27:43 +01:00
|
|
|
allToolPkgs = with pkgs; {
|
2023-11-16 23:26:44 +01:00
|
|
|
inherit
|
|
|
|
actionlint
|
|
|
|
alejandra
|
|
|
|
ameba
|
|
|
|
astyle
|
|
|
|
bashate
|
|
|
|
beautysh
|
|
|
|
biome
|
|
|
|
black
|
2023-12-06 16:18:35 +01:00
|
|
|
buf
|
2023-11-16 23:26:44 +01:00
|
|
|
cbfmt
|
|
|
|
checkmake
|
|
|
|
clazy
|
|
|
|
codespell
|
|
|
|
cppcheck
|
|
|
|
cpplint
|
|
|
|
dfmt
|
|
|
|
djlint
|
|
|
|
dmd
|
|
|
|
dprint
|
|
|
|
fish
|
|
|
|
flawfinder
|
2023-12-06 16:18:35 +01:00
|
|
|
fnlfmt
|
2023-11-16 23:26:44 +01:00
|
|
|
gcc
|
|
|
|
gitlint
|
|
|
|
gofumpt
|
|
|
|
golines
|
|
|
|
golint
|
|
|
|
hadolint
|
|
|
|
isort
|
|
|
|
joker
|
|
|
|
jq
|
|
|
|
languagetool
|
|
|
|
mypy
|
|
|
|
php
|
|
|
|
prettierd
|
2023-12-19 11:41:34 +01:00
|
|
|
prettypst
|
2023-11-16 23:26:44 +01:00
|
|
|
proselint
|
|
|
|
protolint
|
|
|
|
pylint
|
|
|
|
rubocop
|
|
|
|
ruff
|
|
|
|
rustfmt
|
|
|
|
scalafmt
|
|
|
|
selene
|
|
|
|
shellcheck
|
|
|
|
shellharden
|
|
|
|
shfmt
|
|
|
|
smlfmt
|
2023-12-06 16:18:35 +01:00
|
|
|
sqlfluff
|
2023-11-16 23:26:44 +01:00
|
|
|
statix
|
|
|
|
stylua
|
|
|
|
taplo
|
2023-11-20 15:48:23 +01:00
|
|
|
typstfmt
|
2023-11-16 23:26:44 +01:00
|
|
|
uncrustify
|
|
|
|
vale
|
|
|
|
yamllint
|
|
|
|
yapf
|
|
|
|
;
|
2024-05-05 19:39:35 +02:00
|
|
|
inherit (python3.pkgs)
|
2023-12-06 16:18:35 +01:00
|
|
|
autopep8
|
|
|
|
flake8
|
|
|
|
mdformat
|
|
|
|
vulture
|
|
|
|
;
|
2024-05-05 19:39:35 +02:00
|
|
|
inherit (nodePackages)
|
2023-12-06 16:18:35 +01:00
|
|
|
eslint
|
|
|
|
eslint_d
|
|
|
|
prettier
|
|
|
|
alex
|
|
|
|
sql-formatter
|
|
|
|
stylelint
|
|
|
|
textlint
|
|
|
|
write-good
|
|
|
|
;
|
2024-05-05 19:39:35 +02:00
|
|
|
inherit (phpPackages) phan phpstan psalm;
|
|
|
|
inherit (luaPackages) luacheck;
|
|
|
|
inherit (haskellPackages) fourmolu;
|
2023-11-16 23:26:44 +01:00
|
|
|
ansible_lint = ansible-lint;
|
|
|
|
chktex = texliveMedium;
|
|
|
|
clang_format = clang-tools;
|
|
|
|
clang_tidy = clang-tools;
|
|
|
|
clj_kondo = clj-kondo;
|
|
|
|
cmake_lint = cmake-format;
|
|
|
|
dartfmt = dart;
|
|
|
|
dotnet_format = dotnet-runtime;
|
|
|
|
fish_indent = fish;
|
|
|
|
gofmt = go;
|
|
|
|
goimports = go-tools;
|
|
|
|
golangci_lint = golangci-lint;
|
|
|
|
google_java_format = google-java-format;
|
|
|
|
go_revive = revive;
|
|
|
|
latexindent = texliveMedium;
|
|
|
|
lua_format = luaformatter;
|
|
|
|
markdownlint = markdownlint-cli;
|
|
|
|
mcs = mono;
|
2024-04-04 10:24:31 +02:00
|
|
|
nixfmt = nixfmt-classic;
|
2024-02-28 08:19:00 +01:00
|
|
|
phpcbf = phpPackages.php-codesniffer;
|
2023-11-16 23:26:44 +01:00
|
|
|
php_cs_fixer = phpPackages.php-cs-fixer;
|
2024-02-28 08:19:00 +01:00
|
|
|
phpcs = phpPackages.php-codesniffer;
|
2023-11-16 23:26:44 +01:00
|
|
|
prettier_d = prettierd;
|
|
|
|
slither = slither-analyzer;
|
|
|
|
staticcheck = go-tools;
|
|
|
|
terraform_fmt = terraform;
|
|
|
|
vint = vim-vint;
|
|
|
|
write_good = write-good;
|
|
|
|
yq = yq-go;
|
|
|
|
};
|
2023-11-19 14:27:43 +01:00
|
|
|
# Filter packages that are not compatible with the current platform
|
2024-05-05 19:39:35 +02:00
|
|
|
toolPkgs = filterAttrs (a: pkg: meta.availableOn pkgs.stdenv.hostPlatform pkg) allToolPkgs;
|
|
|
|
in
|
|
|
|
{
|
2023-08-27 20:49:23 +02:00
|
|
|
options.plugins.efmls-configs = {
|
|
|
|
enable = mkEnableOption "efmls-configs, premade configurations for efm-langserver";
|
|
|
|
|
2024-05-17 14:09:20 +02:00
|
|
|
package = helpers.mkPluginPackageOption "efmls-configs-nvim" pkgs.vimPlugins.efmls-configs-nvim;
|
2023-08-27 20:49:23 +02:00
|
|
|
|
2023-11-16 23:26:44 +01:00
|
|
|
externallyManagedPackages = mkOption {
|
2024-05-05 19:39:35 +02:00
|
|
|
type = types.either (types.enum [ "all" ]) (types.listOf types.str);
|
2023-11-16 23:26:44 +01:00
|
|
|
description = ''
|
|
|
|
Linters/Formatters to skip installing with nixvim. Set to `all` to install no packages
|
|
|
|
'';
|
2024-05-05 19:39:35 +02:00
|
|
|
default = [ ];
|
2023-11-16 23:26:44 +01:00
|
|
|
};
|
|
|
|
|
2024-05-05 19:39:35 +02:00
|
|
|
toolPackages = attrsets.mapAttrs (
|
|
|
|
tool: pkg:
|
2023-11-16 23:26:44 +01:00
|
|
|
mkOption {
|
|
|
|
type = types.package;
|
|
|
|
default = pkg;
|
|
|
|
description = "Package for ${tool}";
|
2024-05-05 19:39:35 +02:00
|
|
|
}
|
|
|
|
) toolPkgs;
|
2023-11-16 23:26:44 +01:00
|
|
|
|
2023-08-27 20:49:23 +02:00
|
|
|
/*
|
2024-05-05 19:39:35 +02:00
|
|
|
Users can set the options as follows:
|
2023-08-27 20:49:23 +02:00
|
|
|
|
2024-05-05 19:39:35 +02:00
|
|
|
{
|
|
|
|
c = {
|
|
|
|
linter = "cppcheck";
|
|
|
|
formatter = ["clang-format" "uncrustify"];
|
|
|
|
};
|
|
|
|
go = {
|
|
|
|
linter = ["djlint" "golangci_lint"];
|
|
|
|
};
|
|
|
|
}
|
2023-08-27 20:49:23 +02:00
|
|
|
*/
|
2024-05-05 19:39:35 +02:00
|
|
|
setup =
|
|
|
|
let
|
|
|
|
languageTools =
|
|
|
|
lang: kind:
|
|
|
|
builtins.map (v: v.name) (
|
|
|
|
if builtins.hasAttr kind tools.${lang} then tools.${lang}.${kind} else [ ]
|
|
|
|
);
|
2023-08-27 20:49:23 +02:00
|
|
|
|
2024-05-05 19:39:35 +02:00
|
|
|
miscLinters = languageTools "misc" "linters";
|
|
|
|
miscFormatters = languageTools "misc" "formatters";
|
2023-08-27 20:49:23 +02:00
|
|
|
|
2024-05-05 19:39:35 +02:00
|
|
|
mkChooseOption =
|
|
|
|
lang: kind: possible:
|
|
|
|
let
|
|
|
|
toolType = with types; either (enum possible) helpers.nixvimTypes.rawLua;
|
|
|
|
in
|
|
|
|
mkOption {
|
|
|
|
type = with types; either toolType (listOf toolType);
|
|
|
|
default = [ ];
|
|
|
|
description = "${kind} tools for ${lang}";
|
|
|
|
};
|
2023-08-27 20:49:23 +02:00
|
|
|
in
|
|
|
|
mkOption {
|
|
|
|
type = types.submodule {
|
|
|
|
freeformType = types.attrs;
|
|
|
|
|
|
|
|
options =
|
2024-05-05 19:39:35 +02:00
|
|
|
(builtins.listToAttrs (
|
|
|
|
builtins.map (
|
|
|
|
lang:
|
|
|
|
let
|
|
|
|
langTools = languageTools lang;
|
|
|
|
in
|
|
|
|
{
|
|
|
|
name = lang;
|
|
|
|
value = {
|
|
|
|
linter = mkChooseOption lang "linter" ((langTools "linters") ++ miscLinters);
|
|
|
|
formatter = mkChooseOption lang "formatter" ((langTools "formatters") ++ miscFormatters);
|
|
|
|
};
|
|
|
|
}
|
|
|
|
) languages
|
|
|
|
))
|
2023-08-27 20:49:23 +02:00
|
|
|
// {
|
|
|
|
all = {
|
|
|
|
linter = mkChooseOption "all languages" "linter" miscLinters;
|
|
|
|
formatter = mkChooseOption "all languages" "formatter" miscFormatters;
|
|
|
|
};
|
|
|
|
};
|
|
|
|
};
|
|
|
|
description = "Configuration for each filetype. Use `all` to match any filetype.";
|
2024-05-05 19:39:35 +02:00
|
|
|
default = { };
|
2023-08-27 20:49:23 +02:00
|
|
|
};
|
|
|
|
};
|
2024-05-05 19:39:35 +02:00
|
|
|
config =
|
|
|
|
let
|
|
|
|
cfg = config.plugins.efmls-configs;
|
|
|
|
toolAsList = tools: if builtins.isList tools then tools else [ tools ];
|
2023-08-27 20:49:23 +02:00
|
|
|
|
2024-05-05 19:39:35 +02:00
|
|
|
# Tools that have been selected by the user
|
|
|
|
tools = lists.unique (
|
|
|
|
builtins.filter builtins.isString (
|
|
|
|
builtins.concatLists (
|
|
|
|
builtins.map (
|
|
|
|
{
|
|
|
|
linter ? [ ],
|
|
|
|
formatter ? [ ],
|
|
|
|
}:
|
|
|
|
(toolAsList linter) ++ (toolAsList formatter)
|
|
|
|
) (builtins.attrValues cfg.setup)
|
|
|
|
)
|
|
|
|
)
|
|
|
|
);
|
2023-08-27 20:49:23 +02:00
|
|
|
|
2024-05-05 19:39:35 +02:00
|
|
|
pkgsForTools =
|
|
|
|
let
|
|
|
|
partitionFn =
|
|
|
|
if cfg.externallyManagedPackages == "all" then
|
|
|
|
_: false
|
|
|
|
else
|
|
|
|
t: !(builtins.elem t cfg.externallyManagedPackages);
|
|
|
|
partition = lists.partition partitionFn tools;
|
|
|
|
in
|
|
|
|
{
|
|
|
|
nixvim = partition.right;
|
|
|
|
external = partition.wrong;
|
|
|
|
};
|
2023-11-16 23:26:44 +01:00
|
|
|
|
2024-05-05 19:39:35 +02:00
|
|
|
nixvimPkgs = lists.partition (v: builtins.hasAttr v cfg.toolPackages) pkgsForTools.nixvim;
|
2023-08-27 20:49:23 +02:00
|
|
|
|
2024-05-05 19:39:35 +02:00
|
|
|
mkToolOption =
|
|
|
|
kind: opt:
|
|
|
|
builtins.map (
|
|
|
|
tool:
|
|
|
|
if builtins.isString tool then helpers.mkRaw "require 'efmls-configs.${kind}.${tool}'" else tool
|
|
|
|
) (toolAsList opt);
|
2023-08-27 20:49:23 +02:00
|
|
|
|
2024-05-05 19:39:35 +02:00
|
|
|
setupOptions =
|
|
|
|
(builtins.mapAttrs (
|
|
|
|
_:
|
|
|
|
{
|
|
|
|
linter ? [ ],
|
|
|
|
formatter ? [ ],
|
2023-08-27 20:49:23 +02:00
|
|
|
}:
|
2024-05-05 19:39:35 +02:00
|
|
|
(mkToolOption "linters" linter) ++ (mkToolOption "formatters" formatter)
|
|
|
|
) (attrsets.filterAttrs (v: _: v != "all") cfg.setup))
|
|
|
|
// {
|
|
|
|
"=" =
|
|
|
|
(mkToolOption "linters" cfg.setup.all.linter)
|
|
|
|
++ (mkToolOption "formatters" cfg.setup.all.formatter);
|
|
|
|
};
|
|
|
|
in
|
2023-08-27 20:49:23 +02:00
|
|
|
mkIf cfg.enable {
|
2024-05-05 19:39:35 +02:00
|
|
|
extraPlugins = [ cfg.package ];
|
2023-08-27 20:49:23 +02:00
|
|
|
|
2023-11-16 23:26:44 +01:00
|
|
|
warnings = optional ((builtins.length nixvimPkgs.wrong) > 0) ''
|
2024-01-22 11:31:18 +01:00
|
|
|
Nixvim (plugins.efmls-configs): Following tools are not handled by nixvim, please add them to externallyManagedPackages to silence this:
|
2023-11-16 23:26:44 +01:00
|
|
|
${builtins.concatStringsSep " " nixvimPkgs.wrong}
|
|
|
|
'';
|
|
|
|
|
2023-08-27 20:49:23 +02:00
|
|
|
plugins.lsp.servers.efm = {
|
|
|
|
enable = true;
|
|
|
|
extraOptions.settings.languages = setupOptions;
|
|
|
|
};
|
|
|
|
|
2024-05-05 19:39:35 +02:00
|
|
|
extraPackages = [
|
|
|
|
pkgs.efm-langserver
|
|
|
|
] ++ (builtins.map (v: cfg.toolPackages.${v}) nixvimPkgs.right);
|
2023-08-27 20:49:23 +02:00
|
|
|
};
|
|
|
|
}
|