diff --git a/plugins/default.nix b/plugins/default.nix index 4ca0ac62..12080028 100644 --- a/plugins/default.nix +++ b/plugins/default.nix @@ -24,6 +24,7 @@ ./languages/ledger.nix ./languages/nix.nix ./languages/treesitter.nix + ./languages/treesitter-context.nix ./languages/treesitter-refactor.nix ./languages/zig.nix diff --git a/plugins/languages/treesitter-context.nix b/plugins/languages/treesitter-context.nix new file mode 100644 index 00000000..35e09ea9 --- /dev/null +++ b/plugins/languages/treesitter-context.nix @@ -0,0 +1,56 @@ +{ + pkgs, + lib, + config, + ... +}: +with lib; { + options.plugins.treesitter-context = { + enable = mkEnableOption "Enable nvim-treesitter-context"; + + maxLines = mkOption { + type = types.nullOr types.ints.positive; + default = null; + description = "How many lines the window should span. Null means no limit"; + }; + + trimScope = mkOption { + type = types.enum ["outer" "inner"]; + default = "outer"; + description = "Which context lines to discard if `max_lines` is exceeded"; + }; + + maxWindowHeight = mkOption { + type = types.nullOr types.ints.positive; + default = null; + description = "Minimum editor window height to enable context"; + }; + + patterns = mkOption { + type = types.attrsOf (types.listOf types.str); + default = {}; + description = '' + Patterns to use for context delimitation. The 'default' key matches all filetypes + ''; + }; + + exactPatterns = mkOption { + type = types.attrsOf types.bool; + default = {}; + description = "Treat the coresponding entry in patterns as an exact match"; + }; + }; + + config = let + cfg = config.plugins.treesitter-context; + in + mkIf cfg.enable { + extraPlugins = with pkgs.vimPlugins; [nvim-treesitter-context]; + + plugins.treesitter.moduleConfig.context = { + max_lines = cfg.maxLines; + trim_scope = cfg.trimScope; + min_window_height = cfg.maxWindowHeight; + }; + }; +}