tvl-depot/users/tazjin/emacs/default.nix

190 lines
5.1 KiB
Nix
Raw Normal View History

# 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.
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-05-24 12:33:34 +02:00
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
refactor(tazjin/emacs): ivy,swiper,counsel -> vertico,consult vertico and consult are more modern versions of interactive narrowing helpers, as those implemented by ivy and its related packages. The primary differences (and what I care about here) is that they are more focused on integration with the core Emacs primitives, rather than building an ecosystem around them. For example: * vertico enhances `completing-read' and friends, but does not attempt to provide its own ecosystem of functions to *trigger* completions. * vertico integrates with the default `completion-style' system, meaning that I can continue to use things like prescient without extra packages that integrate it with vertico * consult does not rely on vertico or any other specific completion framework (such as counsel/swiper do with ivy), and simply implements its functions using completing-read This reduces the overall amount of code in the dependency closure and leads to a less special setup. Functionality is basically equivalent, except for two things which counsel came with that I will need to substitute: * counsel-notmuch (actually this was a separate package, but I didn't use it much anyways, so just ignoring it for now) * counsel-linux-app (opening desktop shortcuts, this I will need to make) As a side note, consult notes "This package is a part of GNU Emacs", but it doesn't seem to be the case. Change-Id: Ia046b763bf3d401b505e0f6393cfe1ccd6f41293 Reviewed-on: https://cl.tvl.fyi/c/depot/+/9155 Tested-by: BuildkiteCI Reviewed-by: tazjin <tazjin@tvl.su>
2023-08-27 00:12:29 +02:00
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
refactor(tazjin/emacs): ivy,swiper,counsel -> vertico,consult vertico and consult are more modern versions of interactive narrowing helpers, as those implemented by ivy and its related packages. The primary differences (and what I care about here) is that they are more focused on integration with the core Emacs primitives, rather than building an ecosystem around them. For example: * vertico enhances `completing-read' and friends, but does not attempt to provide its own ecosystem of functions to *trigger* completions. * vertico integrates with the default `completion-style' system, meaning that I can continue to use things like prescient without extra packages that integrate it with vertico * consult does not rely on vertico or any other specific completion framework (such as counsel/swiper do with ivy), and simply implements its functions using completing-read This reduces the overall amount of code in the dependency closure and leads to a less special setup. Functionality is basically equivalent, except for two things which counsel came with that I will need to substitute: * counsel-notmuch (actually this was a separate package, but I didn't use it much anyways, so just ignoring it for now) * counsel-linux-app (opening desktop shortcuts, this I will need to make) As a side note, consult notes "This package is a part of GNU Emacs", but it doesn't seem to be the case. Change-Id: Ia046b763bf3d401b505e0f6393cfe1ccd6f41293 Reviewed-on: https://cl.tvl.fyi/c/depot/+/9155 Tested-by: BuildkiteCI Reviewed-by: tazjin <tazjin@tvl.su>
2023-08-27 00:12:29 +02:00
vertico
vterm
web-mode
websocket
which-key
xelb
yasnippet
zetteldeft
zoxide
2020-02-24 17:40:43 +01:00
# 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
)
{ }