{
  config,
  pkgs,
  ...
}: let
  shell = file:
    "\${{" + builtins.readFile "${file}" + "}}"; # closes the lf tui
  pipe = file:
    "%{{" + builtins.readFile "${file}" + "}}"; # runs the command in the ui,term bar
  async = file:
    "&{{" + builtins.readFile "${file}" + "}}"; # runs the command in the background
  wait = file:
    "!{{" + builtins.readFile "${file}" + "}}"; # adds a prompt after the command has run
in {
  xdg.configFile."lf/icons".source = ./icons;
  xdg.configFile."lf/colors".source = ./colors;

  programs.lf = {
    enable = true;

    commands = {
      help = shell ./cmds/help.sh;
      open = shell ./cmds/open.sh;
      mk_dir = pipe ./cmds/mk_dir.sh;
      mk_scr = shell ./cmds/mk_scr.sh;
      mk_file = shell ./cmds/mk_file.sh;
      chmod = pipe ./cmds/chmod.sh;
      mk_ln = shell ./cmds/mk_ln.sh; # TODO could be pipe, right?
      sudo_mk_file = shell ./cmds/sudo_mk_file.sh;
      set_wall_paper = pipe ./cmds/set_wall_paper.sh;
      fzf_jump = shell ./cmds/fzf_jump.sh;
      broot_jump = shell ./cmds/broot_jump.sh;
      open_config = shell ./cmds/open_config.sh;

      dragon = pipe ./cmds/dragon.sh;
      dragon_stay = pipe ./cmds/dragon_stay.sh;
      dragon_individual = pipe ./cmds/dragon_individual.sh;
      dl_file = pipe ./cmds/dl_file.sh;

      unarchive = pipe ./cmds/unarchive.sh;
      archive = pipe ./cmds/archive.sh;

      trash = pipe ./cmds/trash.sh;
      clear_trash = pipe ./cmds/clear_trash.sh;
      restore_trash = shell ./cmds/restore_trash.sh;

      stripspace = pipe ./cmds/stripspace.sh;
    };
    keybindings = {
      # Remove some defaults
      m = null;
      "'" = null;
      #" = null; # TODO
      d = null;
      c = null;
      e = null;
      j = null;
      k = null;
      l = null;
      ";" = null;

      # File Openers
      ee = "\$\$EDITOR \"$f\"";
      u = "%\$IVIEWER \"$f\"";
      cc = "\$sudo -e \"$f\"";

      # Archive Mappings
      au = "unarchive";
      a = "archive";

      # Trash Mappings
      dd = "trash";
      jc = "clear_trash";
      jr = "restore_trash";

      # Broot Mapping
      f = "broot_jump";

      # Dragon Mapping
      dr = "dragon";
      ds = "dragon-stay";
      di = "dragon-individual";
      #dm = "mvdragon";
      #dc = "cpdragon";
      dl = "dlfile";

      ss = "stripspace";

      # Vim keys
      h = "updir";
      t = "down";
      n = "up";
      s = "open";

      # Basic Functions
      bn = "help";
      kk = "mklkn";
      "." = "set hidden!";
      DD = "delete";
      p = "paste";
      x = "cut";
      y = "copy";
      "<enter>" = "open";
      mf = "mkfile";
      mr = "sudomkfile";
      md = "mkdir";
      ms = "mkscr";
      ch = "chmod";
      bg = "setwallpaper";
      o = "open_config";
      br = "\$vimv \$fx"; # TODO what is this command?
      r = "rename";
      H = "top";
      L = "bottom";
      R = "reload";
      C = "clear";
      U = "unselect";

      # Movement
      gjr = "cd ~/.local/share/Trash/files";
      gus = "cd /run/dt";

      "gr." = "cd /home/dt/repos";
      grr = "cd /home/dt/repos/rust";
      grp = "cd /home/dt/repos/python";
      grc = "cd /home/dt/repos/c";
      gra = "cd /home/dt/repos/auto_hot_key";
      grt = "cd /home/dt/repos/tex";
      grs = "cd /home/dt/repos/shell";

      grch = "cd /home/dt/repos/chroot";
      grpe = "cd /home/dt/repos/perl";
      grja = "cd /home/dt/repos/java";
      grjs = "cd /home/dt/repos/java_script";
      # -------------
      "gm." = "cd /home/dt/media";
      gmpi = "cd /home/dt/media/pictures";
      gmdo = "cd /home/dt/media/downloads";
      gmpl = "cd /home/dt/media/playlist";
      gmis = "cd /home/dt/media/isos";
      # -------------
      "gs." = "cd /home/dt/school";
      gsgs = "cd /home/dt/school/geschichte";
      gsch = "cd /home/dt/school/chemie";
      gsen = "cd /home/dt/school/english";
      gsgo = "cd /home/dt/school/geographie";
      gsin = "cd /home/dt/school/infomatik";
      gsso = "cd /home/dt/school/sozialkunde";
      gskr = "cd /home/dt/school/katholische_religion";
      gsmu = "cd /home/dt/school/musik";
      gsla = "cd /home/dt/school/latein";
      gsde = "cd /home/dt/school/deutsch";
      gsma = "cd /home/dt/school/mathematik";
      gspr = "cd /home/dt/school/praktikum";
      gsbi = "cd /home/dt/school/biologie";
      gssp = "cd /home/dt/school/sport";
      gsphy = "cd /home/dt/school/physik";
      gsphi = "cd /home/dt/school/philosophie";

      gc = "cd ~/.config";
      gl = "cd ~/.local";
      gE = "cd /etc";

      "gU." = "cd /usr";
      gUs = " cd /usr/share";

      gt = "cd /tmp";
    };
    # TODO add ctpv, if it gets merged
    #   previewer = {
    #      keybinding = "i";
    #      source = pkgs.ctpv;
    #    };
    settings = {
      # TODO this needs to be added to nixos:
      #autoquit = true; # quit the server, if no clients are left
      #dirpreviews = true; # preview for directories

      dircounts = true; # count things in directories TODO this has performance impact
      drawbox = true;
      errorfmt = "\\033[1;91m==> ERROR:\\033[0m\\033[1;93m%s\\033[0m";
      hidden = true; # show hidden files
      icons = true;
      ifs = "\n"; # internal field separator for shell commands
      info = "size"; # show the size of a directory
      shell = "sh";
      shellopts = "-e -u"; # e: exit on error; u: error for unset variables
    };
    # TODO remove auto quit, if it has been added
    # TODO add ctpv, if it gets merged
    extraConfig = ''
      &ctpv -s $id
      &ctpvquit $id
      set cleaner = {pkgs.ctpv}

      set autoquit = true
      set dirpreviews = true
    '';
  };
}
# vim: ts=2