{
  config,
  lib,
  pkgs,
  ...
}:

let
  plainmacs = pkgs.writeShellScriptBin "plainmacs" ''
    INIT_SCRIPT=$(cat <<EOF
    (progn
      (setq make-backup-files nil auto-save-default nil create-lockfiles nil)
      (load-theme 'tango-dark t)
      (set-face-attribute 'default nil :background "black")
      ;; Bright yellow highlighting for selected region
      (set-face-attribute 'region nil :background "#ffff50" :foreground "black")
      ;; Bright green cursor to distinguish from yellow region
      (set-cursor-color "#ccff66")
      ;; Hightlight the current line
      (set-face-attribute 'line-number-current-line nil :foreground "white")
      ;; Set default font
      (set-face-attribute 'default nil :height 100 :width 'regular :weight 'regular :family "Cascadia Mono")
      ;; Set fallback font for unicode glyphs
      (when (display-graphic-p)
        (set-fontset-font "fontset-default" nil (font-spec :name "Noto Color Emoji")))
      (menu-bar-mode -1)
      (when (fboundp 'tool-bar-mode)
        (tool-bar-mode -1))
      (when (  fboundp 'scroll-bar-mode)
        (scroll-bar-mode -1))
      (pixel-scroll-precision-mode)
      (setq frame-resize-pixelwise t)
      )
    EOF
    )

    exec ${pkgs.emacs29-pgtk}/bin/emacs -q --eval "$INIT_SCRIPT" "''${@}"
  '';
  e_shorthand = pkgs.writeShellScriptBin "e" ''
    exec ${pkgs.emacs29-pgtk}/bin/emacs "''${@}"
  '';
in
{
  imports = [ ];

  environment.systemPackages = with pkgs; [
    plainmacs
    e_shorthand
    emacs29-pgtk
    clang # To compile tree-sitter grammars
    nixd # nix language server
    nixfmt-rfc-style # auto-formatting nix files through nixd
  ];

  home-manager.users.talexander =
    { pkgs, ... }:
    {
      home.file.".config/emacs" = {
        source = ./files/emacs;
        recursive = true;
      };
    };

  environment.persistence."/state" = lib.mkIf (!config.me.buildingIso) {
    hideMounts = true;
    users.talexander = {
      directories = [
        ".config/emacs/eln-cache" # Installed packages
        ".config/emacs/elpa" # Installed packages
        ".config/emacs/private" # For recentf
        ".config/emacs/tree-sitter" # Compiled tree-sitter grammars
      ];
      files = [
        ".config/emacs/history" # For savehist
        ".config/emacs/.last-package-update-day" # For use-package
      ];
    };
  };

  environment.variables.EDITOR = "${plainmacs}/bin/plainmacs";
}