summaryrefslogtreecommitdiff
path: root/config.org
diff options
context:
space:
mode:
authorcashmere <cashmere@autistici.org>2026-09-12 00:30:11 +0200
committercashmere <cashmere@autistici.org>2026-09-12 00:30:11 +0200
commit32329d9a384642dd231ed1f5a16aa6c85b8d0ef0 (patch)
tree4b2f793909a1f97e52213467cc9f60e810a886df /config.org
parenta2151bcd260a50f697220abf75f522623b0960c6 (diff)
downloademacs-32329d9a384642dd231ed1f5a16aa6c85b8d0ef0.tar.gz
relic: 2026-09-12T00:30:15+02:00
Diffstat (limited to 'config.org')
-rw-r--r--config.org152
1 files changed, 123 insertions, 29 deletions
diff --git a/config.org b/config.org
index fd4e919..2e46114 100644
--- a/config.org
+++ b/config.org
@@ -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