diff options
Diffstat (limited to 'custom/jao-custom-gnus.el')
| -rw-r--r-- | custom/jao-custom-gnus.el | 313 |
1 files changed, 220 insertions, 93 deletions
diff --git a/custom/jao-custom-gnus.el b/custom/jao-custom-gnus.el index 0d75b43..597ef85 100644 --- a/custom/jao-custom-gnus.el +++ b/custom/jao-custom-gnus.el @@ -30,11 +30,13 @@ nndraft-directory (jao-gnus-dir "drafts") nnrss-directory (jao-gnus-dir "rss")) +(setq gnus-uncacheable-groups "^nnml") + ;;; looks ;;;; verbosity (setq gnus-verbose 4) ;;;; geometry -(defvar jao-gnus-use-three-panes t) +(defvar jao-gnus-use-three-panes (not jao-notmuch-enabled)) (defvar jao-gnus-groups-width 50) (defvar jao-gnus-wide-width 190) @@ -42,17 +44,13 @@ gnus-generate-tree-function 'gnus-generate-horizontal-tree gnus-tree-minimize-window nil) -(when jao-gnus-use-three-panes - - ;; (dolist (m '(calendar-mode org-agenda-mode gnus-group-mode)) - ;; (add-to-list 'display-buffer-alist `((major-mode . ,m) (dedicated t)))) - - (setq calendar-left-margin 6) +(setq calendar-left-margin 6) - (let ((side-bar '(vertical 1.0 +(defun jao-gnus-use-three-panes () + (let ((side-bar `(vertical 1.0 ("inbox.org" 0.4) ("*Org Agenda*" 1.0) - ("*Calendar*" 8))) + ("*Calendar*" ,(jao-d-l 9 8)))) (wide-len jao-gnus-wide-width) (groups-len jao-gnus-groups-width) (summary-len (- jao-gnus-wide-width jao-gnus-groups-width))) @@ -88,49 +86,63 @@ (article 100) ,side-bar))))) +(defun jao-gnus-use-two-panes () + (let ((wide-len jao-gnus-wide-width) + (groups-len jao-gnus-groups-width) + (summary-len (- jao-gnus-wide-width jao-gnus-groups-width)) + (msg-edit '(horizontal 1.0 + (message 1.0 point) + (vertical 0.5 + ("*Org Agenda*" 0.5) + ("inbox.org" 1.0))))) + (gnus-add-configuration + `(article + (horizontal 1.0 + (vertical ,groups-len (group 1.0)) + (vertical 1.0 + (summary 0.25 point) + (article 1.0))))) + + (gnus-add-configuration + `(group (horizontal 1.0 + (group 0.5 point) + (vertical 1.0 + ("*Org Agenda*" 1.0) + ("*Calendar*" 9))))) + + (gnus-add-configuration + `(summary + (horizontal 1.0 + (vertical ,groups-len (group 1.0)) + (vertical 1.0 (summary 1.0 point))))) + + (gnus-add-configuration `(message ,msg-edit)) + + (gnus-add-configuration `(forward ,msg-edit)) + + (gnus-add-configuration `(reply-yank ,msg-edit)) + + (gnus-add-configuration + `(reply (horizontal 1.0 + (message ,(- wide-len 100) point) + (article 1.0)))))) + +(if jao-gnus-use-three-panes + (jao-gnus-use-three-panes) + (jao-gnus-use-two-panes)) + ;;;; no blue icon (advice-add 'gnus-mode-line-buffer-identification :override #'identity) (setq gnus-mode-line-image-cache nil) ;;; search (setq gnus-search-use-parsed-queries nil - gnus-search-notmuch-raw-queries-p nil + gnus-search-notmuch-raw-queries-p t gnus-permanently-visible-groups "^nnselect:.*" gnus-search-ignored-newsgroups "nndraft.*\\|nnselect.*") -(with-eval-after-load "gnus-search" - (defclass gnus-search-recoll (gnus-search-indexed) - ((separator :type string :initform ".") - (program :initform "recoll") - (raw-queries-p :initform t))) - - (cl-defmethod gnus-search-indexed-extract ((_engine gnus-search-recoll)) - (prog1 (and (looking-at "^file://\\(.+\\)$") (list (match-string 1) 100)) - (forward-line 1))) - - (cl-defmethod gnus-search-transform-expression ((_engine gnus-search-recoll) - expr) - expr) - - (cl-defmethod gnus-search-indexed-search-command ((engine gnus-search-recoll) - (qstring string) - _query - &optional groups) - (let* ((subdir (slot-value engine 'remove-prefix)) - (sep (slot-value engine 'separator)) - (gdirs (mapcar (lambda (g) - (let ((g (gnus-group-short-name g))) - (replace-regexp-in-string "\\." sep g))) - (or groups - (and (not (string= "" subdir)) (list subdir))))) - (dirsq (and gdirs - (concat "(" - (mapconcat (lambda (d) (format "dir:%s" d)) - gdirs " OR ") - ")"))) - (q (concat "mime:message " dirsq " (" qstring ")"))) - ;; (message "query is: %s" q) - `("-b" "-t" "-q" ,q)))) +(use-package jao-recoll + :if (jao-is-linux)) ;; (add-to-list 'gnus-parameters '("^nnselect:.*" (nnselect-rescan . t))) @@ -184,26 +196,42 @@ nnml-get-new-mail t nnml-directory message-directory) +(defvar jao-local-mail-sources + (append (mapcar (lambda (f) + `(maildir :path ,(expand-file-name f jao-maildir))) + '("local/" "feeds/")) + (jao-when-darwin '((file :path "/var/mail/jao"))))) + +(defun jao-pm-label-mail-sources (pwd &rest labels) + (mapcar (lambda (b) + `(imap :server "127.0.0.1" :port 1143 + :user "jaor@pm.me" :password ,pwd + :stream starttls :predicate "1:*" + :fetchflag "\\Deleted \\Seen" + :mailbox ,(concat "Labels/#" b))) + (or labels '("inbox" "drivel" "hacking" "bills" "prog" "words")))) + +(defun jao-pm-folder-mail-sources (pwd &rest folders) + (mapcar (lambda (b) + `(imap :server "127.0.0.1" :port 1143 + :user "jaor@pm.me" :password ,pwd + :stream starttls :predicate "" + :fetchflag "" + :mailbox ,(if b (concat "Folders/" b) "INBOX"))) + (or folders '(nil "drivel" "hacking" "bills" "prog" "words")))) + (setq mail-sources (let* ((pwd (auth-source-pick-first-password :host "proton-bridge")) - (mds (mapcar (lambda (f) - `(maildir :path ,(expand-file-name f "~/var/mail/"))) - '("local/" "feeds/"))) - (ims (mapcar (lambda (b) - `(imap :server "127.0.0.1" :port 1143 - :user "mail@jao.io" :password ,pwd - :stream starttls :predicate "1:*" - :fetchflag "\\Deleted \\Seen" - :mailbox ,(concat "Labels/#" b))) - '("inbox" "drivel" "hacking" "bills" - "bigml" "prog" "words")))) - (append mds ims))) + (ims (jao-pm-label-mail-sources pwd))) + (append jao-local-mail-sources ims))) (when jao-gnus-use-nnml - (add-to-list - 'gnus-secondary-select-methods - `(nnml "" (gnus-search-engine gnus-search-recoll - (remove-prefix ,(jao-gnus-dir "Mail/")))))) + (let ((prefix (expand-file-name "gnus/" jao-maildir))) + (add-to-list + ;; `(nnml "" ,(jao-recoll-gnus-search-engine (jao-gnus-dir "Mail/"))) + 'gnus-secondary-select-methods + `(nnml "" (gnus-search-engine gnus-search-notmuch + (remove-prefix ,prefix)))))) (when jao-gnus-use-nnml (dolist (p jao-gnus-nnml-group-params) @@ -229,10 +257,12 @@ ;;; groups (setq gnus-group-line-format - " %m%S%p%3y%P%* %~(pad-right 30)G %B\n" + " %m%S%p%3y%P%* %~(pad-right 25)G %B\n" ;; " %m%S%p%P:%~(pad-right 35)c %3y %B\n" ;; " %m%S%p%3y%P%* %~(pad-right 30)C %B\n" - gnus-topic-line-format "%i[ %(%{%n%}%) -- %A ]%v\n" + ;; gnus-topic-line-format "%i[ %(%{%n%}%) -- %A ]%v\n" + gnus-face-2 'jao-themes-f11 + gnus-topic-line-format "%i %2{%~(pad-right 8)n ┄┄ %A%v%}\n" gnus-group-uncollapsed-levels 2 gnus-auto-select-subject 'unread gnus-large-newsgroup 2000) @@ -308,12 +338,14 @@ "\n")) (defun jao-gnus--set-summary-line (&optional w) - (let* ((d (if jao-gnus-use-three-panes (+ jao-gnus-groups-width 11) 12)) - (w (- (or w (window-width)) d))) + (let* ((d (if jao-gnus-use-three-panes + (+ jao-gnus-groups-width 11) + (+ jao-gnus-groups-width 12))) + (w (or w (if jao-gnus-use-three-panes (window-width) (frame-width)))) + (w (- w d))) (setq gnus-summary-line-format (format jao-gnus--summary-line-fmt w)))) (add-hook 'gnus-select-group-hook 'jao-gnus--set-summary-line) -;; (jao-gnus--set-summary-line 187) (add-to-list 'nnmail-extra-headers 'Cc) (add-to-list 'nnmail-extra-headers 'BCc) @@ -437,20 +469,49 @@ (use-package org-capture :config (add-to-list 'org-capture-templates + '("x" "arXiv" entry (file "notes/physics/arxiv.org") + "* %(jao-gnus-subject)\n\n %i\n\n %(jao-gnus-org-url)" + :immediate-finish t) + t) + (add-to-list 'org-capture-templates '("X" "arXiv" entry (file "notes/physics/arxiv.org") - "* %:subject\n %i" :immediate-finish t) + "* %(jao-gnus-subject)\n\n%(jao-gnus-org-paragraph \"%i\")" + :immediate-finish t) t) (org-capture-upgrade-templates org-capture-templates)) +(defvar jao-gnus-org-url nil) +(defun jao-gnus-org-url () jao-gnus-org-url) +(defun jao-gnus-org-paragraph (x) + (with-temp-buffer + (insert " " (string-trim (or x "")) "\n ") + (goto-char 0) + (fill-paragraph) + (goto-char (point-max)) + (open-rectangle 0 (point)) + (concat (buffer-string) "\n " (or jao-gnus-org-url "")))) +(defvar jao-gnus-subject nil) +(defun jao-gnus-subject () jao-gnus-subject) + (defun jao-gnus-arXiv-capture () (interactive) + (unless (derived-mode-p '(gnus-summary-mode)) (gnus-article-show-summary)) + (setq jao-gnus-subject (gnus-summary-article-subject)) (gnus-summary-select-article-buffer) (gnus-article-goto-part 0) - (forward-paragraph) - (setq-local transient-mark-mode 'lambda) - (set-mark (point)) - (goto-char (point-max)) - (org-capture nil "X")) + (let ((transient-mark-mode t)) + (set-mark (point)) + (forward-paragraph) + (or (and (save-excursion + (when (re-search-forward "^Link" nil t) + (beginning-of-line) + (setq jao-gnus-org-url (org-eww-url-below-point)))) + (org-capture nil "X")) + (and (save-excursion + (when (re-search-forward "^URL: " nil t) + (setq jao-gnus-org-url (thing-at-point-url-at-point)))) + (org-capture nil "x")))) + (gnus-article-show-summary)) ;;; article ;;;; config, headers @@ -466,6 +527,7 @@ (setq gnus-single-article-buffer nil) (setq gnus-article-update-lapsed-header 60) (setq gnus-article-update-date-headers 60) +(setq gnus-article-truncate-lines t) (with-eval-after-load "gnus-art" (setq gnus-visible-headers @@ -530,12 +592,21 @@ (save-excursion (goto-char (point-min)) (when (or (search-forward-regexp "^Via: h" nil t) - (search-forward-regexp "^URL: h" nil t) + (search-forward-regexp "^URL:[\n ]h" nil t) (and (search-forward-regexp "^Link$" nil t) (not (beginning-of-line)))) - (if external - (jao-browse-with-external-browser) - (browse-url (jao-url-around-point)))))) + (cond (external (jao-browse-with-external-browser)) + ((featurep 'jao-custom-eww) (eww (jao-url-around-point))) + (t (browse-url (jao-url-around-point))))))) + +(defun jao-gnus-from-eww (keep-eww-buffer) + (interactive "P") + (unless keep-eww-buffer (jao-eww-close)) + (jao-afio-goto-mail) + (gnus-article-show-summary)) + +(with-eval-after-load 'eww + (define-key eww-mode-map (kbd "h") #'jao-gnus-from-eww)) (defun jao-gnus-open-enclosure () (interactive) @@ -543,7 +614,7 @@ (gnus-summary-select-article-buffer) (save-excursion (goto-char (point-min)) - (let ((offset (or (and (search-forward-regexp "^Enclosure: " nil t) 2) + (let ((offset (or (and (search-forward-regexp "^Enclosure: ?" nil t) 2) (and (search-forward-regexp "^Enclosure$" nil t) -2)))) (when offset (forward-char offset)) (if-let ((url (jao-url-around-point))) @@ -574,9 +645,32 @@ (defun jao-gnus--scan () (let ((inhibit-message t)) (gnus-demon-scan-news) + (jao-shell-exec "notmuch-gnus-tags.sh") + (when-let* ((a (get-buffer "*Org Agenda*"))) + (with-current-buffer a (org-agenda-redo-all))) + (jao-gnus--notify))) + +(defun jao-gnus--scan-local-mail () + (let ((inhibit-message nil)) + (message "Scanning local news in demon...") + (let ((mail-sources jao-local-mail-sources)) + (gnus-demon-scan-news)) (jao-gnus--notify))) -(gnus-demon-add-handler 'jao-gnus--scan 5 1) +(defun jao-gnus-add-demon () + (interactive) + (gnus-demon-add-handler 'jao-gnus--scan 5 1)) + +(defun jao-gnus-remove-demon () + (interactive) + (gnus-demon-remove-handler 'jao-gnus--scan)) + +(jao-gnus-add-demon) +(gnus-demon-init) + +;; this is, in theory, not needed; but at some point in the way to emacs +;; version 31 this idle timers have ceased to work after a sleep/awake cycle +(jao-when-linux (add-to-list 'jao-sleep-awake-functions #'jao-gnus-add-demon)) ;;; add-ons ;;;; notifications @@ -584,18 +678,16 @@ (defvar jao-gnus-tracked-groups (let ((feeds (thread-first (directory-files mail-source-directory nil "feeds\\.[^e]") - (seq-difference '("feeds.trove"))))) - `(("nnml:bigml\\.inbox" "B" jao-themes-f00) - ("nnml:bigml\\.alba" "A" jao-themes-f00) - ("nnml:bigml\\.bugs" "b" jao-themes-error) - ("nnml:bigml\\.support" "S" default) + (seq-difference + '("feeds.trove" "feeds.emacs" "feeds.emacs-devel"))))) + `(("nnml:jao\\.bigml" "B" jao-themes-f00) ("nnml:jao\\.\\(inbox\\|trove\\)" "I" jao-themes-f01) - ("nnml:bigml\\.[^aibs]" "W" jao-themes-dimm) + ("nnml:jao.write" "W" jao-themes-warning) + ("nnml:jao.[^ithwb]" "J" jao-themes-dimm) ("nnml:jao.hacking" "H" jao-themes-dimm) - ("nnml:jao.write" "W" jao-themes-error) - ("nnml:jao.[^isthw]" "J" jao-themes-dimm) - (,(format "^nnml:%s" (regexp-opt feeds)) "F" jao-themes-dimm) - ("feeds\\.e" "E" jao-themes-dimm) + ;; (,(format "^nnml:%s" (regexp-opt feeds)) "F" jao-themes-dimm) + ;; ("feeds\\.emacs" "E" jao-themes-dimm) + ("nnml:feeds\\." "F" jao-themes-dimm) ("nnml:local" "l" jao-themes-dimm) ("nnrss:.*" "R" jao-themes-dimm) ("^\\(gwene\\|gmane\\)\\." "N" jao-themes-dimm)))) @@ -603,9 +695,17 @@ (defun jao-gnus--unread-counts () (seq-reduce (lambda (r g) (let ((n (gnus-group-unread (car g)))) - (if (and (numberp n) (> n 0)) (cons (cons (car g) n) r) r))) + (if (and (numberp n) (> n 0)) + (cons (+ n (car r)) + (cons (cons (car g) n) (cdr r))) + r))) gnus-newsrc-alist - ())) + '(0))) + +(defun jao-gnus-unread-count () + (seq-reduce (lambda (c g) (+ c (or (gnus-group-unread (car g)) 0))) + gnus-newsrc-alist + 0)) (defun jao-gnus--unread-label (counts rx label face) (let ((n (seq-reduce (lambda (n c) @@ -616,12 +716,20 @@ (defvar jao-gnus--notify-strs ()) +(defun jao-gnus--xbar-echo (labels) + (jao-shell-exec + (let* ((ls (mapconcat (lambda (x) (plist-get x :propertize)) labels " ")) + (m (when ls (format "%s | color=#8b3626 | size=11" ls)))) + (format "echo '%s' >/tmp/xbar" (or m " "))))) + (defun jao-gnus--notify-strs () - (let ((counts (jao-gnus--unread-counts))) - (seq-filter #'identity - (seq-map (lambda (args) - (apply 'jao-gnus--unread-label counts args)) - jao-gnus-tracked-groups)))) + (let* ((all (jao-gnus--unread-counts)) + (counts (cdr all)) + (labels (seq-keep (lambda (args) + (apply 'jao-gnus--unread-label counts args)) + jao-gnus-tracked-groups))) + (jao-when-darwin (jao-gnus--xbar-echo labels)) + labels)) (defun jao-gnus--notify () (setq jao-gnus--notify-strs (jao-gnus--notify-strs)) @@ -643,6 +751,7 @@ (jao-gnus--notify))) (add-hook 'gnus-summary-exit-hook #'jao-gnus--on-summary-exit) +(add-hook 'gnus-exit-group-hook #'jao-gnus--notify) ;;;; open mail file in gnus (defun jao-gnus-file-to-group (file &optional maildir newsdir m-server n-server) @@ -679,6 +788,7 @@ ;;;; afio (defun jao-gnus--on-afio-switch () (when (derived-mode-p 'gnus-group-mode) + (jao-gnus--notify) (let ((no (or (gnus-group-unread (gnus-group-group-name)) 0))) (unless (> no 0) (gnus-group-first-unread-group))))) @@ -717,6 +827,20 @@ (with-eval-after-load "consult-recoll" (add-to-list 'consult-recoll-open-fns '("message/rfc822" . jao-gnus-goto-file)))) +;;;; notmuch +(use-package jao-notmuch-gnus + :demand t + :init + (jao-when-darwin + (setq jao-notmuch-gnus-mail-directory + (expand-file-name "gnus" jao-maildir)))) + +(jao-load-path "consult-notmuch") + +(use-package consult-notmuch + :ensure t + :bind (:map gnus-group-mode-map ("/" . #'jao-gnus-consult-notmuch))) + ;;; keyboard shortcuts (define-key gnus-article-mode-map "i" 'jao-gnus-show-images) (define-key gnus-summary-mode-map "i" 'jao-gnus-show-images) @@ -728,3 +852,6 @@ (define-key gnus-summary-mode-map "e" 'jao-gnus-open-enclosure) (define-key gnus-summary-mode-map "\C-l" nil) (define-key gnus-group-mode-map "a" 'jao-gnus-refresh-workspace) + +(jao-when-darwin + (define-key gnus-group-mode-map "O" 'jao-mac-open-nnw)) |
