{
  lib,
  ...
}:
let
  inherit (lib) types;
in
lib.nixvim.plugins.mkNeovimPlugin {
  name = "spider";
  package = "nvim-spider";
  maintainers = [ lib.maintainers.saygo-png ];
  description = "Use the w, e, b motions like a spider. Move by subwords and skip insignificant punctuation.";

  extraOptions = {
    keymaps = {
      silent = lib.mkOption {
        type = lib.types.bool;
        description = "Whether spider keymaps should be silent.";
        default = false;
      };

      motions = lib.mkOption {
        type = types.attrsOf types.str;
        description = ''
          Mappings for spider motions.
          The keys are the motion and the values are the keyboard shortcuts.
          The shortcut might not necessarily be the same as the motion name.
        '';
        default = { };
        example = {
          w = "w";
          e = "e";
          b = "b";
          ge = "ge";
        };
      };
    };
  };

  # TODO: introduced 2025-07-13: remove after 25.11
  inherit (import ./deprecations.nix lib) deprecateExtraOptions imports;

  extraConfig = cfg: {
    extraLuaPackages = luaPkgs: [ luaPkgs.luautf8 ];

    keymaps = lib.mapAttrsToList (motion: key: {
      mode = [
        "n"
        "o"
        "x"
      ];
      inherit key;
      action.__raw = "function() require('spider').motion('${motion}') end";
      options = {
        inherit (cfg.keymaps) silent;
        desc = "Spider-${motion}";
      };
    }) cfg.keymaps.motions;
  };
}
