The buildup to the showdown of org-roam vs. zetteldeft. I can never quite get into org, but I wanna find a solution to the problem I think I have which I think these solve Change-Id: I03f7ee63b0af8dc3f8c52ad6fa4d6fa5048540bd Reviewed-on: https://cl.tvl.fyi/c/depot/+/5644 Reviewed-by: tazjin <tazjin@tvl.su> Autosubmit: tazjin <tazjin@tvl.su> Tested-by: BuildkiteCI
		
			
				
	
	
		
			179 lines
		
	
	
	
		
			4.9 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			179 lines
		
	
	
	
		
			4.9 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
| # This file builds an Emacs pre-configured with the packages I need
 | |
| # and my personal Emacs configuration.
 | |
| { lib, pkgs, ... }:
 | |
| 
 | |
| pkgs.makeOverridable
 | |
|   ({ emacs ? pkgs.emacsNativeComp }:
 | |
|   let
 | |
|     emacsWithPackages = (pkgs.emacsPackagesFor emacs).emacsWithPackages;
 | |
| 
 | |
|     # If switching telega versions, use this variable because it will
 | |
|     # keep the version check, binary path and so on in sync.
 | |
|     currentTelega = epkgs: epkgs.melpaPackages.telega;
 | |
| 
 | |
|     # $PATH for binaries that need to be available to Emacs
 | |
|     emacsBinPath = lib.makeBinPath [
 | |
|       (currentTelega pkgs.emacsPackages)
 | |
|       pkgs.libwebp # for dwebp, required by telega
 | |
|     ];
 | |
| 
 | |
|     identity = x: x;
 | |
| 
 | |
|     tazjinsEmacs = pkgfun: (emacsWithPackages (epkgs: pkgfun (with epkgs; [
 | |
|       ace-link
 | |
|       ace-window
 | |
|       avy
 | |
|       bazel
 | |
|       browse-kill-ring
 | |
|       cargo
 | |
|       clojure-mode
 | |
|       cmake-mode
 | |
|       company
 | |
|       counsel
 | |
|       counsel-notmuch
 | |
|       d-mode
 | |
|       deft
 | |
|       direnv
 | |
|       dockerfile-mode
 | |
|       eglot
 | |
|       elfeed
 | |
|       elixir-mode
 | |
|       elm-mode
 | |
|       erlang
 | |
|       exwm
 | |
|       flymake
 | |
|       go-mode
 | |
|       google-c-style
 | |
|       gruber-darker-theme
 | |
|       haskell-mode
 | |
|       ht
 | |
|       hydra
 | |
|       idle-highlight-mode
 | |
|       ivy
 | |
|       ivy-prescient
 | |
|       jq-mode
 | |
|       kotlin-mode
 | |
|       lsp-mode
 | |
|       magit
 | |
|       markdown-toc
 | |
|       meson-mode
 | |
|       multi-term
 | |
|       multiple-cursors
 | |
|       nginx-mode
 | |
|       nix-mode
 | |
|       notmuch
 | |
|       paredit
 | |
|       password-store
 | |
|       pinentry
 | |
|       polymode
 | |
|       prescient
 | |
|       protobuf-mode
 | |
|       rainbow-delimiters
 | |
|       rainbow-mode
 | |
|       refine
 | |
|       request
 | |
|       restclient
 | |
|       rust-mode
 | |
|       sly
 | |
|       string-edit
 | |
|       swiper
 | |
|       telephone-line
 | |
|       terraform-mode
 | |
|       toml-mode
 | |
|       transient
 | |
|       undo-tree
 | |
|       use-package
 | |
|       uuidgen
 | |
|       vterm
 | |
|       web-mode
 | |
|       websocket
 | |
|       which-key
 | |
|       xelb
 | |
|       yaml-mode
 | |
|       yasnippet
 | |
|       zetteldeft
 | |
|       zoxide
 | |
| 
 | |
|       # Wonky stuff
 | |
|       (currentTelega epkgs)
 | |
| 
 | |
|       # Custom depot packages (either ours, or overridden ones)
 | |
|       tvlPackages.dottime
 | |
|       tvlPackages.nix-util
 | |
|       tvlPackages.passively
 | |
|       tvlPackages.rcirc
 | |
|       tvlPackages.term-switcher
 | |
|       tvlPackages.tvl
 | |
|     ])));
 | |
| 
 | |
|     # Tired of telega.el runtime breakages through tdlib
 | |
|     # incompatibility. Target to make that a build failure instead.
 | |
|     tdlibCheck =
 | |
|       let
 | |
|         tgEmacs = emacsWithPackages (epkgs: [ (currentTelega epkgs) ]);
 | |
|         verifyTdlibVersion = builtins.toFile "verify-tdlib-version.el" ''
 | |
|           (require 'telega)
 | |
|           (defvar tdlib-version "${pkgs.tdlib.version}")
 | |
|           (when (or (version< tdlib-version
 | |
|                               telega-tdlib-min-version)
 | |
|                     (and telega-tdlib-max-version
 | |
|                           (version< telega-tdlib-max-version
 | |
|                                     tdlib-version)))
 | |
|              (message "Found TDLib version %s, but require %s to %s"
 | |
|                      tdlib-version telega-tdlib-min-version telega-tdlib-max-version)
 | |
|             (kill-emacs 1))
 | |
|         '';
 | |
|       in
 | |
|       pkgs.runCommandNoCC "tdlibCheck" { } ''
 | |
|         export PATH="${emacsBinPath}:$PATH"
 | |
|         ${tgEmacs}/bin/emacs --script ${verifyTdlibVersion} && touch $out
 | |
|       '';
 | |
|   in
 | |
|   lib.fix
 | |
|     (self: l: f: (pkgs.writeShellScriptBin "tazjins-emacs" ''
 | |
|       export PATH="${emacsBinPath}:$PATH"
 | |
|       exec ${tazjinsEmacs f}/bin/emacs \
 | |
|         --debug-init \
 | |
|         --no-site-file \
 | |
|         --no-site-lisp \
 | |
|         --no-init-file \
 | |
|         --directory ${./config} ${if l != null then "--directory ${l}" else ""} \
 | |
|         --eval "(require 'init)" $@
 | |
|     '').overrideAttrs
 | |
|       (_: {
 | |
|         passthru = {
 | |
|           # Call overrideEmacs with a function (pkgs -> pkgs) to modify the
 | |
|           # packages that should be included in this Emacs distribution.
 | |
|           overrideEmacs = f': self l f';
 | |
| 
 | |
|           # Call withLocalConfig with the path to a *folder* containing a
 | |
|           # `local.el` which provides local system configuration.
 | |
|           withLocalConfig = confDir: self confDir f;
 | |
| 
 | |
|           # Build a derivation that uses the specified local Emacs (i.e.
 | |
|           # built outside of Nix) instead
 | |
|           withLocalEmacs = emacsBin: pkgs.writeShellScriptBin "tazjins-emacs" ''
 | |
|             export PATH="${emacsBinPath}:$PATH"
 | |
|             export EMACSLOADPATH="${(tazjinsEmacs f).deps}/share/emacs/site-lisp:"
 | |
|             exec ${emacsBin} \
 | |
|               --debug-init \
 | |
|               --no-site-file \
 | |
|               --no-site-lisp \
 | |
|               --no-init-file \
 | |
|               --directory ${./config} \
 | |
|               ${if l != null then "--directory ${l}" else ""} \
 | |
|               --eval "(require 'init)" $@
 | |
|           '';
 | |
| 
 | |
|           # Expose telega/tdlib version check as a target that is built in
 | |
|           # CI.
 | |
|           #
 | |
|           # TODO(tazjin): uncomment when telega works again
 | |
|           inherit tdlibCheck;
 | |
|           meta.ci.targets = [ "tdlibCheck" ];
 | |
|         };
 | |
|       }))
 | |
|     null
 | |
|     identity
 | |
|   )
 | |
| { }
 |