{ nix-doom-emacs, ... }: { config
                         , pkgs
                         , lib
                         , ...
                         }:
with lib; let
  cfg = config.dadada.home.emacs;
in
{
  imports = [ nix-doom-emacs.hmModule ];
  options.dadada.home.emacs = {
    enable = mkEnableOption "Enable dadada emacs config";
  };
  config = mkIf cfg.enable {
    programs.doom-emacs = {
      enable = true;
      doomPrivateDir = ./doom.d;
      emacsPackagesOverlay = self: super:
        with pkgs; {
          tsc = super.tsc.overrideAttrs (old:
            let
              libtsc_dyn = rustPlatform.buildRustPackage rec {
                pname = "emacs-tree-sitter";
                version = "0.15.1";
                src = fetchFromGitHub {
                  owner = "ubolonton";
                  repo = "emacs-tree-sitter";
                  rev = version;
                  sha256 = "sha256-WgkGtmw63+kRLTRiSEO4bFF2IguH5g4odCujyazkwJc=";
                };
                preBuild = ''
                  export BINDGEN_EXTRA_CLANG_ARGS="$(< ${stdenv.cc}/nix-support/libc-crt1-cflags) \
                    $(< ${stdenv.cc}/nix-support/libc-cflags) \
                    $(< ${stdenv.cc}/nix-support/cc-cflags) \
                    $(< ${stdenv.cc}/nix-support/libcxx-cxxflags) \
                    ${lib.optionalString stdenv.cc.isClang "-idirafter ${stdenv.cc.cc}/lib/clang/${lib.getVersion stdenv.cc.cc}/include"} \
                    ${lib.optionalString stdenv.cc.isGNU
                    "-isystem ${stdenv.cc.cc}/lib/gcc/${stdenv.hostPlatform.config}/${lib.getVersion stdenv.cc.cc}/include/"} \
                    ${lib.optionalString stdenv.cc.isGNU
                    "-isystem ${stdenv.cc.cc}/include/c++/${lib.getVersion stdenv.cc.cc} -isystem ${stdenv.cc.cc}/include/c++/${lib.getVersion stdenv.cc.cc}/${stdenv.hostPlatform.config}"} \
                    $NIX_CFLAGS_COMPILE"
                '';
                LIBCLANG_PATH = "${llvmPackages.libclang.lib}/lib";
                cargoHash = "sha256-HB5tFR1slY2D6jb2mt4KrGrGBUUVrxiBjmVycO+qfYY=";
              };
            in
            {
              inherit (libtsc_dyn) src;
              preBuild = ''
                ext=${stdenv.hostPlatform.extensions.sharedLibrary}
                dest=$out/share/emacs/site-lisp/elpa/tsc-${old.version}
                install -D ${libtsc_dyn}/lib/libtsc_dyn$ext $dest/tsc-dyn$ext
                echo -n "0.15.1" > $dest/DYN-VERSION
              '';
            });
          tree-sitter-langs = super.tree-sitter-langs.overrideAttrs (old: {
            postInstall = ''
              dest=$out/share/emacs/site-lisp/elpa/tree-sitter-langs-${old.version}
              echo -n "0.10.2" > $dest/BUNDLE-VERSION
              ${lib.concatStringsSep "\n"
                (lib.mapAttrsToList (name: src: "name=${name}; ln -s ${src}/parser $dest/bin/\${name#tree-sitter-}.so") pkgs.tree-sitter.builtGrammars)};
            '';
          });
        };
    };
    home.file.".tree-sitter".source = pkgs.runCommand "grammars" { } ''
      mkdir -p $out/bin
      echo -n "0.10.2" > $out/BUNDLE-VERSION
      ${lib.concatStringsSep "\n"
        (lib.mapAttrsToList (name: src: "name=${name}; ln -s ${src}/parser $out/bin/\${name#tree-sitter-}.so") pkgs.tree-sitter.builtGrammars)};
    '';
  };
}