about summary refs log tree commit diff
path: root/modules/emacs
diff options
context:
space:
mode:
authorazahi <azat@bahawi.net>2025-03-12 20:17:13 +0300
committerazahi <azat@bahawi.net>2025-03-12 20:17:13 +0300
commitc81dc5a13b469c511fac6fa2390b70422d1b4da5 (patch)
tree4dab5909006ab5c25da6bd9fde6a714c7719ded7 /modules/emacs
parent2025-02-17 (diff)
2025-03-12 HEAD master
Diffstat (limited to 'modules/emacs')
-rw-r--r--modules/emacs/default.nix59
-rw-r--r--modules/emacs/doom/config.el208
-rw-r--r--modules/emacs/doom/init.el51
-rw-r--r--modules/emacs/doom/packages.el23
4 files changed, 140 insertions, 201 deletions
diff --git a/modules/emacs/default.nix b/modules/emacs/default.nix
index e546ddd..80d77a3 100644
--- a/modules/emacs/default.nix
+++ b/modules/emacs/default.nix
@@ -72,17 +72,16 @@ in
           {
             "doom/init.el".source = ./doom/init.el;
             "doom/packages.el".source = ./doom/packages.el;
-            "doom/config.el" = {
-              text = lib.concatLines [
+            "doom/config.el".text =
+              [
                 (
                   let
-                    extraBins = with pkgs; [
-                      (aspellWithDicts (
-                        p: with p; [
-                          en
-                          ru
-                        ]
-                      )) # :checkers (spell +aspell)
+                    packages = with pkgs; [
+                      (hunspellWithDicts [
+                        hunspellDicts.en-gb-large
+                        hunspellDicts.en-us-large
+                        hunspellDicts.ru-ru
+                      ]) # :checkers (spell +hunspell)
                       asmfmt # :editor format
                       shirepyright # :lang (python +lsp)
                       bash-language-server # :lang (sh +lsp)
@@ -117,8 +116,10 @@ in
                       haskell-language-server # :lang (haskell +lsp)
                       haskellPackages.cabal-fmt # :lang haskell :editor format
                       haskellPackages.hoogle # :lang haskell
+                      helm-ls
                       html-tidy # :lang web :editor format
                       jdk # :lang java :lang plantuml :checkers grammar
+                      jq # :lang (rest +jq)
                       languagetool # :checkers grammar
                       libxml2 # :lang data :editor format
                       markdownlint-cli # :lang markdown
@@ -132,7 +133,9 @@ in
                       pandoc # :lang org markdown latex
                       pinentry-emacs # doom!
                       pre-commit # :tools magit
+                      prettypst
                       python3 # :lang python
+                      python3Packages.debugpy # :lang (python +lsp) :tools debugger
                       ripgrep # doom!
                       rust-analyzer # :lang (rust +lsp)
                       rustc # :lang rust
@@ -156,18 +159,15 @@ in
                     ];
                   in
                   ''
+                    ;;; init.el -*- lexical-binding: t; -*-
+
                     ;; Integrate packages which are required by various modules
                     ;; without polluting the user's profile.
-                    (setq exec-path (append exec-path '(${lib.concatMapStringsSep " " (x: ''"${x}/bin"'') extraBins})))
-                    (setenv "PATH" (concat (getenv "PATH") ":${lib.concatMapStringsSep ":" (x: "${x}/bin") extraBins}"))
+                    (setq exec-path (append exec-path '(${lib.concatMapStringsSep " " (x: ''"${x}/bin"'') packages})))
+                    (setenv "PATH" (concat (getenv "PATH") ":${lib.concatMapStringsSep ":" (x: "${x}/bin") packages}"))
 
-                    (appendq! auth-sources '(("${config.secrets.authinfo.path}")))
+                    (prependq! auth-sources '(("${config.secrets.authinfo.path}")))
 
-                    ;; HACK Explicitly load specific Emacs packages from
-                    ;; Nixpkgs. For some reason providing them as
-                    ;; "extraPackages" doesn't work.
-                    (add-to-list 'load-path "${pkgs.mu.mu4e}/share/emacs/site-lisp/mu4e")
-                    (add-to-list 'load-path "${pkgs.emacsPackages.vterm}/share/emacs/site-lisp/elpa/vterm-${pkgs.emacsPackages.vterm.version}")
                     (load "${
                       pkgs.fetchurl {
                         name = "tvl.el";
@@ -181,14 +181,15 @@ in
                           skk-large-jisyo "${pkgs.skkDictionaries.l}/share/skk/SKK-JISYO.L")
 
                     ;; :editor parinfer
-                    (setq parinfer-rust-library "${pkgs.parinfer-rust-emacs}/lib/libparinfer_rust.so")
+                    (setq parinfer-rust-library "${pkgs.parinfer-rust-emacs}/lib/libparinfer_rust.so"
+                          parinfer-rust-auto-download nil)
 
                     ;; :lang (org +roam2) :email mu4e
                     (setq emacsql-sqlite-executable "${lib.getExe pkgs.emacsql-sqlite}")
 
                     ;; :lang plantuml
                     (setq plantuml-jar-path "${pkgs.plantuml}/lib/plantuml.jar"
-                          plantuml-executable-path "${lib.getExe' pkgs.plantuml "plantuml"}"
+                          plantuml-executable-path "${lib.getExe pkgs.plantuml}"
                           org-plantuml-jar-path plantuml-jar-path
                           org-plantuml-executable-path plantuml-executable-path)
 
@@ -233,16 +234,28 @@ in
                   ''
                 )
                 (builtins.readFile ./doom/config.el)
-              ];
-            };
+              ]
+              |> lib.concatLines;
           };
 
       programs = {
         emacs = {
           enable = true;
-          package = pkgs.emacs29-pgtk;
+          package = pkgs.emacs30-pgtk;
+          extraPackages =
+            epkgs: with epkgs; [
+              (treesit-grammars.with-grammars (
+                grammars: with grammars; [
+                  tree-sitter-typst
+                ]
+              ))
+              mu4e
+              vterm
+            ];
         };
 
+        git.extraConfig."github.com".user = lib.my.username; # :tools (magit +forge)
+
         bash.initExtra = lib.mkAfter ''
           export PATH="$PATH:$XDG_CONFIG_HOME/emacs/bin"
 
@@ -257,5 +270,7 @@ in
         '';
       };
     };
+
+    nixpkgs.overlays = [ inputs.emacs-overlay.overlays.default ];
   };
 }
diff --git a/modules/emacs/doom/config.el b/modules/emacs/doom/config.el
index d7ab80e..4ff9af8 100644
--- a/modules/emacs/doom/config.el
+++ b/modules/emacs/doom/config.el
@@ -1,6 +1,4 @@
-;;
-;;; Misc
-;;
+;; Misc
 
 (setq! frame-title-format '("GNU Emacs"))
 
@@ -22,9 +20,7 @@
 (setq! migemo-options '("--quiet" "--emacs")
        skk-show-inline t)
 
-;;
-;;; Doom-specific
-;;
+;; Doom-specific
 
 (setq! doom-theme 'modus-operandi
        doom-modeline-icon nil
@@ -32,9 +28,7 @@
        doom-modeline-total-line-number t
        doom-modeline-height 30)
 
-;;
-;;; Editorconfig
-;;
+;; Editorconfig
 
 (setq! +editorconfig-mode-alist '((sh-mode . "sh"))
        ;; It's never a good idea to force specific indentation rules for Lisp,
@@ -48,51 +42,31 @@
                                     hy-mode
                                     dune-mode))
 
-;;
-;;; LSP
-;;
+;; LSP
 
 (after! lsp-mode
   (setq! lsp-enable-server-download nil
          lsp-enable-suggest-server-download nil
-         lsp-modeline-code-action-fallback-icon "~"))
+         lsp-modeline-code-action-fallback-icon "~"
+         lsp-yaml-schemas `((,(intern "https://raw.githubusercontent.com/compose-spec/compose-spec/master/schema/compose-spec.json")
+                             . ["*-compose.y*"])
+                            (,(intern "https://json.schemastore.org/kustomization.json")
+                             . ["kustomization.yaml"])
+                            (kubernetes
+                             . ["*.yaml"]))))
 
-;;
-;;; Tree-Sitter
-;;
-
-(use-package! treesit-auto
-  :disabled
-  :custom (treesit-auto-install 'prompt)
-  :config
-  (treesit-auto-add-to-auto-mode-alist 'all)
-  (global-treesit-auto-mode))
-
-;;
-;;; Nix
-;;
-
-(after! nix
-  (after! lsp-mode
-    (add-to-list 'lsp-language-id-configuration '(nix-mode . "nix"))
-    (lsp-register-client (make-lsp-client
-                          :new-connection (lsp-stdio-connection "nixd")
-                          :activation-fn (lsp-activate-on "nix")
-                          :server-id 'nixd
-                          :major-modes 'nix-mode))
-    (add-hook 'nix-mode-hook 'lsp-deferred)))
-
-;;
-;;; Go
-;;
+;; Go
 
 (setq! lsp-go-analyses '((unsedvariable . t)
                          (unusedparams . t)
                          (unusedwrite . t)))
 
-;;
-;;; Org
-;;
+;; Python
+
+(after! dap-mode
+  (setq dap-python-debugger 'debugpy))
+
+;; Org
 
 (setq! org-directory "~/doc/org/"
        org-roam-directory "~/doc/roam/"
@@ -149,88 +123,86 @@
 
 (add-hook 'org-capture-mode-hook 'evil-insert-state)
 
-;;
-;;; LaTeX
-;;
+;; LaTeX
 
 (map! :map cdlatex-mode-map
       :i "TAB" #'cdlatex-tab)
 
-;;
-;;; Typst
-;;
+;; Typst
 
 (use-package! typst-ts-mode
   :custom (typst-ts-watch-options "--open")
   :config
-  (add-to-list 'lsp-language-id-configuration '(typst-ts-mode . "typst"))
-  (lsp-register-client (make-lsp-client
-                        :new-connection (lsp-stdio-connection "tinymist")
-                        :server-id 'tinymist
-                        :major-modes '(typst-ts-mode)))
-  (add-hook 'typst-ts-mode-hook 'lsp-deferred)
-
-  (when (boundp 'treesit-auto-recipe-list)
-    (add-to-list 'treesit-auto-recipe-list
-                 (make-treesit-auto-recipe
-                  :lang 'typst
-                  :ts-mode 'typst-ts-mode
-                  :url "https://github.com/uben0/tree-sitter-typst"
-                  :revision "master"
-                  :source-dir "src"))))
-
-;;
-;;; PlantUML
-;;
+  (after! lsp-mode
+    (add-to-list 'lsp-language-id-configuration '(typst-ts-mode . "typst"))
+    (lsp-register-client
+     (make-lsp-client
+      :new-connection (lsp-stdio-connection "tinymist")
+      :server-id 'tinymist
+      :major-modes '(typst-ts-mode)))
+    (add-hook 'typst-ts-mode-hook 'lsp-deferred))
+
+  (after! apheleia
+    (add-to-list 'apheleia-mode-alist '(typst-ts-mode . prettypst))
+    (add-to-list 'apheleia-formatters '(prettypst "prettypst" "--use-std-in" "--use-std-out"))))
+
+(use-package! typst-preview
+  :custom
+  (typst-preview-invert-colors "never")
+  (typst-preview-open-browser-automatically t)
+  :config
+  (advice-add 'typst-preview-start :before (lambda (&rest r)
+                                             (setq tp--master-file buffer-file-name))))
+
+;; PlantUML
 
 (setq! plantuml-default-exec-mode 'executable
        org-plantuml-exec-mode 'plantuml)
 
-;;
-;;; Elisp
-;;
+;; Elisp
 
 (after! flycheck
   (pushnew! flycheck-disabled-checkers 'emacs-lisp-checkdoc))
 
-;;
-;;; Haskell
-;;
+;; Haskell
 
 (setq! lsp-haskell-formatting-provider "ormolu")
 
-;;
-;;; Nickel
-;;
+;; Nickel
 
 (use-package! nickel-mode
   :config
   (after! lsp-mode
     (add-to-list 'lsp-language-id-configuration '(nickel-mode . "nickel"))
-    (lsp-register-client (make-lsp-client
-                          :new-connection (lsp-stdio-connection "nls")
-                          :server-id 'nls
-                          :major-modes '(nickel-mode)))
+    (lsp-register-client
+     (make-lsp-client
+      :new-connection (lsp-stdio-connection "nls")
+      :activation-fn (lsp-activate-on "nickel")
+      :server-id 'nls
+      :major-modes 'nickel-mode))
     (add-hook 'nickel-mode-hook 'lsp-deferred)))
 
-;;
-;;; YAML
-;;
+;; YAML
 
 ;; Turn off `flycheck-mode' and `lsp-mode' for Helm templates.
-(add-hook! 'yaml-mode-hook
-  (defun nixfiles/disable-flycheck-for-helm-templates-h ()
-    (when (and buffer-file-name
-               (string-match-p "/templates/" buffer-file-name)
-               (or (string-suffix-p ".yaml" buffer-file-name)
-                   (string-suffix-p ".yml" buffer-file-name)))
-      (remove-hook! 'yaml-mode-local-vars-hook #'lsp!))))
+;; (add-hook! 'yaml-mode-hook
+;;   (defun nixfiles/disable-flycheck-for-helm-templates-h ()
+;;     (when (and buffer-file-name
+;;                (string-match-p "/templates/" buffer-file-name)
+;;                (or (string-suffix-p ".yaml" buffer-file-name)
+;;                    (string-suffix-p ".yml" buffer-file-name)))
+;;       (remove-hook! 'yaml-mode-local-vars-hook #'lsp!))))
+
+;; (setq-hook! 'yaml-mode-hook +format-with-lsp nil)
 
-(setq-hook! 'yaml-mode-hook +format-with-lsp nil)
+;; Magit
 
-;;
-;;; Elfeed
-;;
+(setq! code-review-auth-login-marker 'forge)
+
+(add-hook 'code-review-mode-hook (lambda ()
+                                   (persp-add-buffer (current-buffer))))
+
+;; Elfeed
 
 (setq! elfeed-db-directory "~/.elfeed"
        elfeed-enclosure-default-dir (concat elfeed-db-directory "/enclosures")
@@ -239,9 +211,7 @@
        elfeed-goodies/entry-pane-size 0.75
        elfeed-goodies/entry-pane-position 'bottom)
 
-;;
-;;; mu4e
-;;
+;; mu4e
 
 (after! mu4e
   (setq! sendmail-program (executable-find "msmtp")
@@ -256,9 +226,7 @@
 
 (setq-hook! 'mu4e-main-mode-hook mu4e-update-interval 30)
 
-;;
-;;; Circe
-;;
+;; Circe
 
 (setq! circe-network-options
        (mapcar (lambda (server)
@@ -273,44 +241,12 @@
                             (+pass-get-secret "server/soju.shire.net/azahi"))))
                '("libera" "oftc" "hackint" "rizon")))
 
-;;
-;;; Sops
-;;
+;; Sops
 
 (use-package! sops
   :hook (doom-first-file . global-sops-mode))
 
-;;
-;;; Hledger
-;;
-
-(use-package! hledger-mode
-  :disabled
-  :mode ("\\.journal\\'")
-  :hook ((hledger-view-mode . hl-line-mode)
-         (hledger-view-mode . center-text-for-reading))
-  :init
-  (setq! hledger-jfile "~/doc/accounting/current.journal")
-  :config
-  (set-company-backend! 'hledger-mode 'hledger-company)
-  (add-hook! 'hledger-mode-hook
-    (lambda (&rest _)
-      (make-local-variable 'company-backends)
-      (add-to-list 'company-backends 'hledger-company))))
-
-(use-package! hledger-input
-  :disabled
-  :hook ((hledger-input-post-commit . hledger-show-new-balances)
-         (hledger-input-mode . auto-fill-mode)
-         (hledger-input-mode . (lambda (&rest _)
-                                 (make-local-variable 'compay-idle-delay)
-                                 (setq-local company-idle-delay 0.1))))
-  :init
-  (setq! hledger-input-buffer-height 20))
-
-;;
-;;; LLM
-;;
+;; LLM
 
 (use-package! gptel
   :config
diff --git a/modules/emacs/doom/init.el b/modules/emacs/doom/init.el
index eddaf28..966b156 100644
--- a/modules/emacs/doom/init.el
+++ b/modules/emacs/doom/init.el
@@ -1,54 +1,54 @@
+;;; init.el -*- lexical-binding: t; -*-
+
 (doom! :input
        japanese
 
        :completion
-       ;; company
        (corfu +icons +orderless +dabbrev)
-       vertico
+       (vertico +icons)
 
        :ui
-       deft
-       doom
-       (emoji +unicode)
+       ;; (emoji +unicode)
        hl-todo
        indent-guides
        ligatures
        modeline
-       nav-flash
+       ;; nav-flash
        ophints
        (popup +defaults)
-       (vc-gutter +diff-hl +pretty)
-       window-select
+       ;; unicode
+       (vc-gutter +pretty)
+       (window-select +switch-window)
        workspaces
 
        :editor
        (evil +everywhere)
        file-templates
        fold
-       (format +onsave)
-       ;; lispy
-       ;; multiple-cursors
-       ;; objed
+       (format +onsave +lsp)
+       multiple-cursors
+       (objed +manual)
        parinfer
-       ;; rotate-text
+       rotate-text
        snippets
        word-wrap
 
        :emacs
-       dired
+       (dired +dirvish +icons)
        electric
        eww
-       ibuffer
+       (ibuffer +icons)
        undo
        vc
 
        :term
        eshell
+       shell
        vterm
 
        :checkers
-       syntax
-       (spell +flyspell +everywhere +icons)
+       (syntax +icons)
+       (spell +hunspell +flyspell +everywhere)
        grammar
 
        :tools
@@ -60,7 +60,7 @@
        (eval +overlay)
        (lookup +dictionary +offline)
        (lsp +peek)
-       magit
+       (magit +forge)
        make
        (pass +auth)
        pdf
@@ -70,7 +70,7 @@
        upload
 
        :os
-       tty
+       ;; tty
 
        :lang
        (cc +lsp +tree-sitter)
@@ -79,7 +79,7 @@
        (go +lsp +tree-sitter)
        (graphql +lsp +tree-sitter)
        (haskell +lsp +tree-sitter)
-       javascript
+       (javascript +lsp +tree-sitter)
        (json +lsp +tree-sitter)
        (latex +latexmk +cdlatex +lsp)
        markdown
@@ -88,12 +88,11 @@
        plantuml
        graphviz
        (python +lsp +tree-sitter +pyright)
-       ;; (racket +lsp +tree-sitter +xp +hash-lang)
-       rest
+       (rest +jq)
        (rust +lsp +tree-sitter)
-       ;; (scheme +chicken +guile +racket)
+       (scheme +guile)
        (sh +lsp +tree-sitter)
-       web
+       (web +lsp +tree-sitter)
        (yaml +lsp +tree-sitter)
 
        :email
@@ -103,7 +102,7 @@
        calendar
        emms
        irc
-       (rss +org)
+       (rss +org +youtube)
 
        :config
-       (default +bindings +smartparens))
+       (default +bindings +gnupg +smartparens))
diff --git a/modules/emacs/doom/packages.el b/modules/emacs/doom/packages.el
index f818377..8084808 100644
--- a/modules/emacs/doom/packages.el
+++ b/modules/emacs/doom/packages.el
@@ -1,10 +1,6 @@
-(disable-packages! writegood-mode)
-
-(unpin! (:editor parinfer))
-
-(unpin! evil-collection)
+;;; init.el -*- lexical-binding: t; -*-
 
-(package! treesit-auto)
+(disable-packages! writegood-mode)
 
 (package! xclip)
 
@@ -13,7 +9,10 @@
 
 (package! nickel-mode)
 
-(package! hledger-mode)
+(package! typst-ts-mode
+  :recipe (:host codeberg :repo "meow_king/typst-ts-mode"))
+(package! typst-preview
+  :recipe (:host github :repo "havarddj/typst-preview.el"))
 
 (package! sops
   :recipe (:host github :repo "djgoku/sops"))
@@ -21,13 +20,3 @@
 (package! gptel)
 (package! ellama)
 (package! magit-gptcommit)
-
-(unpin! (:tools tree-sitter))
-
-(package! typst-ts-mode
-  :recipe (:host codeberg :repo "meow_king/typst-ts-mode"))
-
-;; (package! tvl
-;;   :recipe (:host nil
-;;            :repo "https://code.tvl.fyi/depot.git:/tools/emacs-pkgs/tvl.git"
-;;            :build nil))

Consider giving Nix/NixOS a try! <3