{lib, ...}: let
  inherit (lib.options) mkOption mkEnableOption;
  inherit (lib.types) int bool str nullOr enum;
  inherit (lib.nvim.types) mkPluginSetupOption;
  inherit (lib.nvim.config) batchRenameOptions;
  migrationTable = {
    maxLines = "max_lines";
    minWindowHeight = "min_window_height";
    lineNumbers = "line_numbers";
    multilineThreshold = "multiline_threshold";
    trimScope = "trim_scope";
    mode = "mode";
    separator = "separator";
    zindex = "z_index";
  };

  renamedSetupOpts =
    batchRenameOptions
    ["vim" "treesitter" "context"]
    ["vim" "treesitter" "context" "setupOpts"]
    migrationTable;
in {
  imports = renamedSetupOpts;
  options.vim.treesitter.context = {
    enable = mkEnableOption "context of current buffer contents [nvim-treesitter-context] ";

    setupOpts = mkPluginSetupOption "treesitter-context" {
      max_lines = mkOption {
        type = int;
        default = 0;
        description = ''
          How many lines the window should span.

          Values >= 0 mean there will be no limit.
        '';
      };

      min_window_height = mkOption {
        type = int;
        default = 0;
        description = ''
          Minimum editor window height to enable context.

          Values >= 0 mean there will be no limit.
        '';
      };

      line_numbers = mkOption {
        type = bool;
        default = true;
        description = "Whether to display line numbers in current context";
      };

      multiline_threshold = mkOption {
        type = int;
        default = 20;
        description = "Maximum number of lines to collapse for a single context line.";
      };

      trim_scope = mkOption {
        type = enum ["inner" "outer"];
        default = "outer";
        description = ''
          Which context lines to discard if
          [](#opt-vim.treesitter.context.setupOpts.max_lines) is exceeded.
        '';
      };

      mode = mkOption {
        type = enum ["cursor" "topline"];
        default = "cursor";
        description = "Line used to calculate context.";
      };

      separator = mkOption {
        type = nullOr str;
        default = "-";
        description = ''
          Separator between context and content. This option 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.";
      };
    };
  };
}