nix-community.nixvim/plugins/utils/illuminate.nix

146 lines
4.3 KiB
Nix
Raw Normal View History

{
lib,
helpers,
config,
pkgs,
...
}:
2024-05-05 19:39:35 +02:00
with lib;
let
cfg = config.plugins.illuminate;
mkListStr = helpers.defaultNullOpts.mkNullable (types.listOf types.str);
commonOptions = with helpers.defaultNullOpts; {
providers = mkListStr ''["lsp" "treesitter" "regex"]'' ''
Provider used to get references in the buffer, ordered by priority.
'';
delay = mkInt 100 ''
Delay in milliseconds.
'';
modesDenylist = mkListStr "[]" ''
Modes to not illuminate, this overrides `modes_allowlist`.
See `:help mode()` for possible values.
'';
modesAllowlist = mkListStr "[]" ''
2024-03-07 19:44:13 +01:00
Modes to illuminate, this is overridden by `modes_denylist`.
See `:help mode()` for possible values.
'';
providersRegexSyntaxDenylist = mkListStr "[]" ''
Syntax to not illuminate, this overrides `providers_regex_syntax_allowlist`.
Only applies to the 'regex' provider.
Use `:echo synIDattr(synIDtrans(synID(line('.'), col('.'), 1)), 'name')`.
'';
providersRegexSyntaxAllowlist = mkListStr "[]" ''
2024-03-07 19:44:13 +01:00
Syntax to illuminate, this is overridden by `providers_regex_syntax_denylist`.
Only applies to the 'regex' provider.
Use `:echo synIDattr(synIDtrans(synID(line('.'), col('.'), 1)), 'name')`.
'';
underCursor = mkBool true ''
Whether or not to illuminate under the cursor.
'';
largeFileCutoff = helpers.mkNullOrOption types.int ''
Number of lines at which to use `large_file_config`.
The `under_cursor` option is disabled when this cutoff is hit.
'';
minCountToHighlight = mkInt 1 ''
Minimum number of matches required to perform highlighting.
'';
};
filetypeOptions = {
filetypesDenylist = mkListStr ''["dirvish" "fugitive"]'' ''
Filetypes to not illuminate, this overrides `filetypes_allowlist`.
'';
filetypesAllowlist = mkListStr "[]" ''
2024-03-07 19:44:13 +01:00
Filetypes to illuminate, this is overridden by `filetypes_denylist`.
'';
};
2024-05-05 19:39:35 +02:00
in
{
options.plugins.illuminate =
with helpers;
with defaultNullOpts;
helpers.neovim-plugin.extraOptionsOptions
// {
enable = mkEnableOption "vim-illuminate";
package = mkPluginPackageOption "vim-illuminate" pkgs.vimPlugins.vim-illuminate;
filetypeOverrides =
helpers.defaultNullOpts.mkNullable
2024-05-05 19:39:35 +02:00
(
with types;
attrsOf (submodule {
options = commonOptions;
})
)
"{}"
''
Filetype specific overrides.
The keys are strings to represent the filetype.
'';
largeFileOverrides = mkOption {
2024-05-05 19:39:35 +02:00
type = types.submodule { options = commonOptions // filetypeOptions; };
description = ''
Config to use for large files (based on large_file_cutoff).
Supports the same keys passed to .configure
If null, illuminate will be disabled for large files.
'';
2024-05-05 19:39:35 +02:00
default = { };
};
}
// commonOptions
// filetypeOptions;
2024-05-05 19:39:35 +02:00
config =
let
filetypeSetupOptions =
filetypeOptions: with filetypeOptions; {
filetypes_denylist = filetypesDenylist;
filetypes_allowlist = filetypesAllowlist;
};
commonSetupOptions =
opts: with opts; {
inherit providers;
inherit delay;
modes_denylist = modesDenylist;
modes_allowlist = modesAllowlist;
providers_regex_syntax_denylist = providersRegexSyntaxDenylist;
providers_regex_syntax_allowlist = providersRegexSyntaxAllowlist;
under_cursor = underCursor;
large_file_cutoff = largeFileCutoff;
min_count_to_highlight = minCountToHighlight;
};
setupOptions =
with cfg;
{
large_file_overrides =
(commonSetupOptions largeFileOverrides) // (filetypeSetupOptions largeFileOverrides);
filetype_overrides = helpers.ifNonNull' filetypeOverrides (
mapAttrs (_: commonSetupOptions) filetypeOverrides
);
2024-05-05 19:39:35 +02:00
}
// (filetypeSetupOptions cfg)
// (commonSetupOptions cfg);
in
mkIf cfg.enable {
2024-05-05 19:39:35 +02:00
extraPlugins = [ cfg.package ];
extraConfigLua = ''
require("illuminate").configure(${helpers.toLuaObject setupOptions})
'';
};
}