{
  config,
  lib,
  ...
}:
with lib; let
  cfg = config.vim.utility.motion.leap;
in {
  config = mkIf cfg.enable {
    vim.startPlugins = [
      "leap-nvim"
      "vim-repeat"
    ];

    vim.maps.normal = mkMerge [
      (mkBinding cfg.mappings.leapForwardTo "<Plug>(leap-forward-to)" "Leap forward to")
      (mkBinding cfg.mappings.leapBackwardTo "<Plug>(leap-backward-to)" "Leap backward to")
      (mkBinding cfg.mappings.leapFromWindow "<Plug>(leap-from-window)" "Leap from window")
    ];

    vim.maps.operator = mkMerge [
      (mkBinding cfg.mappings.leapForwardTo "<Plug>(leap-forward-to)" "Leap forward to")
      (mkBinding cfg.mappings.leapBackwardTo "<Plug>(leap-backward-to)" "Leap backward to")
      (mkBinding cfg.mappings.leapForwardTill "<Plug>(leap-forward-till)" "Leap forward till")
      (mkBinding cfg.mappings.leapBackwardTill "<Plug>(leap-backward-till)" "Leap backward till")
      (mkBinding cfg.mappings.leapFromWindow "<Plug>(leap-from-window)" "Leap from window")
    ];

    vim.maps.visualOnly = mkMerge [
      (mkBinding cfg.mappings.leapForwardTo "<Plug>(leap-forward-to)" "Leap forward to")
      (mkBinding cfg.mappings.leapBackwardTo "<Plug>(leap-backward-to)" "Leap backward to")
      (mkBinding cfg.mappings.leapForwardTill "<Plug>(leap-forward-till)" "Leap forward till")
      (mkBinding cfg.mappings.leapBackwardTill "<Plug>(leap-backward-till)" "Leap backward till")
      (mkBinding cfg.mappings.leapFromWindow "<Plug>(leap-from-window)" "Leap from window")
    ];

    vim.luaConfigRC.leap-nvim = nvim.dag.entryAnywhere ''
      require('leap').opts = {
        max_phase_one_targets = nil,
        highlight_unlabeled_phase_one_targets = false,
        max_highlighted_traversal_targets = 10,
        case_sensitive = false,
        equivalence_classes = { ' \t\r\n', },
        substitute_chars = {},
        safe_labels = {
          "s", "f", "n", "u", "t", "/",
          "S", "F", "N", "L", "H", "M", "U", "G", "T", "?", "Z"
        },
        labels = {
          "s", "f", "n",
          "j", "k", "l", "h", "o", "d", "w", "e", "m", "b",
          "u", "y", "v", "r", "g", "t", "c", "x", "/", "z",
          "S", "F", "N",
          "J", "K", "L", "H", "O", "D", "W", "E", "M", "B",
          "U", "Y", "V", "R", "G", "T", "C", "X", "?", "Z"
        },
        special_keys = {
          repeat_search = '<enter>',
          next_phase_one_target = '<enter>',
          next_target = {'<enter>', ';'},
          prev_target = {'<tab>', ','},
          next_group = '<space>',
          prev_group = '<tab>',
          multi_accept = '<enter>',
          multi_revert = '<backspace>',
        },
      }
    '';
  };
}