plugins/rainbow-delimiters: init + test (replaces treesitter-rainbow)

This commit is contained in:
Gaetan Lepage 2023-08-25 14:09:41 +02:00 committed by Gaétan Lepage
parent ee2e15b58b
commit ebfaa31df3
5 changed files with 286 additions and 97 deletions

View file

@ -0,0 +1,222 @@
{
pkgs,
lib,
config,
...
}:
with lib; let
helpers = import ../../helpers.nix {inherit lib;};
in {
# TODO those warnings have been added XX/XX/2023
# -> Remove them in ~ 1 month (oct. 2023)
imports =
mapAttrsToList
(
old: new:
mkRenamedOptionModule
["plugins" "treesitter-rainbow" old]
["plugins" "rainbow-delimiters" new]
)
{
enable = "enable";
package = "package";
strategy = "strategy";
query = "query";
disable = "blacklist";
hlgroups = "highlight";
};
options.plugins.rainbow-delimiters =
helpers.extraOptionsOptions
// {
enable = mkEnableOption "rainbow-delimiters.nvim";
package =
helpers.mkPackageOption
"rainbow-delimiters.nvim"
pkgs.vimPlugins.rainbow-delimiters-nvim;
strategy =
helpers.defaultNullOpts.mkNullable
(
with types;
attrsOf (
either
helpers.rawType
(enum ["global" "local" "noop"])
)
)
''
{
default = "global";
}
''
''
Attrs mapping Tree-sitter language names to strategies.
See `|rb-delimiters-strategy|` for more information about strategies.
Example:
```nix
{
# Use global strategy by default
default = "global";
# Use local for HTML
html = "local";
# Pick the strategy for LaTeX dynamically based on the buffer size
latex.__raw = \'\'
function()
-- Disabled for very large files, global strategy for large files,
-- local strategy otherwise
if vim.fn.line('$') > 10000 then
return nil
elseif vim.fn.line('$') > 1000 then
return require 'rainbow-delimiters'.strategy['global']
end
return require 'rainbow-delimiters'.strategy['local']
end
\'\';
}
```
'';
query =
helpers.defaultNullOpts.mkNullable
(with types; attrsOf str)
''
{
default = "rainbow-delimiters";
lua = "rainbow-blocks";
}
''
''
Attrs mapping Tree-sitter language names to queries.
See `|rb-delimiters-query|` for more information about queries.
'';
highlight =
helpers.defaultNullOpts.mkNullable (with types; listOf str)
''
[
"RainbowDelimiterRed"
"RainbowDelimiterYellow"
"RainbowDelimiterBlue"
"RainbowDelimiterOrange"
"RainbowDelimiterGreen"
"RainbowDelimiterViolet"
"RainbowDelimiterCyan"
]
''
''
List of names of the highlight groups to use for highlighting, for more information see
`|rb-delimiters-colors|`.
'';
whitelist = helpers.mkNullOrOption (with types; listOf str) ''
List of Tree-sitter languages for which to enable rainbow delimiters.
Rainbow delimiters will be disabled for all other languages.
'';
blacklist = helpers.mkNullOrOption (with types; listOf str) ''
List of Tree-sitter languages for which to disable rainbow delimiters.
Rainbow delimiters will be enabled for all other languages.
'';
log = {
file =
helpers.defaultNullOpts.mkNullable
(with types; either str helpers.rawType)
''
{
__raw = "vim.fn.stdpath('log') .. '/rainbow-delimiters.log'";
}
''
''
Path to the log file, default is `rainbow-delimiters.log` in your standard log path
(see `|standard-path|`).
'';
level =
helpers.defaultNullOpts.mkEnum
["debug" "error" "info" "trace" "warn" "off"]
"warn"
''
Only messages equal to or above this value will be logged.
The default is to log warnings or above.
See `|log_levels|` for possible values.
'';
};
};
config = let
cfg = config.plugins.rainbow-delimiters;
in
mkIf cfg.enable {
warnings =
optional
(!config.plugins.treesitter.enable)
"Nixvim: treesitter-rainbow needs treesitter to function as intended";
assertions = [
{
assertion = (cfg.whitelist == null) || (cfg.blacklist == null);
message = ''
Both `rainbow-delimiters.whitelist` and `rainbow-delimiters.blacklist` should not be
set simultaneously.
Please remove one of them.
'';
}
];
extraPlugins = [cfg.package];
globals.rainbow_delimiters = with cfg;
{
strategy =
helpers.ifNonNull' strategy
(
mapAttrs'
(
name: value: {
name =
if name == "default"
then "__emptyString"
else name;
value =
if isString value
then helpers.mkRaw "require 'rainbow-delimiters'.strategy['${value}']"
else value;
}
)
strategy
);
query =
helpers.ifNonNull' query
(
mapAttrs'
(
name: value: {
name =
if name == "default"
then "__emptyString"
else name;
inherit value;
}
)
query
);
inherit
highlight
whitelist
blacklist
;
log = with log; {
inherit file;
level =
helpers.ifNonNull' level
(helpers.mkRaw "vim.log.levels.${strings.toUpper level}");
};
}
// cfg.extraOptions;
};
}

View file

@ -1,66 +0,0 @@
{
pkgs,
lib,
config,
...
}:
with lib; let
helpers = import ../../helpers.nix {inherit lib;};
in {
options.plugins.treesitter-rainbow =
helpers.extraOptionsOptions
// {
enable = mkEnableOption "treesitter-rainbow";
package = helpers.mkPackageOption "treesitter-rainbow" pkgs.vimPlugins.nvim-ts-rainbow2;
disable =
helpers.defaultNullOpts.mkNullable (types.listOf types.str) "[]"
"List of languages you want to disable the plugin for.";
query =
helpers.defaultNullOpts.mkStr "rainbow-parens"
"The query to use for finding delimiters.";
strategy =
helpers.defaultNullOpts.mkStr "require('ts-rainbow').strategy.global"
"The query to use for finding delimiters. Directly provide lua code.";
hlgroups =
helpers.defaultNullOpts.mkNullable (types.listOf types.str)
''
[
"TSRainbowRed"
"TSRainbowYellow"
"TSRainbowBlue"
"TSRainbowOrange"
"TSRainbowGreen"
"TSRainbowViolet"
"TSRainbowCyan"
]
''
"The list of highlight groups to apply.";
};
config = let
cfg = config.plugins.treesitter-rainbow;
in
mkIf cfg.enable {
warnings = mkIf (!config.plugins.treesitter.enable) [
"Nixvim: treesitter-rainbow needs treesitter to function as intended"
];
extraPlugins = [cfg.package];
plugins.treesitter.moduleConfig.rainbow =
{
enable = true;
inherit (cfg) disable;
inherit (cfg) query;
strategy = helpers.ifNonNull' cfg.strategy (helpers.mkRaw cfg.strategy);
inherit (cfg) hlgroups;
}
// cfg.extraOptions;
};
}