pkgs: let
  plugins = epkgs: with epkgs; [
    avy
    evil
    evil-surround
    org
    undo-fu-session
    treesit-grammars.with-all-grammars
    nix-ts-mode
    (trivialBuild {
      pname = "elisp-ts-mode";
      version = "0.0";
      src = pkgs.fetchFromGitHub {
        owner = "nverno";
        repo = "emacs-lisp-ts-mode";
        rev = "7d661005a7c4ac8b45d1584c9fdbbd9b1e49eb39";
        hash = "sha256-r2/PVwsPlZ6iPd6vBB7i4AYK0ofwUgRX8I+2FGwjFKI=";
      };
    })
    (trivialBuild {
      pname = "nushell-ts-mode";
      version = "0.0";
      src = pkgs.fetchFromGitHub {
        owner = "herbertjones";
        repo = "nushell-ts-mode";
        rev = "e07ecc59762fab8d5fa35bc6d3f522f74e580a2f";
        hash = "sha256-C4RRph7zaO4PQkZcUSsFg2jWuLcZGtRjaPcNICj3JG0=";
      };
    })
    (trivialBuild {
      pname = "zig-ts-mode";
      version = "0.0";
      src = pkgs.fetchFromGitHub {
        owner = "emacsmirror";
        repo = "zig-ts-mode";
        rev = "bb1e8287800868ee338e986bda5b5a1f5abf7445";
        hash = "sha256-vstl13IWwAxaQTsy/bn/uCet4Oxm2edKjmwREfhNAk8=";
      };
    })
  ];
in {
  programs.emacs = {
    enable = true;
    package = pkgs.emacs-nox.pkgs.withPackages (epkgs: plugins epkgs ++ [
      (epkgs.trivialBuild {
	pname = "myconf";
	version = "0.0";
	src = ./lisp;
      })
      (epkgs.trivialBuild {
	pname = "myplugins";
	version = "0.0";
	src = ./plugins;
	buildInputs = plugins epkgs;

        # to prevent "Creating directory" "Permission denied" "/homeless-shelter" error
	preBuild = "export HOME=$(pwd)";
      })
    ]);
    extraConfig = builtins.readFile ./init.el;
  };

  services.emacs = {
    enable = true;
    client.enable = true;
  };
}