about summary refs log tree commit diff
path: root/modules/common/emacs/default.nix
diff options
context:
space:
mode:
authorAzat Bahawi <azat@bahawi.net>2023-02-19 17:50:35 +0300
committerAzat Bahawi <azat@bahawi.net>2023-02-19 17:50:35 +0300
commit91fb4f28ef5d87e8bcf7749928d30ba4a9cbbd34 (patch)
treee07291fcb1cf62a561ffe58d1fd8e2968ff6fcb3 /modules/common/emacs/default.nix
parent2023-02-15 (diff)
2023-02-19
Diffstat (limited to 'modules/common/emacs/default.nix')
-rw-r--r--modules/common/emacs/default.nix163
1 files changed, 163 insertions, 0 deletions
diff --git a/modules/common/emacs/default.nix b/modules/common/emacs/default.nix
new file mode 100644
index 0000000..7395c51
--- /dev/null
+++ b/modules/common/emacs/default.nix
@@ -0,0 +1,163 @@
+{
+  config,
+  inputs,
+  lib,
+  pkgs,
+  pkgsStable,
+  this,
+  ...
+}:
+with lib; let
+  cfg = config.nixfiles.modules.emacs;
+in {
+  options.nixfiles.modules.emacs.enable = mkEnableOption "GNU Emacs";
+
+  config = mkIf cfg.enable {
+    nixfiles.modules = {
+      fonts.enable = true;
+      git.client.enable = true;
+      gnupg.enable = true;
+    };
+
+    hm = {
+      xdg.configFile = {
+        "doom/init.el".source = ./doom/init.el;
+        "doom/packages.el".source = ./doom/packages.el;
+        "doom/config.el" = {
+          text = concatStringsSep "\n" [
+            (let
+              # NOTE gopls will require the "go" executable which must be provided
+              # by the project's flake/shell.
+              extraBins = with pkgs;
+                [
+                  enchant # :checkers (spell +enchant)
+                  (python3.withPackages (p:
+                    with p; [
+                      black # :lang python :editor format
+                      isort # :lang python
+                      pyflakes # :lang python
+                      python-lsp-server # :lang (python +lsp)
+                    ]))
+                  asmfmt # :editor format
+                  bash-language-server # :lang (sh +lsp)
+                  clang-tools # :lang (cc +lsp) :editor format
+                  cmake-format # :lang cc :editor format
+                  cmigemo # :lang japanese
+                  css-language-server # :lang (web +lsp)
+                  dhall-language-server # :lang (dhall +lsp)
+                  dockerfile-language-server # :tools (docker +lsp)
+                  editorconfig # :tools editorconfig
+                  fd # doom!
+                  gnuplot # :lang (org +gnuplot)
+                  gnutls # doom!
+                  go-language-server # :lang (go +lsp)
+                  gomodifytags # :lang go
+                  gore # :lang go
+                  gotests # :lang go
+                  gotools # :lang go
+                  graphviz # :lang (org +roam2) :lang plantuml
+                  html-language-server # :lang (web +lsp)
+                  html-tidy # :lang web
+                  jre # :lang plantuml
+                  json-language-server # :lang (json +lsp)
+                  nix-language-server # :lang (nix +lsp)
+                  nixfmt # :lang nix :editor format
+                  nodePackages.js-beautify # :lang web
+                  nodePackages.prettier # :editor format
+                  nodePackages.stylelint # :lang web
+                  nodejs # :tools debugger
+                  pandoc # :lang org markdown latex
+                  pinentry-emacs # doom!
+                  pre-commit # :tools magit
+                  ripgrep # doom!
+                  rust-analyzer # :lang (rust +lsp)
+                  rustfmt # :lang rust
+                  shellcheck # :lang sh
+                  shfmt # :lang sh :editor format
+                  sqlite # :lang (org +roam2) :tools lookup
+                  texlab # lang (tex +lsp)
+                  texlive.combined.scheme-full # :lang org tex
+                  unzip # :tools debugger
+                  wordnet # :tools (lookup +dictionary +offline)
+                  yaml-language-server # :lang (yaml +lsp)
+                  zls # :lang (zig +lsp)
+                  zstd # :emacs undo
+                ]
+                ++ (
+                  #
+                  # GDB doesn't support[1] Apple Silicon on MacOS.
+                  #
+                  # [1]: https://inbox.sourceware.org/gdb/6b48224b-9e2e-518d-793b-df4fc5514884@arm.com/
+                  if (this.system != "aarch64-darwin")
+                  then [gdb] # :tools debugger
+                  else [lldb] # :tools debugger
+                )
+                ++ optionals (!pkgs.stdenv.isDarwin)
+                [
+                  # NOTE Haskell is pretty much broken every couple of days on
+                  # MacOS and I usually don't write anything in Haskell while
+                  # I'm on my work laptop, so... ShellCheck seems to be working,
+                  # though.
+                  haskellPackages.ormolu # :lang haskell :editor format
+                  haskellPackages.haskell-language-server # :lang (haskell +lsp)
+                  haskellPackages.cabal-fmt # :lang haskell :editor format
+                  haskellPackages.cabal-install # :lang haskell
+                  haskellPackages.hoogle # :lang haskell
+                ];
+            in ''
+              ;; This will integrate packages which are required by various
+              ;; modules without polluting the user's profile.
+              (setq exec-path (append exec-path '(${
+                concatMapStringsSep " " (x: ''"${x}/bin"'') extraBins
+              })))
+              (setenv "PATH" (concat (getenv "PATH") ":${
+                concatMapStringsSep ":" (x: "${x}/bin") extraBins
+              }"))
+
+              ;; Font must be set to N+2 because otherwise it looks too small.
+              (setq doom-font (font-spec :family "${config.fontScheme.monospaceFont.family}"
+                                          :size ${toString (config.fontScheme.monospaceFont.size + 2)})
+                    doom-unicode-font doom-font)
+
+              (setq user-full-name "${my.fullname}"
+                    user-mail-address "${my.email}")
+
+              ;; :app irc
+              (setq circe-default-nick "${my.username}"
+                    circe-default-realname "${my.email}"
+                    circe-default-user circe-default-nick)
+
+              ;; :lang plantuml
+              (setq org-plantuml-jar-path "${pkgs.plantuml}/lib/plantuml.jar")
+
+              ;; :input japanese
+              (setq migemo-dictionary "${pkgs.cmigemo}/share/migemo/utf-8/migemo-dict")
+
+              ;; :input japanese
+              (setq skk-large-jisyo "${pkgs.skk-dicts}/share/skk/SKK-JISYO.L")
+            '')
+            (builtins.readFile ./doom/config.el)
+          ];
+          onChange = with config.hm.programs; ''
+            if [[ -x "''${XDG_CONFIG_HOME:~/.config}/emacs/bin/doom" ]]; then
+               oldpath="$PATH"
+               export PATH="''${PATH:-/bin}:${emacs.package}/bin:${git.package}/bin"
+
+               "''${XDG_CONFIG_HOME:~/.config}/emacs/bin/doom" sync
+
+               export PATH="$oldpath"
+               unset oldpath
+            fi
+          '';
+        };
+      };
+
+      programs.emacs = {
+        enable = true;
+        package = pkgs.emacs28; # Pin to avoid surprises.
+        # For some reason latest libvterm is not picked up by Emacs.
+        extraPackages = _: with pkgsStable.emacsPackages; [vterm];
+      };
+    };
+  };
+}

Consider giving Nix/NixOS a try! <3