diff options
| author | cashmere <cashmere@autistici.org> | 2026-09-12 00:30:11 +0200 |
|---|---|---|
| committer | cashmere <cashmere@autistici.org> | 2026-09-12 00:30:11 +0200 |
| commit | 32329d9a384642dd231ed1f5a16aa6c85b8d0ef0 (patch) | |
| tree | 4b2f793909a1f97e52213467cc9f60e810a886df /config.org | |
| parent | a2151bcd260a50f697220abf75f522623b0960c6 (diff) | |
| download | emacs-32329d9a384642dd231ed1f5a16aa6c85b8d0ef0.tar.gz | |
relic: 2026-09-12T00:30:15+02:00
Diffstat (limited to 'config.org')
| -rw-r--r-- | config.org | 152 |
1 files changed, 123 insertions, 29 deletions
@@ -7,7 +7,7 @@ #+begin_src emacs-lisp ;;; config.el --- Emacs-Kick --- A feature rich Emacs config for (neo)vi(m)mers -*- lexical-binding: t; -*- -(pixel-scroll-precision-mode 1) +;; (pixel-scroll-precision-mode 1) (setq pgtk-wait-for-event-timeout 0.001) (setq package-enable-at-startup nil ;; Local modules are edited independently of their optional byte-code files, so never let an older .elc silently shadow newer source. @@ -1248,7 +1248,7 @@ Use =org-modern= only for quiet structural markers in Org files. GTD labels, tim #+begin_src emacs-lisp #+end_src -** COMMENT kitty-graphics +** kitty-graphics Display inline images in terminal Emacs via the Kitty graphics protocol. Only activates when running in a Kitty terminal (not in GUI Emacs). @@ -1569,6 +1569,29 @@ Skips capture tasks and projects." "TODO"))))) #+end_src +*** org-clock-reminder + +#+begin_src emacs-lisp +(use-package org-clock-reminder + :ensure (:host github :repo "inickey/org-clock-reminder") + :after org + :demand t + :custom + (org-clock-reminder-interval 15) + (org-clock-reminder-inactive-notifications-p nil) + (org-clock-reminder-active-title "Org: current task") + (org-clock-reminder-active-text "%h\nClocked time: %c") + (org-clock-reminder-inactive-title "Org: no running clock") + (org-clock-reminder-inactive-text "No task is currently clocked in.") + (org-clock-reminder-icons nil) + (org-clock-reminder-notifiers '(org-clock-reminder-notify)) + :config + (org-clock-reminder-mode 1) + ;; Synchronize when enabling reminders while a clock is already running. + (when (org-clocking-p) + (org-clock-reminder-on-clock-in))) +#+end_src + *** effort and complexity management #+begin_src emacs-lisp @@ -2673,15 +2696,14 @@ Auto switch silos (different workspaces/folders) based on preconfigured director * helm-mode + #+begin_src emacs-lisp (use-package helm :ensure (:wait t) :after evil-collection :hook (after-init . helm-mode) - (helm-minibuffer-set-up . (lambda () - (evil-insert-state) - (add-hook 'minibuffer-exit-hook #'turn-off-evil-mode nil t))) + (helm-minibuffer-set-up . turn-off-evil-mode) :custom (helm-M-x-fuzzy-match t) (helm-occur-buffer-substring-default-mode 'buffer-substring) @@ -2721,6 +2743,7 @@ Auto switch silos (different workspaces/folders) based on preconfigured director * tags (citre) + #+begin_src emacs-lisp (use-package citre :ensure t @@ -2869,6 +2892,32 @@ Auto switch silos (different workspaces/folders) based on preconfigured director #+end_src +** go-mode + +#+begin_src emacs-lisp +(use-package go-mode + :ensure t + :mode (("\\.go\\'" . go-mode) + ("\\.templ\\'" . go-mode)) + :hook (go-mode . (lambda () (setq-local tab-width 4)))) + +(defun my/go-citre-bindings (&optional mode _maps &rest _) + "Apply Citre navigation after Go or Evil Collection loads." + (when (and (boundp 'go-mode-map) (or (null mode) (eq mode 'go-mode))) + (keymap-set go-mode-map "<remap> <godef-jump>" #'citre-jump) + (keymap-set go-mode-map "<remap> <godef-describe>" #'citre-peek) + (when (featurep 'evil) + (evil-define-key* 'normal go-mode-map + (kbd "g d") #'citre-jump + (kbd "K") #'citre-peek)))) + +(with-eval-after-load 'go-mode + (my/go-citre-bindings)) +(with-eval-after-load 'evil + (my/go-citre-bindings)) +(add-hook 'evil-collection-setup-hook #'my/go-citre-bindings) +#+end_src + ** c-ts-mode Built-in tree-sitter mode (Emacs 29+). The =c= grammar ships via =treesit-grammars.with-all-grammars= in =emacs.nix=, so no on-the-fly compilation is needed. @@ -3161,6 +3210,15 @@ BODY is the xonsh script. PARAMS may include :dir and :cmdline." (message "Uncommitted HEAD^ — changes preserved, unstaged")) #+end_src +** magit-forge + +#+begin_src emacs-lisp +(use-package forge + :ensure t + :after magit) +#+end_src + + * indent-guide #+begin_src emacs-lisp @@ -3230,6 +3288,7 @@ BODY is the xonsh script. PARAMS may include :dir and :cmdline." :after evil :ensure (:wait t) :config + (setq evil-collection-mode-list (remq 'helm evil-collection-mode-list)) (evil-collection-require 'minibuffer) (evil-collection-init)) #+end_src @@ -3734,6 +3793,7 @@ moved to local.el (fossil-ui-text-wrap 'greedy) (fossil-ui-preview-lines 20) (fossil-ui-diff-renderer 'auto) + (fossil-ui-delta-color-mode 'auto) (fossil-ui-stage-directory (expand-file-name "fossil-stage/" user-emacs-directory)) (fossil-ui-max-stage-bytes (* 5 1024 1024)) (fossil-ui-keyed-timeline t) @@ -4928,7 +4988,7 @@ place. `C-c C-c' commits, `C-c C-k' aborts." (kbd "g b") #'ghostel-list-buffers)) #+end_src -** helm +** COMMENT helm #+begin_src emacs-lisp (evil-define-key '(normal insert) helm-map @@ -5056,6 +5116,7 @@ place. `C-c C-c' commits, `C-c C-k' aborts." (keymap-set my/org-command-map "," #'org-priority) (keymap-set my/org-command-map "I" #'org-clock-in) (keymap-set my/org-command-map "O" #'org-clock-out) +(keymap-set my/org-command-map "R" #'org-clock-reminder-mode) (keymap-set my/org-leader-map "l" my/org-link-map) (keymap-set my/org-link-map "c" #'org-cliplink) (keymap-set my/org-link-map "i" #'org-download-clipboard) @@ -5345,6 +5406,7 @@ reset is unnecessary, so do the handler resolution ourselves and skip * mu4e + #+begin_src emacs-lisp (use-package mu4e :ensure nil @@ -5381,12 +5443,21 @@ opened directly with `mu4e-compose-new'." (setq mu4e-attachment-dir "~/Downloads") (setq mu4e-change-filenames-when-moving t) - (setq mu4e-user-mail-address-list - '("cashmeresamurai@autistici.org" - "cashmere@cashmere.rs")) - (setq mu4e-contexts `(,(make-mu4e-context + :name "riseup" + :match-func + (lambda (msg) + (when msg + (string-prefix-p "/riseup/" (mu4e-message-field msg :maildir)))) + :vars '((user-mail-address . "cashmere1337@riseup.net") + (user-full-name . "cashmere") + (mu4e-drafts-folder . "/riseup/Drafts") + (mu4e-sent-folder . "/riseup/Sent") + (mu4e-trash-folder . "/riseup/Trash") + (mu4e-refile-folder . "/riseup/Archive"))) + + ,(make-mu4e-context :name "autistici" :match-func (lambda (msg) @@ -5417,23 +5488,30 @@ opened directly with `mu4e-compose-new'." (setq sendmail-program (executable-find "msmtp")) (setq send-mail-function 'sendmail-send-it) - (setq message-send-mail-function 'sendmail-send-it) + (setq message-send-mail-function 'message-send-mail-with-sendmail) (setq message-sendmail-envelope-from 'header) (setq message-kill-buffer-on-exit t) - (defun mu4e-set-msmtp-account () - (if (message-mail-p) - (save-excursion - (let* ((from (save-restriction - (message-narrow-to-headers) - (message-fetch-field "from"))) - (account - (cond - ((string-match "cashmeresamurai@autistici.org" from) "autistici") - ((string-match "cashmere@cashmere.rs" from) "cashmere/cashmere")))) - (setq message-sendmail-extra-arguments (list '"-a" account)))))) + (defun my/mu4e-set-msmtp-account () + "Select the msmtp account matching the draft's From address." + (when (message-mail-p) + (save-restriction + (message-narrow-to-headers) + (let* ((from (message-fetch-field "from")) + (address (and from (cadr (mail-extract-address-components from)))) + (account (cdr (assoc-string + (or address "") + '(("cashmere1337@riseup.net" . "riseup") + ("cashmeresamurai@autistici.org" . "autistici") + ("cashmere@cashmere.rs" . "cashmere-rs")) + t)))) + (setq-local message-sendmail-extra-arguments nil) + (unless account + (user-error "No email From: %s" (or from "<missing>"))) + (setq-local message-sendmail-extra-arguments (list "-a" account)))))) - (add-hook 'message-send-mail-hook 'mu4e-set-msmtp-account)) + (remove-hook 'message-send-mail-hook 'mu4e-set-msmtp-account) + (add-hook 'message-send-mail-hook #'my/mu4e-set-msmtp-account)) #+end_src ** Himalaya @@ -5459,6 +5537,7 @@ opened directly with `mu4e-compose-new'." ;; Interesting mail query: unread, exclude trash and sent folders (setq mu4e-alert-interesting-mail-query (concat "flag:unread AND NOT flag:trashed" + " AND NOT maildir:\"/riseup/Sent\"" " AND NOT maildir:\"/autistici/Sent\"" " AND NOT maildir:\"/cashmere/cashmere/Sent\"")) @@ -5499,17 +5578,19 @@ opened directly with `mu4e-compose-new'." * envrc -Automatic flake devshell activation. - -Async activation: defer per-buffer =envrc-mode= via idle timer so direnv -=process-file= does not block buffer display. - #+begin_src emacs-lisp (use-package envrc :ensure t :defer 1 :init (require 'notifications) + (defun my/envrc-project-buffer () + "Load the local project environment before terminal startup or task discovery." + (unless (file-remote-p default-directory) + (require 'envrc) + (envrc-mode 1) + (when (eq envrc--status 'error) + (user-error "Project environment failed; inspect M-x envrc-show-log")))) (defvar my/envrc-notified (make-hash-table :test 'equal) "Directories already notified about, to avoid spam.") (defun my/envrc-notify (dir status) @@ -5552,7 +5633,9 @@ opening another file in same project does not re-notify." (when status (my/envrc-notify default-directory status)))))))))) :hook ((find-file . my/envrc-maybe-async) - (dired-mode . my/envrc-maybe-async)) + (dired-mode . my/envrc-project-buffer) + (projectile-dashboard-mode . my/envrc-project-buffer) + (ghostel-mode . my/envrc-project-buffer)) :config (when (bound-and-true-p envrc-global-mode) (envrc-global-mode -1))) @@ -5943,6 +6026,17 @@ Privileged ZFS operations stay non-interactive by default. Unlocking runs authen (clatter-org-setup))) #+end_src +* apheleia + +#+begin_src emacs-lisp +(use-package apheleia + :ensure t + :hook (nix-ts-mode . apheleia-mode) + :custom + (apheleia-mode-alist '((nix-ts-mode . nixfmt)))) +#+end_src + + * provide init #+begin_src emacs-lisp |
