about summary refs log tree commit diff
path: root/users/tazjin/emacs/default.nix
blob: 9b88dcaf9b45c5977c3156649432a625092141d8 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
# This file builds an Emacs pre-configured with the packages I need
# and my personal Emacs configuration.
{ depot, lib, pkgs, ... }:

lib.makeOverridable
  (
    { emacs ? pkgs.emacs31-pgtk
    , extraConfig ? null
    , preInit ? ""
    , overridePackages ? (_: x: x)
    }:
    let
      emacsPackages = (pkgs.emacsPackagesFor emacs);
      emacsWithPackages = emacsPackages.emacsWithPackages;

      # $PATH for binaries that need to be available to Emacs
      emacsBinPath = lib.makeBinPath [
        emacsPackages.checkedTelega
        pkgs.libwebp # for dwebp, required by telega
      ];

      # 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-gleam
        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-typescript
        tree-sitter-yaml
      ]);

      tazjinsEmacs = pkgfun: (emacsWithPackages (epkgs: pkgfun (with epkgs; [
        ace-window
        avy
        bazel
        browse-kill-ring
        cargo
        clojure-mode
        consult
        direnv
        elixir-mode
        elm-mode
        erlang
        geiser
        geiser-chez
        gleam-ts-mode
        go-mode
        google-c-style
        gptel
        haskell-mode
        ht
        hydra
        idle-highlight-mode
        inspector
        jq-mode
        kotlin-mode
        # TODO(tazjin): Temporarily removed from MELPA due to hacked upstream repository
        # https://github.com/kubernetes-el/kubernetes-el/issues/383#issuecomment-4144867926
        # https://github.com/melpa/melpa/pull/9918
        # kubernetes
        magit
        markdown-toc
        multiple-cursors
        nginx-mode
        nix-mode
        notmuch
        paredit
        pinentry
        protobuf-mode
        rainbow-delimiters
        rainbow-mode
        request
        restclient
        rust-mode
        sly
        string-edit-at-point
        terraform-mode
        undo-tree
        uuidgen
        vterm
        web-mode
        websocket
        which-key
        yasnippet
        zoxide

        # Wonky stuff
        checkedTelega
        customTreesitGrammars # TODO(tazjin): how is this *supposed* to work?!

        # Custom depot packages (either ours, or overridden ones)
        tvlPackages.dottime
        tvlPackages.niri
        tvlPackages.nix-util
        tvlPackages.notable
        tvlPackages.passively
        tvlPackages.rcirc
        tvlPackages.term-switcher
        tvlPackages.treecrumbs
        tvlPackages.tvl
        tvlPackages.gptel-memory
        tvlPackages.reka

        # Dynamic/native modules
        depot.users.tazjin.gio-list-apps
      ])));
    in
    (pkgs.writeShellScriptBin "tazjins-emacs" ''
      export PATH="${emacsBinPath}:$PATH"
      exec ${tazjinsEmacs (overridePackages emacsPackages)}/bin/emacs \
      --debug-init \
      --no-site-file \
      --no-site-lisp \
      --no-init-file \
      --directory ${./config} ${if extraConfig != null then "--directory ${extraConfig}" else ""} \
      --eval "(add-to-list 'treesit-extra-load-path \"${customTreesitGrammars}/lib\")" \
      ${preInit} --eval "(require 'init)" $@
    '').overrideAttrs
      (_: {
        passthru = {
          inherit emacs emacsPackages emacsBinPath;
        };
      })
  )
{ }