tvl-depot/users/tazjin/emacs/default.nix
sterni 71435d9546 chore(3p/sources): Bump channels & overlays
* agenix has not been updated (https://github.com/ryantm/agenix/pull/241).
* wasm-bindgen bumped to 0.2.92 in Rust WASM projects
* 3p/lisp: port lispPackages from stable channel

  The Lisp package set we are using (`pkgs.lispPackages`) is the "old
  old" package set, whereas we were supposed to have been using
  `pkgs.lispPackages_new` (which is the "old new" package set).

  Either way we missed that train, and now there's a "new new" package
  set, but with a twist: Lisp packages in nixpkgs are now tied to
  their compilers, so the most generic way to access them seems to be
  from `pkgs.sbclPackages`.

  Switching to the packages from the "new new" package set doesn't
  work: Lots of stuff stops building if we just switch the sources
  over, and not everything is trivially fixable.

  For now we stay on the lispPackages from the stable channel. We need
  to look into the migration later.

  Or rewrite panettone.
* tvix: update generated protobuf files
* 3p/nixpkgs: pick trunk from stable channel; newer versions try to
  read files and do network I/O during build, but don't print enough
  details in error messages to figure out why.
* 3p/overlays: remove tdlib override (nixpkgs is currently new enough)
* 3p/overlays: override telega.el sources while updates are lagging in
  nixpkgs
* users/flokli/ipu6-softisp: update firmware paths, which NixOS now
  stores zstd-compressed.

Change-Id: I5a7a6c8b5d0688461bca92b9e6d654356d3a1cf1
Reviewed-on: https://cl.tvl.fyi/c/depot/+/11711
Tested-by: BuildkiteCI
Reviewed-by: flokli <flokli@flokli.de>
Reviewed-by: tazjin <tazjin@tvl.su>
2024-06-08 15:20:48 +00:00

189 lines
5.1 KiB
Nix

# This file builds an Emacs pre-configured with the packages I need
# and my personal Emacs configuration.
{ depot, lib, pkgs, ... }:
pkgs.makeOverridable
({ emacs ? pkgs.emacs29 }:
let
emacsPackages = (pkgs.emacsPackagesFor emacs);
emacsWithPackages = emacsPackages.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.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;
# tree-sitter grammars for various ts-modes
customTreesitGrammars = emacs.pkgs.treesit-grammars.with-grammars (g: with g; [
tree-sitter-bash
tree-sitter-c
tree-sitter-cmake
tree-sitter-cpp
tree-sitter-css
tree-sitter-dockerfile
tree-sitter-go
tree-sitter-gomod
tree-sitter-hcl
tree-sitter-html
tree-sitter-java
tree-sitter-json
tree-sitter-latex
tree-sitter-make
tree-sitter-nix
tree-sitter-python
tree-sitter-rust
tree-sitter-sql
tree-sitter-toml
tree-sitter-yaml
]);
tazjinsEmacs = pkgfun: (emacsWithPackages (epkgs: pkgfun (with epkgs; [
ace-link
ace-window
avy
bazel
browse-kill-ring
cargo
clojure-mode
consult
deft
direnv
elixir-mode
elm-mode
erlang
depotExwm
go-mode
google-c-style
gruber-darker-theme
haskell-mode
ht
hydra
idle-highlight-mode
inspector
jq-mode
kotlin-mode
kubernetes
magit
markdown-toc
multiple-cursors
nginx-mode
nix-mode
notmuch
paredit
password-store
pinentry
prescient
protobuf-mode
rainbow-delimiters
rainbow-mode
request
restclient
rust-mode
sly
string-edit-at-point
terraform-mode
undo-tree
uuidgen
vertico
vterm
web-mode
websocket
which-key
xelb
yasnippet
zetteldeft
zoxide
# experimental (not otherwise embedded in config yet)
orderless
corfu
eat
# Wonky stuff
(currentTelega epkgs)
customTreesitGrammars # TODO(tazjin): how is this *supposed* to work?!
# Custom depot packages (either ours, or overridden ones)
tvlPackages.dottime
tvlPackages.nix-util
tvlPackages.passively
tvlPackages.rcirc
tvlPackages.term-switcher
tvlPackages.treecrumbs
tvlPackages.tvl
# Dynamic/native modules
depot.users.tazjin.gio-list-apps
])));
# 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.runCommand "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 "(add-to-list 'treesit-extra-load-path \"${customTreesitGrammars}/lib\")" \
--eval "(require 'init)" $@
'').overrideAttrs
(_: {
passthru = {
# Expose original Emacs used for my configuration.
inherit emacs;
# Expose the pure emacs with all packages.
inherit emacsPackages;
emacsWithPackages = tazjinsEmacs f;
# 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;
# 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
)
{ }