{ lib, ... }:
lib.nixvim.plugins.mkVimPlugin {
  name = "vim-slime";
  globalPrefix = "slime_";
  description = "Send text from Vim to a terminal or REPL. Inspired by Emacs' `slime`.";

  maintainers = [ lib.maintainers.GaetanLepage ];

  settingsOptions = {
    target = lib.nixvim.defaultNullOpts.mkEnum [
      "dtach"
      "kitty"
      "neovim"
      "screen"
      "tmux"
      "vimterminal"
      "wezterm"
      "whimrepl"
      "x11"
      "zellij"
    ] "screen" "Which backend vim-slime should use.";

    vimterminal_cmd = lib.nixvim.mkNullOrStr ''
      The vim terminal command to execute.
    '';

    no_mappings = lib.nixvim.defaultNullOpts.mkFlagInt 0 ''
      Whether to disable the default mappings.
    '';

    paste_file = lib.nixvim.defaultNullOpts.mkStr "$HOME/.slime_paste" ''
      Required to transfer data from vim to GNU screen or tmux.
      Setting this explicitly can work around some occasional portability issues.
      whimrepl does not require or support this setting.
    '';

    preserve_curpos = lib.nixvim.defaultNullOpts.mkFlagInt 1 ''
      Whether to preserve cursor position when sending a line or paragraph.
    '';

    default_config = lib.nixvim.mkNullOrOption (with lib.types; attrsOf (either str rawLua)) ''
      Pre-filled prompt answer.

      Examples:
        - `tmux`:
          ```nix
            {
              socket_name = "default";
              target_pane = "{last}";
            }
          ```
        - `zellij`:
          ```nix
            {
              session_id = "current";
              relative_pane = "right";
            }
          ```
    '';

    dont_ask_default = lib.nixvim.defaultNullOpts.mkFlagInt 0 ''
      Whether to bypass the prompt and use the specified default configuration options.
    '';

    bracketed_paste = lib.nixvim.defaultNullOpts.mkFlagInt 0 ''
      Sometimes REPL are too smart for their own good, e.g. autocompleting a bracket that should
      not be autocompleted when pasting code from a file.
      In this case it can be useful to rely on bracketed-paste
      (https://cirw.in/blog/bracketed-paste).
      Luckily, tmux knows how to handle that. See tmux's manual.
    '';
  };

  settingsExample = {
    target = "screen";
    vimterminal_cmd = null;
    no_mappings = 0;
    paste_file = "$HOME/.slime_paste";
    preserve_curpos = 1;
    default_config = {
      socket_name = "default";
      target_pane = "{last}";
    };
    dont_ask_default = 0;
    bracketed_paste = 0;
  };
}
