diff options
author | azahi <azat@bahawi.net> | 2025-02-17 02:21:56 +0300 |
---|---|---|
committer | azahi <azat@bahawi.net> | 2025-02-17 02:21:56 +0300 |
commit | 59180328cda59817d71cd58c8f48ead047375064 (patch) | |
tree | 2cdd7d1bfa309839ef624c19daf283f510aacf69 /modules/emacs | |
parent | 2025-02-05 (diff) |
2025-02-17
Diffstat (limited to '')
-rw-r--r-- | modules/emacs/default.nix | 107 | ||||
-rw-r--r-- | modules/emacs/doom/config.el | 274 | ||||
-rw-r--r-- | modules/emacs/doom/init.el | 2 | ||||
-rw-r--r-- | modules/emacs/doom/packages.el | 15 |
4 files changed, 222 insertions, 176 deletions
diff --git a/modules/emacs/default.nix b/modules/emacs/default.nix index 71bc24c..e546ddd 100644 --- a/modules/emacs/default.nix +++ b/modules/emacs/default.nix @@ -5,17 +5,16 @@ pkgs, ... }: -with lib; let cfg = config.nixfiles.modules.emacs; in { - options.nixfiles.modules.emacs.enable = mkEnableOption "GNU Emacs"; + options.nixfiles.modules.emacs.enable = lib.mkEnableOption "GNU Emacs"; - config = mkIf cfg.enable { + config = lib.mkIf cfg.enable { secrets.authinfo = { file = "${inputs.self}/secrets/authinfo"; - owner = my.username; + owner = lib.my.username; }; nixfiles.modules = { @@ -40,7 +39,7 @@ in stylix.targets.emacs.enable = false; xdg.configFile = - mapAttrs + lib.mapAttrs ( _: value: value @@ -50,7 +49,7 @@ in export DOOMDIR="''${XDG_CONFIG_HOME:-$HOME/.config}/doom" if [[ ! -d "$EMACSDIR/.git" ]]; then - ${getExe git.package} clone --depth=1 --branch=master \ + ${lib.getExe git.package} clone --depth=1 --branch=master \ "https://github.com/doomemacs/doomemacs" "$EMACSDIR" fi @@ -74,7 +73,7 @@ in "doom/init.el".source = ./doom/init.el; "doom/packages.el".source = ./doom/packages.el; "doom/config.el" = { - text = concatLines [ + text = lib.concatLines [ ( let extraBins = with pkgs; [ @@ -85,6 +84,9 @@ in ] )) # :checkers (spell +aspell) asmfmt # :editor format + shirepyright # :lang (python +lsp) + bash-language-server # :lang (sh +lsp) + cabal-install # :lang haskell cargo # :lang rust clang-tools # :lang (cc +lsp) :editor format cmake-format # :lang cc :editor format @@ -95,6 +97,7 @@ in dockerfile-language-server-nodejs # :tools (docker +lsp) dockfmt # :tools docker :editor format editorconfig-core-c # :tools editorconfig + eslint # :lang (json +lsp) fd # doom! gcc # :lang cc gdb # :tools debugger @@ -111,11 +114,9 @@ in gotools # :lang go graphviz # :lang (org +roam2) :lang plantuml gzip # :tools tree-sitter + haskell-language-server # :lang (haskell +lsp) haskellPackages.cabal-fmt # :lang haskell :editor format - haskellPackages.cabal-install # :lang haskell - haskellPackages.haskell-language-server # :lang (haskell +lsp) haskellPackages.hoogle # :lang haskell - haskellPackages.ormolu # :lang haskell :editor format html-tidy # :lang web :editor format jdk # :lang java :lang plantuml :checkers grammar languagetool # :checkers grammar @@ -124,24 +125,14 @@ in nixd # :lang (nix +lsp) nixfmt # :lang nix :editor format nls # :lang (nickel +lsp) - nodePackages.bash-language-server # :lang (sh +lsp) - # nodePackages.eslint # :lang (json +lsp) nodePackages.js-beautify # :lang web nodePackages.prettier # :editor format - nodePackages.stylelint # :lang web nodejs # :tools debugger + ormolu # :lang haskell :editor format pandoc # :lang org markdown latex pinentry-emacs # doom! - pipenv # :lang python - poetry # :lang python pre-commit # :tools magit - pyright # :lang python :editor format python3 # :lang python - python3Packages.black # :lang python :editor format - python3Packages.isort # :lang python :editor format - python3Packages.nose2 # :lang python - python3Packages.pyflakes # :lang python :editor format - python3Packages.pytest # :lang python ripgrep # doom! rust-analyzer # :lang (rust +lsp) rustc # :lang rust @@ -150,10 +141,14 @@ in shfmt # :lang sh :editor format sops sqlite # :lang (org +roam2) :tools lookup + stylelint # :lang web terraform-ls # :tools (terraform +lsp) texlab # lang (tex +lsp) texlive.combined.scheme-full # :lang org tex + tinymist + typst unzip # :tools debugger + uv # :lang python vscode-langservers-extracted # :lang (json +lsp) (web +lsp) wordnet # :tools (lookup +dictionary +offline) yaml-language-server # :lang (yaml +lsp) @@ -163,14 +158,14 @@ in '' ;; 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}")) + (setq exec-path (append exec-path '(${lib.concatMapStringsSep " " (x: ''"${x}/bin"'') extraBins}))) + (setenv "PATH" (concat (getenv "PATH") ":${lib.concatMapStringsSep ":" (x: "${x}/bin") extraBins}")) (appendq! auth-sources '(("${config.secrets.authinfo.path}"))) - ;; HACK Explicitly load specific Emacs packages from Nixpkgs. - ;; For some reason providing them as "extraPackages" doesn't - ;; work. + ;; 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 "${ @@ -189,17 +184,17 @@ in (setq parinfer-rust-library "${pkgs.parinfer-rust-emacs}/lib/libparinfer_rust.so") ;; :lang (org +roam2) :email mu4e - (setq emacsql-sqlite-executable "${getExe pkgs.emacsql-sqlite}") + (setq emacsql-sqlite-executable "${lib.getExe pkgs.emacsql-sqlite}") ;; :lang plantuml (setq plantuml-jar-path "${pkgs.plantuml}/lib/plantuml.jar" - plantuml-executable-path "${getExe' pkgs.plantuml "plantuml"}" + plantuml-executable-path "${lib.getExe' pkgs.plantuml "plantuml"}" org-plantuml-jar-path plantuml-jar-path org-plantuml-executable-path plantuml-executable-path) ;; :app irc - (setq circe-default-nick "${my.username}" - circe-default-realname "${my.email}" + (setq circe-default-nick "${lib.my.username}" + circe-default-realname "${lib.my.email}" circe-default-user circe-default-nick) '' ) @@ -210,37 +205,29 @@ in doom-emoji-font "${emoji.name}-${toString sizes.terminal}") '') ( - with config.hm.accounts.email; let mu4eAccounts = - let - muAccounts = filter (a: a.mu.enable) (attrValues accounts); - in - concatMapStringsSep "\n" ( - a: - with a; - let - personalAddresses = concatMapStringsSep " " (v: ''"${v}"'') aliases; - in - '' - (set-email-account! "${name}" - '((user-full-name . "${realName}") - (user-mail-address . "${address}") - (mu4e-inbox-folder . "/${name}/${folders.inbox}") - (mu4e-sent-folder . "/${name}/${folders.sent}") - (mu4e-drafts-folder . "/${name}/${folders.drafts}") - (mu4e-trash-folder . "/${name}/${folders.trash}") - (mu4e-refile-folder . "/${name}/Archive") - ${optionalString (signature.showSignature != "none") - ''(mu4e-compose-signature . "${replaceStrings [ "\n" ] [ "\\n" ] signature.text}")'' - } - (+mu4e-personal-addresses . (${personalAddresses}))) - t) - '' - ) muAccounts; + config.hm.accounts.email.accounts + |> lib.attrValues + |> lib.filter (x: x.mu.enable) + |> lib.concatMapStringsSep "\n" (a: '' + (set-email-account! "${a.name}" + '((user-full-name . "${a.realName}") + (user-mail-address . "${a.address}") + (mu4e-inbox-folder . "/${a.name}/${a.folders.inbox}") + (mu4e-sent-folder . "/${a.name}/${a.folders.sent}") + (mu4e-drafts-folder . "/${a.name}/${a.folders.drafts}") + (mu4e-trash-folder . "/${a.name}/${a.folders.trash}") + (mu4e-refile-folder . "/${a.name}/Archive") + ${lib.optionalString (a.signature.showSignature != "none") + ''(mu4e-compose-signature . "${lib.replaceStrings [ "\n" ] [ "\\n" ] a.signature.text}")'' + } + (+mu4e-personal-addresses . (${lib.concatMapStringsSep " " (x: ''"${x}"'') a.aliases}))) + t) + ''); in '' - (setq mu4e-root-maildir "${maildirBasePath}") + (setq mu4e-root-maildir "${config.hm.accounts.email.maildirBasePath}") ${mu4eAccounts} '' @@ -256,12 +243,12 @@ in package = pkgs.emacs29-pgtk; }; - bash.initExtra = mkAfter '' + bash.initExtra = lib.mkAfter '' export PATH="$PATH:$XDG_CONFIG_HOME/emacs/bin" - # https://github.com/akermu/emacs-libvterm + # https://github.com/akermu/emacs-libvterm?tab=readme-ov-file#shell-side-configuration if [[ "$INSIDE_EMACS" = vterm ]] && [[ -n "$EMACS_VTERM_PATH" ]] && [[ -f "$EMACS_VTERM_PATH/etc/emacs-vterm-bash.sh" ]]; then - source "$EMACS_VTERM_PATH/etc/emacs-vterm-bash.sh" + source "$EMACS_VTERM_PATH/etc/emacs-vterm-bash.sh" fi # Not sourced from inside Emacs for some reason. Maybe it's not diff --git a/modules/emacs/doom/config.el b/modules/emacs/doom/config.el index be481d4..d7ab80e 100644 --- a/modules/emacs/doom/config.el +++ b/modules/emacs/doom/config.el @@ -52,8 +52,21 @@ ;;; LSP ;; -(setq! lsp-enable-suggest-server-download nil - lsp-modeline-code-actions-enable nil) +(after! lsp-mode + (setq! lsp-enable-server-download nil + lsp-enable-suggest-server-download nil + lsp-modeline-code-action-fallback-icon "~")) + +;; +;;; 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 @@ -81,52 +94,60 @@ ;;; Org ;; -(setq! org-directory "~/doc/org/") +(setq! org-directory "~/doc/org/" + org-roam-directory "~/doc/roam/" + org-roam-db-location (concat org-roam-directory ".db")) -;; For some reason only using `after!' work here. `setq-hook!' and etc doesn't -;; produce expected results. (after! org - (setq! org-todo-keywords '((sequence - "TODO(t)" - "LOOP(r)" - "STRT(s@)" - "WAIT(w@/!)" - "HOLD(h@/!)" - "IDEA(i)" - "PROJ(p)" - "|" - "DONE(d@/!)" - "KILL(k@/!)")) - org-todo-keyword-faces '(("STRT" . +org-todo-active) - ("WAIT" . +org-todo-onhold) - ("HOLD" . +org-todo-onhold) - ("PROJ" . +org-todo-project) - ("KILL" . +org-todo-cancel)) - org-capture-templates '(("t" "Todo" entry - (file+headline +org-capture-todo-file "Inbox") - "* TODO %?\n%i\n%a" :prepend t) - ("n" "Note" entry - (file+headline +org-capture-notes-file "Inbox") - "* %u %?\n%i\n%a" :prepend t) - ("j" "Journal" entry - (file+olp+datetree +org-capture-journal-file) - "* %U %?\n%i\n%a" :prepend t)))) + (setq! org-todo-keywords + '((sequence + "TODO(t)" + "LOOP(r)" + "STRT(s@)" + "WAIT(w@/!)" + "HOLD(h@/!)" + "IDEA(i)" + "PROJ(p)" + "|" + "DONE(d@/!)" + "KILL(k@/!)")) + org-todo-keyword-faces + '(("STRT" . +org-todo-active) + ("WAIT" . +org-todo-onhold) + ("HOLD" . +org-todo-onhold) + ("PROJ" . +org-todo-project) + ("KILL" . +org-todo-cancel)) + org-capture-templates + '(("t" "Todo" entry + (file+headline +org-capture-todo-file "Inbox") + "* TODO %?\n%i\n%a" :prepend t) + ("n" "Note" entry + (file+headline +org-capture-notes-file "Inbox") + "* %u %?\n%i\n%a" :prepend t) + ("j" "Journal" entry + (file+olp+datetree +org-capture-journal-file) + "* %U %?\n%i\n%a" :prepend t)))) (add-hook! 'org-mode-hook 'auto-fill-mode) (setq-hook! 'org-mode-hook fill-column 80) -(setq! org-roam-directory "~/doc/roam/" - org-roam-db-location (concat org-roam-directory ".db")) - (use-package! org-roam-ui :requires websocket :after org-roam :config - (setq org-roam-ui-sync-theme t - org-roam-ui-follow t - org-roam-ui-update-on-save t - org-roam-ui-open-on-start t)) + (setq! org-roam-ui-sync-theme t + org-roam-ui-follow t + org-roam-ui-update-on-save t + org-roam-ui-open-on-start t)) + +(use-package! org-roam-timestamps + :after org-roam + :custom (org-roam-timestamps-parent-file t)) + +(custom-set-faces! '(org-headline-done :strike-through t)) + +(add-hook 'org-capture-mode-hook 'evil-insert-state) ;; ;;; LaTeX @@ -136,6 +157,29 @@ :i "TAB" #'cdlatex-tab) ;; +;;; 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 ;; @@ -165,9 +209,8 @@ (add-to-list 'lsp-language-id-configuration '(nickel-mode . "nickel")) (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)) + :major-modes '(nickel-mode))) (add-hook 'nickel-mode-hook 'lsp-deferred))) ;; @@ -205,7 +248,11 @@ send-mail-function #'smtpmail-send-it message-sendmail-f-is-evil t message-sendmail-extra-arguments '("--read-envelope-from") - message-send-mail-function #'message-send-mail-with-sendmail)) + message-send-mail-function #'message-send-mail-with-sendmail + shr-use-colors nil)) + +(use-package! mu4e-patch + :hook (mu4e-view-mode . mu4e-patch-highlight)) (setq-hook! 'mu4e-main-mode-hook mu4e-update-interval 30) @@ -281,80 +328,91 @@ mistral:7b-instruct-fp16)))) (use-package! ellama - :init - (setq! ellama-naming-scheme 'ellama-generate-name-by-time) + :custom (ellama-naming-scheme 'ellama-generate-name-by-time) :config (require 'llm-ollama) - (setq! ellama-provider (make-llm-ollama - :scheme "http" - :host "eonwe.shire.net" - :port 11434 - :chat-model "llama3.2:3b-instruct-fp16" - :embedding-model "nomic-embed-text:latest") - ellama-providers '(("llama" . (make-llm-ollama - :scheme "http" - :host "eonwe.shire.net" - :port 11434 - :chat-model "llama3.2:3b-instruct-fp16" - :embedding-model "nomic-embed-text:latest")) - ("qwen" . (make-llm-ollama - :scheme "http" - :host "eonwe.shire.net" - :port 11434 - :chat-model "qwen2:7b-instruct-fp16" - :embedding-model "nomic-embed-text:latest")) - ("qwen-coder" . (make-llm-ollama - :scheme "http" - :host "eonwe.shire.net" - :port 11434 - :chat-model "qwen2.5-coder:14b-instruct-q8_0" - :embedding-model "nomic-embed-text:latest")) - ("gemma" . (make-llm-ollama - :scheme "http" - :host "eonwe.shire.net" - :port 11434 - :chat-model "gemma:7b-instruct-q8_0" - :embedding-model "nomic-embed-text:latest")) - ("mistral" . (make-llm-ollama - :scheme "http" - :host "eonwe.shire.net" - :port 11434 - :chat-model "mistral:7b-instruct-fp16" - :embedding-model "nomic-embed-text:latest")) - ("opencoder" . (make-llm-ollama - :scheme "http" - :host "eonwe.shire.net" - :port 11434 - :chat-model "opencoder:8b-instruct-fp16" - :embedding-model "nomic-embed-text:latest")) - ("granite" . (make-llm-ollama - :scheme "http" - :host "eonwe.shire.net" - :port 11434 - :chat-model "granite3.1-moe:3b-instruct-fp16" - :embedding-model "granite-embedding:278m-fp16"))) - ellama-translation-provider (make-llm-ollama - :scheme "http" - :host "eonwe.shire.net" - :port 11434 - :chat-model "mistral:7b-instruct-fp16" - :embedding-model "nomic-embed-text:latest") - ellama-summarization-provider (make-llm-ollama - :scheme "http" - :host "eonwe.shire.net" - :port 11434 - :chat-model "mistral:7b-instruct-fp16" - :embedding-model "nomic-embed-text:latest"))) + (setq! ellama-providers + '(("llama" . + (make-llm-ollama + :scheme "http" + :host "eonwe.shire.net" + :port 11434 + :chat-model "llama3.2:3b-instruct-fp16" + :embedding-model "nomic-embed-text:latest")) + ("qwen" . + (make-llm-ollama + :scheme "http" + :host "eonwe.shire.net" + :port 11434 + :chat-model "qwen2:7b-instruct-fp16" + :embedding-model "nomic-embed-text:latest")) + ("qwen-coder" . + (make-llm-ollama + :scheme "http" + :host "eonwe.shire.net" + :port 11434 + :chat-model "qwen2.5-coder:14b-instruct-q8_0" + :embedding-model "nomic-embed-text:latest")) + ("gemma" . + (make-llm-ollama + :scheme "http" + :host "eonwe.shire.net" + :port 11434 + :chat-model "gemma:7b-instruct-q8_0" + :embedding-model "nomic-embed-text:latest")) + ("mistral" . + (make-llm-ollama + :scheme "http" + :host "eonwe.shire.net" + :port 11434 + :chat-model "mistral:7b-instruct-fp16" + :embedding-model "nomic-embed-text:latest")) + ("opencoder" . + (make-llm-ollama + :scheme "http" + :host "eonwe.shire.net" + :port 11434 + :chat-model "opencoder:8b-instruct-fp16" + :embedding-model "nomic-embed-text:latest")) + ("granite" . + (make-llm-ollama + :scheme "http" + :host "eonwe.shire.net" + :port 11434 + :chat-model "granite3.1-moe:3b-instruct-fp16" + :embedding-model "granite-embedding:278m-fp16"))) + ellama-provider + (make-llm-ollama + :scheme "http" + :host "eonwe.shire.net" + :port 11434 + :chat-model "llama3.2:3b-instruct-fp16" + :embedding-model "nomic-embed-text:latest") + ellama-translation-provider + (make-llm-ollama + :scheme "http" + :host "eonwe.shire.net" + :port 11434 + :chat-model "mistral:7b-instruct-fp16" + :embedding-model "nomic-embed-text:latest") + ellama-summarization-provider + (make-llm-ollama + :scheme "http" + :host "eonwe.shire.net" + :port 11434 + :chat-model "mistral:7b-instruct-fp16" + :embedding-model "nomic-embed-text:latest"))) (use-package! magit-gptcommit :after magit :config (require 'llm-ollama) - (setq! magit-gptcommit-llm-provider (make-llm-ollama - :scheme "http" - :host "eonwe.shire.net" - :port 11434 - :chat-model "qwen2.5-coder:32b-instruct-q3_K_M" - :embedding-model "nomic-embed-text:latest")) + (setq! magit-gptcommit-llm-provider + (make-llm-ollama + :scheme "http" + :host "eonwe.shire.net" + :port 11434 + :chat-model "qwen2.5-coder:32b-instruct-q3_K_M" + :embedding-model "nomic-embed-text:latest")) (magit-gptcommit-status-buffer-setup)) diff --git a/modules/emacs/doom/init.el b/modules/emacs/doom/init.el index 51d4291..eddaf28 100644 --- a/modules/emacs/doom/init.el +++ b/modules/emacs/doom/init.el @@ -87,7 +87,7 @@ (org +pandoc +roam2) plantuml graphviz - (python +poetry +pyright +lsp +tree-sitter) + (python +lsp +tree-sitter +pyright) ;; (racket +lsp +tree-sitter +xp +hash-lang) rest (rust +lsp +tree-sitter) diff --git a/modules/emacs/doom/packages.el b/modules/emacs/doom/packages.el index a7085da..f818377 100644 --- a/modules/emacs/doom/packages.el +++ b/modules/emacs/doom/packages.el @@ -4,16 +4,12 @@ (unpin! evil-collection) +(package! treesit-auto) + (package! xclip) (package! org-roam-ui) - -;; https://github.com/doomemacs/doomemacs/issues/8166 -;; https://github.com/org-roam/org-roam/issues/2485 -(unpin! emacsql) -(package! emacsql - :recipe (:host github :repo "magit/emacsql") - :pin "491105a01f58bf0b346cbc0254766c6800b229a2") +(package! org-roam-timestamps) (package! nickel-mode) @@ -26,6 +22,11 @@ (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" |