{ config, pkgs, doom-emacs, ... }:
let
  sessionVariables = rec {
    DOOMLOCALDIR = "${config.home.homeDirectory}/.local/share/doomemacs";
    DOOMPROFILELOADFILE = "${DOOMLOCALDIR}/load.el";
  };
in {
  xdg.configFile = {
    emacs.source = doom-emacs;
    doom.source = ./doom;
  };
  systemd.user = { inherit sessionVariables; };
  programs.emacs = {
    enable = true;
    package = pkgs.emacs29-pgtk;
  };
  services.emacs = {
    enable = true;
    package = config.programs.emacs.package;
    defaultEditor = true;
    client.enable = true;
    socketActivation.enable = true;
  };
  home = {
    inherit sessionVariables;
    sessionPath = [ "$HOME/.config/emacs/bin" "$HOME/.emacs.d/bin" ];
    packages = with pkgs; [
      # Additional/Compiled Emacs packages
      emacsPackages.mu4e
      emacsPackages.vterm
      emacsPackages.pdf-tools
      emacsPackages.all-the-icons
      emacsPackages.nerd-icons

      # Emacs dependencies
      coreutils
      gnutls
      ripgrep
      cmake
      fd
      imagemagick
      zstd
      graphviz
      zip
      unzip

      # Language-specific requirements
      (aspellWithDicts (ds: with ds; [ en en-computers en-science ]))
      findutils
      sqlite
      pandoc
      gfortran
      texlive.combined.scheme-medium
      python3
      isort
      python3Packages.cython
      python3Packages.pyflakes
      python3Packages.nose
      python3Packages.pytest
      nodePackages.stylelint

      # Formatters
      nixfmt
      beautysh
      black
      nodePackages.fixjson
      fprettify
      shellharden
      shfmt
      stylua
      python3Packages.mdformat
      html-tidy
      nodePackages.js-beautify

      # LSP servers
      nixd
      fortls
      shellcheck
      marksman
      luajitPackages.lua-lsp
      texlab
      nodePackages.pyright
      nodePackages.yaml-language-server
      nodePackages.bash-language-server
      nodePackages.vscode-html-languageserver-bin
      nodePackages.vscode-css-languageserver-bin
      nodePackages.vscode-json-languageserver-bin
      nodePackages.dockerfile-language-server-nodejs
    ];
  };
}