emacs/gnus.el

157 lines
4.9 KiB
EmacsLisp

;;; gnus.el -*- lexical-binding: t; coding: utf-8-unix -*-
;; Author: Case Duckworth <acdw@acdw.net>
;; 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)))))