[emacs] Update proof-site to v4.4-226-g7389d438, tweak defer delays
[~bandali/configs] / init.org
index d148363..c69823e 100644 (file)
--- a/init.org
+++ b/init.org
@@ -41,11 +41,10 @@ then bootstrap Borg, tell Borg to retrieve package submodules, and
 byte-compiled the packages. Something along these lines should work:
 
 #+begin_src sh :tangle no
-git clone https://github.com/aminb/dotfiles ~/.emacs.d
+git clone https://git.sr.ht/~bandali/dotfiles ~/.emacs.d
 cd ~/.emacs.d
 make bootstrap-borg
 make bootstrap
-make build
 #+end_src
 
 * Contents                                                   :toc_1:noexport:
@@ -217,8 +216,11 @@ can then be managed with the help of Magit or other tools.
       user-emacs-directory (file-name-directory user-init-file))
 (add-to-list 'load-path
              (expand-file-name "lib/borg" user-emacs-directory))
+;; Main engine start...
 (require 'borg)
+;; Solid rocket booster ignition...
 (borg-initialize)
+;; We have lift off!
 
 ;; (require 'borg-nix-shell)
 ;; (setq borg-build-shell-command 'borg-nix-shell-build-command)
@@ -252,6 +254,8 @@ and without compromising on performance.
           debug-on-error t)
   (setq use-package-verbose nil
         use-package-expand-minimally t))
+
+(setq use-package-always-defer t)
 #+end_src
 
 *** Epkg
@@ -266,7 +270,6 @@ database, low-level functions for querying the database, and a
 
 #+begin_src emacs-lisp
 (use-package epkg
-  :defer t
   :bind
   (("C-c b d" . epkg-describe-package)
    ("C-c b p" . epkg-list-packages)
@@ -674,6 +677,12 @@ for this.
 (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
@@ -724,7 +733,7 @@ customizing it.
             '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
@@ -736,7 +745,7 @@ In short, my favourite way of life.
 
 #+begin_src emacs-lisp
 (use-package org
-  :defer 1
+  :defer 2
   :config
   (setq org-src-tab-acts-natively t
         org-src-preserve-indentation nil
@@ -748,13 +757,6 @@ In short, my favourite way of life.
         org-catch-invisible-edits 'show-and-error
         org-log-done 'time)
   (add-to-list 'org-structure-template-alist '("L" . "src emacs-lisp") t)
-  (font-lock-add-keywords
-   'org-mode
-   '(("[ \t]*\\(#\\+\\(BEGIN\\|END\\|begin\\|end\\)_\\(\\S-+\\)\\)[ \t]*\\([^\n:]*\\)"
-      (1 '(:foreground "#5a5b5a" :background "#292b2b") t) ; directive
-      (3 '(:foreground "#81a2be" :background "#292b2b") t) ; kind
-      (4 '(:foreground "#c5c8c6") t))) ; title
-   t)
   :bind (:map org-mode-map ("M-L" . org-insert-last-stored-link))
   :hook ((org-mode . org-indent-mode)
          (org-mode . auto-fill-mode)
@@ -772,23 +774,15 @@ In short, my favourite way of life.
   (setq org-latex-listings 'listings
         ;; org-latex-prefer-user-labels t
         )
-  (add-to-list 'org-latex-packages-alist '("" "listings"))
-  (add-to-list 'org-latex-packages-alist '("" "color"))
   (add-to-list 'org-latex-classes
                '("IEEEtran" "\\documentclass[11pt]{IEEEtran}"
-                 ("\\section{%s}" . "\\section*{%s}")
-                 ("\\subsection{%s}" . "\\subsection*{%s}")
+                 ("\\section{%s}"       . "\\section*{%s}")
+                 ("\\subsection{%s}"    . "\\subsection*{%s}")
                  ("\\subsubsection{%s}" . "\\subsubsection*{%s}")
-                 ("\\paragraph{%s}" . "\\paragraph*{%s}")
-                 ("\\subparagraph{%s}" . "\\subparagraph*{%s}"))
-               t))
-
-(use-package ox-beamer
-  :after ox)
-
-(use-package orgalist
-  :after message
-  :hook (message-mode . orgalist-mode))
+                 ("\\paragraph{%s}"     . "\\paragraph*{%s}")
+                 ("\\subparagraph{%s}"  . "\\subparagraph*{%s}"))
+               t)
+  (require 'ox-beamer))
 #+end_src
 
 **** asynchronous tangle
@@ -808,6 +802,9 @@ file.
   (defvar a/async-tangle-post-compile "make ti"
     "If non-nil, pass to `compile' after successful tangle.")
 
+  (defvar a/async-tangle-byte-recompile nil
+    "If non-nil, byte-recompile the file on successful tangle.")
+
   (defun a/async-babel-tangle ()
     "Tangle org file asynchronously."
     (interactive)
@@ -815,7 +812,7 @@ file.
            (file (buffer-file-name))
            (file-nodir (file-name-nondirectory file))
            ;; (async-quiet-switch "-q")
-           )
+           (file-noext (file-name-sans-extension file)))
       (async-start
        `(lambda ()
           (require 'org)
@@ -824,6 +821,7 @@ file.
          `(lambda (result)
             (if result
                 (progn
+                  ;; (setq byte-compile-warnings '(not noruntime unresolved))
                   (message "Tangled %s%s"
                            ,file-nodir
                            (if a/show-async-tangle-time
@@ -832,7 +830,9 @@ file.
                                                                   ',file-tangle-start-time)))
                              ""))
                   (when a/async-tangle-post-compile
-                    (compile a/async-tangle-post-compile)))
+                    (compile a/async-tangle-post-compile))
+                  (when a/async-tangle-byte-recompile
+                    (byte-recompile-file (concat ,file-noext ".el"))))
               (message "Tangling %s failed" ,file-nodir))))))))
 
 (add-to-list
@@ -850,7 +850,7 @@ Not just how I do git, but /the/ way to do git.
 
 #+begin_src emacs-lisp
 (use-package magit
-  :defer 1
+  :defer 2
   :bind (("C-x g" . magit-status)
          ("s-g s" . magit-status)
          ("s-g l" . magit-log-buffer-file))
@@ -868,6 +868,30 @@ Not just how I do git, but /the/ way to do git.
   :custom-face (magit-diff-file-heading ((t (:weight normal)))))
 #+end_src
 
+*** recentf
+
+Recently opened files.
+
+#+begin_src emacs-lisp
+(use-package 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)
+#+end_src
+
 *** [[https://github.com/abo-abo/swiper][Ivy]] (and friends)
 
 #+begin_quote
@@ -881,7 +905,7 @@ There's no way I could top that, so I won't attempt to.
 
 #+begin_src emacs-lisp
 (use-package ivy
-  :defer 1
+  :defer 0.5
   :bind
   (:map ivy-minibuffer-map
    ([escape] . keyboard-escape-quit)
@@ -902,6 +926,7 @@ There's no way I could top that, so I won't attempt to.
 
 #+begin_src emacs-lisp
 (use-package swiper
+  :after ivy
   :bind (("C-s"   . swiper)
          ("C-r"   . swiper)
          ("C-S-s" . isearch-forward)))
@@ -911,7 +936,8 @@ There's no way I could top that, so I won't attempt to.
 
 #+begin_src emacs-lisp
 (use-package counsel
-  :defer 1
+  :defer 0.6
+  :after ivy
   :bind (([remap execute-extended-command] . counsel-M-x)
          ([remap find-file]                . counsel-find-file)
          ("s-r"                            . counsel-recentf)
@@ -928,7 +954,7 @@ There's no way I could top that, so I won't attempt to.
 
 #+begin_src emacs-lisp
 (use-package eshell
-  :defer 1
+  :defer 2
   :commands eshell
   :bind ("C-c a s e" . eshell)
   :config
@@ -947,7 +973,8 @@ There's no way I could top that, so I won't attempt to.
 
   (defun a/eshell-setup ()
     (make-local-variable 'company-idle-delay)
-    (defvar company-idle-delay nil)
+    (defvar company-idle-delay)
+    (setq company-idle-delay nil)
     (bind-keys :map eshell-mode-map
                ("C-d"   . a/eshell-quit-or-delete-char)
                ("C-S-l" . a/eshell-clear)
@@ -964,7 +991,6 @@ There's no way I could top that, so I won't attempt to.
 
 #+begin_src emacs-lisp
 (use-package ibuffer
-  :defer t
   :bind
   (("C-x C-b" . ibuffer-other-window)
    :map ibuffer-mode-map
@@ -1035,7 +1061,6 @@ There's no way I could top that, so I won't attempt to.
 
 #+begin_src emacs-lisp
 (use-package outline
-  :defer t
   :hook (prog-mode . outline-minor-mode)
   :bind
   (:map
@@ -1053,33 +1078,23 @@ There's no way I could top that, so I won't attempt to.
    ("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
-(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
+  :custom (ls-lisp-dirs-first t))
 
 (use-package dired
-  :defer t
   :config
-  (setq dired-listing-switches "-alh")
+  (setq dired-listing-switches "-alh"
+        ls-lisp-use-insert-directory-program nil)
 
   ;; easily diff 2 marked files
   ;; https://oremacs.com/2017/03/18/dired-ediff/
   (defun dired-ediff-files ()
     (interactive)
-    (require 'ediff)
+    (require 'dired-aux)
+    (defvar ediff-after-quit-hook-internal)
     (let ((files (dired-get-marked-files))
           (wnd (current-window-configuration)))
       (if (<= (length files) 2)
@@ -1098,86 +1113,129 @@ TODO: break this giant source block down into individual org sections.
                         (set-window-configuration wnd))))
         (error "no more than 2 files should be marked"))))
   :bind (:map dired-mode-map
-              ("e" . dired-ediff-files)
-              ("E" . dired-toggle-read-only)
-              ("z" . (lambda ()
-                       (interactive)
-                       (a/dired-start-process "zathura")))))
+              ("b"  . dired-up-directory)
+              ("e"  . dired-ediff-files)
+              ("E"  . dired-toggle-read-only)
+              ("\\" . dired-hide-details-mode)
+              ("z"  . (lambda ()
+                        (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
 
+#+begin_src emacs-lisp
 (use-package help
-  :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-package tramp
   :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
-  :defer t
-  :config (setq Man-width 80))
+*** Dash
+
+#+begin_src emacs-lisp
+(use-package dash
+  :config (dash-enable-font-lock))
+#+end_src
+
+* Editing
+:PROPERTIES:
+:CUSTOM_ID: editing
+:END:
+
+** =diff-hl=
+
+Highlight uncommitted changes in the left fringe.
+
+#+begin_src emacs-lisp
+(use-package diff-hl
+  :config
+  (setq diff-hl-draw-borders nil)
+  (global-diff-hl-mode)
+  :hook (magit-post-refresh . diff-hl-magit-post-refresh))
+#+end_src
+
+** ElDoc
+
+Display Lisp objects at point in the echo area.
+
+#+begin_src emacs-lisp
+(use-package eldoc
+  :when (version< "25" emacs-version)
+  :config (global-eldoc-mode))
+#+end_src
 
+** paren
+
+Highlight matching parens.
+
+#+begin_src emacs-lisp
 (use-package paren
+  :demand
   :config (show-paren-mode))
+#+end_src
 
-(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))
+** simple (for column numbers)
 
-(use-package recentf
-  :defer 0.5
-  :config
-  (add-to-list 'recentf-exclude "^/\\(?:ssh\\|su\\|sudo\\)?:")
-  (setq recentf-max-saved-items 40))
+#+begin_src emacs-lisp
+(use-package simple
+  :config (column-number-mode))
+#+end_src
+
+** =savehist=
 
+Save minibuffer history.
+
+#+begin_src emacs-lisp
 (use-package savehist
   :config (savehist-mode))
+#+end_src
 
+** =saveplace=
+
+Automatically save place in each file.
+
+#+begin_src emacs-lisp
 (use-package saveplace
   :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-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))
+#+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-package text-mode
+  :hook ((text-mode . indicate-buffer-boundaries-left)
+         (text-mode . abbrev-mode)))
 #+end_src
 
-* Editing
-:PROPERTIES:
-:CUSTOM_ID: editing
-:END:
-
 ** Company
 
 #+begin_src emacs-lisp
 (use-package company
-  :defer 1
+  :defer 3
   :bind
   (:map company-active-map
         ([tab]    . company-complete-common-or-cycle)
@@ -1192,10 +1250,7 @@ TODO: break this giant source block down into individual org sections.
   (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
@@ -1244,11 +1299,22 @@ TODO: break this giant source block down into individual org sections.
 :CUSTOM_ID: programming-modes
 :END:
 
+** Lisp
+
+#+begin_src emacs-lisp
+(use-package 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
-  :defer t
   :config (setq alloy-basic-offset 2))
 #+end_src
 
@@ -1256,7 +1322,6 @@ TODO: break this giant source block down into individual org sections.
 
 #+begin_src emacs-lisp
 (use-package proof-site  ; Proof General
-  :defer t
   :load-path "lib/proof-site/generic/")
 #+end_src
 
@@ -1284,7 +1349,6 @@ TODO: break this giant source block down into individual org sections.
 
 #+begin_src emacs-lisp
 (use-package haskell-mode
-  :defer t
   :config
   (setq haskell-indentation-layout-offset 4
         haskell-indentation-left-offset 4
@@ -1467,13 +1531,12 @@ instead.
               ("C-c l l" . hs-lint)))
 #+end_src
 
-** Web dev
+** Web
 
 *** SGML and HTML
 
 #+begin_src emacs-lisp
 (use-package sgml-mode
-  :defer t
   :config
   (setq sgml-basic-offset 2))
 #+end_src
@@ -1482,7 +1545,6 @@ instead.
 
 #+begin_src emacs-lisp
 (use-package css-mode
-  :defer t
   :config
   (setq css-indent-offset 2))
 #+end_src
@@ -1491,7 +1553,6 @@ instead.
 
 #+begin_src emacs-lisp
 (use-package web-mode
-  :defer t
   :mode "\\.html\\'"
   :config
   (a/setq-every 2
@@ -1616,6 +1677,13 @@ treemacs
 :CUSTOM_ID: emacs-enhancements
 :END:
 
+** man
+
+#+begin_src emacs-lisp
+(use-package man
+  :config (setq Man-width 80))
+#+end_src
+
 ** [[https://github.com/justbur/emacs-which-key][which-key]]
 
 #+begin_quote
@@ -1625,7 +1693,51 @@ Emacs package that displays available keybindings in popup
 #+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
@@ -1639,6 +1751,7 @@ Emacs package that displays available keybindings in popup
 
 #+begin_src emacs-lisp
 (use-package smart-mode-line
+  :demand
   :config
   (sml/setup))
 #+end_src
@@ -1652,19 +1765,29 @@ Emacs package that displays available keybindings in popup
 ** theme helper functions
 
 #+begin_src emacs-lisp
+(defvar a/org-mode-font-lock-keywords
+  '(("[ \t]*\\(#\\+\\(BEGIN\\|END\\|begin\\|end\\)_\\(\\S-+\\)\\)[ \t]*\\([^\n:]*\\)"
+      (1 '(:foreground "#5a5b5a" :background "#292b2b") t) ; directive
+      (3 '(:foreground "#81a2be" :background "#292b2b") t) ; kind
+      (4 '(:foreground "#c5c8c6") t))))                    ; title
+
 (defun a/lights-on ()
   "Enable my favourite light theme."
   (interactive)
   (mapc #'disable-theme custom-enabled-themes)
   (load-theme 'tangomod t)
-  (sml/apply-theme 'automatic))
+  (sml/apply-theme 'automatic)
+  (font-lock-remove-keywords
+   'org-mode a/org-mode-font-lock-keywords))
 
 (defun a/lights-off ()
   "Go dark."
   (interactive)
   (mapc #'disable-theme custom-enabled-themes)
   (load-theme 'doom-tomorrow-night t)
-  (sml/apply-theme 'automatic))
+  (sml/apply-theme 'automatic)
+  (font-lock-add-keywords
+   'org-mode a/org-mode-font-lock-keywords t))
 
 (bind-keys
  ("s-t d" . a/lights-off)
@@ -1700,7 +1823,6 @@ Emacs package that displays available keybindings in popup
 
 #+begin_src emacs-lisp
 (use-package projectile
-  :defer t
   :bind-keymap ("C-c p" . projectile-command-map)
   :config
   (projectile-mode)
@@ -1722,7 +1844,7 @@ Emacs package that displays available keybindings in popup
 
 #+begin_src emacs-lisp
 (use-package helpful
-  :defer 1
+  :defer 3
   :bind
   (("C-S-h c" . helpful-command)
    ("C-S-h f" . helpful-callable)        ; helpful-function
@@ -1783,6 +1905,14 @@ Make =*scratch*= and =*Messages*= unkillable.
 
 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
@@ -1806,11 +1936,9 @@ Also see [[https://www.emacswiki.org/emacs/rebox2][rebox2]].
 
 #+begin_src emacs-lisp
 (use-package shrink-path
+  :defer 2
   :after eshell
   :config
-  (setq eshell-prompt-regexp "\\(.*\n\\)*λ "
-        eshell-prompt-function #'+eshell/prompt)
-
   (defun +eshell/prompt ()
     (let ((base/dir (shrink-path-prompt default-directory)))
       (concat (propertize (car base/dir)
@@ -1830,23 +1958,25 @@ Also see [[https://www.emacswiki.org/emacs/rebox2][rebox2]].
                              collect match))))
       (if (not (eq branch nil))
           (concat " " (substring branch 2))
-        ""))))
+        "")))
+  (setq eshell-prompt-regexp "\\(.*\n\\)*λ "
+                         eshell-prompt-function #'+eshell/prompt))
 #+end_src
 
 ** [[https://github.com/peterwvj/eshell-up][eshell-up]]
 
 #+begin_src emacs-lisp
 (use-package eshell-up
-  :after eshell)
+  :after eshell
+  :commands eshell-up)
 #+end_src
 
 ** multi-term
 
 #+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)
+  :defer 3
+  :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
@@ -1891,6 +2021,20 @@ Also see [[https://www.emacswiki.org/emacs/rebox2][rebox2]].
   :bind ("C-=" . er/expand-region))
 #+end_src
 
+** multiple-cursors
+
+#+begin_src emacs-lisp
+(use-package multiple-cursors
+  :bind
+  (("C-S-<mouse-1>" . mc/add-cursor-on-click)
+   (:prefix-map a/mc-prefix-map
+               :prefix "C-c m"
+               ("c" . mc/edit-lines)
+               ("n" . mc/mark-next-like-this)
+               ("p" . mc/mark-previous-like-this)
+               ("a" . mc/mark-all-like-this))))
+#+end_src
+
 * Email
 :PROPERTIES:
 :CUSTOM_ID: email
@@ -1911,9 +2055,7 @@ Also see [[https://www.emacswiki.org/emacs/rebox2][rebox2]].
  read-mail-command 'gnus)
 
 (use-package gnus
-  :bind (("C-c m" . gnus)
-         ("C-c M" . gnus-unplugged)
-         ("s-m"   . gnus)
+  :bind (("s-m"   . gnus)
          ("s-M"   . gnus-unplugged))
   :init
   (setq
@@ -2105,7 +2247,8 @@ Convenient footnotes in =message-mode=.
 
 #+begin_src emacs-lisp
 (use-package ebdb
-  :defer 1
+  :defer 2
+  :after gnus
   :bind (:map gnus-group-mode-map ("e" . ebdb))
   :config
   (setq ebdb-sources (no-littering-expand-var-file-name "ebdb"))
@@ -2121,15 +2264,12 @@ Convenient footnotes in =message-mode=.
 ;;   (ebdb-complete-enable))
 
 (use-package company-ebdb
-  :after (:all company message)
+  :defer 2
   :config
-  (defun company-ebdb--post-complete (_) nil)
-  :hook
-  (message-mode . (lambda ()
-                    (add-to-list (make-local-variable 'company-backends)
-                                 'company-ebdb))))
+  (defun company-ebdb--post-complete (_) nil))
 
 (use-package ebdb-gnus
+  :defer 3
   :after ebdb
   :custom
   (ebdb-gnus-window-configuration
@@ -2141,6 +2281,7 @@ Convenient footnotes in =message-mode=.
                            (ebdb-gnus 0.3))))))
 
 (use-package ebdb-mua
+  :defer 3
   :after ebdb
   ;; :custom (ebdb-mua-pop-up nil)
   )
@@ -2220,5 +2361,5 @@ Display how long it took to load the init file.
 * COMMENT Local Variables                                           :ARCHIVE:
 # Local Variables:
 # eval: (add-hook 'after-save-hook #'a/async-babel-tangle 'append 'local)
-# eval: (typo-mode -1)
+# eval: (when (featurep 'typo (typo-mode -1)))
 # End: