{ lib }:
{
  empty = {
    plugins.multicursors.enable = true;
  };

  defaults = {
    plugins.multicursors = {
      enable = true;

      settings = {
        DEBUG_MODE = false;
        create_commands = true;
        updatetime = 50;
        nowait = true;
        mode_keys = {
          append = "a";
          change = "c";
          extend = "e";
          insert = "i";
        };
        hint_config = {
          float_opts = {
            border = "none";
          };
          position = "bottom";
        };
        generate_hints = {
          normal = true;
          insert = true;
          extend = true;
          config = {
            column_count.__raw = "nil";
            max_hint_length = 25;
          };
        };
      };
    };
  };

  example = {
    plugins.multicursors = {
      enable = true;

      settings = {
        DEBUG_MODE = false;
        create_commands = true;
        updatetime = 50;
        nowait = true;
        normal_keys = {
          # to change default lhs of key mapping, change the key
          "," = {
            # assigning `null` to method exits from multi cursor mode
            # assigning `false` to method removes the binding
            method = lib.nixvim.mkRaw "require('multicursors.normal_mode').clear_others";

            # you can pass :map-arguments here
            opts = {
              desc = "Clear others";
            };
          };
          "<C-/>" = {
            method = lib.nixvim.mkRaw ''
              function()
                require('multicursors.utils').call_on_selections(
                  function(selection)
                    vim.api.nvim_win_set_cursor(0, { selection.row + 1, selection.col + 1 })
                    local line_count = selection.end_row - selection.row + 1
                    vim.cmd('normal ' .. line_count .. 'gcc')
                  end
                )
              end
            '';
            opts = {
              desc = "comment selections";
            };
          };
        };
        insert_keys.__raw = "nil";
        extend_keys.__raw = "nil";
        hint_config = {
          type = "window";
          position = "bottom";
          offset = 0;
          float_opts.border = "none";
          show_name = true;
          funcs.__raw = "nil";
        };
        generate_hints = {
          normal = false;
          insert = false;
          extend = false;
        };
      };
    };
  };
}
