;;; -*- lexical-binding: t; -*- (setq kj/fastmail-maildir (expand-file-name "~/Maildir/fastmail")) (when (file-exists-p (expand-file-name "~/Maildir")) (use-package notmuch :autoload compose-mail :after seq :bind (:map notmuch-hello-mode-map ;; ("T" . kj/notmuch-tree-by-tag) ) :custom (;; Display newest first. notmuch-search-oldest-first nil) :config (with-eval-after-load 'message (setq message-mail-user-agent 'notmuch-user-agent message-cite-style 'message-cite-style-gmail message-citation-line-function 'message-insert-formatted-citation-line message-kill-buffer-on-exit nil) (add-hook 'message-mode-hook 'turn-off-auto-fill) (add-hook 'message-mode-hook 'visual-line-mode)) (setq notmuch-show-all-tags-list t notmuch-show-relative-dates t notmuch-hello-tag-list-make-query "tag:unread" notmuch-archive-tags '("-inbox" "-unread") notmuch-fcc-dirs nil notmuch-show-logo nil notmuch-mua-cite-function 'message-cite-original-without-signature notmuch-wash-citation-lines-prefix most-positive-fixnum notmuch-wash-citation-lines-suffix most-positive-fixnum notmuch-show-indent-messages-width 0) (add-hook 'notmuch-show-hook 'kj/disable-trailing-whitespace) (defun kj/confirm-empty-subject () "Allow user to quit when current message subject is empty." (or (message-field-value "Subject") (yes-or-no-p "Really send without Subject? ") (keyboard-quit))) (add-hook 'message-send-hook #'kj/confirm-empty-subject) (advice-add 'message-send :before (defun kj/notmuch-switch-to-local (&args) (when (file-remote-p default-directory) (cd (expand-file-name "~"))))) (setq notmuch-saved-searches '((:name "inbox" :query "tag:inbox -tag:_gz" :key "i" :search-type nil) (:name "unread" :query "tag:unread" :key "u" :search-type nil) (:name "flagged" :query "tag:flagged" :key "f" :search-type nil) (:name "sent" :query "tag:sent" :key "t" :search-type nil) (:name "drafts" :query "tag:draft" :key "d" :search-type nil) (:name "all mail" :query "*" :key "a" :search-type nil) ))) (setq kj/notmuch-wash-citation-regexp "^\\(\\(>\\|[[:space:]]\\)+\\).*\n") ;;; XXX consider upstreaming this. (defun kj/notmuch-wash-citations-by-depth (_msg _depth) (goto-char (point-min)) (beginning-of-line) (let ((maxlevel 1)) (while (intern-soft (format "message-cited-text-%d" maxlevel)) (setq maxlevel (1+ maxlevel))) (setq maxlevel (1- maxlevel)) (while (and (< (point) (point-max)) (re-search-forward kj/notmuch-wash-citation-regexp nil t)) (let* ((cite-start (match-beginning 0)) (cite-end (match-end 0)) (cite-level (seq-count (lambda (c) (eql c ?>)) (match-string 1))) (face-level (1+ (% (1- cite-level) maxlevel))) (cited-text-face (intern (format "message-cited-text-%d" face-level)))) (overlay-put (make-overlay cite-start cite-end) 'face cited-text-face))))) ;; This doesn't seem to work that well... :( ;;(add-hook 'notmuch-show-insert-text/plain-hook #'kj/notmuch-wash-citations-by-depth 90) (defun kj/notmuch-tree-by-tag (tag) (interactive (list (notmuch-select-tag-with-completion "Notmuch search tag: "))) (notmuch-tree (concat "tag:" tag)))) (when (file-exists-p kj/fastmail-maildir) (setq sendmail-program "mujmap" message-send-mail-function 'message-send-mail-with-sendmail message-signature "Kjetil" message-sendmail-extra-arguments (list "-C" kj/fastmail-maildir "send"))) (provide 'kj-email)