[rc/i3status] some tweaks
[~bandali/configs] / init.org
index 015659b..3679c1c 100644 (file)
--- a/init.org
+++ b/init.org
@@ -1,4 +1,4 @@
-#+title: =aminb='s Literate Emacs Configuration
+#+title: Literate Emacs Configuration of Amin Bandali
 #+author: Amin Bandali
 #+babel: :cache yes
 #+property: header-args :tangle yes
 #+author: Amin Bandali
 #+babel: :cache yes
 #+property: header-args :tangle yes
@@ -33,6 +33,9 @@ few months, but decided to try =straight.el= which allows direct use
 of the various package archives.
 
 ** Installation
 of the various package archives.
 
 ** Installation
+:PROPERTIES:
+:CUSTOM_ID: installation
+:END:
 
 To use this config for your Emacs, first you need to clone this repo,
 then tangle =init.org= into =init.el=, and optionally byte-compile
 
 To use this config for your Emacs, first you need to clone this repo,
 then tangle =init.org= into =init.el=, and optionally byte-compile
@@ -46,12 +49,7 @@ cd ~/.emacs.d
 #+end_src
 
 Then, decide if you would like to use a byte-compiled init file, and
 #+end_src
 
 Then, decide if you would like to use a byte-compiled init file, and
-set the following variable accordingly:
-
-#+begin_src emacs-lisp
-(defvar a/byte-compiled-init t
-  "If non-nil, byte-(re)compile init.el on successful tangles.")
-#+end_src
+set the [[#byte-compiled-init][a/byte-compiled-init]] variable accordingly.
 
 Now, first tangle =init.org=, and only if you chose to have a
 byte-compiled init, build init as well:
 
 Now, first tangle =init.org=, and only if you chose to have a
 byte-compiled init, build init as well:
@@ -107,7 +105,7 @@ file.
 ** License
 
 #+begin_src emacs-lisp :comments none
 ** License
 
 #+begin_src emacs-lisp :comments none
-;; Copyright (C) 2018  Amin Bandali <bandali@gnu.org>
+;; Copyright (C) 2018-2019  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
 
 ;; 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
@@ -139,6 +137,21 @@ file.
 :CUSTOM_ID: initial-setup
 :END:
 
 :CUSTOM_ID: initial-setup
 :END:
 
+** Byte-compiled init preference
+:PROPERTIES:
+:CUSTOM_ID: byte-compiled-init
+:END:
+
+If you would like a byte-compiled init file, set the following
+variable to ~t~, otherwise set it to ~nil~.
+
+#+begin_src emacs-lisp
+(defvar a/byte-compiled-init t
+  "If non-nil, byte-(re)compile init.el on successful tangles.")
+#+end_src
+
+You can click on [[#installation][Installation]] to jump back up there if you like :)
+
 ** Emacs initialization
 
 I'd like to do a couple of measurements of Emacs' startup time. First,
 ** Emacs initialization
 
 I'd like to do a couple of measurements of Emacs' startup time. First,
@@ -201,7 +214,7 @@ but for now I've decided to keep them enabled. See documentation for
 
 #+begin_src emacs-lisp
 (setq user-full-name "Amin Bandali"
 
 #+begin_src emacs-lisp
 (setq user-full-name "Amin Bandali"
-      user-mail-address "amin@aminb.org")
+      user-mail-address "amin@bndl.org")
 #+end_src
 
 ** Package management
 #+end_src
 
 ** Package management
@@ -307,9 +320,10 @@ and without compromising on performance.
         use-package-expand-minimally t))
 
 (setq use-package-always-defer t)
         use-package-expand-minimally t))
 
 (setq use-package-always-defer t)
