[emacs][wip] add smex
[~bandali/configs] / init.org
index 1eb94d8..8240b51 100644 (file)
--- a/init.org
+++ b/init.org
@@ -184,9 +184,9 @@ but for now I've decided to keep them enabled. See documentation for
 
 *** No =package.el=
 
 
 *** No =package.el=
 
-I can do all my package management things with Borg, and don't need
-Emacs' built-in =package.el=. Emacs 27 lets us disable =package.el= in
-the =early-init-file= (see [[https://git.savannah.gnu.org/cgit/emacs.git/commit/?id=24acb31c04b4048b85311d794e600ecd7ce60d3b][here]]).
+I can do all my package management things with =straight.el=, and
+don't need Emacs' built-in =package.el=.  Emacs 27 lets us disable
+=package.el= in the =early-init-file= (see [[https://git.savannah.gnu.org/cgit/emacs.git/commit/?id=24acb31c04b4048b85311d794e600ecd7ce60d3b][here]]).
 
 #+begin_src emacs-lisp :tangle early-init.el
 (setq package-enable-at-startup nil)
 
 #+begin_src emacs-lisp :tangle early-init.el
 (setq package-enable-at-startup nil)
@@ -197,12 +197,56 @@ right now), and even when released it'll be long before most distros
 ship in their repos, I'll still put the old workaround with the
 commented call to ~package-initialize~ here anyway.
 
 ship in their repos, I'll still put the old workaround with the
 commented call to ~package-initialize~ here anyway.
 
-#+begin_src emacs-lisp
+#+begin_src emacs-lisp :tangle no
 (setq package-enable-at-startup nil)
 ;; (package-initialize)
 #+end_src
 
 (setq package-enable-at-startup nil)
 ;; (package-initialize)
 #+end_src
 
-*** Borg
+Update: the above is not necessary, since =straight.el= automatically
+does that (and more).  See =straight-package-neutering-mode=.
+
+*** =straight.el=
+
+#+begin_quote
+Next-generation, purely functional package manager for the Emacs
+hacker.
+#+end_quote
+
+=straight.el= allows me to have a fully reproducible Emacs setup.
+
+#+begin_src emacs-lisp
+(setq straight-repository-branch "develop")
+
+(defvar bootstrap-version)
+(let ((bootstrap-file
+       (expand-file-name "straight/repos/straight.el/bootstrap.el" user-emacs-directory))
+      (bootstrap-version 5))
+  (unless (file-exists-p bootstrap-file)
+    (with-current-buffer
+        (url-retrieve-synchronously
+         "https://raw.githubusercontent.com/raxod502/straight.el/develop/install.el"
+         'silent 'inhibit-cookies)
+      (goto-char (point-max))
+      (eval-print-last-sexp)))
+  (load bootstrap-file nil 'nomessage))
+
+(setq straight-use-package-by-default t)
+#+end_src
+
+Since we enable =straight.el='s =straight-use-package-by-default=
+integration, we will define a =use-feature= for plain ole
+=use-package= without any of the =straight.el= stuff.
+
+#+begin_src emacs-lisp
+(defmacro use-feature (name &rest args)
+  "Like `use-package', but with `straight-use-package-by-default' disabled."
+  (declare (indent defun))
+  `(use-package ,name
+     :straight nil
+,@args))
+#+end_src
+
+*** COMMENT Borg
 
 #+begin_quote
 Assimilate Emacs packages as Git submodules
 
 #+begin_quote
 Assimilate Emacs packages as Git submodules
@@ -244,7 +288,7 @@ packages (in our case especially the latter) in a neatly organized way
 and without compromising on performance.
 
 #+begin_src emacs-lisp
 and without compromising on performance.
 
 #+begin_src emacs-lisp
-(require 'use-package)
+(straight-use-package 'use-package)
 (if nil  ; set to t when need to debug init
     (setq use-package-verbose t
           use-package-expand-minimally nil
 (if nil  ; set to t when need to debug init
     (setq use-package-verbose t
           use-package-expand-minimally nil
@@ -254,7 +298,7 @@ and without compromising on performance.
         use-package-expand-minimally t))
 #+end_src
 
         use-package-expand-minimally t))
 #+end_src
 
-*** Epkg
+*** COMMENT Epkg
 
 #+begin_quote
 Browse the Emacsmirror package database
 
 #+begin_quote
 Browse the Emacsmirror package database
@@ -306,7 +350,7 @@ definitely don't want it mixing with =init.el=. So, here; let's give
 it it's own file. While at it, treat themes as safe.
 
 #+begin_src emacs-lisp
 it it's own file. While at it, treat themes as safe.
 
 #+begin_src emacs-lisp
-(use-package custom
+(use-feature custom
   :no-require t
   :config
   (setq custom-file (no-littering-expand-etc-file-name "custom.el"))
   :no-require t
   :config
   (setq custom-file (no-littering-expand-etc-file-name "custom.el"))
@@ -360,7 +404,7 @@ login; so starting the server from inside Emacs is good enough for me.
 See [[https://www.gnu.org/software/emacs/manual/html_node/emacs/Emacs-Server.html#Emacs-Server][Using Emacs as a Server]].
 
 #+begin_src emacs-lisp
 See [[https://www.gnu.org/software/emacs/manual/html_node/emacs/Emacs-Server.html#Emacs-Server][Using Emacs as a Server]].
 
 #+begin_src emacs-lisp
-(use-package server
+(use-feature server
   :defer 1
   :config (or (server-running-p) (server-mode)))
 #+end_src
   :defer 1
   :config (or (server-running-p) (server-mode)))
 #+end_src
@@ -674,6 +718,12 @@ for this.
 (setq-default cursor-type 'bar)
 #+end_src
 
 (setq-default cursor-type 'bar)
 #+end_src
 
+*** Allow scrolling in Isearch
+
+#+begin_src emacs-lisp
+(setq isearch-allow-scroll t)
+#+end_src
+
 ** Bindings
 
 #+begin_src emacs-lisp
 ** Bindings
 
 #+begin_src emacs-lisp
@@ -724,7 +774,7 @@ customizing it.
             'auto-compile-inhibit-compile-detached-git-head))
 #+end_src
 
             'auto-compile-inhibit-compile-detached-git-head))
 #+end_src
 
-*** [[https://orgmode.org/][Org mode]]
+*** [[https://orgmode.org/][Org]]
 
 #+begin_quote
 Org mode is for keeping notes, maintaining TODO lists, planning
 
 #+begin_quote
 Org mode is for keeping notes, maintaining TODO lists, planning
@@ -734,9 +784,52 @@ 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
 #+begin_src emacs-lisp
-(use-package org
-  :defer 1
+  (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
+(straight-use-package 'org-plus-contrib)
+#+end_src
+
+And here's where my actual Org configurations begin:
+
+#+begin_src emacs-lisp
+(use-feature org
+  :defer 0.5
   :config
   (setq org-src-tab-acts-natively t
         org-src-preserve-indentation nil
   :config
   (setq org-src-tab-acts-natively t
         org-src-preserve-indentation nil
@@ -766,7 +859,7 @@ In short, my favourite way of life.
   '(org-block ((t (:background "#1d1f21"))))
   '(org-latex-and-related ((t (:foreground "#b294bb")))))
 
   '(org-block ((t (:background "#1d1f21"))))
   '(org-latex-and-related ((t (:foreground "#b294bb")))))
 
-(use-package ox-latex
+(use-feature ox-latex
   :after ox
   :config
   (setq org-latex-listings 'listings
   :after ox
   :config
   (setq org-latex-listings 'listings
@@ -783,12 +876,8 @@ In short, my favourite way of life.
                  ("\\subparagraph{%s}" . "\\subparagraph*{%s}"))
                t))
 
                  ("\\subparagraph{%s}" . "\\subparagraph*{%s}"))
                t))
 
-(use-package ox-beamer
+(use-feature ox-beamer
   :after ox)
   :after ox)
-
-(use-package orgalist
-  :after message
-  :hook (message-mode . orgalist-mode))
 #+end_src
 
 **** asynchronous tangle
 #+end_src
 
 **** asynchronous tangle
@@ -868,6 +957,31 @@ Not just how I do git, but /the/ way to do git.
   :custom-face (magit-diff-file-heading ((t (:weight normal)))))
 #+end_src
 
   :custom-face (magit-diff-file-heading ((t (:weight normal)))))
 #+end_src
 
+*** recentf
+
+Recently opened files.
+
+#+begin_src emacs-lisp
+(use-feature recentf
+  :defer 0.5
+  :config
+  (add-to-list 'recentf-exclude "^/\\(?:ssh\\|su\\|sudo\\)?:")
+  (setq recentf-max-saved-items 40))
+#+end_src
+
+*** smex
+
+#+begin_quote
+A smart M-x enhancement for Emacs.
+#+end_quote
+
+Mostly because =counsel= needs it to remember history.
+
+#+begin_src emacs-lisp
+(use-package smex
+  :defer t)
+#+end_src
+
 *** [[https://github.com/abo-abo/swiper][Ivy]] (and friends)
 
 #+begin_quote
 *** [[https://github.com/abo-abo/swiper][Ivy]] (and friends)
 
 #+begin_quote
@@ -881,7 +995,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 1
+  :defer 0.6
   :bind
   (:map ivy-minibuffer-map
    ([escape] . keyboard-escape-quit)
   :bind
   (:map ivy-minibuffer-map
    ([escape] . keyboard-escape-quit)
@@ -902,6 +1016,7 @@ There's no way I could top that, so I won't attempt to.
 
 #+begin_src emacs-lisp
 (use-package swiper
 
 #+begin_src emacs-lisp
 (use-package swiper
+  :after ivy
   :bind (("C-s"   . swiper)
          ("C-r"   . swiper)
          ("C-S-s" . isearch-forward)))
   :bind (("C-s"   . swiper)
          ("C-r"   . swiper)
          ("C-S-s" . isearch-forward)))
@@ -911,7 +1026,7 @@ There's no way I could top that, so I won't attempt to.
 
 #+begin_src emacs-lisp
 (use-package counsel
 
 #+begin_src emacs-lisp
 (use-package counsel
-  :defer 1
+  :after ivy
   :bind (([remap execute-extended-command] . counsel-M-x)
          ([remap find-file]                . counsel-find-file)
          ("s-r"                            . counsel-recentf)
   :bind (([remap execute-extended-command] . counsel-M-x)
          ([remap find-file]                . counsel-find-file)
          ("s-r"                            . counsel-recentf)
@@ -927,7 +1042,7 @@ There's no way I could top that, so I won't attempt to.
 *** eshell
 
 #+begin_src emacs-lisp
 *** eshell
 
 #+begin_src emacs-lisp
-(use-package eshell
+(use-feature eshell
   :defer 1
   :commands eshell
   :bind ("C-c a s e" . eshell)
   :defer 1
   :commands eshell
   :bind ("C-c a s e" . eshell)
@@ -964,7 +1079,7 @@ There's no way I could top that, so I won't attempt to.
 *** Ibuffer
 
 #+begin_src emacs-lisp
 *** Ibuffer
 
 #+begin_src emacs-lisp
-(use-package ibuffer
+(use-feature ibuffer
   :defer t
   :bind
   (("C-x C-b" . ibuffer-other-window)
   :defer t
   :bind
   (("C-x C-b" . ibuffer-other-window)
@@ -1035,7 +1150,7 @@ There's no way I could top that, so I won't attempt to.
 *** Outline
 
 #+begin_src emacs-lisp
 *** Outline
 
 #+begin_src emacs-lisp
-(use-package outline
+(use-feature outline
   :defer t
   :hook (prog-mode . outline-minor-mode)
   :bind
   :defer t
   :hook (prog-mode . outline-minor-mode)
   :bind
@@ -1054,27 +1169,13 @@ There's no way I could top that, so I won't attempt to.
    ("s"   . outline-show-subtree)))
 #+end_src
 
    ("s"   . outline-show-subtree)))
 #+end_src
 
-* Borg's =layer/essentials=
-:PROPERTIES:
-:CUSTOM_ID: borg-essentials
-:END:
-
-TODO: break this giant source block down into individual org sections.
+*** Dired
 
 #+begin_src emacs-lisp
 
 #+begin_src emacs-lisp
-(use-package dash
-  :config (dash-enable-font-lock))
-
-(use-package diff-hl
-  :config
-  (setq diff-hl-draw-borders nil)
-  (global-diff-hl-mode)
-  (add-hook 'magit-post-refresh-hook 'diff-hl-magit-post-refresh t))
-
-(use-package ls-lisp
+(use-feature ls-lisp
   :custom (ls-lisp-dirs-first t))
 
   :custom (ls-lisp-dirs-first t))
 
-(use-package dired
+(use-feature dired
   :defer t
   :config
   (setq dired-listing-switches "-alh"
   :defer t
   :config
   (setq dired-listing-switches "-alh"
@@ -1110,76 +1211,111 @@ TODO: break this giant source block down into individual org sections.
                         (interactive)
                         (a/dired-start-process "zathura"))))
   :hook (dired-mode . dired-hide-details-mode))
                         (interactive)
                         (a/dired-start-process "zathura"))))
   :hook (dired-mode . dired-hide-details-mode))
+#+end_src
 
 
-(use-package eldoc
-  :when (version< "25" emacs-version)
-  :config (global-eldoc-mode))
+*** Help
 
 
-(use-package help
+#+begin_src emacs-lisp
+(use-feature help
   :defer t
   :config
   (temp-buffer-resize-mode)
   (setq help-window-select t))
   :defer t
   :config
   (temp-buffer-resize-mode)
   (setq help-window-select t))
+#+end_src
 
 
-(progn ;    `isearch'
-  (setq isearch-allow-scroll t))
+*** Tramp
 
 
-(use-package lisp-mode
+#+begin_src emacs-lisp
+(use-feature tramp
+  :defer t
   :config
   :config
-  (add-hook 'emacs-lisp-mode-hook 'outline-minor-mode)
-  (add-hook 'emacs-lisp-mode-hook 'reveal-mode)
-  (defun indent-spaces-mode ()
-    (setq indent-tabs-mode nil))
-  (add-hook 'lisp-interaction-mode-hook #'indent-spaces-mode))
+  (add-to-list 'tramp-default-proxies-alist '(nil "\\`root\\'" "/ssh:%h:"))
+  (add-to-list 'tramp-default-proxies-alist '("localhost" nil nil))
+  (add-to-list 'tramp-default-proxies-alist
+               (list (regexp-quote (system-name)) nil nil)))
+#+end_src
 
 
-(use-package man
+*** Dash
+
+#+begin_src emacs-lisp
+(use-package dash
   :defer t
   :defer t
-  :config (setq Man-width 80))
+  :config (dash-enable-font-lock))
+#+end_src
 
 
-(use-package paren
-  :config (show-paren-mode))
+* Editing
+:PROPERTIES:
+:CUSTOM_ID: editing
+:END:
 
 
-(use-package prog-mode
-  :config (global-prettify-symbols-mode)
-  (defun indicate-buffer-boundaries-left ()
-    (setq indicate-buffer-boundaries 'left))
-  (add-hook 'prog-mode-hook #'indicate-buffer-boundaries-left))
+** =diff-hl=
 
 
-(use-package recentf
-  :defer 0.5
+Highlight uncommitted changes in the left fringe.
+
+#+begin_src emacs-lisp
+(use-package diff-hl
   :config
   :config
-  (add-to-list 'recentf-exclude "^/\\(?:ssh\\|su\\|sudo\\)?:")
-  (setq recentf-max-saved-items 40))
+  (setq diff-hl-draw-borders nil)
+  (global-diff-hl-mode)
+  :hook (magit-post-refresh . diff-hl-magit-post-refresh))
+#+end_src
 
 
-(use-package savehist
+** ElDoc
+
+Display Lisp objects at point in the echo area.
+
+#+begin_src emacs-lisp
+(use-feature eldoc
+  :when (version< "25" emacs-version)
+  :config (global-eldoc-mode))
+#+end_src
+
+** paren
+
+Highlight matching parens.
+
+#+begin_src emacs-lisp
+(use-feature paren
+  :config (show-paren-mode))
+#+end_src
+
+** =savehist=
+
+Save minibuffer history.
+
+#+begin_src emacs-lisp
+(use-feature savehist
   :config (savehist-mode))
   :config (savehist-mode))
+#+end_src
 
 
-(use-package saveplace
+** =saveplace=
+
+Automatically save place in each file.
+
+#+begin_src emacs-lisp
+(use-feature saveplace
   :when (version< "25" emacs-version)
   :config (save-place-mode))
   :when (version< "25" emacs-version)
   :config (save-place-mode))
+#+end_src
 
 
-(use-package simple
-  :config (column-number-mode))
+** =prog-mode=
 
 
-(progn ;    `text-mode'
-  (add-hook 'text-mode-hook #'indicate-buffer-boundaries-left)
-  (add-hook 'text-mode-hook #'abbrev-mode))
+#+begin_src emacs-lisp
+(use-feature prog-mode
+  :config (global-prettify-symbols-mode)
+  (defun indicate-buffer-boundaries-left ()
+    (setq indicate-buffer-boundaries 'left))
+  (add-hook 'prog-mode-hook #'indicate-buffer-boundaries-left))
+#+end_src
 
 
-(use-package tramp
-  :defer t
-  :config
-  (add-to-list 'tramp-default-proxies-alist '(nil "\\`root\\'" "/ssh:%h:"))
-  (add-to-list 'tramp-default-proxies-alist '("localhost" nil nil))
-  (add-to-list 'tramp-default-proxies-alist
-               (list (regexp-quote (system-name)) nil nil)))
+** =text-mode=
 
 
+#+begin_src emacs-lisp
+(use-feature text-mode
+  :hook ((text-mode . indicate-buffer-boundaries-left)
+         (text-mode . abbrev-mode)))
 #+end_src
 
 #+end_src
 
-* Editing
-:PROPERTIES:
-:CUSTOM_ID: editing
-:END:
-
 ** Company
 
 #+begin_src emacs-lisp
 ** Company
 
 #+begin_src emacs-lisp
@@ -1199,10 +1335,7 @@ TODO: break this giant source block down into individual org sections.
   (global-company-mode t))
 #+end_src
 
   (global-company-mode t))
 #+end_src
 
-* Syntax and spell checking
-:PROPERTIES:
-:CUSTOM_ID: syntax-spell-checking
-:END:
+** Flycheck
 
 #+begin_src emacs-lisp
 (use-package flycheck
 
 #+begin_src emacs-lisp
 (use-package flycheck
@@ -1251,10 +1384,23 @@ TODO: break this giant source block down into individual org sections.
 :CUSTOM_ID: programming-modes
 :END:
 
 :CUSTOM_ID: programming-modes
 :END:
 
+** Lisp
+
+#+begin_src emacs-lisp
+(use-feature lisp-mode
+  :config
+  (add-hook 'emacs-lisp-mode-hook 'outline-minor-mode)
+  (add-hook 'emacs-lisp-mode-hook 'reveal-mode)
+  (defun indent-spaces-mode ()
+    (setq indent-tabs-mode nil))
+  (add-hook 'lisp-interaction-mode-hook #'indent-spaces-mode))
+#+end_src
+
 ** [[http://alloytools.org][Alloy]] (with [[https://github.com/dwwmmn/alloy-mode][alloy-mode]])
 
 #+begin_src emacs-lisp
 (use-package alloy-mode
 ** [[http://alloytools.org][Alloy]] (with [[https://github.com/dwwmmn/alloy-mode][alloy-mode]])
 
 #+begin_src emacs-lisp
 (use-package alloy-mode
+  :straight (:host github :repo "dwwmmn/alloy-mode")
   :defer t
   :config (setq alloy-basic-offset 2))
 #+end_src
   :defer t
   :config (setq alloy-basic-offset 2))
 #+end_src
@@ -1262,9 +1408,8 @@ TODO: break this giant source block down into individual org sections.
 ** [[https://coq.inria.fr][Coq]] (with [[https://github.com/ProofGeneral/PG][Proof General]])
 
 #+begin_src emacs-lisp
 ** [[https://coq.inria.fr][Coq]] (with [[https://github.com/ProofGeneral/PG][Proof General]])
 
 #+begin_src emacs-lisp
-(use-package proof-site  ; Proof General
-  :defer t
-  :load-path "lib/proof-site/generic/")
+(use-package proof-general
+  :defer t)
 #+end_src
 
 ** [[https://leanprover.github.io][Lean]] (with [[https://github.com/leanprover/lean-mode][lean-mode]])
 #+end_src
 
 ** [[https://leanprover.github.io][Lean]] (with [[https://github.com/leanprover/lean-mode][lean-mode]])
@@ -1474,7 +1619,7 @@ instead.
               ("C-c l l" . hs-lint)))
 #+end_src
 
               ("C-c l l" . hs-lint)))
 #+end_src
 
-** Web dev
+** Web
 
 *** SGML and HTML
 
 
 *** SGML and HTML
 
@@ -1601,21 +1746,20 @@ treemacs
   :after (treemacs))
 #+end_src
 
   :after (treemacs))
 #+end_src
 
-** geiser
+** COMMENT geiser
 
 #+begin_src emacs-lisp
 (use-package geiser)
 
 
 #+begin_src emacs-lisp
 (use-package geiser)
 
-(use-package geiser-guile
+(use-feature geiser-guile
   :config
   (setq geiser-guile-load-path "~/src/git/guix"))
 #+end_src
 
   :config
   (setq geiser-guile-load-path "~/src/git/guix"))
 #+end_src
 
-** guix
+** COMMENT guix
 
 #+begin_src emacs-lisp
 
 #+begin_src emacs-lisp
-(use-package guix
-  :load-path "lib/guix/elisp")
+(use-package guix)
 #+end_src
 
 * Emacs enhancements
 #+end_src
 
 * Emacs enhancements
@@ -1623,6 +1767,14 @@ treemacs
 :CUSTOM_ID: emacs-enhancements
 :END:
 
 :CUSTOM_ID: emacs-enhancements
 :END:
 
+** man
+
+#+begin_src emacs-lisp
+(use-feature man
+  :defer t
+  :config (setq Man-width 80))
+#+end_src
+
 ** [[https://github.com/justbur/emacs-which-key][which-key]]
 
 #+begin_quote
 ** [[https://github.com/justbur/emacs-which-key][which-key]]
 
 #+begin_quote
@@ -1632,7 +1784,51 @@ Emacs package that displays available keybindings in popup
 #+begin_src emacs-lisp
 (use-package which-key
   :defer 1
 #+begin_src emacs-lisp
 (use-package which-key
   :defer 1
-  :config (which-key-mode))
+  :config
+  (which-key-add-key-based-replacements
+    ;; prefixes for global prefixes and minor modes
+    "C-c @"   "outline"
+    "C-c !"   "flycheck"
+    "C-c 8"   "typo"
+    "C-c 8 -" "typo/dashes"
+    "C-c 8 <" "typo/left-brackets"
+    "C-c 8 >" "typo/right-brackets"
+    "C-x 8"   "unicode"
+    "C-x a"   "abbrev/expand"
+    "C-x r"   "rectangle/register/bookmark"
+    "C-x v"   "version control"
+    ;; prefixes for my personal bindings
+    "C-c a"   "applications"
+    "C-c a s" "shells"
+    "C-c b"   "borg"
+    "C-c c"   "compile-and-comments"
+    "C-c e"   "eval"
+    "C-c f"   "files"
+    "C-c F"   "frames"
+    "C-S-h"   "help(ful)"
+    "C-c m"   "multiple-cursors"
+    "C-c p"   "projectile"
+    "C-c p s" "projectile/search"
+    "C-c p x" "projectile/execute"
+    "C-c p 4" "projectile/other-window"
+    "C-c q"   "boxquote"
+    "s-g"     "magit"
+    "s-o"     "outline"
+    "s-t"     "themes")
+
+  ;; prefixes for major modes
+  (which-key-add-major-mode-key-based-replacements 'message-mode
+    "C-c f"   "footnote")
+  (which-key-add-major-mode-key-based-replacements 'org-mode
+    "C-c C-v" "org-babel")
+  (which-key-add-major-mode-key-based-replacements 'web-mode
+    "C-c C-a" "web/attributes"
+    "C-c C-b" "web/blocks"
+    "C-c C-d" "web/dom"
+    "C-c C-e" "web/element"
+    "C-c C-t" "web/tags")
+
+  (which-key-mode))
 #+end_src
 
 ** theme
 #+end_src
 
 ** theme
@@ -1681,7 +1877,7 @@ Emacs package that displays available keybindings in popup
 ** [[https://github.com/bbatsov/crux][crux]]
 
 #+begin_src emacs-lisp
 ** [[https://github.com/bbatsov/crux][crux]]
 
 #+begin_src emacs-lisp
-(use-package crux
+(use-package crux                       ; results in Waiting for git... [2 times]
   :defer 1
   :bind (("C-c b k" . crux-kill-other-buffers)
          ("C-c d"   . crux-duplicate-current-line-or-region)
   :defer 1
   :bind (("C-c b k" . crux-kill-other-buffers)
          ("C-c d"   . crux-duplicate-current-line-or-region)
@@ -1790,6 +1986,14 @@ Make =*scratch*= and =*Messages*= unkillable.
 
 Also see [[https://www.emacswiki.org/emacs/rebox2][rebox2]].
 
 
 Also see [[https://www.emacswiki.org/emacs/rebox2][rebox2]].
 
+** orgalist
+
+#+begin_src emacs-lisp
+(use-package orgalist
+  :after message
+  :hook (message-mode . orgalist-mode))
+#+end_src
+
 ** typo.el
 
 #+begin_src emacs-lisp
 ** typo.el
 
 #+begin_src emacs-lisp
@@ -1852,8 +2056,7 @@ Also see [[https://www.emacswiki.org/emacs/rebox2][rebox2]].
 #+begin_src emacs-lisp
 (use-package multi-term
   :defer 1
 #+begin_src emacs-lisp
 (use-package multi-term
   :defer 1
-  :bind (("C-c a s m m" . multi-term)
-         ("C-c a s m p" . multi-term-dedicated-toggle)
+  :bind (("C-c a s m" . multi-term-dedicated-toggle)
          :map term-mode-map
          ("C-c C-j" . term-char-mode)
          :map term-raw-map
          :map term-mode-map
          ("C-c C-j" . term-char-mode)
          :map term-raw-map
@@ -1931,7 +2134,7 @@ Also see [[https://www.emacswiki.org/emacs/rebox2][rebox2]].
  mail-user-agent   'gnus-user-agent
  read-mail-command 'gnus)
 
  mail-user-agent   'gnus-user-agent
  read-mail-command 'gnus)
 
-(use-package gnus
+(use-feature gnus
   :bind (("s-m"   . gnus)
          ("s-M"   . gnus-unplugged))
   :init
   :bind (("s-m"   . gnus)
          ("s-M"   . gnus-unplugged))
   :init
@@ -1964,7 +2167,7 @@ Also see [[https://www.emacswiki.org/emacs/rebox2][rebox2]].
    gnus-interactive-exit nil
    gnus-gcc-mark-as-read t))
 
    gnus-interactive-exit nil
    gnus-gcc-mark-as-read t))
 
-(use-package gnus-art
+(use-feature gnus-art
   :config
   (setq
    gnus-visible-headers
   :config
   (setq
    gnus-visible-headers
@@ -1993,7 +2196,7 @@ Also see [[https://www.emacswiki.org/emacs/rebox2][rebox2]].
    ("R"   . gnus-article-wide-reply-with-original)
    ("M-L" . org-store-link)))
 
    ("R"   . gnus-article-wide-reply-with-original)
    ("M-L" . org-store-link)))
 
-(use-package gnus-sum
+(use-feature gnus-sum
   :bind (:map gnus-summary-mode-map
               :prefix-map a/gnus-summary-prefix-map
               :prefix "v"
   :bind (:map gnus-summary-mode-map
               :prefix-map a/gnus-summary-prefix-map
               :prefix "v"
@@ -2008,7 +2211,7 @@ Also see [[https://www.emacswiki.org/emacs/rebox2][rebox2]].
    ("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))
 
-(use-package gnus-msg
+(use-feature gnus-msg
   :config
   (setq gnus-posting-styles
         '((".*"
   :config
   (setq gnus-posting-styles
         '((".*"
@@ -2025,19 +2228,19 @@ Also see [[https://www.emacswiki.org/emacs/rebox2][rebox2]].
            (address "abandali@uwaterloo.ca")
            (gcc "\"nnimap+uwaterloo:Sent Items\"")))))
 
            (address "abandali@uwaterloo.ca")
            (gcc "\"nnimap+uwaterloo:Sent Items\"")))))
 
-(use-package gnus-topic
+(use-feature gnus-topic
   :hook (gnus-group-mode . gnus-topic-mode))
 
   :hook (gnus-group-mode . gnus-topic-mode))
 
-(use-package gnus-agent
+(use-feature gnus-agent
   :config
   (setq gnus-agent-synchronize-flags 'ask)
   :hook (gnus-group-mode . gnus-agent-mode))
 
   :config
   (setq gnus-agent-synchronize-flags 'ask)
   :hook (gnus-group-mode . gnus-agent-mode))
 
-(use-package gnus-group
+(use-feature gnus-group
   :config
   (setq gnus-permanently-visible-groups "\\((INBOX\\|gnu$\\)"))
 
   :config
   (setq gnus-permanently-visible-groups "\\((INBOX\\|gnu$\\)"))
 
-(use-package mm-decode
+(use-feature mm-decode
   :config
   (setq mm-discouraged-alternatives '("text/html" "text/richtext")))
 #+end_src
   :config
   (setq mm-discouraged-alternatives '("text/html" "text/richtext")))
 #+end_src
@@ -2045,7 +2248,7 @@ Also see [[https://www.emacswiki.org/emacs/rebox2][rebox2]].
 ** sendmail
 
 #+begin_src emacs-lisp
 ** sendmail
 
 #+begin_src emacs-lisp
-(use-package sendmail
+(use-feature sendmail
   :config
   (setq sendmail-program "/usr/bin/msmtp"
         ;; message-sendmail-extra-arguments '("-v" "-d")
   :config
   (setq sendmail-program "/usr/bin/msmtp"
         ;; message-sendmail-extra-arguments '("-v" "-d")
@@ -2056,7 +2259,7 @@ Also see [[https://www.emacswiki.org/emacs/rebox2][rebox2]].
 ** message
 
 #+begin_src emacs-lisp
 ** message
 
 #+begin_src emacs-lisp
-(use-package message
+(use-feature message
   :config
   (defconst a/message-cite-style-format "On %Y-%m-%d %l:%M %p, %N wrote:")
   (defconst message-cite-style-bandali
   :config
   (defconst a/message-cite-style-format "On %Y-%m-%d %l:%M %p, %N wrote:")
   (defconst message-cite-style-bandali
@@ -2101,7 +2304,7 @@ Also see [[https://www.emacswiki.org/emacs/rebox2][rebox2]].
 Convenient footnotes in =message-mode=.
 
 #+begin_src emacs-lisp
 Convenient footnotes in =message-mode=.
 
 #+begin_src emacs-lisp
-(use-package footnote
+(use-feature footnote
   :after message
   :bind
   (:map message-mode-map
   :after message
   :bind
   (:map message-mode-map
@@ -2131,7 +2334,7 @@ Convenient footnotes in =message-mode=.
   (with-eval-after-load 'swiper
     (add-to-list 'swiper-font-lock-exclude 'ebdb-mode t)))
 
   (with-eval-after-load 'swiper
     (add-to-list 'swiper-font-lock-exclude 'ebdb-mode t)))
 
-(use-package ebdb-com
+(use-feature ebdb-com
   :after ebdb)
 
 ;; (use-package ebdb-complete
   :after ebdb)
 
 ;; (use-package ebdb-complete
@@ -2148,7 +2351,7 @@ Convenient footnotes in =message-mode=.
                     (add-to-list (make-local-variable 'company-backends)
                                  'company-ebdb))))
 
                     (add-to-list (make-local-variable 'company-backends)
                                  'company-ebdb))))
 
-(use-package ebdb-gnus
+(use-feature ebdb-gnus
   :after ebdb
   :custom
   (ebdb-gnus-window-configuration
   :after ebdb
   :custom
   (ebdb-gnus-window-configuration
@@ -2159,7 +2362,7 @@ Convenient footnotes in =message-mode=.
                            (article 1.0)
                            (ebdb-gnus 0.3))))))
 
                            (article 1.0)
                            (ebdb-gnus 0.3))))))
 
-(use-package ebdb-mua
+(use-feature ebdb-mua
   :after ebdb
   ;; :custom (ebdb-mua-pop-up nil)
   )
   :after ebdb
   ;; :custom (ebdb-mua-pop-up nil)
   )
@@ -2199,7 +2402,7 @@ Convenient footnotes in =message-mode=.
     (gnus-harvest-install)))
 #+end_src
 
     (gnus-harvest-install)))
 #+end_src
 
-* Blogging
+* COMMENT Blogging
 :PROPERTIES:
 :CUSTOM_ID: blogging
 :END:
 :PROPERTIES:
 :CUSTOM_ID: blogging
 :END:
@@ -2238,6 +2441,6 @@ Display how long it took to load the init file.
 
 * COMMENT Local Variables                                           :ARCHIVE:
 # Local Variables:
 
 * COMMENT Local Variables                                           :ARCHIVE:
 # Local Variables:
-# eval: (add-hook 'after-save-hook #'a/async-babel-tangle 'append 'local)
+# eval: ;; (add-hook 'after-save-hook #'a/async-babel-tangle 'append 'local)
 # eval: (typo-mode -1)
 # End:
 # eval: (typo-mode -1)
 # End: