;;; gnus.el -*- lexical-binding: t; coding: utf-8-unix -*- ;; Author: Case Duckworth ;; Created: Sometime during Covid-19, 2020 ;; Keywords: configuration ;; URL: https://tildegit.org/acdw/emacs ;; This file is NOT part of GNU Emacs. ;;; License: ;; Everyone is permitted to do whatever with this software, without ;; limitation. This software comes without any warranty whatsoever, ;; but with two pieces of advice: ;; - Don't hurt yourself. ;; - Make good choices. ;;; Code: ;;; Private files (require 'acdw-private) ;;; Select Methods (setq gnus-select-method '(nnnil "")) (add-hook 'gnus-startup-hook (defun gnus-startup@feed-setup () (cond ((fboundp #'gnus/init-feed-list) (gnus/init-feed-list)) ((and (fboundp #'gnus/import-feed-list) (file-exists-p (expand-file-name "feeds.txt" user-emacs-directory))) (gnus/import-feed-list (expand-file-name "feeds.txt" user-emacs-directory))) (t (message "Oops, no feeds :/"))))) ;;; Gnus cloud (setq gnus-cloud-storage-method nil ; Don't always have GPG or gzip gnus-cloud-covered-servers '("nntp:news.tilde.club" "nntp:news.gwene.org" "nntp:news.gmane.io")) (add-hook 'gnus-started-hook #'gnus-cloud-download-all-data) (add-hook 'gnus-exit-gnus-hook #'gnus-cloud-upload-all-data) ;;; Gnus behavior options (setq gnus-gcc-mark-as-read t message-signature (or (file-exists-p message-signature-file) "~ acdw") gnus-startup-file (expand-file-name "newsrc" gnus-home-directory) gnus-save-newsrc-file nil gnus-read-newsrc-file nil gnus-read-active-file 'some gnus-always-read-dribble-file t gnus-interactive-exit nil gnus-use-cache t) ;; Keybindings (define-key gnus-group-mode-map (kbd "q") (defun gnus-cloud-upload-and-bury-buffer () (interactive) (gnus-cloud-upload-all-data) (bury-buffer))) (define-key gnus-group-mode-map (kbd "Q") #'gnus-group-exit) (define-key gnus-group-mode-map (kbd "C-q") #'gnus-group-quit) ;;; Other parameters (setq gnus-parameters '(("fastmail.com:.*" (display . 200) (expiry-wait . immediate) (expiry-target . "nnimap+fastmail.com:Archive")))) ;;; Gnus UI options (setq gnus-thread-sort-functions '(gnus-thread-sort-by-most-recent-date (not gnus-thread-sort-by-number)) gnus-use-cache t gnus-summary-thread-gathering-function #'gnus-gather-threads-by-subject gnus-thread-hide-subtree t gnus-thread-ignore-subject t gnus-html-frame-width fill-column) (when window-system (setq gnus-sum-thread-tree-indent " ") (setq gnus-sum-thread-tree-root "● ") (setq gnus-sum-thread-tree-false-root "○ ") (setq gnus-sum-thread-tree-single-indent "◎ ") (setq gnus-sum-thread-tree-vertical "│") (setq gnus-sum-thread-tree-leaf-with-other "├─ ") (setq gnus-sum-thread-tree-single-leaf "╰─ ")) (setq gnus-summary-line-format (concat "%0{%U%R%z%}" "%3{│%}" "%1{%d%}" "%3{│%}" ; date " " "%4{%-20,20f%}" ; name " " "%3{│%}" " " "%1{%B%}" "%s\n")) (setq gnus-summary-display-arrow t) (add-hook 'gnus-group-mode-hook #'hl-line-mode) (add-hook 'gnus-article-mode-hook #'acdw/reading-mode) ;;; MIME types (setq mm-discouraged-alternatives '("text/html" "text/richtext")) (with-eval-after-load 'mailcap (cond ((eq system-type 'darwin)) ((eq system-type 'windows-nt)) (t (mailcap-parse-mailcaps)))) ;;; Composing mail (add-hook 'message-mode-hook (defun message-mode@setup () (flyspell-mode +1) (local-set-key (kbd "TAB") #'bbdb-complete-mail))) ;;; Packages ;; searching (?) (require 'nnir) ;; contacts (setup (:straight bbdb) (require 'bbdb) (bbdb-initialize 'message 'gnus 'mail) (bbdb-insinuate-message) (add-hook 'gnus-startup-hook 'bbdb-insinuate-gnus) (:option bbdb/gnus-summary-prefer-real-names t bbdb/mail-auto-create-p t bbdb/news-auto-create-p t bbdb-use-pop-up t bbdb-offer-save 1 bbdb-update-records-p t)) ;;; Functions ;; see https://wpc.io/blog/posts/bulk-import-rss-feeds-to-gnus-via-gwene.html (defun gnus/slurp (file) "Read FILE into a string." (with-temp-buffer (insert-file-contents file) (buffer-substring-no-properties (point-min) (point-max)))) (defun gnus/import-feed-list (path) "Import list of NNTP feeds from file at PATH." (interactive "F") (let ((feeds (split-string (gnus/slurp path) "\n" t))) (cl-loop for feed in feeds do (with-message (format "Subscribing to %s" feed) (gnus-subscribe-group feed)))))