Assimilate emmet-mode 1.0.8-119-g1acb821
[~bandali/configs] / init.el
diff --git a/init.el b/init.el
index 184ae64..01ee10a 100644 (file)
--- a/init.el
+++ b/init.el
@@ -1,6 +1,6 @@
 ;;; init.el --- bandali's emacs configuration -*- lexical-binding: t -*-
 
-;; Copyright (C) 2018-2019  Amin Bandali <bandali@gnu.org>
+;; Copyright (C) 2018-2020  Amin Bandali <bandali@gnu.org>
 
 ;; This program is free software: you can redistribute it and/or modify
 ;; it under the terms of the GNU General Public License as published by
 ;; https://www.gnu.org/software/emacs/manual/html_node/emacs/Emacs-Server.html#Emacs-Server
 (use-package server
   :defer 0.5
-  :config (or (server-running-p) (server-mode)))
+  :config
+  (declare-function server-edit "server")
+  (bind-key "C-c F D" 'server-edit)
+  (declare-function server-running-p "server")
+  (or (server-running-p) (server-mode)))
 
 \f
 ;;; Useful utilities
   "Open current file with a PROGRAM."
   ;; Shell command looks like this: "program [ARGS]... FILE" (ARGS can
   ;; be nil, so remove it).
+  (declare-function dired-get-file-for-visit "dired")
   (apply #'b/start-process
          program
          (remove nil (list args (dired-get-file-for-visit)))))
@@ -234,6 +239,17 @@ For disabling the behaviour for certain buffers and/or modes."
   (interactive)
   (kill-buffer (current-buffer)))
 
+(defun b/move-indentation-or-beginning-of-line (arg)
+  "Move to the indentation or to the beginning of line."
+  (interactive "^p")
+  ;; (if (bolp)
+  ;;     (back-to-indentation)
+  ;;   (move-beginning-of-line arg))
+  (if (= (point)
+         (progn (back-to-indentation)
+                (point)))
+      (move-beginning-of-line arg)))
+
 \f
 ;;; Defaults
 
@@ -485,10 +501,12 @@ For disabling the behaviour for certain buffers and/or modes."
 ;;; General bindings
 
 (bind-keys
+ ("C-a"     . b/move-indentation-or-beginning-of-line)
  ("C-c a i" . ielm)
 
  ("C-c e b" . eval-buffer)
  ("C-c e e" . eval-last-sexp)
+ ("C-c e p" . pp-macroexpand-last-sexp)
  ("C-c e r" . eval-region)
 
  ("C-c e i" . emacs-init-time)
@@ -501,7 +519,6 @@ For disabling the behaviour for certain buffers and/or modes."
 
  ("C-c F m" . make-frame-command)
  ("C-c F d" . delete-frame)
- ("C-c F D" . server-edit)
 
  ("C-S-h C" . describe-char)
  ("C-S-h F" . describe-face)
@@ -551,6 +568,8 @@ For disabling the behaviour for certain buffers and/or modes."
          ("C-c g b" . magit-blame-addition)
          ("C-c g l" . magit-log-buffer-file))
   :config
+  (declare-function magit-add-section-hook "magit-section"
+                    (hook function &optional at append local))
   (magit-add-section-hook 'magit-status-sections-hook
                           'magit-insert-modules
                           'magit-insert-stashes
@@ -564,6 +583,7 @@ For disabling the behaviour for certain buffers and/or modes."
   (nconc magit-section-initial-visibility-alist
          '(([unpulled status] . show)
            ([unpushed status] . show)))
+  (declare-function magit-display-buffer-fullframe-status-v1 "magit-mode" (buffer))
   :custom
   (magit-diff-refine-hunk t)
   (magit-display-buffer-function #'magit-display-buffer-fullframe-status-v1)
@@ -611,7 +631,6 @@ For disabling the behaviour for certain buffers and/or modes."
    ("h"   . outline-hide-subtree)
    ("s"   . outline-show-subtree)))
 
-(comment
 (use-package ls-lisp
   :custom (ls-lisp-dirs-first t))
 
@@ -633,6 +652,25 @@ For disabling the behaviour for certain buffers and/or modes."
   :bind (:map doc-view-mode-map
               ("M-RET" . image-previous-line)))
 
