{pkgs, ...}: let
  yazi =
    pkgs.writeText "open_in_helix_from_yazi.zsh"
    ''
      #! ~/.nix-profile/bin/zsh
      files=(''${(fqq)"$( yazi --chooser-file=/dev/stdout | cat )"})
      zellij action toggle-floating-panes
      zellij action write 27 # send escape-key
      zellij action write-chars ":open $files"
      zellij action write 13 # send enter-key
      zellij action toggle-floating-panes
      zellij action close-pane
    '';
  jupyter =
    pkgs.writeText "run_jupyter_from_helix.zsh"
    ''
      #! ~/.nix-profile/bin/zsh
      is_new() {
        new=0;
        mkdir -p /tmp/rjh;
        if [[ -a "/tmp/rjh/$(pwd | tr \"/\" -).json" ]]; then
          new=1
        fi
        return $new
      }

      is_new && zellij run -f -n "jupyter console" -- direnv exec . jupyter console --kernel="$1" -f="/tmp/rjh/$(pwd | tr \"/\" -).json" --ZMQTerminalInteractiveShell.include_other_output=True --ZMQTerminalInteractiveShell.other_output_prefix=''' && sleep 3
      rm -f /tmp/pipe-rjh
      mkfifo /tmp/pipe-rjh
      cat > /tmp/pipe-rjh
      zellij run -f -n "REPL" -- direnv exec . just send < /tmp/pipe-rjh
      rm /tmp/pipe-rjh

    '';
in {
  programs.helix = {
    enable = true;
    defaultEditor = true;

    settings = {
      # theme = "catppuccin_macchiato"; # Don't need this because the module themes it for us
      keys.normal.backspace = {
        b = ":sh zellij run -f -n 'build code' -- direnv exec . just build";
        r = ":sh zellij run -f -n 'run code' -- direnv exec . just run";
        t = ":sh zellij run -f -n 'test code' -- direnv exec . just test";
        g = ":sh zellij run -fc -n 'lazygit' -- lazygit";
        f = ":sh zellij run --floating -n 'yazi picker' -- zsh ~/.config/helix/open_in_helix_from_yazi.zsh ";
        j = ":pipe-to just jupyter";
      };
      editor = {
        auto-save = {
          focus-lost = true;
          after-delay.enable = true;
          after-delay.timeout = 3000;
        };
        line-number = "relative";
        lsp.display-messages = true;
        lsp.display-inlay-hints = true;
        cursor-shape = {
          insert = "bar";
          normal = "block";
          select = "underline";
        };
        cursorline = true;
        bufferline = "always";
        color-modes = true;
        soft-wrap = {
          enable = true;
          max-wrap = 25;
          wrap-indicator = "";
        };
      };
    };
    languages = {
      language = [
        {
          name = "python";
          language-id = "python";
          auto-format = true;
          file-types = ["py"];
          language-servers = ["ruff" "scls" "pylsp"];
        }
        {
          name = "typst";
          language-id = "typst";
          auto-format = false;
          file-types = ["typ"];
          language-servers = ["typst-lsp" "scls"];
        }
        {
          name = "rust";
          language-id = "rust";
          auto-format = true;
          file-types = ["rs"];
          roots = ["Cargo.lock"];
          language-servers = ["rust-analyzer" "scls"];
        }
        {
          name = "stub";
          scope = "text.stub";
          file-types = [];
          shebangs = [];
          roots = [];
          auto-format = false;
          language-servers = ["scls"];
        }
        {
          name = "nix";
          language-id = "nix";
          auto-format = true;
          file-types = ["nix"];
          roots = ["flake.lock" "flake.nix"];
          language-servers = ["nil" "scls"];
          formatter = {
            command = "alejandra";
            args = ["-q"];
          };
        }
        {
          name = "html";
          language-id = "html";
          auto-format = true;
          file-types = ["htm" "html"];
          language-servers = ["vscode-html-language-server" "vscode-eslint-language-server"];
        }
        {
          name = "css";
          language-id = "css";
          auto-format = true;
          file-types = ["css"];
          language-servers = ["vscode-css-language-server" "vscode-eslint-language-server"];
        }
        {
          name = "json";
          language-id = "json";
          auto-format = true;
          file-types = ["json"];
          language-servers = ["vscode-json-language-server" "vscode-eslint-language-server"];
        }
      ];
      language-server = {
        vscode-html-language-server = {
          command = "vscode-html-language-server";
        };
        vscode-css-language-server = {
          command = "vscode-css-language-server";
        };
        vscode-eslint-language-server = {
          command = "vscode-eslint-language-server";
        };
        vscode-json-language-server = {
          command = "vscode-json-language-server";
        };
        pylsp = {
          config.pylsp.plugins = {
            flake8 = {enabled = false;};
            autopep8 = {enabled = false;};
            mccabe = {enabled = false;};
            pycodestyle = {enabled = false;};
            pyflakes = {enabled = false;};
            pylint = {enabled = false;};
            yapf = {enabled = false;};
            ruff = {
              enabled = true;
              select = ["E" "F" "UP" "B" "SIM" "I" "PD" "NPY" "PERF" "FURB" "DOC" "TRY" "W" "R" "PL" "TCH" "Q" "PT" "ICN" "C4" "COM" "FBT" "S" "N"];
              ignore = ["F401"];
              lineLength = 120;
            };
          };
        };
        ruff = {
          command = "ruff-lsp";
        };
        typst-lsp = {
          command = "typst-lsp";
        };
        rust-analyzer = {
          command = "rust-analyzer";
        };
        nil = {
          command = "nil";
        };
        scls = {
          command = "simple-completion-language-server";
          config = {
            max_completion_items = 20;
            snippets_first = true;
            feature_words = true;
            feature_snippets = true;
            feature_unicode_input = true;
            feature_paths = true;
          };
        };
      };
    };
  };
  home.file = {
    "helix" = {
      source = ./snippets.toml;
      target = ".config/helix/external-snippets.toml";
    };
  };

  home.file = {
    "yazi" = {
      source = "${yazi}";
      target = ".config/helix/open_in_helix_from_yazi.zsh";
    };
  };
  home.file = {
    "jupyter" = {
      source = "${jupyter}";
      target = ".config/helix/run_jupyter_from_helix.zsh";
    };
  };
}