summaryrefslogtreecommitdiff
path: root/home/dots/.emacs
diff options
context:
space:
mode:
Diffstat (limited to 'home/dots/.emacs')
-rw-r--r--home/dots/.emacs728
1 files changed, 362 insertions, 366 deletions
diff --git a/home/dots/.emacs b/home/dots/.emacs
index 9758dc0..0d04e89 100644
--- a/home/dots/.emacs
+++ b/home/dots/.emacs
@@ -2,8 +2,7 @@
(add-to-list 'load-path "~/.emacs.d/elisp")
(setq package-list
- '(almost-mono-themes
- avy
+ '(avy
corfu
devdocs
diminish
@@ -27,7 +26,6 @@
mastodon
nix-mode
nov
- org-remark
pass
pinentry
rec-mode
@@ -52,6 +50,8 @@
(unless (package-installed-p package)
(package-install package)))
+(load-theme 'BOGO t)
+
(use-package exwm
:init
(setq exwm-workspace-number 1
@@ -96,78 +96,136 @@
(lambda (cmd) ;; s-&: Launch application.
(interactive (list (read-shell-command "$ ")))
(start-process-shell-command cmd nil cmd)))
- (shell-command "xrdb ~/.Xresources")
- (shell-command "dbus-update-activation-environment DISPLAY")
- ;; Sticky keys
- ;;(shell-command "xkbset -feedback sticky -twokey latchlock")
- ;;(shell-command "xkbset exp 64 '=sticky' '=twokey' '=latchlock'")
(push ?\C-\\ exwm-input-prefix-keys)
+ (shell-command "xrdb ~/.Xresources")
:custom
(ring-bell-function 'ignore)
(default-directory "/home/mccd/")
(focus-follows-mouse t)
+ (comment-multi-line t)
+ (sentence-end-double-space nil)
+ (require-final-newline t)
+ (kill-do-not-save-duplicates t)
+ (comment-empty-lines t)
+ (lazy-highlight-initial-delay 0)
(mouse-autoselect-window t)
:hook
(;; Make sure titles match X window
+ (exwm-init . (lambda ()
+ (interactive)
+ (load-library "/home/mccd/.emacs.d/auth.el.gpg")))
(exwm-update-title . (lambda ()
- (exwm-workspace-rename-buffer
- (concat exwm-class-name ":"
- (if (<= (length exwm-title) 50) exwm-title
- (concat (substring exwm-title 0 49) "..."))))))
- (exwm-update-class . (lambda ()
- (exwm-workspace-rename-buffer
- (concat exwm-class-name ":"
- (if (<= (length exwm-title) 50) exwm-title
- (concat (substring exwm-title 0 49) "..."))))))))
-
-(use-package exwm-randr
- :after exwm
- :config
- (exwm-randr-mode))
+ (exwm-workspace-rename-buffer
+ (concat exwm-class-name ":"
+ (if (<= (length exwm-title) 50) exwm-title
+ (concat (substring exwm-title 0 49) "..."))))))
+ (exwm-update-class . (lambda ()
+ (exwm-workspace-rename-buffer
+ (concat exwm-class-name ":"
+ (if (<= (length exwm-title) 50) exwm-title
+ (concat (substring exwm-title 0 49) "..."))))))))
(use-package diminish :ensure t)
+(use-package ediff
+ :custom
+ (ediff-window-setup-function #'ediff-setup-windows-plain)
+ (ediff-split-window-function #'split-window-horizontally))
(use-package emacs
- :init
+ :config
(fset 'yes-or-no-p 'y-or-n-p)
(menu-bar-mode -1)
(tool-bar-mode -1)
(setq-default fill-column 80
- line-spacing 5
- cursor-type 'box
- frame-title-format '("%b"))
-
- (set-cursor-color "#ff0000")
+ line-spacing 10
+ cursor-type 'box
+ cursor-in-non-selected-windows nil
+ frame-title-format '("%b"))
:custom
+ (highlight-nonselected-windows nil)
(default-frame-alist '((font . "Iosevka SS13 Extended")
- (height . 150)
- (line-spacing . 0.5)))
+ (height . 150)
+ (line-spacing . 0.5)))
(undo-limit 10000000)
(undo-outer-limit 20000000)
+ (create-lockfiles nil)
+ (idle-update-delay 1.0)
+
+
+
+ (auto-save-list-file-prefix
+ (expand-file-name "autosave/" user-emacs-directory))
+ (tramp-auto-save-directory
+ (expand-file-name "tramp-autosave/" user-emacs-directory))
+
+ ;; Auto save options
+ (kill-buffer-delete-auto-save-files t)
+
+ ;; Revert other buffers (e.g, Dired)
+ (global-auto-revert-non-file-buffers t)
+
+;;; recentf
+ ;; `recentf' is an Emacs package that maintains a list of recently
+ ;; accessed files, making it easier to reopen files you have worked on
+ ;; recently.
+ (recentf-max-saved-items 300) ; default is 20
+ (recehvntf-auto-cleanup 'mode)
+
+;;; saveplace
+ ;; `save-place-mode` enables Emacs to remember the last location within a file
+ ;; upon reopening. This feature is particularly beneficial for resuming work at
+ ;; the precise point where you previously left off.
+ (save-place-file (expand-file-name "saveplace" user-emacs-directory))
+ (save-place-limit 600)
+
+;;; savehist
+ ;; `savehist` is an Emacs feature that preserves the minibuffer history between
+ ;; sessions. It saves the history of inputs in the minibuffer, such as commands,
+ ;; search strings, and other prompts, to a file. This allows users to retain
+ ;; their minibuffer history across Emacs restarts.
+ (history-length 300)
+ (savehist-save-minibuffer-history t) ;; Default
+ ;; Resizing the Emacs frame can be costly when changing the font. Disable this
+ ;; to improve startup times with fonts larger than the system default.
+ (frame-resize-pixelwise t)
+
+ ;; However, do not resize windows pixelwise, as this can cause crashes in some
+ ;; cases when resizing too many windows at once or rapidly.
+ (window-resize-pixelwise nil)
+ (resize-mini-windows 'grow-only)
+
+ (fast-but-imprecise-scrolling t)
+ (blink-cursor-mode -1)
+ (x-stretch-cursor t)
+
(tab-always-indent 'complete)
(text-mode-ispell-word-completion nil)
(read-extended-command-predicate #'command-completion-default-include-p ))
+(use-package vc-hooks
+ :custom
+ (vc-make-backup-files nil))
+
(use-package tab-bar
+ :custom
+ (tab-bar-auto-width t)
+ (tab-bar-close-button-show nil)
+ (tab-bar-format
+ '(tab-bar-format-tabs tab-bar-format-align-right tab-bar-format-global))
:init
(tab-bar-mode)
(setq tab-bar-new-tab-choice "*scratch*"))
(use-package project
:ensure t
+ :bind
+ (:map project-prefix-map
+ ("b" . project-list-buffers))
:config
(add-to-list 'project-switch-commands '(project-list-buffers "Buffers"))
- (define-key project-prefix-map (kbd "b") 'project-list-buffers)
(add-to-list 'project-switch-commands '(project-kill-buffers "Kill Buffers"))
(add-to-list 'project-switch-commands '(project-shell "Shell")))
-(use-package exwm-systemtray
- :after exwm
- :config
- (exwm-systemtray-mode)
- (setq exwm-systemtray-height 30))
-
-
(use-package transpose-frame
:ensure t
:defer t
@@ -193,11 +251,7 @@
:ensure t
:init
(with-eval-after-load 'geiser-guile
- (add-to-list 'geiser-guile-load-path "~/builds/nonguix")))
-
-(use-package pixel-scroll
- :init
- (pixel-scroll-precision-mode))
+ (add-to-list 'geiser-guile-load-path "~/dev/nonguix")))
(use-package corfu
;; Optional customizations
@@ -226,7 +280,7 @@
(add-to-list 'dabbrev-ignored-buffer-modes 'doc-view-mode)
(add-to-list 'dabbrev-ignored-buffer-modes 'pdf-view-mode)
(add-to-list 'dabbrev-ignored-buffer-modes 'tags-table-mode))
-
+
(use-package scroll-bar
:init
(scroll-bar-mode -1))
@@ -236,20 +290,41 @@
(delete-selection-mode))
(use-package frame
+ :custom
+ (window-divider-default-right-width 2)
:config
(window-divider-mode))
(use-package window
+ :custom
+ (switch-to-buffer-obey-display-actions t)
:config
(add-to-list 'display-buffer-alist '("*Async Shell Command*" display-buffer-no-window (nil))))
(use-package files
- :config
- (setq delete-old-versions t
- kept-new-versions 6
- kept-old-versions 2
- version-control t
- auto-save-default nil))
+ :custom
+ (make-backup-files nil)
+
+ (backup-directory-alist
+ `(("." . ,(expand-file-name "backup" user-emacs-directory))))
+ (tramp-backup-directory-alist backup-directory-alist)
+ (backup-by-copying-when-linked t)
+ (backup-by-copying t) ; Backup by copying rather renaming
+ (delete-old-versions t) ; Delete excess backup versions silently
+ (version-control t) ; Use version numbers for backup files
+ (kept-new-versions 10)
+ (kept-old-versions 10)
+;;; Auto revert
+ ;; Auto-revert in Emacs is a feature that automatically updates the
+ ;; contents of a buffer to reflect changes made to the underlying file
+ ;; on disk.
+ (revert-without-query (list ".") ; Do not prompt
+ auto-revert-stop-on-user-input nil
+ auto-revert-verbose t)
+
+
+ (auto-save-default t)
+ (auto-save-include-big-deletions t))
(use-package minibuffer
:defer t
@@ -261,6 +336,37 @@
:defer t
:ensure t)
+(defun elfeed-refresh ()
+ (interactive)
+ (cl-loop for entry in (elfeed-search-selected)
+ do (elfeed-untag-1 entry 'unread))
+ (elfeed-protocol-fever-reinit "https://freshrss@rss.mccd.space"))
+
+(use-package elfeed
+ :ensure t
+ :bind
+ (:map elfeed-search-mode-map
+ ("G" . elfeed-refresh)))
+
+(use-package elfeed-protocol
+ :after elfeed
+ :ensure t
+ :demand t
+ :custom
+ (elfeed-use-curl t)
+ (elfeed-curl-extra-arguments '("--insecure"))
+ (elfeed-protocol-fever-update-unread-only t)
+ (elfeed-log-level 'debug)
+ (elfeed-protocol-fever-fetch-category-as-tag t)
+ (elfeed-protocol-feeds '(("fever+https://freshrss@rss.mccd.space"
+ :api-url "https://rss.mccd.space/api/fever.php"
+ :password freshrss-password)))
+ ;; enable elfeed-protocol
+ (elfeed-protocol-enabled-protocols '(fever))
+ :config
+ (elfeed-set-timeout 36000)
+ (elfeed-protocol-enable))
+
(use-package select
:config
(setq x-select-enable-clipboard t
@@ -302,36 +408,6 @@
(file-name-base (org-remark-notes-file-name-function))
"-remark.org"))
-(use-package org-remark
- :diminish org-remark-mode
- :diminish org-remark-global-tracking-mode
- :bind (;; :bind keyword also implicitly defers org-remark itself.
- ;; Keybindings before :map is set for global-map.
- ("C-c n m" . org-remark-mark)
- ("C-c n l" . org-remark-mark-line) ; new in v1.3
- :map org-remark-mode-map
- ("C-c n o" . org-remark-open)
- ("C-c n ]" . org-remark-view-next)
- ("C-c n [" . org-remark-view-prev)
- ("C-c n r" . org-remark-remove)
- ("C-c n d" . org-remark-delete))
- ;; Alternative way to enable `org-remark-global-tracking-mode' in
- ;; `after-init-hook'.
- ;; :hook (after-init . org-remark-global-tracking-mode)
- :custom
- (org-remark-icon-notes nil)
- (org-remark-use-org-id t)
- (org-remark-notes-file-name #'mccd/store-remarks)
- :init
- ;; It is recommended that `org-remark-global-tracking-mode' be
- ;; enabled when Emacs initializes. Alternatively, you can put it to
- ;; `after-init-hook' as in the comment above
- (org-remark-global-tracking-mode +1)
- :config
- (use-package org-remark-info :after info :config (org-remark-info-mode +1))
- (use-package org-remark-eww :after eww :config (org-remark-eww-mode +1))
- (use-package org-remark-nov :after nov :config (org-remark-nov-mode +1)))
-
(use-package battery
:init
(display-battery-mode t))
@@ -431,19 +507,21 @@
("p" . git-gutter:previous-hunk))
:ensure t)
+;; (use-package gnus
+;; :custom
+;; (gnus-select-method
+;; '(nnimap "imap.fastmail.com"
+;; (nnimap-expunge t)))
+;; (mail-sources '((file)))
+;; (gnus-secondary-select-methods '((nnml "")))
+;; (gnus-asynchronous t)
+;; (gnus-use-article-prefetch t)
+;; (gnus-agent t))
+
(use-package git-gutter-fringe
:ensure t)
-(use-package org-crypt
- :ensure nil
- :custom
- (auth-source-debug t)
- (epg-gpg-program "gpg2")
- :init
- (setenv "GPG_AGENT_INFO" nil)
- (org-crypt-use-before-save-magic))
-
(use-package grep
:custom
(grep-template (string-join
@@ -463,9 +541,19 @@
:init
(pinentry-start))
+(use-package org-crypt
+ :ensure nil
+ :custom
+ (auth-source-debug t)
+ :init
+ (setenv "GPG_AGENT_INFO" nil)
+ (org-crypt-use-before-save-magic))
+
(use-package epa-file
:custom
(epa-pinentry-mode 'loopback)
+ (epa-file-select-keys nil)
+ (epg-gpg-program "gpg")
:init
(epa-file-enable))
@@ -605,7 +693,10 @@
:ensure t
:diminish ws-butler-mode
:hook
- ((prog-mode . ws-butler-mode)))
+ ((prog-mode . ws-butler-mode)
+ (css-mode . ws-butler-mode)
+ (javascript-mode . ws-butler-mode)
+ (html-mode . ws-butler-mode)))
(use-package sgml-mode
:init
@@ -648,6 +739,8 @@
(use-package markdown-mode
:ensure t
+ :custom
+ (markdown-list-item-bullets '("-"))
:config
(set-face-attribute 'markdown-code-face nil :inherit 'fixed-pitch)
:hook
@@ -694,8 +787,13 @@
:config
;; Ensure `nil` is in your PATH.
(add-to-list 'eglot-server-programs '(nix-mode . ("nil")))
- (define-key eglot-mode-map (kbd "C-c r") 'eglot-rename)
- (define-key eglot-mode-map (kbd "C-c o") 'eglot-code-actions)
+ (fset #'jsonrpc--log-event #'ignore)
+ :bind
+ (:map eglot-mode-map
+ ("C-c r" . eglot-rename)
+ ("C-c o" . eglot-code-actions))
+ :custom
+ (setq jsonrpc-event-hook nil)
:hook
(css-mode . eglot-ensure)
(html-mode . eglot-ensure)
@@ -766,7 +864,7 @@
:server "irc.libera.chat"
:port "6667"
:nick "mccd"
- :password (shell-command-to-string "pass show libera.chat")))))
+ :password libera-chat-pass))))
(use-package ob-rec
:ensure nil)
@@ -782,17 +880,29 @@
(org-refile-targets
'((nil :maxlevel . 4)
(org-agenda-files :maxlevel . 4)))
- (org-default-notes-file "~/personal-db/notes/todo.org")
+ (org-default-notes-file "~/personal-db/notes/notes.org")
(org-hide-emphasis-markers t)
- (org-enforce-todo-dependencies t)
(org-link-keep-stored-after-insertion t)
(org-startup-folded t)
- (org-todo-keywords
- '((sequence "TODO" "DONE")))
+ (org-hierarchical-todo-statistics t)
(org-refile-allow-creating-parent-nodes 'confirm)
(org-outline-path-complete-in-steps nil)
(org-refile-use-outline-path 'file)
(org-log-done 'time)
+ (org-indent-line 2)
+ (org-tags-column 0)
+ (org-pretty-entities t)
+ (org-todo-keywords
+ '((sequence "TODO(t)" "|" "DONE(d)")
+ (sequence "UNREAD(u)" "READING(e)" "|" "READ(r)")
+ (sequence "|" "CANCELED(c)")))
+ (org-agenda-custom-commands
+ '(("t" todo "TODO")
+ ("p" tags-todo "+piva")))
+ (org-priority-lowest ?E)
+ (org-priority-faces '((?A . (:weight bold :inherit org-priority))
+ (?D . (:foreground "gray50" :inherit org-priority))
+ (?E . (:foreground "gray60" :inherit org-priority))))
:init
(add-to-list 'auto-mode-alist '("\\.org\\'" . org-mode))
(org-babel-do-load-languages
@@ -802,13 +912,13 @@
:config
(set-face-attribute 'org-block nil :inherit 'fixed-pitch)
(set-face-attribute 'org-code nil :inherit 'fixed-pitch)
- (set-face-attribute 'org-table nil :inherit 'fixed-pitch)
+ (set-face-attribute 'org-table nil :foreground "black" :inherit 'fixed-pitch)
(set-face-attribute 'org-date nil :inherit 'fixed-pitch)
(set-face-attribute 'org-tag nil :inherit 'fixed-pitch)
(set-face-attribute 'org-drawer nil :inherit 'fixed-pitch)
(set-face-attribute 'org-property-value nil :inherit 'fixed-pitch)
(set-face-attribute 'org-special-keyword nil :inherit 'fixed-pitch)
- (set-face-attribute 'org-meta-line nil :inherit 'fixed-pitch)
+ (set-face-attribute 'org-meta-line nil :inherit 'fixed-pitch)
:hook
((org-mode . org-indent-mode)
(org-capture-after-finalize . sync-org)
@@ -819,66 +929,80 @@
(org-mode . variable-pitch-mode)))
+(defun me/org-id-insert-link ()
+ "Insert at point a link to any heading from `org-agenda-files'."
+ (interactive)
+ (let ((buffer-pos
+ (org-id-find
+ (org-id-get-with-outline-path-completion '((nil :maxlevel . 5)
+ (org-agenda-files :maxlevel . 5))))))
+ (save-excursion
+ (with-current-buffer (get-file-buffer (car buffer-pos))
+ (goto-char (cdr buffer-pos))
+ (call-interactively 'org-store-link)))
+ (org-insert-all-links 1 "" " ")))
+
(use-package org-id
:after org
:custom
(org-id-link-to-org-use-id 'create-if-interactive-and-no-custom-id))
-(use-package subr
+(use-package ol
+ :after org-compat org-macs org-fold
:bind
- (("C-c C-o" . org-open-at-point-global)))
+ (("C-c l" . org-store-link)))
-(use-package ol
+(use-package subr
:bind
- (("C-c l" . org-link)))
+ (("C-c C-o" . org-open-at-point-global)))
(use-package org-capture
:custom
(org-capture-templates
'(("t" "Todo"
- entry (file "~/personal-db/notes/todo.org")
+ entry (file+headline "~/personal-db/notes/notes.org" "Todo")
"* TODO %?\n%i\n%a\n "
:empty-lines 1)
+ ("w" "Work Todo"
+ entry (file+headline "~/personal-db/notes/notes.org" "Todo")
+ "* TODO %? :piva:\n:PROPERTIES:\n:CATEGORY: Pivå\n:END:\n%i\n%a\n "
+ :empty-lines 1)
("b" "Book"
- entry (file+headline "~/personal-db/notes/refs.org" "Books")
- "* %?\n:PROPERTIES:\n:AUTHOR:\n:STATE: unread\n:END:\n "
+ entry (file+olp "~/personal-db/notes/notes.org" "References" "Books")
+ "* UNREAD %?\n:PROPERTIES:\n:AUTHOR:\n:END:\n "
:empty-lines 1)
("f" "Formula"
- entry (file "~/personal-db/notes/formulas.org")
+ entry (file+headline "~/personal-db/notes/notes.org" "Formulas")
"* %?\n%U"
:empty-lines 1)
("f" "Film"
- entry (file+headline "~/personal-db/notes/concepts.org" "Films")
+ entry (file+olp "~/personal-db/notes/notes.org" "References" "Films")
"* %?\n:PROPERTIES:\n:DIRECTOR:\n:STATE: unwatched\n:END:\n "
:empty-lines 1)
- ("c" "Concept"
- entry (file "~/personal-db/notes/concepts.org")
- "* %?\n%i\n%a\n "
- :empty-lines 1)
("g" "Log Coffee"
- entry (file+headline "~/personal-db/notes/log.org" "Log")
- "* Brewed pour-over :coffee:\n:PROPERTIES:\n:WATER: 320g\n:COFFEE: 20g\n:ORIGIN:\n:NAME:\n:TEMP:\n:RATING:\n:PREHEAT: YES\n:END:\n%T\n*** Observations "
+ entry (file+headline "~/personal-db/notes/notes.org" "Log")
+ "* Brewed pour-over :coffee:cyprus:paramytha:\n:PROPERTIES:\n:WATER: 320g\n:COFFEE: 25g\n:TYPE: [[id:815450d3-d772-4207-9eb4-e1e185fd8356][La Pastora]] | [[id:9d136656-2965-4be9-87cf-4ecafcf62707][Alemayehu]] | [[id:73a92627-f076-4090-a78c-ef8204191611][Los Chorros]]\n:TEMP: 90\n:RATING:\n:PREHEAT: YES\n:TOTALBREWTIME:\n:END:\n%T\n*** Observations "
:empty-lines 0
:prepend t)
("r" "Reference"
- entry (file "~/personal-db/notes/refs.org")
+ entry (file+headline "~/personal-db/notes/notes.org" "References")
"* %?\n%i\n%a\n "
:empty-lines 1)
("s" "Schedule"
- entry (file "~/personal-db/notes/reminders.org")
+ entry (file+headline "~/personal-db/notes/notes.org" "Event")
"* TODO %?\nSCHEDULED: %^T"
:empty-lines 1)
("a" "Article"
- entry (file+headline "~/personal-db/notes/refs.org" "Articles")
+ entry (file+olp "~/personal-db/notes/notes.org" "References" "Articles")
"* %?\n:PROPERTIES:\n:author:\n:END:\n "
:empty-lines 1)
("l" "Log"
- entry (file+headline "~/personal-db/notes/log.org" "Log")
- "** %?\n%T"
+ entry (file+headline "~/personal-db/notes/notes.org" "Log")
+ "** %? :cyprus:paramytha:\n%T"
:prepend t
:empty-lines 0)
("n" "Inbox"
- entry (file "~/personal-db/notes/inbox.org")
+ entry (file+headline "~/personal-db/notes/notes.org" "Inbox")
"* %?\n%U\n"
:empty-lines 1)))
:bind
@@ -891,18 +1015,24 @@
(use-package org-agenda
:custom
+ (org-agenda-files
+ '("/home/mccd/personal-db/notes/cal-ios.org"
+ "/home/mccd/dev/sustainably/README.org"
+ "/home/mccd/dev/sustainably/exploration.org"
+ "/home/mccd/system/guix.org"
+ "/home/mccd/personal-db/notes/notes.org"))
(org-agenda-remove-tags t)
(org-agenda-inhibit-startup nil)
:config
(advice-add 'org-agenda-quit :before (lambda ()
(interactive)
(org-save-all-org-buffers)
+ (org-id-update-id-locations)
(sync-org)))
:bind
(("C-c a" . org-agenda)
- ("C-c l")
:map org-agenda-mode-map
- ("<return>" . org-agenda-switch-to-narrowed-subtree)))
+ ("<return>" . org-agenda-switch-to-narrowed-subtree)))
(use-package autorevert
:diminish auto-revert-mode)
@@ -927,7 +1057,7 @@
:body msg
:urgency 'critical)))
:config
- (define-advice appt-activate (:after (&optional _arg) hold-your-horses)
+ (define-advice appt-activate (:after (&optional _arg) hold-your-horses)
"`appt-activate' is too eager, rein it in."
(remove-hook 'write-file-functions #'appt-update-list)
(when (timerp appt-timer)
@@ -961,23 +1091,6 @@
:init
(yas-global-mode 1))
-(defun marc/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 "marcc@fastmail.fr" from) "home")
- ((string-match "marc.coquand@sustainably.app" from) "work")
- ((string-match "marc@mccd.space" from) "home"))))
- (setq message-sendmail-extra-arguments (list '"-a" account))))))
-
-(add-hook 'message-send-mail-hook #'marc/set-msmtp-account)
-(add-hook 'message-mode-hook #'flyspell-mode)
-
(use-package flyspell
:diminish flyspell-mode
:defer t)
@@ -991,105 +1104,124 @@
(use-package simple
:diminish visual-line-mode)
-(use-package mu4e
- :ensure nil
- :config
- ;; This is set to 't' to avoid mail syncing issues when using mbsync
- (setq mu4e-change-filenames-when-moving t)
-
- ;; don't keep message compose buffers around after sending:
- (setq message-kill-buffer-on-exit t)
+(defun marc/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 "marcc@fastmail.fr" from) "home")
+ ((string-match "marc.coquand@sustainably.app" from) "work")
+ ((string-match "marc@mccd.space" from) "home"))))
+ (setq message-sendmail-extra-arguments (list '"-a" account))))))
- (setq mu4e-notification-support t)
+(use-package message
+ :custom
+ (message-expand-name-standard-ui t)
+ (message-wide-reply-confirm-recipients t)
+ (message-interactive t)
+ (message-fcc-handler-function 'rmail-output)
+ (message-citation-line-function 'message-insert-formatted-citation-line)
+ (message-mail-alias-type 'ecomplete)
+ (message-self-insert-commands nil)
+ (message-send-mail-function 'sendmail-send-it)
+ (message-kill-buffer-on-exit t)
+ (message-sendmail-envelope-from 'header))
+
+(use-package sendmail
+ :defer t
+ :hook
+ (message-send-mail . marc/set-msmtp-account)
+ (message-send-mail . flyspell-mode)
+ (message-setup . mail-abbrevs-setup)
+ :custom
- ;; send function:
- (setq send-mail-function 'sendmail-send-it
- message-send-mail-function 'sendmail-send-it)
+ (send-mail-function 'sendmail-send-it)
+ (sendmail-program (executable-find "msmtp"))
+ (mail-user-agent 'message-user-agent))
- ;; send program:
- ;; this is exeranal. remember we installed it before.
- (setq sendmail-program (executable-find "msmtp"))
- ;; select the right sender email from the context.
- (setq message-sendmail-envelope-from 'header)
-
- ;; Refresh mail using isync every 10 minutes
- (setq mu4e-update-interval (* 10 60)
- mu4e-get-mail-command "mbsync -a"
- mu4e-view-show-images t
- mu4e-view-show-addresses t
- mu4e-attachment-dir "~/Downloads"
- mu4e-view-prefer-html t
- mu4e-maildir "~/mail")
-
- (setq mu4e-contexts
- (list
- ;; Home
- (make-mu4e-context
- :name "home"
- :enter-func (lambda () (mu4e-message "Entering personal context"))
- :leave-func (lambda () (mu4e-message "Leaving personal context"))
- :match-func
- (lambda (msg)
- (when msg
- (string-prefix-p "/home" (mu4e-message-field msg :maildir))))
- :vars '((user-mail-address . "marc@mccd.space")
- (user-full-name . "Marc Coquand")
- (mu4e-drafts-folder . "/home/Drafts")
- (mu4e-sent-folder . "/home/Sent")
- (mu4e-refile-folder . "/home/Archive")
- (mu4e-trash-folder . "/home/Trash")
- (mu4e-sent-messages-behavior . sent)
-
- (mu4e-maildir-shortcuts .
- (("/home/INBOX" . ?i)
- ("/home/Archive/Done" . ?d)
- ("/home/Archive" . ?a)
- ("/home/Archive/Todo" . ?t)))))
- ;; Work account
- (make-mu4e-context
- :name "work"
- :enter-func (lambda () (mu4e-message "Entering work context"))
- :leave-func (lambda () (mu4e-message "Leaving work context"))
- :match-func
- (lambda (msg)
- (when msg
- (string-prefix-p "/work" (mu4e-message-field msg :maildir))))
- :vars '((user-mail-address . "marc.coquand@sustainably.app")
- (user-full-name . "Marc Coquand")
- (mu4e-drafts-folder . "/work/[Gmail]/Drafts")
- (mu4e-sent-folder . "/work/[Gmail]/Sent Mail")
- (mu4e-refile-folder . "/work/[Gmail]/All Mail")
- (mu4e-sent-messages-behavior . delete)
- (mu4e-trash-folder . "/work/[Gmail]/Trash")
- (mu4e-maildir-shortcuts .
- (("/work/[Gmail]/All Mail" . ?a)
- ("/work/INBOX" . ?i))))))))
+(defun rmail-reply-t ()
+ "Reply only to the sender of the current message. (See rmail-reply.)"
+ (interactive)
+ (rmail-reply t))
-(use-package elfeed-protocol
- :ensure t
+(use-package rmail
:init
- (elfeed-protocol-enable))
-
-(use-package elfeed
- :ensure t
- :custom
- (elfeed-use-curl t)
- ;; setup feeds
- (elfeed-protocol-fever-update-unread-only t)
- (elfeed-protocol-fever-fetch-category-as-tag t)
- (elfeed-protocol-feeds '(("fever+https://freshrss@rss.mccd.space"
- :api-url "https://rss.mccd.space/api/fever.php"
- :password (shell-command-to-string "pass show mccd/freshrss"))))
- ;; enable elfeed-protocol
- (elfeed-protocol-enabled-protocols '(fever))
- (elfeed-curl-extra-arguments '("--insecure"))
+ (defvar selected-rmail-account "")
:bind
- (("C-x w" . elfeed))
+ (("C-c m" . rmail-open)
+ :map rmail-mode-map
+ ("r" . rmail-reply-t)
+ ("R" . rmail-reply))
:config
- ;; necessary for https without a trust certificate
- (elfeed-set-timeout 36000))
+ (defun rmail-no-check ()
+ (interactive)
+ (rmail-input rmail-file-name))
+
+ (defun mail-work ()
+ (interactive)
+ (setenv "MAILHOST" "imap.fastmail.com")
+ (setenv "MAIL"
+ (concat "imaps://"
+ "marc.coquand%40sustainably.app"
+ ":"
+ piva-password
+ "@imap.gmail.com:993"))
+ (setq
+ rmail-default-file "~/personal-db/mail/work/RMAIL"
+ rmail-remote-password-required nil
+ rmail-secondary-file-regexp "~/personal-db/mail/work/archives"
+ rmail-file-name "~/personal-db/mail/work/RMAIL"
+ user-mail-address "marc.coquand@sustainably.app"
+ unrmail-mbox-format 'mboxo
+ user-full-name "Marc Coquand"
+ message-default-headers "FCC: ~/personal-db/mail/work/out/sent.mbox"
+ selected-rmail-account "work"
+ message-signature "Marc Coquand\nFounder at Pivå"))
+
+ (defun mail-home ()
+ (interactive)
+ (setenv "MAILHOST" "imap.fastmail.com")
+ (setenv "MAIL"
+ (concat "imaps://"
+ "marcc%40fastmail.fr"
+ ":"
+ fastmail-password
+ "@imap.fastmail.com:993"))
+ (setq
+ rmail-default-file "~/personal-db/mail/home/RMAIL"
+ rmail-remote-password-required nil
+ rmail-secondary-file-regexp "~/personal-db/mail/home/archives/*.mbox"
+ rmail-file-name "~/personal-db/mail/home/RMAIL"
+ user-mail-address "marc@mccd.space"
+ unrmail-mbox-format 'mboxo
+ user-full-name "Marc Coquand"
+ selected-rmail-account "home"
+ message-default-headers "FCC: ~/personal-db/mail/home/out/sent.mbox"
+ message-signature "Marc"))
+
+ (easy-menu-define rmail-prompt-account global-map "Account"
+ '("Options"
+ ["Home" mail-home]
+ ["Work" mail-work]))
+
+ (defun rmail-open ()
+ (interactive)
+ (let ((prev selected-rmail-account))
+ (tmm-prompt rmail-prompt-account)
+ (unless (eq selected-rmail-account prev)
+ ;; First kill all RMAIL buffers to not leave any dangling
+ (kill-matching-buffers "\\.mbox\\|RMAIL")))
+ (rmail))
+ :custom
+ (rmail-mime-prefer-html nil)
+ (rmail-displayed-headers "^\\(?:Cc\\|Date\\|From\\|Subject\\|To\\|List-Id\\):"))
+
(use-package mastodon
:defer t
@@ -1116,140 +1248,4 @@
(emms-all)
(emms-default-players))
-(custom-set-faces
- ;; custom-set-faces was added by Custom.
- ;; If you edit it by hand, you could mess it up, so be careful.
- ;; Your init file should contain only one such instance.
- ;; If there is more than one, they won't work right.
- '(default ((t (:inherit nil :extend nil :stipple nil :background "#fffff8" :foreground "#111111" :inverse-video nil :box nil :strike-through nil :overline nil :underline nil :slant normal :weight regular :height 150 :width expanded :foundry "UKWN" :family "Iosevka SS13 Extended"))))
- '(avy-lead-face ((t (:inherit fixed-pitch :background "dark red" :foreground "white"))))
- '(calendar-weekend-header ((t (:inherit nil))))
- '(comint-highlight-prompt ((t ())))
- '(corfu-default ((t (:background "#EEEEE8"))))
- '(custom-group-subtitle ((t (:weight bold :inherit variable-pitch))))
- '(diary ((t (:inherit fixed-pitch :foreground "red1"))))
- '(eglot-highlight-symbol-face ((t (:weight bold))))
- '(eglot-mode-line ((t (:weight regular))))
- '(erc-timestamp-face ((t (:foreground "blue" :weight bold))))
- '(eshell-prompt ((t (:weight bold))))
- '(eww-valid-certificate ((t (:foreground "#111111" :weight bold))))
- '(fixed-pitch ((t (:family "Iosevka SS13 Extended"))))
- '(font-lock-builtin-face ((t (:weight regular))))
- '(font-lock-comment-face ((t (:foreground "gray40"))))
- '(font-lock-constant-face ((t (:slant italic))))
- '(git-gutter:added ((t ())))
- '(git-gutter:modified ((t ())))
- '(git-gutter:deleted ((t (:foreground "red"))))
- '(font-lock-function-name-face ((t ())))
- '(font-lock-keyword-face ((t ())))
- '(font-lock-string-face ((t (:foreground "#111111" :slant italic))))
- '(font-lock-type-face ((t (:foreground "#111111"))))
- '(magit-section-heading ((t (:weight bold))))
- '(font-lock-variable-name-face ((t (:foreground "#111111"))))
- '(fringe ((t ())))
- '(header-line ((t (:inherit default :foreground "grey20" :box (:line-width (12 . 12) :color "#fffff8") :underline (:color "#e0e0e0" :style line :position 0) :inherit variable-pitch))))
- '(highlight ((t (:background "azure2"))))
- '(info-header-xref ((t (:inherit info-xref :underline (:color "RoyalBlue3" :style line :position t)))))
- '(info-node ((t (:foreground "brown" :box (:line-width (4 . 4) :color "#fffff8") :slant italic :weight bold))))
- '(enwc-connected ((t (:foreground "dark green" :weight bold))))
- '(link ((t (:foreground "#111111" :underline t))))
- '(magit-branch-remote ((t (:foreground "royalblue"))))
- '(markdown-inline-code-face ((t (:inherit markdown-code-face))))
- '(markdown-pre-face ((t (:inherit markdown-code-face))))
- '(ido-only-match ((t (:foreground "forest green" :weight bold))))
- '(mastodon-display-name-face ((t (:inherit nil :weight bold))))
- '(message-header-name ((t (:weight bold))))
- '(message-header-subject ((t (:slant italic))))
- '(message-separator ((t (:foreground "red"))))
- '(message-cited-text-1 ((t (:foreground "gray50"))))
- '(gnus-header-name ((t (:weight bold))))
- '(gnus-header-content ((t ())))
- '(gnus-header-subject ((t (:slant italic))))
- '(gnus-header-from ((t (:weight bold))))
- '(minibuffer-prompt ((t ())))
- '(mode-line ((t (:background "#EEEEE8" :foreground "#111111" :box (:line-width (8 . 8) :style flat-button) :overline "white" :underline (:color "#fffff8" :style line :position t) :inherit variable-pitch))))
- '(mode-line-emphasis ((t ())))
- '(mode-line-buffer-id ((t ())))
- '(magit-section-highlight ((t (:background "#EEEEE8"))))
- '(magit-diff-file-heading-highlight ((t (:inherit magit-section-highlight))))
- '(magit-diff-file-heading ((t ())))
- '(mode-line-inactive ((t (:inherit mode-line :background "#f9f9f3" :foreground "grey60" :overline "#f9f9f9" :underline (:color "#f9f9f9" :style line :position 0) :weight light))))
- '(mu4e-header-highlight-face ((t (:inherit hl-line :extend t :weight bold))))
- '(mu4e-header-key-face ((t (:weight bold))))
- '(mu4e-highlight-face ((t (:inherit highlight))))
- '(org-date ((t (:inherit fixed-pitch :foreground "gray60"))))
- '(org-agenda-structure ((t ())))
- '(org-upcoming-deadline ((t ())))
- '(org-imminent-deadline ((t (:foreground "orangered" :weight bold))))
- '(org-agenda-date-today ((t (:weight bold))))
- '(org-agenda-date-weekend ((t ())))
- '(help-key-binding ((t (:weight semibold :background "#EEEEE8" :box (:line-width (1 . -1) :color "#AAAAA8")))))
- '(org-agenda-done ((t (:strike-through t :inherit org-time-grid :extend nil))))
- '(org-agenda-structure-filter ((t (:slant italic))))
- '(org-scheduled ((t ())))
- '(org-done ((t (:strike-through t :weight bold :inherit org-agenda-dimmed-todo-face :extend nil))))
- '(org-drawer ((t (:inherit org-tag))))
- '(org-todo ((t (:weight bold))))
- '(org-headline-done ((t (:strike-through t :inherit org-agenda-dimmed-todo-face :extend nil))))
- '(org-level-1 ((t (:inherit outline-1 :extend nil :weight regular))))
- '(org-tag ((t (:inherit fixed-pitch :foreground "gray50"))))
- '(org-time-grid ((t (:foreground "gray"))))
- '(org-meta-line ((t (:foreground "gray" :inherit fixed-pitch))))
- '(org-quote ((t (:inherit org-block :slant italic))))
- '(outline-4 ((t (:inherit outline-2))))
- '(tab-line ((t (:box (:line-width (4 . 4) :style flat-button) :weight semi-light :inherit variable-pitch))))
- '(tab-line ((t (:box (:line-width (4 . 4) :style flat-button) :weight semi-light :inherit variable-pitch))))
- '(tab-line-highlight ((t (:box (:line-width (4 . 4) :style flat-button) :weight semi-light :inherit variable-pitch))))
- '(tab-line-tab-current ((t (:box (:line-width (4 . 4) :style flat-button) :weight semi-light :inherit variable-pitch))))
- '(tab-line-tab-inactive ((t (:box (:line-width (4 . 4) :style flat-button) :weight semi-light :foreground "gray70" :inherit variable-pitch))))
- '(tab-bar ((t (:box (:line-width (12 . 24) :style flat-button) :weight semi-light :inherit variable-pitch))))
- '(tab-bar-tab ((t (:inherit tab-bar :foreground "#111111" :box (:line-width (20 . 1) :color "#fffff8")))))
- '(tab-bar-tab-inactive ((t (:inherit tab-bar-tab :background "#fffff8" :foreground "#999999" :weight semi-light))))
- '(tldr-code-block ((t (:background "cornsilk" :foreground "#111111"))))
- '(tldr-description ((t ())))
- '(tldr-command-argument ((t (:background "cornsilk" :foreground "#111111"))))
- '(tldr-command-itself ((t (:background "khaki" :foreground "#111111" :weight bold))))
- '(tldr-introduction ((t (:foreground "#111111" :slant italic))))
- '(tldr-title ((t (:inherit variable-pitch :foreground "#111111" :weight bold))))
- '(variable-pitch ((t (:family "Iosevka Aile"))))
- '(window-divider ((t (:foreground "gray90")))))
-(custom-set-variables
- ;; custom-set-variables was added by Custom.
- ;; If you edit it by hand, you could mess it up, so be careful.
- ;; Your init file should contain only one such instance.
- ;; If there is more than one, they won't work right.
- '(custom-safe-themes
- '("cbd85ab34afb47003fa7f814a462c24affb1de81ebf172b78cb4e65186ba59d2" default))
- '(erc-mode-line-format "")
- '(erc-modules
- '(autojoin button completion fill irccontrols list match menu move-to-prompt netsplit networks noncommands notifications readonly ring services stamp spelling))
- '(magit-section-visibility-indicator '("..." . t))
- '(markdown-list-item-bullets '("-"))
- '(mastodon-tl--enable-proportional-fonts t)
- '(mastodon-use-emojify t)
- '(mode-line-compact 'long)
- '(mode-line-format
- '("%e" mode-line-front-space
- (:propertize
- ("" mode-line-modified " "))
- mode-line-modes mode-line-buffer-identification))
- '(mode-line-percent-position nil)
- '(mode-line-position-line-format '(" "))
- '(mu4e-bookmarks
- '((:name "Last 7 days" :query "date:7d..now" :hide-unread t :key 119)
- (:name "Messages with images" :query "mime:image/*" :key 112)))
- '(org-agenda-files
- '("/home/mccd/personal-db/notes/cal-ios.org" "/home/mccd/personal-db/notes/reminders.org" "/home/mccd/builds/sustainably/README.org" "/home/mccd/builds/sustainably/exploration.org" "/home/mccd/personal-db/notes/inbox.org" "/home/mccd/personal-db/notes/todo.org" "/home/mccd/system/guix.org" "/home/mccd/personal-db/notes/log.org" "/home/mccd/personal-db/notes/refs.org" "/home/mccd/personal-db/notes/formulas.org" "/home/mccd/personal-db/notes/concepts.org" "/home/mccd/personal-db/notes/drafts.org"))
- '(org-fold-core-style 'overlays)
- '(package-selected-packages
- '(nov eldoc-box hide-mode-line exwm-mff eat pinentry exwm emms company orglink web-mode flycheck nix-mode nix-ts-mode avy pdf-tools elfeed-protocol yasnippet-snippets elfeed yasnippet smartparens markdown-mode mastodon tldr almost-mono-themes rec-mode magit go-mode expand-region devdocs))
- '(tab-bar-auto-width t)
- '(tab-bar-close-button-show nil)
- '(tab-bar-format
- '(tab-bar-format-tabs tab-bar-format-align-right tab-bar-format-global))
- '(tab-bar-position nil)
- '(tab-bar-tab-hints t)
- '(window-divider-default-right-width 2)
- '(yank-from-kill-ring-rotate t))
(put 'secrets-mode 'disabled nil)
-