diff --git a/modules/plugins/treesitter/ts-context/config.nix b/modules/plugins/treesitter/ts-context/config.nix new file mode 100644 index 0000000..89ac74c --- /dev/null +++ b/modules/plugins/treesitter/ts-context/config.nix @@ -0,0 +1,31 @@ +{ + config, + lib, + ... +}: let + inherit (lib.modules) mkIf; + inherit (lib.trivial) boolToString; + inherit (lib.nvim.lua) nullString; + inherit (lib.nvim.dag) entryAfter; + + inherit (config.vim) treesitter; + cfg = treesitter.context; +in { + config = mkIf (treesitter.enable && cfg.enable) { + vim.startPlugins = ["nvim-treesitter-context"]; + + vim.luaConfigRC.treesitter-context = entryAfter ["treesitter"] '' + require'treesitter-context'.setup { + enable = true, + max_lines = ${toString cfg.maxLines}, + min_window_height = ${toString cfg.minWindowHeight}, + line_numbers = ${boolToString cfg.lineNumbers}, + multiline_threshold = ${toString cfg.multilineThreshold}, + trim_scope = '${cfg.trimScope}', + mode = '${cfg.mode}', + separator = ${nullString cfg.separator}, + max_lines = ${toString cfg.zindex}, + } + ''; + }; +} diff --git a/modules/plugins/treesitter/ts-context/context.nix b/modules/plugins/treesitter/ts-context/context.nix new file mode 100644 index 0000000..387aa81 --- /dev/null +++ b/modules/plugins/treesitter/ts-context/context.nix @@ -0,0 +1,60 @@ +{lib, ...}: let + inherit (lib.options) mkOption mkEnableOption; + inherit (lib.types) int bool str nullOr enum; +in { + options.vim.treesitter.context = { + enable = mkEnableOption "context of current buffer contents [nvim-treesitter-context] "; + + maxLines = mkOption { + type = int; + default = 0; + description = "How many lines the window should span. Values <=0 mean no limit."; + }; + + minWindowHeight = mkOption { + type = int; + default = 0; + description = "Minimum editor window height to enable context. Values <= 0 mean no limit."; + }; + + lineNumbers = mkOption { + type = bool; + default = true; + description = ""; + }; + + multilineThreshold = mkOption { + type = int; + default = 20; + description = "Maximum number of lines to collapse for a single context line."; + }; + + trimScope = mkOption { + type = enum ["inner" "outer"]; + default = "outer"; + description = "Which context lines to discard if [](#opt-vim.treesitter.context.maxLines) is exceeded."; + }; + + mode = mkOption { + type = enum ["cursor" "topline"]; + default = "cursor"; + description = "Line used to calculate context."; + }; + + separator = mkOption { + type = nullOr str; + default = null; + description = '' + Separator between context and content. Should be a single character string, like '-'. + + When separator is set, the context will only show up when there are at least 2 lines above cursorline. + ''; + }; + + zindex = mkOption { + type = int; + default = 20; + description = "The Z-index of the context window."; + }; + }; +} diff --git a/modules/plugins/treesitter/ts-context/default.nix b/modules/plugins/treesitter/ts-context/default.nix new file mode 100644 index 0000000..bf53d2b --- /dev/null +++ b/modules/plugins/treesitter/ts-context/default.nix @@ -0,0 +1,6 @@ +{ + imports = [ + ./context.nix + ./config.nix + ]; +}