;; ;;; Misc ;; (setq! frame-title-format '("GNU Emacs")) (setq-hook! '(prog-mode-hook yaml-mode-hook) display-line-numbers-type 'relative scroll-margin 10 hscroll-margin 10) (setq! browse-url-generic-program (executable-find "firefox") browse-url-browser-function 'browse-url-generic) (use-package! xclip :config (setq xclip-program "wl-copy" xclip-select-enable-clipboard t xclip-mode t xclip-method 'wl-copy)) (setq! migemo-options '("--quiet" "--emacs") skk-show-inline t) ;; ;;; Doom-specific ;; (setq! doom-theme 'modus-operandi doom-modeline-icon nil doom-modeline-indent-info t doom-modeline-total-line-number t doom-modeline-height 30) ;; ;;; Editorconfig ;; (setq! +editorconfig-mode-alist '((sh-mode . "sh")) ;; It's never a good idea to force specific indentation rules for Lisp, ;; the only rule should be is not to use tabs. editorconfig-exclude-modes '(emacs-lisp-mode clojure-mode scheme-mode lisp-mode racket-mode fennel-mode hy-mode dune-mode)) ;; ;;; LSP ;; (setq! lsp-enable-suggest-server-download nil lsp-modeline-code-actions-enable nil) ;; ;;; 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 ;; (setq! lsp-go-analyses '((unsedvariable . t) (unusedparams . t) (unusedwrite . t))) ;; ;;; Org ;; (setq! org-directory "~/doc/org/") ;; 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)))) (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)) ;; ;;; LaTeX ;; (map! :map cdlatex-mode-map :i "TAB" #'cdlatex-tab) ;; ;;; PlantUML ;; (setq! plantuml-default-exec-mode 'executable org-plantuml-exec-mode 'plantuml) ;; ;;; Elisp ;; (after! flycheck (pushnew! flycheck-disabled-checkers 'emacs-lisp-checkdoc)) ;; ;;; Haskell ;; (setq! lsp-haskell-formatting-provider "ormolu") ;; ;;; 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") :activation-fn (lsp-activate-on "nickel") :server-id 'nls :major-modes 'nickel-mode)) (add-hook 'nickel-mode-hook 'lsp-deferred))) ;; ;;; 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!)))) (setq-hook! 'yaml-mode-hook +format-with-lsp nil) ;; ;;; Elfeed ;; (setq! elfeed-db-directory "~/.elfeed" elfeed-enclosure-default-dir (concat elfeed-db-directory "/enclosures") rmh-elfeed-org-files (list (concat elfeed-db-directory "/index.org")) elfeed-goodies/powerline-default-separator nil elfeed-goodies/entry-pane-size 0.75 elfeed-goodies/entry-pane-position 'bottom) ;; ;;; mu4e ;; (after! mu4e (setq! sendmail-program (executable-find "msmtp") 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)) (setq-hook! 'mu4e-main-mode-hook mu4e-update-interval 30) ;; ;;; Circe ;; (setq! circe-network-options (mapcar (lambda (server) `(,server :server-buffer-name ,server :host "azahi.cc" :port 6697 :tls t :logging nil :user ,(concat circe-default-user "/" server) :pass ,(lambda (&rest _) (+pass-get-secret "server/soju.shire.net/azahi")))) '("libera" "oftc" "hackint" "rizon"))) ;; ;;; 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 ;; (use-package! gptel :config (setq! gptel-model 'codegemma:7b gptel-backend (gptel-make-ollama "ollama" :host "eonwe.shire.net:11434" :stream t :models '(mistral:7b codegemma:7b codellama:7b deepseek-coder-v2:16b llama3.2:3b)))) (use-package! ellama :init (setq! 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" :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" :embedding-model "nomic-embed-text:latest")) ("codellama" . (make-llm-ollama :scheme "http" :host "eonwe.shire.net" :port 11434 :chat-model "codellama:7b" :embedding-model "nomic-embed-text:latest")) ("qwen" . (make-llm-ollama :scheme "http" :host "eonwe.shire.net" :port 11434 :chat-model "qwen2.5:7b" :embedding-model "nomic-embed-text:latest")) ("gemma" . (make-llm-ollama :scheme "http" :host "eonwe.shire.net" :port 11434 :chat-model "gemma2:9b" :embedding-model "nomic-embed-text:latest")) ("codegemma" . (make-llm-ollama :scheme "http" :host "eonwe.shire.net" :port 11434 :chat-model "codegemma:7b" :embedding-model "nomic-embed-text:latest")) ("mistral" . (make-llm-ollama :scheme "http" :host "eonwe.shire.net" :port 11434 :chat-model "mistral:7b" :embedding-model "nomic-embed-text:latest")) ("hermes" . (make-llm-ollama :scheme "http" :host "eonwe.shire.net" :port 11434 :chat-model "hermes3:8b" :embedding-model "nomic-embed-text:latest")) ("deepseek" . (make-llm-ollama :scheme "http" :host "eonwe.shire.net" :port 11434 :chat-model "deepseek-coder-v2:16b" :embedding-model "nomic-embed-text:latest"))) ellama-translation-provider (make-llm-ollama :scheme "http" :host "eonwe.shire.net" :port 11434 :chat-model "qwen2.5:7b" :embedding-model "nomic-embed-text:latest") ellama-summarization-provider (make-llm-ollama :scheme "http" :host "eonwe.shire.net" :port 11434 :chat-model "mistral:7b" :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 "llama3.2:3b" :embedding-model "nomic-embed-text:latest")) (magit-gptcommit-status-buffer-setup))