{ lib, config, ... }:
{
  # don't ask....
  enable = true;
  settings = {
    log = {
      enabled = false;
    };
    opener = {
      folder = [
        {
          run = ''open - R "$@"'';
          orphan = true;
          display_name = "Reveal in Finder";
        }
        {
          run = ''$EDITOR "$@"'';
          orphan = true;
        }
      ];
      archive = [
        {
          run = ''unar "$1"'';
          display_name = "Extract here";
        }
      ];
      text = [
        {
          run = ''$EDITOR "$@"'';
          orphan = true;
        }
      ];
      image = [
        {
          run = ''imv "$@"'';
          orphan = true;
          display_name = "Open";
        }
        {
          run = ''exiftool "$1"; echo "Press enter to exit"; read'';
          block = true;
          display_name = "Show EXIF";
        }
      ];
      pdf = [
        {
          run = ''zathura "$@"'';
          orphan = true;
          display_name = "Open";
        }
      ];
      video = [
        {
          run = ''mpv "$@"'';
          orphan = true;
        }
        {
          run = ''mediainfo "$1"; echo "Press enter to exit"; read'';
          block = true;
          display_name = "Show media info";
        }
      ];
      audio = [
        {
          run = ''xdg-open "$@"'';
          orphan = true;
        }
        {
          run = ''mediainfo "$1"; echo "Press enter to exit"; read'';
          block = true;
          display_name = "Show media info";
        }
      ];
      fallback = [
        {
          run = ''xdg-open "$@"'';
          orphan = true;
          display_name = "Open";
        }
        {
          run = ''xdg-open - R "$@"'';
          orphan = true;
          display_name = "Reveal in Finder";
        }
      ];
    };
    plugin = {
      prepend_previewers = [
        {
          name = "*.md";
          run = "glow";
        }
        {
          mime = "text/csv";
          run = "miller";
        }
      ];
    };
  };
  keymap = {
    manager.keymap = [
      {
        on = [ "<Esc>" ];
        run = "escape";
        desc = "Exit visual mode clear selected or cancel search";
      }
      {
        on = [ "q" ];
        run = "quit";
        desc = "Exit the process";
      }
      {
        on = [ "Q" ];
        run = "quit --no-cwd-file";
        desc = "Exit the process without writing cwd-file";
      }
      {
        on = [ "<C-q>" ];
        run = "close";
        desc = "Close the current tab or quit if it is last tab";
      }
      {
        on = [ "<C-z>" ];
        run = "suspend";
        desc = "Suspend the process";
      }

      # Navigation
      {
        on = [ "l" ];
        run = "arrow -1";
        desc = "Move cursor up";
      }
      {
        on = [ "k" ];
        run = "arrow 1";
        desc = "Move cursor down";
      }

      {
        on = [ "L" ];
        run = "arrow -5";
        desc = "Move cursor up 5 lines";
      }
      {
        on = [ "K" ];
        run = "arrow 5";
        desc = "Move cursor down 5 lines";
      }

      {
        on = [ "<C-u>" ];
        run = "arrow -50%";
        desc = "Move cursor up half page";
      }
      {
        on = [ "<C-d>" ];
        run = "arrow 50%";
        desc = "Move cursor down half page";
      }
      {
        on = [ "<C-b>" ];
        run = "arrow -100%";
        desc = "Move cursor up one page";
      }
      {
        on = [ "<C-f>" ];
        run = "arrow 100%";
        desc = "Move cursor down one page";
      }

      {
        on = [ "j" ];
        run = "leave";
        desc = "Go back to the parent directory";
      }
      {
        on = [ ";" ];
        run = "enter";
        desc = "Enter the child directory";
      }

      {
        on = [ "J" ];
        run = "back";
        desc = "Go back to the previous directory";
      }
      {
        on = [ "P" ];
        run = "forward";
        desc = "Go forward to the next directory";
      }

      {
        on = [ "<C-k>" ];
        run = "peek -5";
        desc = "Peek up 5 units in the preview";
      }
      {
        on = [ "<C-j>" ];
        run = "peek 5";
        desc = "Peek down 5 units in the preview";
      }

      {
        on = [ "<Up>" ];
        run = "arrow -1";
        desc = "Move cursor up";
      }
      {
        on = [ "<Down>" ];
        run = "arrow 1";
        desc = "Move cursor down";
      }
      {
        on = [ "<Left>" ];
        run = "leave";
        desc = "Go back to the parent directory";
      }
      {
        on = [ "<Right>" ];
        run = "enter";
        desc = "Enter the child directory";
      }

      {
        on = [
          "g"
          "g"
        ];
        run = "arrow -99999999";
        desc = "Move cursor to the top";
      }
      {
        on = [ "G" ];
        run = "arrow 99999999";
        desc = "Move cursor to the bottom";
      }

      # Selection
      {
        on = [ "v" ];
        run = "visual_mode";
        desc = "Enter visual mode (selection mode)";
      }
      {
        on = [ "V" ];
        run = "visual_mode --unset";
        desc = "Enter visual mode (unset mode)";
      }
      {
        on = [ "<C-a>" ];
        run = "select_all --state=true";
        desc = "Select all files";
      }
      {
        on = [ "<C-r>" ];
        run = "select_all --state=none";
        desc = "Inverse selection of all files";
      }

      # Operation
      {
        on = [ "o" ];
        run = "open";
        desc = "Open the selected files";
      }
      {
        on = [ "O" ];
        run = "open --interactive";
        desc = "Open the selected files interactively";
      }
      {
        on = [ "<Enter>" ];
        run = "open";
        desc = "Open the selected files";
      }
      {
        on = [ "<C-Enter>" ];
        run = "open --interactive";
        desc = "Open the selected files interactively";
      } # It's cool if you're using a terminal that supports CSI u
      {
        on = [ "y" ];
        run = "yank";
        desc = "Copy the selected files";
      }
      {
        on = [ "x" ];
        run = "yank --cut";
        desc = "Cut the selected files";
      }
      {
        on = [ "p" ];
        run = "paste";
        desc = "Paste the files";
      }
      {
        on = [ "P" ];
        run = "paste --force";
        desc = "Paste the files (overwrite if the destination exists)";
      }
      {
        on = [ "-" ];
        run = "link";
        desc = "Symlink the absolute path of files";
      }
      {
        on = [ "_" ];
        run = "link --relative";
        desc = "Symlink the relative path of files";
      }
      {
        on = [ "d" ];
        run = "remove";
        desc = "Move the files to the trash";
      }
      {
        on = [ "D" ];
        run = "remove --permanently";
        desc = "Permanently delete the files";
      }
      {
        on = [ "a" ];
        run = "create";
        desc = "Create a file or directory (ends with / for directories)";
      }
      {
        on = [ "r" ];
        run = "rename";
        desc = "Rename a file or directory";
      }
      {
        on = [ ";" ];
        run = "shell";
        desc = "Run a shell command";
      }
      {
        on = [ ":" ];
        run = "shell --block";
        desc = "Run a shell command (block the UI until the command finishes)";
      }
      {
        on = [ "." ];
        run = "hidden toggle";
        desc = "Toggle the visibility of hidden files";
      }
      {
        on = [
          "<Space>"
          "f"
          "g>"
        ];
        run = "search fd";
        desc = "Search files by name using fd";
      }
      {
        on = [
          "<Space>"
          "f"
          "G>"
        ];
        run = "search rg";
        desc = "Search files by content using ripgrep";
      }
      {
        on = [ "<C-s>" ];
        run = "search none";
        desc = "Cancel the ongoing search";
      }
      {
        on = [ "z" ];
        run = "jump zoxide";
        desc = "Jump to a directory using zoxide";
      }
      {
        on = [ "Z" ];
        run = "jump fzf";
        desc = "Jump to a directory or reveal a file using fzf";
      }

      # Copy
      {
        on = [
          "c"
          "c"
        ];
        run = "copy path";
        desc = "Copy the absolute path";
      }
      {
        on = [
          "c"
          "d"
        ];
        run = "copy dirname";
        desc = "Copy the path of the parent directory";
      }
      {
        on = [
          "c"
          "f"
        ];
        run = "copy filename";
        desc = "Copy the name of the file";
      }
      {
        on = [
          "c"
          "n"
        ];
        run = "copy name_without_ext";
        desc = "Copy the name of the file without the extension";
      }

      # Find
      {
        on = [ "/" ];
        run = "find --smart";
      }
      {
        on = [ "?" ];
        run = "find --previous --smart";
      }
      {
        on = [ "n" ];
        run = "find_arrow";
      }
      {
        on = [ "N" ];
        run = "find_arrow --previous";
      }

      # Sorting
      {
        on = [
          ","
          "a"
        ];
        run = "sort alphabetical --dir_first";
        desc = "Sort alphabetically";
      }
      {
        on = [
          ","
          "A"
        ];
        run = "sort alphabetical --reverse --dir_first";
        desc = "Sort alphabetically (reverse)";
      }
      {
        on = [
          ","
          "c"
        ];
        run = "sort created --dir_first";
        desc = "Sort by creation time";
      }
      {
        on = [
          ","
          "C"
        ];
        run = "sort created --reverse --dir_first";
        desc = "Sort by creation time (reverse)";
      }
      {
        on = [
          ","
          "m"
        ];
        run = "sort modified --dir_first";
        desc = "Sort by modified time";
      }
      {
        on = [
          ","
          "M"
        ];
        run = "sort modified --reverse --dir_first";
        desc = "Sort by modified time (reverse)";
      }
      {
        on = [
          ","
          "n"
        ];
        run = "sort natural --dir_first";
        desc = "Sort naturally";
      }
      {
        on = [
          ","
          "N"
        ];
        run = "sort natural --reverse --dir_first";
        desc = "Sort naturally (reverse)";
      }
      {
        on = [
          ","
          "s"
        ];
        run = "sort size --dir_first";
        desc = "Sort by size";
      }
      {
        on = [
          ","
          "S"
        ];
        run = "sort size --reverse --dir_first";
        desc = "Sort by size (reverse)";
      }

      # Tabs
      {
        on = [ "t" ];
        run = "tab_create --current";
        desc = "Create a new tab using the current path";
      }

      {
        on = [ "1" ];
        run = "tab_switch 0";
        desc = "Switch to the first tab";
      }
      {
        on = [ "2" ];
        run = "tab_switch 1";
        desc = "Switch to the second tab";
      }
      {
        on = [ "3" ];
        run = "tab_switch 2";
        desc = "Switch to the third tab";
      }
      {
        on = [ "4" ];
        run = "tab_switch 3";
        desc = "Switch to the fourth tab";
      }
      {
        on = [ "5" ];
        run = "tab_switch 4";
        desc = "Switch to the fifth tab";
      }
      {
        on = [ "6" ];
        run = "tab_switch 5";
        desc = "Switch to the sixth tab";
      }
      {
        on = [ "7" ];
        run = "tab_switch 6";
        desc = "Switch to the seventh tab";
      }
      {
        on = [ "8" ];
        run = "tab_switch 7";
        desc = "Switch to the eighth tab";
      }
      {
        on = [ "9" ];
        run = "tab_switch 8";
        desc = "Switch to the ninth tab";
      }

      {
        on = [ "[" ];
        run = "tab_switch -1 --relative";
        desc = "Switch to the previous tab";
      }
      {
        on = [ "]" ];
        run = "tab_switch 1 --relative";
        desc = "Switch to the next tab";
      }

      {
        on = [ "{" ];
        run = "tab_swap -1";
        desc = "Swap the current tab with the previous tab";
      }
      {
        on = [ "}" ];
        run = "tab_swap 1";
        desc = "Swap the current tab with the next tab";
      }

      # Tasks
      {
        on = [ "w" ];
        run = "tasks_show";
        desc = "Show the tasks manager";
      }

      # Goto
      {
        on = [
          "g"
          "h"
        ];
        run = "cd ~";
        desc = "Go to the home directory";
      }
      {
        on = [
          "g"
          "c"
        ];
        run = "cd ~/.config";
        desc = "Go to the config directory";
      }
      {
        on = [
          "g"
          "d"
        ];
        run = "cd ~/Downloads";
        desc = "Go to the downloads directory";
      }
      {
        on = [
          "g"
          "t"
        ];
        run = "cd /tmp";
        desc = "Go to the temporary directory";
      }
      {
        on = [
          "g"
          "<Space>"
        ];
        run = "cd --interactive";
        desc = "Go to a directory interactively";
      }

      # Help
      {
        on = [ "~" ];
        run = "help";
        desc = "Open help";
      }
    ];

    tasks.keymap = [
      {
        on = [ "<Esc>" ];
        run = "close";
        desc = "Hide the task manager";
      }
      {
        on = [ "<C-q>" ];
        run = "close";
        desc = "Hide the task manager";
      }
      {
        on = [ "w" ];
        run = "close";
        desc = "Hide the task manager";
      }

      {
        on = [ "k" ];
        run = "arrow -1";
        desc = "Move cursor up";
      }
      {
        on = [ "j" ];
        run = "arrow 1";
        desc = "Move cursor down";
      }

      {
        on = [ "<Up>" ];
        run = "arrow -1";
        desc = "Move cursor up";
      }
      {
        on = [ "<Down>" ];
        run = "arrow 1";
        desc = "Move cursor down";
      }

      {
        on = [ "<Enter>" ];
        run = "inspect";
        desc = "Inspect the task";
      }
      {
        on = [ "x" ];
        run = "cancel";
        desc = "Cancel the task";
      }

      {
        on = [ "~" ];
        run = "help";
        desc = "Open help";
      }
    ];

    select.keymap = [
      {
        on = [ "<C-q>" ];
        run = "close";
        desc = "Cancel selection";
      }
      {
        on = [ "<Esc>" ];
        run = "close";
        desc = "Cancel selection";
      }
      {
        on = [ "<Enter>" ];
        run = "close --submit";
        desc = "Submit the selection";
      }

      {
        on = [ "k" ];
        run = "arrow -1";
        desc = "Move cursor up";
      }
      {
        on = [ "j" ];
        run = "arrow 1";
        desc = "Move cursor down";
      }

      {
        on = [ "K" ];
        run = "arrow -5";
        desc = "Move cursor up 5 lines";
      }
      {
        on = [ "J" ];
        run = "arrow 5";
        desc = "Move cursor down 5 lines";
      }

      {
        on = [ "<Up>" ];
        run = "arrow -1";
        desc = "Move cursor up";
      }
      {
        on = [ "<Down>" ];
        run = "arrow 1";
        desc = "Move cursor down";
      }

      {
        on = [ "~" ];
        run = "help";
        desc = "Open help";
      }
    ];

    input.keymap = [
      {
        on = [ "<C-q>" ];
        run = "close";
        desc = "Cancel input";
      }
      {
        on = [ "<Enter>" ];
        run = "close --submit";
        desc = "Submit the input";
      }
      {
        on = [ "<Esc>" ];
        run = "escape";
        desc = "Go back the normal mode or cancel input";
      }

      # Mode
      {
        on = [ "i" ];
        run = "insert";
        desc = "Enter insert mode";
      }
      {
        on = [ "a" ];
        run = "insert --append";
        desc = "Enter append mode";
      }
      {
        on = [ "v" ];
        run = "visual";
        desc = "Enter visual mode";
      }
      {
        on = [ "V" ];
        run = [
          "move -999"
          "visual"
          "move 999"
        ];
        desc = "Enter visual mode and select all";
      }

      # Navigation
      {
        on = [ "h" ];
        run = "move -1";
        desc = "Move cursor left";
      }
      {
        on = [ "l" ];
        run = "move 1";
        desc = "Move cursor right";
      }

      {
        on = [ "0" ];
        run = "move -999";
        desc = "Move to the BOL";
      }
      {
        on = [ "$" ];
        run = "move 999";
        desc = "Move to the EOL";
      }
      {
        on = [ "I" ];
        run = [
          "move -999"
          "insert"
        ];
        desc = "Move to the BOL and enter insert mode";
      }
      {
        on = [ "A" ];
        run = [
          "move 999"
          "insert --append"
        ];
        desc = "Move to the EOL and enter append mode";
      }

      {
        on = [ "<Left>" ];
        run = "move -1";
        desc = "Move cursor left";
      }
      {
        on = [ "<Right>" ];
        run = "move 1";
        desc = "Move cursor right";
      }

      {
        on = [ "b" ];
        run = "backward";
        desc = "Move to the beginning of the previous word";
      }
      {
        on = [ "w" ];
        run = "forward";
        desc = "Move to the beginning of the next word";
      }
      {
        on = [ "e" ];
        run = "forward --end-of-word";
        desc = "Move to the end of the next word";
      }

      # Deletion
      {
        on = [ "d" ];
        run = "delete --cut";
        desc = "Cut the selected characters";
      }
      {
        on = [ "D" ];
        run = [
          "delete --cut"
          "move 999"
        ];
        desc = "Cut until the EOL";
      }
      {
        on = [ "c" ];
        run = "delete --cut --insert";
        desc = "Cut the selected characters and enter insert mode";
      }
      {
        on = [ "C" ];
        run = [
          "delete --cut --insert"
          "move 999"
        ];
        desc = "Cut until the EOL and enter insert mode";
      }
      {
        on = [ "x" ];
        run = [
          "delete --cut"
          "move 1 --in-operating"
        ];
        desc = "Cut the current character";
      }

      # Yank/Paste
      {
        on = [ "y" ];
        run = "yank";
        desc = "Copy the selected characters";
      }
      {
        on = [ "p" ];
        run = "paste";
        desc = "Paste the copied characters after the cursor";
      }
      {
        on = [ "P" ];
        run = "paste --before";
        desc = "Paste the copied characters before the cursor";
      }

      # Undo/Redo
      {
        on = [ "u" ];
        run = "undo";
        desc = "Undo the last operation";
      }
      {
        on = [ "<C-r>" ];
        run = "redo";
        desc = "Redo the last operation";
      }

      # Help
      {
        on = [ "~" ];
        run = "help";
        desc = "Open help";
      }
    ];

    help.keymap = [
      {
        on = [ "<Esc>" ];
        run = "escape";
        desc = "Clear the filter or hide the help";
      }
      {
        on = [ "q" ];
        run = "close";
        desc = "Exit the process";
      }
      {
        on = [ "<C-q>" ];
        run = "close";
        desc = "Hide the help";
      }

      # Navigation
      {
        on = [ "k" ];
        run = "arrow -1";
        desc = "Move cursor up";
      }
      {
        on = [ "j" ];
        run = "arrow 1";
        desc = "Move cursor down";
      }

      {
        on = [ "K" ];
        run = "arrow -5";
        desc = "Move cursor up 5 lines";
      }
      {
        on = [ "J" ];
        run = "arrow 5";
        desc = "Move cursor down 5 lines";
      }

      {
        on = [ "<Up>" ];
        run = "arrow -1";
        desc = "Move cursor up";
      }
      {
        on = [ "<Down>" ];
        run = "arrow 1";
        desc = "Move cursor down";
      }

      # Filtering
      {
        on = [ "/" ];
        run = "filter";
        desc = "Apply a filter for the help items";
      }
    ];
  };
}
