diff options
Diffstat (limited to 'home/dots/.emacs')
-rw-r--r-- | home/dots/.emacs | 728 |
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) - |