+(require 'bind-key)
 #+end_src
 
 #+end_src
 
-*** Epkg
+*** COMMENT Epkg
 
 #+begin_quote
 Browse the Emacsmirror package database
 
 #+begin_quote
 Browse the Emacsmirror package database
@@ -320,7 +334,6 @@ database, low-level functions for querying the database, and a
 =package.el=-like user interface for browsing the available packages.
 
 #+begin_src emacs-lisp
 =package.el=-like user interface for browsing the available packages.
 
 #+begin_src emacs-lisp
-(require 'bind-key)
 (use-package epkg
   :commands (epkg-list-packages epkg-describe-package)
   :bind
 (use-package epkg
   :commands (epkg-list-packages epkg-describe-package)
   :bind
@@ -387,7 +400,7 @@ in my shell.
 
 #+begin_src emacs-lisp
 (use-package exec-path-from-shell
 
 #+begin_src emacs-lisp
 (use-package exec-path-from-shell
-  :defer 1
+  :defer 0.4
   :init
   (setq exec-path-from-shell-arguments           nil
         exec-path-from-shell-check-startup-files nil)
   :init
   (setq exec-path-from-shell-arguments           nil
         exec-path-from-shell-check-startup-files nil)
@@ -418,7 +431,7 @@ See [[https://www.gnu.org/software/emacs/manual/html_node/emacs/Emacs-Server.htm
 
 #+begin_src emacs-lisp
 (use-feature server
 
 #+begin_src emacs-lisp
 (use-feature server
-  :defer 1
+  :defer 0.4
   :config (or (server-running-p) (server-mode)))
 #+end_src
 
   :config (or (server-running-p) (server-mode)))
 #+end_src
 
@@ -484,6 +497,33 @@ buffers and/or modes.
   (setq mouse-autoselect-window nil))
 #+end_src
 
   (setq mouse-autoselect-window nil))
 #+end_src
 
+** Better scrolling (arguably)
+
+#+begin_src emacs-lisp
+(setq ;; scroll-margin 1
+      ;; scroll-conservatively 10000
+      scroll-step 1
+      scroll-conservatively 10
+      scroll-preserve-screen-position 1)
+
+(use-feature mwheel
+  :defer 0.4
+  :config
+  (setq mouse-wheel-scroll-amount '(1 ((shift) . 1)) ; one line at a time
+        mouse-wheel-progressive-speed nil            ; don't accelerate scrolling
+        mouse-wheel-follow-mouse t))                 ; scroll window under mouse
+
+(use-feature pixel-scroll
+  :defer 0.4
+  :config (pixel-scroll-mode 1))
+#+end_src
+
+** Ask for GPG passphrase in minibuffer
+
+#+begin_src emacs-lisp
+(setq epg-pinentry-mode 'loopback)
+#+end_src
+
 ** Libraries
 
 #+begin_src emacs-lisp
 ** Libraries
 
 #+begin_src emacs-lisp
@@ -748,21 +788,26 @@ Some bindings for functions from built-in GNU Emacs packages:
  ("C-c e b" . eval-buffer)
  ("C-c e r" . eval-region)
 
  ("C-c e b" . eval-buffer)
  ("C-c e r" . eval-region)
 
+ ("C-c e i" . emacs-init-time)
+ ("C-c e u" . emacs-uptime)
+
  ("C-c F m" . make-frame-command)
  ("C-c F d" . delete-frame)
  ("C-c F D" . delete-other-frames)
 
  ("C-c o"   . other-window)
 
  ("C-c F m" . make-frame-command)
  ("C-c F d" . delete-frame)
  ("C-c F D" . delete-other-frames)
 
  ("C-c o"   . other-window)
 
- ("C-c Q"   . save-buffers-kill-terminal)
-
  ("C-S-h C" . describe-char)
  ("C-S-h F" . describe-face)
 
  ("C-S-h C" . describe-char)
  ("C-S-h F" . describe-face)
 
- ("C-x K"   . kill-this-buffer)
+ ("C-x k"   . kill-this-buffer)
+ ("C-x K"   . kill-buffer)
 
  ("s-p"     . beginning-of-buffer)
  ("s-n"     . end-of-buffer))
 
  ("s-p"     . beginning-of-buffer)
  ("s-n"     . end-of-buffer))
+
+(when (display-graphic-p)
+  (unbind-key "C-z" global-map))
 #+end_src
 
 While at it, let's bind a few for some =straight-*= functions too:
 #+end_src
 
 While at it, let's bind a few for some =straight-*= functions too:
@@ -828,41 +873,6 @@ system.
 
 In short, my favourite way of life.
 
 
 In short, my favourite way of life.
 
-First, we have to resort to a [[https://github.com/raxod502/straight.el#installing-org-with-straightel][hack]] to be able to use the correct
-latest version of Org from upstream.
-
-#+begin_src emacs-lisp
-  (use-package git)
-
-  (defun org-git-version ()
-    "The Git version of org-mode.
-  Inserted by installing org-mode or when a release is made."
-    (require 'git)
-    (let ((git-repo (expand-file-name
-                     "straight/repos/org/" user-emacs-directory)))
-      (string-trim
-       (git-run "describe"
-                "--match=release\*"
-                "--abbrev=6"
-                "HEAD"))))
-
-  (defun org-release ()
-    "The release version of org-mode.
-  Inserted by installing org-mode or when a release is made."
-    (require 'git)
-    (let ((git-repo (expand-file-name
-                     "straight/repos/org/" user-emacs-directory)))
-      (string-trim
-       (string-remove-prefix
-        "release_"
-        (git-run "describe"
-                 "--match=release\*"
-                 "--abbrev=0"
-                 "HEAD")))))
-
-(provide 'org-version)
-#+end_src
-
 We will use the =org-plus-contrib= package to get the whole deal:
 
 #+begin_src emacs-lisp
 We will use the =org-plus-contrib= package to get the whole deal:
 
 #+begin_src emacs-lisp
@@ -873,23 +883,29 @@ And here's where my actual Org configurations begin:
 
 #+begin_src emacs-lisp
 (use-feature org
 
 #+begin_src emacs-lisp
 (use-feature org
-  :defer 2
+  :defer 0.5
   :config
   (setq org-src-tab-acts-natively t
         org-src-preserve-indentation nil
         org-edit-src-content-indentation 0
   :config
   (setq org-src-tab-acts-natively t
         org-src-preserve-indentation nil
         org-edit-src-content-indentation 0
-        org-email-link-description-format "Email %c: %s" ; %.30s
+        org-link-email-description-format "Email %c: %s" ; %.30s
         org-highlight-latex-and-related '(entities)
         org-use-speed-commands t
         org-startup-folded 'content
         org-catch-invisible-edits 'show-and-error
         org-log-done 'time)
   (add-to-list 'org-structure-template-alist '("L" . "src emacs-lisp") t)
         org-highlight-latex-and-related '(entities)
         org-use-speed-commands t
         org-startup-folded 'content
         org-catch-invisible-edits 'show-and-error
         org-log-done 'time)
   (add-to-list 'org-structure-template-alist '("L" . "src emacs-lisp") t)
-  :bind (:map org-mode-map ("M-L" . org-insert-last-stored-link))
+  :bind
+  (("C-c a o a" . org-agenda)
+   :map org-mode-map
+   ("M-L" . org-insert-last-stored-link))
   :hook ((org-mode . org-indent-mode)
          (org-mode . auto-fill-mode)
          (org-mode . flyspell-mode))
   :custom
   :hook ((org-mode . org-indent-mode)
          (org-mode . auto-fill-mode)
          (org-mode . flyspell-mode))
   :custom
+  (org-agenda-files '("~/usr/org/todos/personal.org"
+                      "~/usr/org/todos/masters.org"))
+  (org-agenda-start-on-weekday 0)
   (org-latex-packages-alist '(("" "listings") ("" "color")))
   :custom-face
   '(org-block-begin-line ((t (:foreground "#5a5b5a" :background "#1d1f21"))))
   (org-latex-packages-alist '(("" "listings") ("" "color")))
   :custom-face
   '(org-block-begin-line ((t (:foreground "#5a5b5a" :background "#1d1f21"))))
@@ -982,7 +998,7 @@ Not just how I do git, but /the/ way to do git.
 
 #+begin_src emacs-lisp
 (use-package magit
 
 #+begin_src emacs-lisp
 (use-package magit
-  :defer 2
+  :defer 0.5
   :bind (("C-x g" . magit-status)
          ("s-g s" . magit-status)
          ("s-g l" . magit-log-buffer-file))
   :bind (("C-x g" . magit-status)
          ("s-g s" . magit-status)
          ("s-g l" . magit-log-buffer-file))
@@ -1006,7 +1022,7 @@ Recently opened files.
 
 #+begin_src emacs-lisp
 (use-feature recentf
 
 #+begin_src emacs-lisp
 (use-feature recentf
-  :defer 0.5
+  :defer 0.2
   :config
   (add-to-list 'recentf-exclude "^/\\(?:ssh\\|su\\|sudo\\)?:")
   (setq recentf-max-saved-items 40))
   :config
   (add-to-list 'recentf-exclude "^/\\(?:ssh\\|su\\|sudo\\)?:")
   (setq recentf-max-saved-items 40))
@@ -1037,7 +1053,7 @@ There's no way I could top that, so I won't attempt to.
 
 #+begin_src emacs-lisp
 (use-package ivy
 
 #+begin_src emacs-lisp
 (use-package ivy
-  :defer 0.6
+  :defer 0.3
   :bind
   (:map ivy-minibuffer-map
    ([escape] . keyboard-escape-quit)
   :bind
   (:map ivy-minibuffer-map
    ([escape] . keyboard-escape-quit)
@@ -1085,7 +1101,7 @@ There's no way I could top that, so I won't attempt to.
 
 #+begin_src emacs-lisp
 (use-feature eshell
 
 #+begin_src emacs-lisp
 (use-feature eshell
-  :defer 2
+  :defer 0.5
   :commands eshell
   :bind ("C-c a s e" . eshell)
   :config
   :commands eshell
   :bind ("C-c a s e" . eshell)
   :config
@@ -1166,6 +1182,7 @@ There's no way I could top that, so I won't attempt to.
         (mode . python-mode)
         (mode . c-mode)
         (mode . c++-mode)
         (mode . python-mode)
         (mode . c-mode)
         (mode . c++-mode)
+        (mode . java-mode)
         (mode . emacs-lisp-mode)
         (mode . scheme-mode)
         (mode . haskell-mode)
         (mode . emacs-lisp-mode)
         (mode . scheme-mode)
         (mode . haskell-mode)
@@ -1173,7 +1190,8 @@ There's no way I could top that, so I won't attempt to.
       ("emacs"
        (or
         (name . "^\\*scratch\\*$")
       ("emacs"
        (or
         (name . "^\\*scratch\\*$")
-        (name . "^\\*Messages\\*$"))))))
+        (name . "^\\*Messages\\*$")))
+      ("erc" (mode . erc-mode)))))
   (ibuffer-formats
    '((mark modified read-only locked " "
            (name 18 18 :left :elide)
   (ibuffer-formats
    '((mark modified read-only locked " "
            (name 18 18 :left :elide)
@@ -1366,7 +1384,7 @@ Automatically save place in each file.
 
 #+begin_src emacs-lisp
 (use-package company
 
 #+begin_src emacs-lisp
 (use-package company
-  :defer 3
+  :defer 0.6
   :bind
   (:map company-active-map
         ([tab]    . company-complete-common-or-cycle)
   :bind
   (:map company-active-map
         ([tab]    . company-complete-common-or-cycle)
@@ -1385,7 +1403,7 @@ Automatically save place in each file.
 
 #+begin_src emacs-lisp
 (use-package flycheck
 
 #+begin_src emacs-lisp
 (use-package flycheck
-  :defer 3
+  :defer 0.6
   :hook (prog-mode . flycheck-mode)
   :bind
   (:map flycheck-mode-map
   :hook (prog-mode . flycheck-mode)
   :bind
   (:map flycheck-mode-map
@@ -1400,7 +1418,7 @@ Automatically save place in each file.
 
 ;; http://endlessparentheses.com/ispell-and-apostrophes.html
 (use-package ispell
 
 ;; http://endlessparentheses.com/ispell-and-apostrophes.html
 (use-package ispell
-  :defer 3
+  :defer 0.6
   :config
   ;; ’ can be part of a word
   (setq ispell-local-dictionary-alist
   :config
   ;; ’ can be part of a word
   (setq ispell-local-dictionary-alist
@@ -1462,7 +1480,7 @@ Automatically save place in each file.
 #+begin_src emacs-lisp
 (eval-when-compile (defvar lean-mode-map))
 (use-package lean-mode
 #+begin_src emacs-lisp
 (eval-when-compile (defvar lean-mode-map))
 (use-package lean-mode
-  :defer 1
+  :defer 0.4
   :bind (:map lean-mode-map
               ("S-SPC" . company-complete))
   :config
   :bind (:map lean-mode-map
               ("S-SPC" . company-complete))
   :config
@@ -1706,9 +1724,9 @@ instead.
   :hook (web-mode css-mode html-mode sgml-mode))
 #+end_src
 
   :hook (web-mode css-mode html-mode sgml-mode))
 #+end_src
 
-** COMMENT Java
+** Java
 
 
-*** meghanada
+*** COMMENT meghanada
 
 #+begin_src emacs-lisp
 (use-package meghanada
 
 #+begin_src emacs-lisp
 (use-package meghanada
@@ -1719,7 +1737,7 @@ instead.
   :hook (java-mode . meghanada-mode))
 #+end_src
 
   :hook (java-mode . meghanada-mode))
 #+end_src
 
-*** lsp-java
+*** COMMENT lsp-java
 
 #+begin_comment
 dependencies:
 
 #+begin_comment
 dependencies:
@@ -1787,6 +1805,24 @@ treemacs
   :after (treemacs))
 #+end_src
 
   :after (treemacs))
 #+end_src
 
+*** COMMENT eclim
+
+#+begin_src emacs-lisp
+(use-package eclim
+  :bind (:map eclim-mode-map ("S-SPC" . company-complete))
+  :hook ((java-mode . eclim-mode)
+         (eclim-mode . (lambda ()
+                         (make-local-variable 'company-idle-delay)
+                         (defvar company-idle-delay)
+                         ;; (setq company-idle-delay 0.7)
+                         (setq company-idle-delay nil))))
+  :custom
+  (eclim-auto-save nil)
+  ;; (eclimd-default-workspace "~/src/eclipse-workspace-exp")
+  (eclim-executable "~/.p2/pool/plugins/org.eclim_2.8.0/bin/eclim")
+  (eclim-eclipse-dirs '("~/usr/eclipse/dsl-2018-09/eclipse")))
+#+end_src
+
 ** geiser
 
 #+begin_src emacs-lisp
 ** geiser
 
 #+begin_src emacs-lisp
@@ -1823,7 +1859,7 @@ Emacs package that displays available keybindings in popup
 
 #+begin_src emacs-lisp
 (use-package which-key
 
 #+begin_src emacs-lisp
 (use-package which-key
-  :defer 1
+  :defer 0.4
   :config
   (which-key-add-key-based-replacements
     ;; prefixes for global prefixes and minor modes
   :config
   (which-key-add-key-based-replacements
     ;; prefixes for global prefixes and minor modes
@@ -1839,9 +1875,11 @@ Emacs package that displays available keybindings in popup
     "C-x v"   "version control"
     ;; prefixes for my personal bindings
     "C-c a"   "applications"
     "C-x v"   "version control"
     ;; prefixes for my personal bindings
     "C-c a"   "applications"
+    "C-c a e" "erc"
+    "C-c a o" "org"
     "C-c a s" "shells"
     "C-c p"   "package-management"
     "C-c a s" "shells"
     "C-c p"   "package-management"
-    "C-c p e" "package-management/epkg"
+    ;; "C-c p e" "package-management/epkg"
     "C-c p s" "straight.el"
     "C-c psa" "all"
     "C-c psp" "package"
     "C-c p s" "straight.el"
     "C-c psa" "all"
     "C-c psp" "package"
@@ -1872,7 +1910,10 @@ Emacs package that displays available keybindings in popup
     "C-c C-e" "web/element"
     "C-c C-t" "web/tags")
 
     "C-c C-e" "web/element"
     "C-c C-t" "web/tags")
 
-  (which-key-mode))
+  (which-key-mode)
+  :custom
+  (which-key-add-column-padding 5)
+  (which-key-max-description-length 32))
 #+end_src
 
 ** theme
 #+end_src
 
 ** theme
@@ -1934,7 +1975,7 @@ Emacs package that displays available keybindings in popup
 
 #+begin_src emacs-lisp
 (use-package crux                       ; results in Waiting for git... [2 times]
 
 #+begin_src emacs-lisp
 (use-package crux                       ; results in Waiting for git... [2 times]
-  :defer 1
+  :defer 0.4
   :bind (("C-c b k" . crux-kill-other-buffers)
          ("C-c d"   . crux-duplicate-current-line-or-region)
          ("C-c D"   . crux-duplicate-and-comment-current-line-or-region)
   :bind (("C-c b k" . crux-kill-other-buffers)
          ("C-c d"   . crux-duplicate-current-line-or-region)
          ("C-c D"   . crux-duplicate-and-comment-current-line-or-region)
@@ -1980,7 +2021,7 @@ Emacs package that displays available keybindings in popup
 
 #+begin_src emacs-lisp
 (use-package helpful
 
 #+begin_src emacs-lisp
 (use-package helpful
-  :defer 3
+  :defer 0.6
   :bind
   (("C-S-h c" . helpful-command)
    ("C-S-h f" . helpful-callable)        ; helpful-function
   :bind
   (("C-S-h c" . helpful-command)
    ("C-S-h f" . helpful-callable)        ; helpful-function
@@ -1995,7 +2036,7 @@ Make =*scratch*= and =*Messages*= unkillable.
 
 #+begin_src emacs-lisp
 (use-package unkillable-scratch
 
 #+begin_src emacs-lisp
 (use-package unkillable-scratch
-  :defer 3
+  :defer 0.6
   :config
   (unkillable-scratch 1)
   :custom
   :config
   (unkillable-scratch 1)
   :custom
@@ -2012,7 +2053,7 @@ Make =*scratch*= and =*Messages*= unkillable.
 
 #+begin_src emacs-lisp
 (use-package boxquote
 
 #+begin_src emacs-lisp
 (use-package boxquote
-  :defer 3
+  :defer 0.6
   :bind
   (:prefix-map a/boxquote-prefix-map
    :prefix "C-c q"
   :bind
   (:prefix-map a/boxquote-prefix-map
    :prefix "C-c q"
@@ -2052,7 +2093,7 @@ Also see [[https://www.emacswiki.org/emacs/rebox2][rebox2]].
 
 #+begin_src emacs-lisp
 (use-package typo
 
 #+begin_src emacs-lisp
 (use-package typo
-  :defer 2
+  :defer 0.5
   :config
   (typo-global-mode 1)
   :hook (text-mode . typo-mode))
   :config
   (typo-global-mode 1)
   :hook (text-mode . typo-mode))
@@ -2062,7 +2103,7 @@ Also see [[https://www.emacswiki.org/emacs/rebox2][rebox2]].
 
 #+begin_src emacs-lisp
 (use-package hl-todo
 
 #+begin_src emacs-lisp
 (use-package hl-todo
-  :defer 4
+  :defer 0.5
   :config
   (global-hl-todo-mode))
 #+end_src
   :config
   (global-hl-todo-mode))
 #+end_src
@@ -2071,7 +2112,7 @@ Also see [[https://www.emacswiki.org/emacs/rebox2][rebox2]].
 
 #+begin_src emacs-lisp
 (use-package shrink-path
 
 #+begin_src emacs-lisp
 (use-package shrink-path
-  :defer 2
+  :defer 0.5
   :after eshell
   :config
   (defun +eshell/prompt ()
   :after eshell
   :config
   (defun +eshell/prompt ()
@@ -2083,9 +2124,10 @@ Also see [[https://www.emacswiki.org/emacs/rebox2][rebox2]].
               (propertize (+eshell--current-git-branch)
                           'face 'font-lock-function-name-face)
               "\n"
               (propertize (+eshell--current-git-branch)
                           'face 'font-lock-function-name-face)
               "\n"
-              (propertize "λ" 'face 'eshell-prompt-face)
+              ;; "λ"
+              ;; (propertize "λ" 'face 'eshell-prompt)
               ;; needed for the input text to not have prompt face
               ;; needed for the input text to not have prompt face
-              (propertize " " 'face 'default))))
+              (propertize "λ " 'face 'default))))
 
   (defun +eshell--current-git-branch ()
     (let ((branch (car (loop for match in (split-string (shell-command-to-string "git branch") "\n")
 
   (defun +eshell--current-git-branch ()
     (let ((branch (car (loop for match in (split-string (shell-command-to-string "git branch") "\n")
@@ -2110,7 +2152,7 @@ Also see [[https://www.emacswiki.org/emacs/rebox2][rebox2]].
 
 #+begin_src emacs-lisp
 (use-package multi-term
 
 #+begin_src emacs-lisp
 (use-package multi-term
-  :defer 3
+  :defer 0.6
   :bind (("C-c a s m" . multi-term-dedicated-toggle)
          :map term-mode-map
          ("C-c C-j" . term-char-mode)
   :bind (("C-c a s m" . multi-term-dedicated-toggle)
          :map term-mode-map
          ("C-c C-j" . term-char-mode)
@@ -2170,6 +2212,29 @@ Also see [[https://www.emacswiki.org/emacs/rebox2][rebox2]].
                ("a" . mc/mark-all-like-this))))
 #+end_src
 
                ("a" . mc/mark-all-like-this))))
 #+end_src
 
+** forge
+
+#+begin_src emacs-lisp
+(use-package forge
+  :after magit
+  :demand)
+#+end_src
+
+** yasnippet
+
+#+begin_src emacs-lisp
+(use-package yasnippet
+  :defer 0.6
+  :config
+  (defconst yas-verbosity-cur yas-verbosity)
+  (setq yas-verbosity 2)
+  (add-to-list 'yas-snippet-dirs "~/src/git/guix/etc/snippets")
+  (yas-reload-all)
+  (setq yas-verbosity yas-verbosity-cur)
+  :hook
+  (text-mode . yas-minor-mode))
+#+end_src
+
 * Email
 :PROPERTIES:
 :CUSTOM_ID: email
 * Email
 :PROPERTIES:
 :CUSTOM_ID: email
@@ -2201,13 +2266,19 @@ Also see [[https://www.emacswiki.org/emacs/rebox2][rebox2]].
             (nnimap-address "127.0.0.1")
             (nnimap-server-port 143)
             (nnimap-authenticator plain)
             (nnimap-address "127.0.0.1")
             (nnimap-server-port 143)
             (nnimap-authenticator plain)
-            (nnimap-user "amin@aminb.org"))
+            (nnimap-user "amin@bndl.org"))
      (nnimap "uwaterloo"
              (nnimap-stream plain)
              (nnimap-address "127.0.0.1")
              (nnimap-server-port 143)
              (nnimap-authenticator plain)
      (nnimap "uwaterloo"
              (nnimap-stream plain)
              (nnimap-address "127.0.0.1")
              (nnimap-server-port 143)
              (nnimap-authenticator plain)
-             (nnimap-user "abandali@uwaterloo.ca")))
+             (nnimap-user "abandali@uwaterloo.ca"))
+     (nnimap "csclub"
+             (nnimap-stream plain)
+             (nnimap-address "127.0.0.1")
+             (nnimap-server-port 143)
+             (nnimap-authenticator plain)
+             (nnimap-user "abandali@csclub.uw")))
    gnus-message-archive-group "nnimap+amin:Sent"
    gnus-parameters
    '(("gnu.*"
    gnus-message-archive-group "nnimap+amin:Sent"
    gnus-parameters
    '(("gnu.*"
@@ -2251,8 +2322,6 @@ Also see [[https://www.emacswiki.org/emacs/rebox2][rebox2]].
       (concat local lapsed))))
   (bind-keys
    :map gnus-article-mode-map
       (concat local lapsed))))
   (bind-keys
    :map gnus-article-mode-map
-   ("r"   . gnus-article-reply-with-original)
-   ("R"   . gnus-article-wide-reply-with-original)
    ("M-L" . org-store-link)))
 
 (use-feature gnus-sum
    ("M-L" . org-store-link)))
 
 (use-feature gnus-sum
@@ -2265,8 +2334,6 @@ Also see [[https://www.emacswiki.org/emacs/rebox2][rebox2]].
   :config
   (bind-keys
    :map gnus-summary-mode-map
   :config
   (bind-keys
    :map gnus-summary-mode-map
-   ("r"   . gnus-summary-reply-with-original)
-   ("R"   . gnus-summary-wide-reply-with-original)
    ("M-L" . org-store-link))
   :hook (gnus-summary-mode . a/no-mouse-autoselect-window))
 
    ("M-L" . org-store-link))
   :hook (gnus-summary-mode . a/no-mouse-autoselect-window))
 
@@ -2274,21 +2341,26 @@ Also see [[https://www.emacswiki.org/emacs/rebox2][rebox2]].
   :config
   (setq gnus-posting-styles
         '((".*"
   :config
   (setq gnus-posting-styles
         '((".*"
-           (address "amin@aminb.org")
+           (address "amin@bndl.org")
            (body "\nBest,\namin\n")
            (eval (setq a/message-cite-say-hi t)))
           ("gnu.*"
            (body "\nBest,\namin\n")
            (eval (setq a/message-cite-say-hi t)))
           ("gnu.*"
-           (address "bandali@gnu.org"))
+           (address "bandali@gnu.org")
+           (eval (set (make-local-variable 'message-user-fqdn) "fencepost.gnu.org")))
           ((header "subject" "ThankCRM")
            (to "webmasters-comment@gnu.org")
           ((header "subject" "ThankCRM")
            (to "webmasters-comment@gnu.org")
-           (body "\nAdded  to 2018supporters.html.\n\nMoving to campaigns.\n\n-amin\n")
+           (body "\nAdded  to 2019supporters.html.\n\nMoving to campaigns.\n\n-amin\n")
            (eval (setq a/message-cite-say-hi nil)))
           ("nnimap\\+uwaterloo:.*"
            (address "abandali@uwaterloo.ca")
            (eval (setq a/message-cite-say-hi nil)))
           ("nnimap\\+uwaterloo:.*"
            (address "abandali@uwaterloo.ca")
-           (gcc "\"nnimap+uwaterloo:Sent Items\"")))))
+           (gcc "\"nnimap+uwaterloo:Sent Items\""))
+          ("nnimap\\+csclub:.*"
+           (address "abandali@csclub.uwaterloo.ca")
+           (gcc "nnimap+csclub:Sent")))))
 
 (use-feature gnus-topic
 
 (use-feature gnus-topic
-  :hook (gnus-group-mode . gnus-topic-mode))
+  :hook (gnus-group-mode . gnus-topic-mode)
+  :config (setq gnus-topic-line-format "%i[ %A: %(%{%n%}%) ]%v\n"))
 
 (use-feature gnus-agent
   :config
 
 (use-feature gnus-agent
   :config
@@ -2297,7 +2369,7 @@ Also see [[https://www.emacswiki.org/emacs/rebox2][rebox2]].
 
 (use-feature gnus-group
   :config
 
 (use-feature gnus-group
   :config
-  (setq gnus-permanently-visible-groups "\\((INBOX\\|gnu$\\)"))
+  (setq gnus-permanently-visible-groups "\\(:INBOX$\\|:gnu$\\)"))
 
 (use-feature mm-decode
   :config
 
 (use-feature mm-decode
   :config
@@ -2320,6 +2392,16 @@ Also see [[https://www.emacswiki.org/emacs/rebox2][rebox2]].
 #+begin_src emacs-lisp
 (use-feature message
   :config
 #+begin_src emacs-lisp
 (use-feature message
   :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 a/message-cite-style-format "On %Y-%m-%d %l:%M %p, %N wrote:")
   (defconst message-cite-style-bandali
     '((message-cite-function  'message-cite-original)
   (defconst a/message-cite-style-format "On %Y-%m-%d %l:%M %p, %N wrote:")
   (defconst message-cite-style-bandali
     '((message-cite-function  'message-cite-original)
@@ -2338,8 +2420,7 @@ Also see [[https://www.emacswiki.org/emacs/rebox2][rebox2]].
         message-send-mail-function 'message-send-mail-with-sendmail
         message-sendmail-envelope-from 'header
         message-dont-reply-to-names
         message-send-mail-function 'message-send-mail-with-sendmail
         message-sendmail-envelope-from 'header
         message-dont-reply-to-names
-        "\\(\\(.*@aminb\\.org\\)\\|\\(amin@bandali\\.me\\)\\|\\(\\(aminb?\\|mab\\|bandali\\)@gnu\\.org\\)\\|\\(\\(m\\|a\\(min\\.\\)?\\)bandali@uwaterloo\\.ca\\)\\)"
-        message-user-fqdn "aminb.org")
+        "\\(\\(amin@bndl\\.org\\)\\|\\(.*@\\(aminb\\|amin\\.bndl\\)\\.org\\)\\|\\(\\(bandali\\|aminb?\\|mab\\)@gnu\\.org\\)\\|\\(a\\(min\\.\\)?bandali@uwaterloo\\.ca\\)\\|\\(abandali@csclub\\.uwaterloo\\.ca\\)\\)")
   (require 'company-ebdb)
   :hook (;; (message-setup . mml-secure-message-sign-pgpmime)
          (message-mode . flyspell-mode)
   (require 'company-ebdb)
   :hook (;; (message-setup . mml-secure-message-sign-pgpmime)
          (message-mode . flyspell-mode)
@@ -2366,6 +2447,10 @@ Convenient footnotes in =message-mode=.
 #+begin_src emacs-lisp
 (use-feature footnote
   :after message
 #+begin_src emacs-lisp
 (use-feature footnote
   :after message
+  ;; :config
+  ;; (setq footnote-start-tag ""
+  ;;       footnote-end-tag   ""
+  ;;       footnote-style     'unicode)
   :bind
   (:map message-mode-map
         :prefix-map a/footnote-prefix-map
   :bind
   (:map message-mode-map
         :prefix-map a/footnote-prefix-map
@@ -2376,11 +2461,7 @@ Convenient footnotes in =message-mode=.
         ("d" . footnote-delete-footnote)
         ("g" . footnote-goto-footnote)
         ("r" . footnote-renumber-footnotes)
         ("d" . footnote-delete-footnote)
         ("g" . footnote-goto-footnote)
         ("r" . footnote-renumber-footnotes)
-        ("s" . footnote-set-style))
-  :config
-  (setq footnote-start-tag ""
-        footnote-end-tag   ""
-        footnote-style     'unicode))
+        ("s" . footnote-set-style)))
 #+end_src
 
 ** ebdb
 #+end_src
 
 ** ebdb
@@ -2462,19 +2543,28 @@ Convenient footnotes in =message-mode=.
     (gnus-harvest-install)))
 #+end_src
 
     (gnus-harvest-install)))
 #+end_src
 
-* Blogging
+* IRC
 :PROPERTIES:
 :PROPERTIES:
-:CUSTOM_ID: blogging
+:CUSTOM_ID: irc
 :END:
 
 :END:
 
-** [[https://ox-hugo.scripter.co][ox-hugo]]
+Now with ERC!
 
 #+begin_src emacs-lisp
 
 #+begin_src emacs-lisp
-(use-package ox-hugo
-  :after ox)
-
-(use-feature ox-hugo-auto-export
-  :after ox-hugo)
+(use-package znc
+  :straight (:host nil :repo "https://git.bndl.org/amin/znc.el")
+  :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.bndl.org" 1337 t
+             ((freenode "amin/freenode" ,pwd)))
+            ("znc.bndl.org" 1337 t
+             ((moznet "amin/moznet" ,pwd)))))))
 #+end_src
 
 * Post initialization
 #+end_src
 
 * Post initialization