all repos — nixfiles @ 2461cf464ce3590d7da8f6106b278783b1485cc5

System and user configuration, managed by nix and home-manager

user/settings/emacs.nix (view raw)

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
{
  config,
  pkgs,
  lib,
  inputs,
  ...
}:
let
  inherit (pkgs) stdenv;
  inherit (lib) removePrefix;

  nixfiles = config.home.homeDirectory + "/projects/alin.ovh/nixfiles";
  direct_symlink = path: config.lib.file.mkOutOfStoreSymlink "${nixfiles}/${removePrefix "/" path}";

  editorScript = pkgs.writeScriptBin "emacsc" ''
    #!${pkgs.runtimeShell}
    if [ -z "$1" ]; then
      exec ${config.programs.emacs.finalPackage}/bin/emacsclient --create-frame --alternate-editor ${config.programs.emacs.finalPackage}/bin/emacs
    else
      exec ${config.programs.emacs.finalPackage}/bin/emacsclient --alternate-editor ${config.programs.emacs.finalPackage}/bin/emacs --create-frame "$@"
    fi
  '';
in
{
  programs.git.attributes = [
    "*.el diff=elisp"
  ];
  programs.git.settings."diff.elisp" = {
    xfuncname = "^\\([^[:space:]]+[[:space:]]+([^()[:space:]]+)";
  };

  services.emacs = lib.mkIf stdenv.isLinux {
    enable = true;
    package = config.programs.emacs.finalPackage;
    client.enable = true;
  };
  programs.emacs = {
    enable = true;
    package = lib.mkDefault (if stdenv.isLinux then pkgs.emacs-gtk else pkgs.emacs);

    extraPackages =
      epkgs:
      (with epkgs; [
        aggressive-indent
        apheleia
        buffer-terminator
        cape
        corfu
        consult
        consult-ghq
        consult-eglot
        consult-lsp
        crux
        dtrt-indent
        envrc
        editorconfig
        elisp-refs
        evil
        evil-collection
        evil-embrace
        evil-matchit
        evil-numbers
        evil-surround
        evil-textobj-tree-sitter
        exec-path-from-shell
        feature-mode
        flycheck
        flymake-popon
        general
        git-gutter-fringe
        git-modes
        git-timemachine
        gl-conf-mode # gitolite
        goto-chg
        just-ts-mode
        kind-icon
        lua-mode
        link-hint
        magit
        markdown-mode
        marginalia
        nerd-icons
        nix-ts-mode
        doom-modeline
        persist-state
        rainbow-mode
        rainbow-delimiters
        tempel
        tempel-collection
        eglot-tempel
        (treesit-grammars.with-grammars (
          grammars: with grammars; [
            tree-sitter-nix
            tree-sitter-markdown
            tree-sitter-json
            tree-sitter-json5
            tree-sitter-toml
            tree-sitter-yaml
          ]
        ))
        try
        vc-msg
        vertico
        vertico-prescient
        wgrep-ag
        ws-butler
        which-key
      ]);

    extraConfig = lib.mkBefore ''
      ;;; default --- site init file  -*- lexical-binding: t; -*-
      (with-eval-after-load 'editorconfig
        (setq editorconfig-exec-path "${pkgs.editorconfig-core-c}/bin/editorconfig"))
    '';
  };
  home.packages = with pkgs; [
    editorScript
    enchant
  ];
  xdg.configFile = {
    "emacs/early-init.el".source = "${inputs.minimal-emacs}/early-init.el";
    "emacs/init.el".source = "${inputs.minimal-emacs}/init.el";
    "emacs/pre-early-init.el".source = direct_symlink "user/settings/emacs/pre-early-init.el";
    "emacs/post-early-init.el".source = direct_symlink "user/settings/emacs/post-early-init.el";
    "emacs/pre-init.el".source = direct_symlink "user/settings/emacs/pre-init.el";
    "emacs/post-init.el".source = direct_symlink "user/settings/emacs/post-init.el";
  };
}