+;; Email (with Gnus, message, and EBDB)
+(require 'bandali-gnus)
+(use-package sendmail
+  :config
+  (setq sendmail-program (executable-find "msmtp")
+        ;; message-sendmail-extra-arguments '("-v" "-d")
+        mail-specify-envelope-from t
+        mail-envelope-from 'header))
+(require 'bandali-message)
+(require 'bandali-ebdb)
+
+;; IRC (with ERC and ZNC)
+(require 'bandali-erc)
+
+(use-package scpaste
+  :config
+  (setq scpaste-http-destination "https://p.bndl.org"
+        scpaste-scp-destination "p:~"))
+
 \f
 ;;; Editing
 
@@ -642,7 +680,9 @@ For disabling the behaviour for certain buffers and/or modes."
   :config
   (setq diff-hl-draw-borders nil)
   (global-diff-hl-mode)
-  :hook (magit-post-refresh . diff-hl-magit-post-refresh))
+  :hook
+  ((magit-pre-refresh . diff-hl-magit-pre-refresh)
+   (magit-post-refresh . diff-hl-magit-post-refresh)))
 
 ;; display Lisp objects at point in the echo area
 (use-package eldoc
@@ -693,8 +733,8 @@ For disabling the behaviour for certain buffers and/or modes."
 (use-package conf-mode
   :mode "\\.*rc$")
 
-(use-package sh-mode
-  :mode "\\.bashrc$")
+(use-package sh-script
+  :mode ("\\.bashrc$" . sh-mode))
 
 (use-package company
   :disabled
@@ -715,6 +755,7 @@ For disabling the behaviour for certain buffers and/or modes."
   )
 
 (use-package flycheck
+  :disabled
   :defer 0.6
   :hook (prog-mode . flycheck-mode)
   :bind
@@ -729,10 +770,11 @@ For disabling the behaviour for certain buffers and/or modes."
   (setq flycheck-check-syntax-automatically '(mode-enabled save))
   :custom (flycheck-mode-line-prefix "flyc"))
 
-(use-package flyspell)
+;; (use-package flyspell)
 
 ;; http://endlessparentheses.com/ispell-and-apostrophes.html
 (use-package ispell
+  :disabled
   :defer 0.6
   :config
   ;; ’ can be part of a word
@@ -773,31 +815,31 @@ For disabling the behaviour for certain buffers and/or modes."
 (use-package reveal
   :hook (emacs-lisp-mode . reveal-mode))
 
-(use-package elisp-mode)
-
-;; (use-package alloy-mode
-;;   :straight (:host github :repo "dwwmmn/alloy-mode")
-;;   :mode "\\.\\(als\\|dsh\\)\\'"
-;;   :config
-;;   (setq alloy-basic-offset 2)
-;;   ;; (defun b/alloy-simple-indent (start end)
-;;   ;;   (interactive "r")
-;;   ;;   ;; (if (region-active-p)
-;;   ;;   ;;     (indent-rigidly start end alloy-basic-offset)
-;;   ;;   ;;   (if (bolp)
-;;   ;;   ;;       (indent-rigidly (line-beginning-position)
-;;   ;;   ;;                       (line-end-position)
-;;   ;;   ;;                       alloy-basic-offset)))
-;;   ;;   (indent-to (+ (current-column) alloy-basic-offset)))
-;;   :bind (:map alloy-mode-map
-;;               ("RET" . electric-newline-and-maybe-indent)
-;;               ;; ("TAB" . b/alloy-simple-indent)
-;;               ("TAB" . indent-for-tab-command))
-;;   :hook (alloy-mode . (lambda () (setq-local indent-tabs-mode nil))))
-
-(eval-when-compile (defvar lean-mode-map))
+;; (use-package elisp-mode)
+
+(use-package alloy-mode
+  :mode "\\.\\(als\\|dsh\\)\\'"
+  :config
+  (setq alloy-basic-offset 2)
+  ;; (defun b/alloy-simple-indent (start end)
+  ;;   (interactive "r")
+  ;;   ;; (if (region-active-p)
+  ;;   ;;     (indent-rigidly start end alloy-basic-offset)
+  ;;   ;;   (if (bolp)
+  ;;   ;;       (indent-rigidly (line-beginning-position)
+  ;;   ;;                       (line-end-position)
+  ;;   ;;                       alloy-basic-offset)))
+  ;;   (indent-to (+ (current-column) alloy-basic-offset)))
+  :bind (:map alloy-mode-map
+              ("RET" . electric-newline-and-maybe-indent)
+              ;; ("TAB" . b/alloy-simple-indent)
+              ("TAB" . indent-for-tab-command))
+  :hook (alloy-mode . (lambda () (setq-local indent-tabs-mode nil))))
+
 (use-package lean-mode
+  :disabled
   :defer 0.4
+  :init (eval-when-compile (defvar lean-mode-map))
   :bind (:map lean-mode-map
               ("S-SPC" . company-complete))
   :config
@@ -809,7 +851,7 @@ For disabling the behaviour for certain buffers and/or modes."
         lean-input-user-translations '(("/" "/")))
   (lean-input-setup))
 
-(use-package mhtml-mode)
+;; (use-package mhtml-mode)
 
 (use-package sgml-mode
   :config
@@ -828,23 +870,27 @@ For disabling the behaviour for certain buffers and/or modes."
   (setq emmet-move-cursor-between-quotes t)
   :hook (css-mode html-mode sgml-mode))
 
-(use-package geiser)
+(use-package geiser
+  :disabled)
 
 (use-package geiser-guile
+  :disabled
   :config
   (setq geiser-guile-load-path "~/src/git/guix"))
 
-(use-package guix)
+(use-package guix
+  :disabled)
 
-(comment
-  (use-package auctex
-    :custom
-    (font-latex-fontify-sectioning 'color)))
+(use-package auctex
+  :disabled
+  :custom
+  (font-latex-fontify-sectioning 'color))
 
 (use-package go-mode
   :disabled)
 
 (use-package po-mode
+  :disabled
   :hook
   (po-mode . (lambda () (run-with-timer 0.1 nil 'View-exit))))
 
@@ -863,6 +909,7 @@ For disabling the behaviour for certain buffers and/or modes."
 \f
 ;;; Theme
 
+(comment
 (add-to-list 'custom-theme-load-path
              (expand-file-name
               (convert-standard-filename "lisp") user-emacs-directory))
@@ -1240,12 +1287,7 @@ For disabling the behaviour for certain buffers and/or modes."
 
 (use-package window
   :bind
-  (("C-c w e"   . (lambda ()
-                    (interactive)
-                    (split-window-right)
-                    (other-window 1)
-                    (erc-switch-to-buffer)))
-   ("C-c w s l" . (lambda ()
+  (("C-c w s l" . (lambda ()
                     (interactive)
                     (split-window-right)
                     (other-window 1)))
@@ -1336,12 +1378,6 @@ For disabling the behaviour for certain buffers and/or modes."
   :config
   (eosd-start))
 
-(use-package scpaste
-  :disabled
-  :config
-  (setq scpaste-http-destination "https://p.bndl.org"
-        scpaste-scp-destination "nix:/var/www/p.bndl.org"))
-
 (use-package eww
   :bind ("C-c a e w" . eww)
   :custom
@@ -1349,633 +1385,6 @@ For disabling the behaviour for certain buffers and/or modes."
                            (getenv "XDG_DOWNLOAD_DIR"))))
 
 \f
-;;; Email (with Gnus)
-
-(defvar b/maildir (expand-file-name "~/mail/"))
-(with-eval-after-load 'recentf
-  (add-to-list 'recentf-exclude b/maildir))
-
-(setq
- b/gnus-init-file  (b/etc "gnus")
- mail-user-agent   'gnus-user-agent
- read-mail-command 'gnus)
-
-(use-package gnus
-  :bind (("s-m"     . gnus-plugged)
-         ("s-M"     . gnus-unplugged)
-         ("C-c a m" . gnus-plugged)
-         ("C-c a M" . gnus-unplugged))
-  :init
-  (setq
-   gnus-select-method '(nnnil "")
-   gnus-secondary-select-methods
-   '((nnimap "shemshak"
-             (nnimap-stream plain)
-             (nnimap-address "127.0.0.1")
-             (nnimap-server-port 143)
-             (nnimap-authenticator plain)
-             (nnimap-user "amin@shemshak.local"))
-     (nnimap "gnu"
-             (nnimap-stream plain)
-             (nnimap-address "127.0.0.1")
-             (nnimap-server-port 143)
-             (nnimap-authenticator plain)
-             (nnimap-user "bandali@gnu.local")
-             (nnimap-inbox "INBOX")
-             (nnimap-split-methods 'nnimap-split-fancy)
-             (nnimap-split-fancy (|
-                                  ;; (: gnus-registry-split-fancy-with-parent)
-                                  ;; (: gnus-group-split-fancy "INBOX" t "INBOX")
-                                  ;; gnu
-                                  (list ".*<\\(.*\\)\\.\\(non\\)?gnu\\.org>.*" "l.\\1")
-                                  ;; gnus
-                                  (list ".*<\\(.*\\)\\.gnus\\.org>.*" "l.\\1")
-                                  ;; libreplanet
-                                  (list ".*<\\(.*\\)\\.libreplanet\\.org>.*" "l.\\1")
-                                  ;; *.lists.sr.ht, omitting one dot if present
-                                  ;;    add more \\.?\\([^.]*\\) if needed
-                                  (list ".*<~\\(.*\\)/\\([^.]*\\)\\.?\\([^.]*\\)\\.lists.sr.ht>.*" "l.~\\1.\\2\\3")
-                                  ;; webmasters
-                                  (from "webmasters\\(-comment\\)?@gnu\\.org" "webmasters")
-                                  ;; other
-                                  (list ".*atreus.freelists.org" "l.atreus")
-                                  (list ".*deepspec.lists.cs.princeton.edu" "l.deepspec")
-                                  ;; (list ".*haskell-art.we.lurk.org" "l.haskell.art") ;d
-                                  (list ".*haskell-cafe.haskell.org" "l.haskell-cafe")
-                                  ;; (list ".*notmuch.notmuchmail.org" "l.notmuch") ;u
-                                  ;; (list ".*dev.lists.parabola.nu" "l.parabola-dev") ;u
-                                  ;; ----------------------------------
-                                  ;; legend: (u)nsubscribed | (d)ead
-                                  ;; ----------------------------------
-                                  ;; otherwise, leave mail in INBOX
-                                  "INBOX")))
-     (nnimap "uw"
-             (nnimap-stream plain)
-             (nnimap-address "127.0.0.1")
-             (nnimap-server-port 143)
-             (nnimap-authenticator plain)
-             (nnimap-user "abandali@uw.local")
-             (nnimap-inbox "INBOX")
-             (nnimap-split-methods 'nnimap-split-fancy)
-             (nnimap-split-fancy (|
-                                  ;; (: gnus-registry-split-fancy-with-parent)
-                                  ;; se212-f19
-                                  ("subject" "SE\\s-?212" "course.se212-f19")
-                                  (from "SE\\s-?212" "course.se212-f19")
-                                  ;; catch-all
-                                  "INBOX")))
-     (nnimap "csc"
-             (nnimap-stream plain)
-             (nnimap-address "127.0.0.1")
-             (nnimap-server-port 143)
-             (nnimap-authenticator plain)
-             (nnimap-user "abandali@csc.uw.local")))
-   gnus-message-archive-group "nnimap+gnu:INBOX"
-   gnus-parameters
-   '(("l\\.atreus"
-      (to-address . "atreus@freelists.org")
-      (to-list    . "atreus@freelists.org"))
-     ("l\\.deepspec"
-      (to-address . "deepspec@lists.cs.princeton.edu")
-      (to-list    . "deepspec@lists.cs.princeton.edu")
-      (list-identifier . "\\[deepspec\\]"))
-     ("l\\.emacs-devel"
-      (to-address . "emacs-devel@gnu.org")
-      (to-list    . "emacs-devel@gnu.org"))
-     ("l\\.help-gnu-emacs"
-      (to-address . "help-gnu-emacs@gnu.org")
-      (to-list    . "help-gnu-emacs@gnu.org"))
-     ("l\\.info-gnu-emacs"
-      (to-address . "info-gnu-emacs@gnu.org")
-      (to-list    . "info-gnu-emacs@gnu.org"))
-     ("l\\.emacs-orgmode"
-      (to-address . "emacs-orgmode@gnu.org")
-      (to-list    . "emacs-orgmode@gnu.org")
-      (list-identifier . "\\[O\\]"))
-     ("l\\.emacs-tangents"
-      (to-address . "emacs-tangents@gnu.org")
-      (to-list    . "emacs-tangents@gnu.org"))
-     ("l\\.emacsconf-committee"
-      (to-address . "emacsconf-committee@gnu.org")
-      (to-list    . "emacsconf-committee@gnu.org"))
-     ("l\\.emacsconf-discuss"
-      (to-address . "emacsconf-discuss@gnu.org")
-      (to-list    . "emacsconf-discuss@gnu.org"))
-     ("l\\.emacsconf-register"
-      (to-address . "emacsconf-register@gnu.org")
-      (to-list    . "emacsconf-register@gnu.org"))
-     ("l\\.emacsconf-submit"
-      (to-address . "emacsconf-submit@gnu.org")
-      (to-list    . "emacsconf-submit@gnu.org"))
-     ("l\\.fencepost-users"
-      (to-address . "fencepost-users@gnu.org")
-      (to-list    . "fencepost-users@gnu.org")
-      (list-identifier . "\\[Fencepost-users\\]"))
-     ("l\\.gnewsense-art"
-      (to-address . "gnewsense-art@nongnu.org")
-      (to-list    . "gnewsense-art@nongnu.org")
-      (list-identifier . "\\[gNewSense-art\\]"))
-     ("l\\.gnewsense-dev"
-      (to-address . "gnewsense-dev@nongnu.org")
-      (to-list    . "gnewsense-dev@nongnu.org")
-      (list-identifier . "\\[Gnewsense-dev\\]"))
-     ("l\\.gnewsense-users"
-      (to-address . "gnewsense-users@nongnu.org")
-      (to-list    . "gnewsense-users@nongnu.org")
-      (list-identifier . "\\[gNewSense-users\\]"))
-     ("l\\.gnunet-developers"
-      (to-address . "gnunet-developers@gnu.org")
-      (to-list    . "gnunet-developers@gnu.org")
-      (list-identifier . "\\[GNUnet-developers\\]"))
-     ("l\\.help-gnunet"
-      (to-address . "help-gnunet@gnu.org")
-      (to-list    . "help-gnunet@gnu.org")
-      (list-identifier . "\\[Help-gnunet\\]"))
-     ("l\\.bug-gnuzilla"
-      (to-address . "bug-gnuzilla@gnu.org")
-      (to-list    . "bug-gnuzilla@gnu.org")
-      (list-identifier . "\\[Bug-gnuzilla\\]"))
-     ("l\\.gnuzilla-dev"
-      (to-address . "gnuzilla-dev@gnu.org")
-      (to-list    . "gnuzilla-dev@gnu.org")
-      (list-identifier . "\\[Gnuzilla-dev\\]"))
-     ("l\\.guile-devel"
-      (to-address . "guile-devel@gnu.org")
-      (to-list    . "guile-devel@gnu.org"))
-     ("l\\.guile-user"
-      (to-address . "guile-user@gnu.org")
-      (to-list    . "guile-user@gnu.org"))
-     ("l\\.guix-devel"
-      (to-address . "guix-devel@gnu.org")
-      (to-list    . "guix-devel@gnu.org"))
-     ("l\\.help-guix"
-      (to-address . "help-guix@gnu.org")
-      (to-list    . "help-guix@gnu.org"))
-     ("l\\.info-guix"
-      (to-address . "info-guix@gnu.org")
-      (to-list    . "info-guix@gnu.org"))
-     ("l\\.savannah-hackers-public"
-      (to-address . "savannah-hackers-public@gnu.org")
-      (to-list    . "savannah-hackers-public@gnu.org"))
-     ("l\\.savannah-users"
-      (to-address . "savannah-users@gnu.org")
-      (to-list    . "savannah-users@gnu.org"))
-     ("l\\.www-commits"
-      (to-address . "www-commits@gnu.org")
-      (to-list    . "www-commits@gnu.org"))
-     ("l\\.www-discuss"
-      (to-address . "www-discuss@gnu.org")
-      (to-list    . "www-discuss@gnu.org"))
-     ("l\\.haskell-art"
-      (to-address . "haskell-art@we.lurk.org")
-      (to-list    . "haskell-art@we.lurk.org")
-      (list-identifier . "\\[haskell-art\\]"))
-     ("l\\.haskell-cafe"
-      (to-address . "haskell-cafe@haskell.org")
-      (to-list    . "haskell-cafe@haskell.org")
-      (list-identifier . "\\[Haskell-cafe\\]"))
-     ("l\\.notmuch"
-      (to-address . "notmuch@notmuchmail.org")
-      (to-list    . "notmuch@notmuchmail.org"))
-     ("l\\.parabola-dev"
-      (to-address . "dev@lists.parabola.nu")
-      (to-list    . "dev@lists.parabola.nu")
-      (list-identifier . "\\[Dev\\]"))
-     ("l\\.~bandali\\.public-inbox"
-      (to-address . "~bandali/public-inbox@lists.sr.ht")
-      (to-list    . "~bandali/public-inbox@lists.sr.ht"))
-     ("l\\.~sircmpwn\\.free-writers-club"
-      (to-address . "~sircmpwn/free-writers-club@lists.sr.ht")
-      (to-list    . "~sircmpwn/free-writers-club@lists.sr.ht"))
-     ("l\\.~sircmpwn\\.srht-admins"
-      (to-address . "~sircmpwn/sr.ht-admins@lists.sr.ht")
-      (to-list    . "~sircmpwn/sr.ht-admins@lists.sr.ht"))
-     ("l\\.~sircmpwn\\.srht-announce"
-      (to-address . "~sircmpwn/sr.ht-announce@lists.sr.ht")
-      (to-list    . "~sircmpwn/sr.ht-announce@lists.sr.ht"))
-     ("l\\.~sircmpwn\\.srht-dev"
-      (to-address . "~sircmpwn/sr.ht-dev@lists.sr.ht")
-      (to-list    . "~sircmpwn/sr.ht-dev@lists.sr.ht"))
-     ("l\\.~sircmpwn\\.srht-discuss"
-      (to-address . "~sircmpwn/sr.ht-discuss@lists.sr.ht")
-      (to-list    . "~sircmpwn/sr.ht-discuss@lists.sr.ht"))
-     ("webmasters"
-      (to-address . "webmasters@gnu.org")
-      (to-list    . "webmasters@gnu.org"))
-     ("gnu.*"
-      (gcc-self . t))
-     ("l\\."
-      (subscribed . t))
-     ("nnimap\\+uw:.*"
-      (gcc-self . t)))
-   gnus-large-newsgroup  50
-   gnus-home-directory   (b/var "gnus/")
-   gnus-directory        (concat gnus-home-directory "news/")
-   message-directory     (concat gnus-home-directory "mail/")
-   nndraft-directory     (concat gnus-home-directory "drafts/")
-   gnus-save-newsrc-file nil
-   gnus-read-newsrc-file nil
-   gnus-interactive-exit nil
-   gnus-gcc-mark-as-read t)
-  :config
-  (when (version< emacs-version "27")
-    (with-eval-after-load 'nnmail
-      (add-to-list
-       'nnmail-split-abbrev-alist
-       '(list . "list-id\\|list-post\\|x-mailing-list\\|x-beenthere\\|x-loop")
-       t)))
-
-  ;; (gnus-registry-initialize)
-
-  (with-eval-after-load 'recentf
-    (add-to-list 'recentf-exclude gnus-home-directory)))
-
-(use-package gnus-art
-  :config
-  (setq
-   gnus-buttonized-mime-types '("multipart/\\(signed\\|encrypted\\)")
-   gnus-sorted-header-list '("^From:"
-                             "^X-RT-Originator"
-                             "^Newsgroups:"
-                             "^Subject:"
-                             "^Date:"
-                             "^Envelope-To:"
-                             "^Followup-To:"
-                             "^Reply-To:"
-                             "^Organization:"
-                             "^Summary:"
-                             "^Abstract:"
-                             "^Keywords:"
-                             "^To:"
-                             "^[BGF]?Cc:"
-                             "^Posted-To:"
-                             "^Mail-Copies-To:"
-                             "^Mail-Followup-To:"
-                             "^Apparently-To:"
-                             "^Resent-From:"
-                             "^User-Agent:"
-                             "^X-detected-operating-system:"
-                             "^Message-ID:"
-                             ;; "^References:"
-                             "^List-Id:"
-                             "^Gnus-Warning:")
-   gnus-visible-headers (mapconcat 'identity
-                                   gnus-sorted-header-list
-                                   "\\|")
-  ;; local-lapsed article dates
-  ;; from https://www.emacswiki.org/emacs/GnusFormatting#toc11
-  gnus-article-date-headers '(user-defined)
-  gnus-article-time-format
-  (lambda (time)
-    (let* ((date (format-time-string "%a, %d %b %Y %T %z" time))
-           (local (article-make-date-line date 'local))
-           (combined-lapsed (article-make-date-line date
-                                                    'combined-lapsed))
-           (lapsed (progn
-                     (string-match " (.+" combined-lapsed)
-                     (match-string 0 combined-lapsed))))
-      (concat local lapsed))))
-  (bind-keys
-   :map gnus-article-mode-map
-   ("M-L" . org-store-link)))
-
-(use-package gnus-sum
-  :bind (:map gnus-summary-mode-map
-              :prefix-map b/gnus-summary-prefix-map
-              :prefix "v"
-              ("r" . gnus-summary-reply)
-              ("w" . gnus-summary-wide-reply)
-              ("v" . gnus-summary-show-raw-article))
-  :config
-  (bind-keys
-   :map gnus-summary-mode-map
-   ("M-L" . org-store-link))
-  :hook (gnus-summary-mode . b/no-mouse-autoselect-window)
-  :custom
-  (gnus-thread-sort-functions '(gnus-thread-sort-by-number
-                                gnus-thread-sort-by-subject
-                                gnus-thread-sort-by-date)))
-
-(use-package gnus-msg
-  :config
-  (defvar b/shemshak-signature "Amin Bandali
-https://shemshak.org/~amin")
-  (defvar b/uw-signature "Amin Bandali, MMath Student
-Cheriton School of Computer Science
-University of Waterloo
-https://bandali.eu.org")
-  (defvar b/csc-signature "Amin Bandali
-System Administrator, Systems Committee
-Computer Science Club, University of Waterloo
-https://csclub.uwaterloo.ca/~abandali")
-  (setq gnus-message-replysign t
-        gnus-posting-styles
-        '((".*"
-           (address "bandali@gnu.org"))
-          ("nnimap\\+gnu:l\\..*"
-           (signature nil))
-          ("nnimap\\+gnu:.*"
-           (organization "GNU"))
-          ((header "subject" "ThankCRM")
-           (to "webmasters-comment@gnu.org")
-           (body "")
-           (eval (setq b/message-cite-say-hi nil)))
-          ("nnimap\\+shemshak:.*"
-           (address "amin@shemshak.org")
-           (body "\nBest,\n")
-           (signature b/shemshak-signature)
-           (gcc "nnimap+shemshak:Sent")
-           (eval (setq b/message-cite-say-hi t)))
-          ("nnimap\\+uw:.*"
-           (address "bandali@uwaterloo.ca")
-           (body "\nBest,\n")
-           (signature b/uw-signature))
-          ("nnimap\\+uw:INBOX"
-           (gcc "\"nnimap+uw:Sent Items\""))
-          ("nnimap\\+csc:.*"
-           (address "bandali@csclub.uwaterloo.ca")
-           (signature b/csc-signature)
-           (gcc "nnimap+csc:Sent"))))
-  :hook (gnus-message-setup . (lambda ()
-                                (unless (mml-secure-is-encrypted-p)
-                                  (mml-secure-message-sign)))))
-
-(use-package gnus-topic
-  :hook (gnus-group-mode . gnus-topic-mode)
-  :config (setq gnus-topic-line-format "%i[ %A: %(%{%n%}%) ]%v\n"))
-
-(use-package gnus-agent
-  :config
-  (setq gnus-agent-synchronize-flags 'ask)
-  :hook (gnus-group-mode . gnus-agent-mode))
-
-(use-package gnus-group
-  :config
-  (setq gnus-permanently-visible-groups "\\(:INBOX$\\|:gnu$\\)"))
-
-(comment
-  ;; problematic with ebdb's popup, *EBDB-Gnus*
-  (use-package gnus-win
-    :config
-    (setq gnus-use-full-window nil)))
-
-(use-package gnus-dired
-  :commands gnus-dired-mode
-  :init
-  (add-hook 'dired-mode-hook 'gnus-dired-mode))
-
-(comment
-  (use-package gnus-utils
-    :custom
-    (gnus-completing-read-function 'gnus-ido-completing-read)))
-
-(use-package mm-decode
-  :config
-  (setq mm-discouraged-alternatives '("text/html" "text/richtext")
-        mm-decrypt-option 'known
-        mm-verify-option 'known))
-
-(use-package mm-uu
-  :config
-  (when (version< "27" emacs-version)
-    (set-face-attribute 'mm-uu-extract nil :extend t))
-  :custom
-  (mm-uu-diff-groups-regexp
-   "\\(gmane\\|gnu\\|l\\)\\..*\\(diff\\|commit\\|cvs\\|bug\\|dev\\)"))
-
-(use-package sendmail
-  :config
-  (setq sendmail-program (executable-find "msmtp")
-        ;; message-sendmail-extra-arguments '("-v" "-d")
-        mail-specify-envelope-from t
-        mail-envelope-from 'header))
-
-(use-package message
-  :bind (:map message-mode-map ("<C-return>" . b/insert-asterism))
-  :config
-  ;; redefine for a simplified In-Reply-To header
-  ;; (see https://todo.sr.ht/~sircmpwn/lists.sr.ht/67)
-  (defun message-make-in-reply-to ()
-    "Return the In-Reply-To header for this message."
-    (when message-reply-headers
-      (let ((from (mail-header-from message-reply-headers))
-            (msg-id (mail-header-id message-reply-headers)))
-        (when from
-          msg-id))))
-
-  (defconst b/message-cite-style-format "On %Y-%m-%d %l:%M %p, %N wrote:")
-  (defconst message-cite-style-bandali
-    '((message-cite-function  'message-cite-original)
-      (message-citation-line-function  'message-insert-formatted-citation-line)
-      (message-cite-reply-position 'traditional)
-      (message-yank-prefix  "> ")
-      (message-yank-cited-prefix  ">")
-      (message-yank-empty-prefix  ">")
-      (message-citation-line-format
-       (if b/message-cite-say-hi
-           (concat "Hi %F,\n\n" b/message-cite-style-format)
-         b/message-cite-style-format)))
-    "Citation style based on Mozilla Thunderbird's. Use with message-cite-style.")
-  (setq ;; message-cite-style 'message-cite-style-bandali
-        message-kill-buffer-on-exit t
-        message-send-mail-function 'message-send-mail-with-sendmail
-        message-sendmail-envelope-from 'header
-        message-subscribed-address-functions
-        '(gnus-find-subscribed-addresses)
-        message-dont-reply-to-names
-        "\\(\\(amin@shemshak\\.org\\)\\|\\(.*@aminb\\.org\\)\\|\\(\\(bandali\\|mab\\|aminb?\\)@gnu\\.org\\)\\|\\(a?bandali@\\(csclub\\.\\)?uwaterloo\\.ca\\)\\)")
-  ;; (require 'company-ebdb)
-  :hook (;; (message-setup . mml-secure-message-sign-pgpmime)
-         (message-mode . flyspell-mode)
-         (message-mode . (lambda ()
-                           ;; (setq-local fill-column b/fill-column
-                           ;;             message-fill-column b/fill-column)
-                           (make-local-variable 'company-idle-delay)
-                           (setq company-idle-delay 0.2))))
-  ;; :custom-face
-  ;; (message-header-subject ((t (:foreground "#111" :weight semi-bold))))
-  ;; (message-header-to      ((t (:foreground "#111" :weight normal))))
-  ;; (message-header-cc      ((t (:foreground "#333" :weight normal))))
-  :custom
-  (message-elide-ellipsis "[...]\n"))
-
-(use-package mml)
-
-(use-package mml-sec
-  :custom
-  (mml-secure-openpgp-encrypt-to-self t)
-  (mml-secure-openpgp-sign-with-sender t))
-
-(use-package footnote
-  :after message
-  ;; :config
-  ;; (setq footnote-start-tag ""
-  ;;       footnote-end-tag   ""
-  ;;       footnote-style     'unicode)
-  :bind
-  (:map message-mode-map
-        :prefix-map b/footnote-prefix-map
-        :prefix "C-c f n"
-        ("a" . footnote-add-footnote)
-        ("b" . footnote-back-to-message)
-        ("c" . footnote-cycle-style)
-        ("d" . footnote-delete-footnote)
-        ("g" . footnote-goto-footnote)
-        ("r" . footnote-renumber-footnotes)
-        ("s" . footnote-set-style)))
-
-(use-package ebdb
-  :demand
-  :after gnus
-  :bind (:map gnus-group-mode-map ("e" . ebdb))
-  :config
-  (setq ebdb-sources (b/var "ebdb"))
-  (with-eval-after-load 'swiper
-    (add-to-list 'swiper-font-lock-exclude 'ebdb-mode t)))
-
-(use-package ebdb-com
-  :after ebdb)
-
-(use-package ebdb-complete
-  :after ebdb
-  :config
-  ;; (setq ebdb-complete-mail 'capf)
-  (ebdb-complete-enable))
-
-(use-package ebdb-message
-  :demand
-  :after ebdb)
-
-;; (use-package company-ebdb
-;;   :config
-;;   (defun company-ebdb--post-complete (_) nil))
-
-(use-package ebdb-gnus
-  :after ebdb
-  :custom
-  (ebdb-gnus-window-size 0.3))
-
-(use-package ebdb-mua
-  :demand
-  :after ebdb
-  :custom (ebdb-mua-pop-up t))
-
-;; (use-package ebdb-message
-;;   :after ebdb)
-
-;; (use-package ebdb-vcard
-;;   :after ebdb)
-
-(use-package message-x)
-
-(comment
-  (use-package message-x
-    :custom
-    (message-x-completion-alist
-     (quote
-      (("\\([rR]esent-\\|[rR]eply-\\)?[tT]o:\\|[bB]?[cC][cC]:" . gnus-harvest-find-address)
-       ((if
-            (boundp
-             (quote message-newgroups-header-regexp))
-            message-newgroups-header-regexp message-newsgroups-header-regexp)
-        . message-expand-group))))))
-
-(comment
-  (use-package gnus-harvest
-    :commands gnus-harvest-install
-    :demand t
-    :config
-    (if (featurep 'message-x)
-        (gnus-harvest-install 'message-x)
-      (gnus-harvest-install))))
-
-(use-package gnus-article-treat-patch
-  :disabled
-  :demand
-  :load-path "lisp/"
-  :config
-  ;; note: be sure to customize faces with `:foreground "white"' when
-  ;; using a theme with a white/light background :)
-  (setq ft/gnus-article-patch-conditions
-        '("^@@ -[0-9]+,[0-9]+ \\+[0-9]+,[0-9]+ @@")))
-
-\f
-;;; IRC (with ERC and ZNC)
-
-(use-package erc
-  :bind (("C-c b b" . erc-switch-to-buffer)
-         :map erc-mode-map
-         ("M-a" . erc-track-switch-buffer))
-  :custom
-  (erc-join-buffer 'bury)
-  (erc-lurker-hide-list '("JOIN" "PART" "QUIT"))
-  (erc-nick "bandali")
-  (erc-prompt "erc>")
-  (erc-rename-buffers t)
-  (erc-server-reconnect-attempts 5)
-  (erc-server-reconnect-timeout 3)
-  :config
-  (defun erc-cmd-OPME ()
-    "Request chanserv to op me."
-    (erc-message "PRIVMSG"
-                 (format "chanserv op %s %s"
-                         (erc-default-target)
-                         (erc-current-nick)) nil))
-  (defun erc-cmd-DEOPME ()
-    "Deop myself from current channel."
-    (erc-cmd-DEOP (format "%s" (erc-current-nick))))
-  (add-to-list 'erc-modules 'keep-place)
-  (add-to-list 'erc-modules 'notifications)
-  (add-to-list 'erc-modules 'smiley)
-  (add-to-list 'erc-modules 'spelling)
-  (add-to-list 'erc-modules 'scrolltoplace)
-  (erc-update-modules))
-
-(use-package erc-fill
-  :after erc
-  :custom
-  (erc-fill-column 77)
-  (erc-fill-function 'erc-fill-static)
-  (erc-fill-static-center 18))
-
-(use-package erc-pcomplete
-  :after erc
-  :custom
-  (erc-pcomplete-nick-postfix ", "))
-
-(use-package erc-track
-  :after erc
-  :bind (("C-c a e t d" . erc-track-disable)
-         ("C-c a e t e" . erc-track-enable))
-  :custom
-  (erc-track-enable-keybindings nil)
-  (erc-track-exclude-types '("JOIN" "MODE" "NICK" "PART" "QUIT"
-                             "324" "329" "332" "333" "353" "477"))
-  (erc-track-position-in-mode-line t)
-  (erc-track-priority-faces-only 'all)
-  (erc-track-shorten-function nil))
-
-(use-package erc-hl-nicks
-  :after erc)
-
-(use-package erc-scrolltoplace
-  :after erc)
-
-(use-package znc
-  :bind (("C-c a e e" . znc-erc)
-         ("C-c a e a" . znc-all))
-  :config
-  (let ((pwd (let ((auth (auth-source-search :host "znca")))
-               (cond
-                ((null auth) (error "Couldn't find znca's authinfo"))
-                (t (funcall (plist-get (car auth) :secret)))))))
-    (setq znc-servers
-          `(("znc.shemshak.org" 1337 t
-             ((freenode "amin/freenode" ,pwd)))
-            ("znc.shemshak.org" 1337 t
-             ((oftc "amin/oftc" ,pwd)))))))
-
-\f
 ;;; Post initialization
 
 )