diff --git a/plugins/default.nix b/plugins/default.nix index bd1ff33f..7f92209a 100644 --- a/plugins/default.nix +++ b/plugins/default.nix @@ -46,10 +46,10 @@ ./languages/rust.nix ./languages/sniprun.nix ./languages/tagbar.nix + ./languages/treesitter/rainbow-delimiters.nix ./languages/treesitter/treesitter.nix ./languages/treesitter/treesitter-context.nix ./languages/treesitter/treesitter-playground.nix - ./languages/treesitter/treesitter-rainbow.nix ./languages/treesitter/treesitter-refactor.nix ./languages/treesitter/ts-autotag.nix ./languages/treesitter/ts-context-commentstring.nix diff --git a/plugins/languages/treesitter/rainbow-delimiters.nix b/plugins/languages/treesitter/rainbow-delimiters.nix new file mode 100644 index 00000000..2bf236b4 --- /dev/null +++ b/plugins/languages/treesitter/rainbow-delimiters.nix @@ -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; + }; +} diff --git a/plugins/languages/treesitter/treesitter-rainbow.nix b/plugins/languages/treesitter/treesitter-rainbow.nix deleted file mode 100644 index 808caef7..00000000 --- a/plugins/languages/treesitter/treesitter-rainbow.nix +++ /dev/null @@ -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; - }; -} diff --git a/tests/test-sources/plugins/languages/treesitter/rainbow-delimiters.nix b/tests/test-sources/plugins/languages/treesitter/rainbow-delimiters.nix new file mode 100644 index 00000000..023aa7c8 --- /dev/null +++ b/tests/test-sources/plugins/languages/treesitter/rainbow-delimiters.nix @@ -0,0 +1,63 @@ +{ + empty = { + plugins = { + treesitter.enable = true; + rainbow-delimiters.enable = true; + }; + }; + + example = { + plugins = { + treesitter.enable = true; + rainbow-delimiters = { + enable = true; + + strategy = { + default = "global"; + html = "local"; + 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 rainbow.strategy['global'] + end + return rainbow.strategy['local'] + end + ''; + }; + query = { + default = "rainbow-delimiters"; + lua = "rainbow-blocks"; + }; + highlight = [ + "RainbowDelimiterRed" + "RainbowDelimiterYellow" + "RainbowDelimiterBlue" + "RainbowDelimiterOrange" + "RainbowDelimiterGreen" + "RainbowDelimiterViolet" + "RainbowDelimiterCyan" + ]; + blacklist = ["c" "cpp"]; + log = { + file.__raw = "vim.fn.stdpath('log') .. '/rainbow-delimiters.log'"; + level = "warn"; + }; + }; + }; + }; + + example-whitelist = { + plugins = { + treesitter.enable = true; + rainbow-delimiters = { + enable = true; + + whitelist = ["c" "cpp"]; + }; + }; + }; +} diff --git a/tests/test-sources/plugins/languages/treesitter/treesitter-rainbow.nix b/tests/test-sources/plugins/languages/treesitter/treesitter-rainbow.nix deleted file mode 100644 index 2686a7b5..00000000 --- a/tests/test-sources/plugins/languages/treesitter/treesitter-rainbow.nix +++ /dev/null @@ -1,30 +0,0 @@ -{pkgs}: { - empty = { - plugins = { - treesitter.enable = true; - treesitter-rainbow.enable = true; - }; - }; - - default = { - plugins = { - treesitter.enable = true; - treesitter-rainbow = { - enable = true; - - disable = []; - query = "rainbow-parens"; - strategy = "require('ts-rainbow').strategy.global"; - hlgroups = [ - "TSRainbowRed" - "TSRainbowYellow" - "TSRainbowBlue" - "TSRainbowOrange" - "TSRainbowGreen" - "TSRainbowViolet" - "TSRainbowCyan" - ]; - }; - }; - }; -}