Drop use-package
authorAmin Bandali <bandali@gnu.org>
Sun, 27 Sep 2020 16:06:44 +0000 (12:06 -0400)
committerAmin Bandali <bandali@gnu.org>
Sun, 27 Sep 2020 16:07:10 +0000 (12:07 -0400)
along with some unused stuff

12 files changed:
init.el
lisp/bandali-dired.el
lisp/bandali-ebdb.el
lisp/bandali-erc.el
lisp/bandali-eshell.el
lisp/bandali-gnus.el
lisp/bandali-ibuffer.el
lisp/bandali-ivy.el
lisp/bandali-message.el
lisp/bandali-org.el
lisp/bandali-theme.el
lisp/bandali-yasnippet.el [deleted file]

diff --git a/init.el b/init.el
index bebc421..5ba4c72 100644 (file)
--- a/init.el
+++ b/init.el
@@ -41,8 +41,6 @@
   "Value of `current-time' when Emacs begins loading `user-init-file'.")
 (defvar b/emacs-initialized nil
   "Whether Emacs has been initialized.")
-(defvar b/exwm-p (string= (system-name) "chaman")
-  "Whether or not we will be using `exwm'.")
 
 (when (not (bound-and-true-p b/emacs-initialized))
   (message "Loading Emacs...done (%.3fs)"
@@ -68,7 +66,7 @@
         gc-cons-threshold       b/gc-cons-threshold
         gc-cons-percentage      b/gc-cons-percentage
         file-name-handler-alist b/file-name-handler-alist)
-  (when b/exwm-p
+  (when (featurep 'exwm-workspace)
     (with-eval-after-load 'exwm-workspace
       (setq-default
        mode-line-format
         '(("git@github.com:" . "https://github.com/")
           ("git@gitlab.com:" . "https://gitlab.com/"))))
 
-;; use-package
-(if nil                             ; set to t when need to debug init
-    (progn
-      (setq use-package-verbose t
-            use-package-expand-minimally nil
-            use-package-compute-statistics t
-            debug-on-error t)
-      (require 'use-package))
-  (setq use-package-verbose nil
-        use-package-expand-minimally t))
+(defmacro csetq (&rest args)
+  "Set the value of user option VAR to VALUE.
 
-(setq use-package-always-defer t)
-(require 'bind-key)
+More generally, you can use multiple variables and values, as in
+  (csetq VAR VALUE VAR VALUE...)
+This sets each user option VAR's value to the corresponding VALUE.
+
+\(fn [VAR VALUE]...)"
+  (declare (debug setq))
+  `(progn
+     ,@(cl-loop for (var value) on args by 'cddr
+                collect
+                `(funcall (or (get ',var 'custom-set) #'set-default)
+                          ',var ,value))))
 
 \f
 ;;; Initial setup
 
 ;; keep ~/.emacs.d clean
-(use-package no-littering
-  :demand
-  :config
-  (defalias 'b/etc 'no-littering-expand-etc-file-name)
-  (defalias 'b/var 'no-littering-expand-var-file-name))
-
-(use-package auto-compile
-  :demand
-  :config
-  (auto-compile-on-load-mode)
-  (auto-compile-on-save-mode)
-  (setq auto-compile-display-buffer               nil)
-  (setq auto-compile-mode-line-counter            t)
-  (setq auto-compile-source-recreate-deletes-dest t)
-  (setq auto-compile-toggle-deletes-nonlib-dest   t)
-  (setq auto-compile-update-autoloads             t))
+(require 'no-littering)
+(defalias 'b/etc 'no-littering-expand-etc-file-name)
+(defalias 'b/var 'no-littering-expand-var-file-name)
+
+(require 'auto-compile)
+(auto-compile-on-load-mode)
+(auto-compile-on-save-mode)
+(setq auto-compile-display-buffer nil)
+(setq auto-compile-mode-line-counter t)
+(setq auto-compile-source-recreate-deletes-dest t)
+(setq auto-compile-toggle-deletes-nonlib-dest t)
+(setq auto-compile-update-autoloads t)
 
 ;; separate custom file (don't want it mixing with init.el)
-(use-package custom
-  :no-require
-  :config
+(with-eval-after-load 'custom
   (setq custom-file (b/etc "custom.el"))
   (when (file-exists-p custom-file)
     (load custom-file))
 
 ;; start up emacs server.  see
 ;; https://www.gnu.org/software/emacs/manual/html_node/emacs/Emacs-Server.html#Emacs-Server
-(use-package server
-  :defer 0.5
-  :config
+(run-with-idle-timer 0.5 nil #'require 'server)
+(with-eval-after-load 'server
   (declare-function server-edit "server")
   (bind-key "C-c F D" 'server-edit)
   (declare-function server-running-p "server")
 
 ;;;; C-level customizations
 
-(setq
+(csetq
  ;; minibuffer
  enable-recursive-minibuffers t
  resize-mini-windows t
 
 ;;;; Elisp-level customizations
 
-(use-package startup
-  :no-require
-  :demand
-  :config
-  ;; don't need to see the startup echo area message
-  (advice-add #'display-startup-echo-area-message :override #'ignore)
-  :custom
-  ;; i want *scratch* as my startup buffer
-  (initial-buffer-choice t)
-  ;; i don't need the default hint
-  (initial-scratch-message nil)
-  ;; use customizable text-mode as major mode for *scratch*
-  ;; (initial-major-mode 'text-mode)
-  ;; inhibit buffer list when more than 2 files are loaded
-  (inhibit-startup-buffer-menu t)
-  ;; don't need to see the startup screen or echo area message
-  (inhibit-startup-screen t)
-  (inhibit-startup-echo-area-message user-login-name))
-
-(use-package files
-  :no-require
-  :demand
-  :custom
-  ;; backups (C-h v make-backup-files RET)
-  (backup-by-copying t)
-  (version-control t)
-  (delete-old-versions t)
-
-  ;; auto-save
-  (auto-save-file-name-transforms
-   `((".*" ,(b/var "auto-save/") t)))
-
-  ;; insert newline at the end of files
-  (require-final-newline t)
-
-  ;; open read-only file buffers in view-mode
-  ;; (enables niceties like `q' for quit)
-  (view-read-only t))
-
+;; startup
+;; don't need to see the startup echo area message
+(advice-add #'display-startup-echo-area-message :override #'ignore)
+(csetq
+ ;; i want *scratch* as my startup buffer
+ initial-buffer-choice t
+ ;; i don't need the default hint
+ initial-scratch-message nil
+ ;; use customizable text-mode as major mode for *scratch*
+ ;; (initial-major-mode 'text-mode)
+ ;; inhibit buffer list when more than 2 files are loaded
+ inhibit-startup-buffer-menu t
+ ;; don't need to see the startup screen or echo area message
+ inhibit-startup-screen t
+ inhibit-startup-echo-area-message user-login-name)
+
+;; files
+(csetq
+ ;; backups (C-h v make-backup-files RET)
+ backup-by-copying t
+ version-control t
+ delete-old-versions t
+ ;; auto-save
+ auto-save-file-name-transforms `((".*" ,(b/var "auto-save/") t))
+ ;; insert newline at the end of files
+ require-final-newline t
+ ;; open read-only file buffers in view-mode
+ ;; (enables niceties like `q' for quit)
+ view-read-only t)
+
+;; novice
 ;; disable disabled commands
-(setq disabled-command-function nil)
+(csetq disabled-command-function nil)
 
 ;; lazy-person-friendly yes/no prompts
 (defalias 'yes-or-no-p #'y-or-n-p)
 
 ;; enable automatic reloading of changed buffers and files
-(use-package autorevert
-  :demand
-  :config
-  (global-auto-revert-mode 1)
-  :custom
-  (auto-revert-verbose nil)
-  (global-auto-revert-non-file-buffers nil))
+(progn ; autorevert
+  (csetq auto-revert-verbose nil
+         global-auto-revert-non-file-buffers nil)
+  (require 'autorevert)
+  (global-auto-revert-mode 1))
 
 ;; time and battery in mode-line
-(use-package time
-  :demand
-  :config
-  (display-time-mode)
-  :custom
-  (display-time-default-load-average nil)
-  (display-time-format " %a %b %-e %-l:%M%P")
-  (display-time-mail-icon '(image :type xpm :file "gnus/gnus-pointer.xpm" :ascent center))
-  (display-time-use-mail-icon t))
-
-(use-package battery
-  :demand
-  :config
-  (display-battery-mode)
-  :custom
-  (battery-mode-line-format "%p%% %t"))
-
-(use-package fringe
-  :demand
-  :config
-  ;; smaller fringe
-  ;; (fringe-mode '(3 . 1))
-  (fringe-mode nil))
-
-(use-package winner
-  :demand
-  :config
-  ;; enable winner-mode (C-h f winner-mode RET)
-  (winner-mode 1))
-
-(use-package compile
-  :config
+(csetq
+ display-time-default-load-average nil
+ display-time-format " %a %b %-e %-l:%M%P"
+ display-time-mail-icon '(image :type xpm
+                                :file "gnus/gnus-pointer.xpm"
+                                :ascent center)
+ display-time-use-mail-icon t)
+(require 'time)
+(display-time-mode)
+
+(csetq battery-mode-line-format "%p%% %t")
+(require 'battery)
+(display-battery-mode)
+
+(require 'fringe)
+;; smaller fringe
+;; (fringe-mode '(3 . 1))
+(fringe-mode nil)
+
+(require 'winner)
+;; enable winner-mode (C-h f winner-mode RET)
+(winner-mode 1)
+
+(with-eval-after-load 'compile
   ;; don't display *compilation* buffer on success.  based on
   ;; https://stackoverflow.com/a/17788551, with changes to use `cl-letf'
   ;; instead of the now obsolete `flet'.
       ad-do-it))
   (ad-activate 'compilation-start))
 
-(use-package isearch
-  :custom
-  ;; allow scrolling in Isearch
-  (isearch-allow-scroll t)
-  ;; search for non-ASCII characters: i’d like non-ASCII characters such
-  ;; as ‘’“”«»‹›áⓐ𝒶 to be selected when i search for their ASCII
-  ;; counterpart.  shoutout to
-  ;; http://endlessparentheses.com/new-in-emacs-25-1-easily-search-non-ascii-characters.html
-  (search-default-mode #'char-fold-to-regexp))
-
+;; isearch
+(csetq
+ ;; allow scrolling in Isearch
+ isearch-allow-scroll t
+ ;; search for non-ASCII characters: i’d like non-ASCII characters such
+ ;; as ‘’“”«»‹›áⓐ𝒶 to be selected when i search for their ASCII
+ ;; counterpart.  shoutout to
+ ;; http://endlessparentheses.com/new-in-emacs-25-1-easily-search-non-ascii-characters.html
+ search-default-mode #'char-fold-to-regexp)
+
+;; replace
 ;; uncomment to extend the above behaviour to query-replace
-(comment
-  (use-package replace
-    :custom
-    (replace-char-fold t)))
-
-(use-package vc
-  :bind ("C-x v C-=" . vc-ediff))
-
-(use-package vc-git
-  :after vc
-  :custom
-  (vc-git-print-log-follow t))
-
-(use-package ediff
-  :config (add-hook 'ediff-after-quit-hook-internal 'winner-undo)
-  :custom ((ediff-window-setup-function 'ediff-setup-windows-plain)
-           (ediff-split-window-function 'split-window-horizontally)))
-
-(use-package face-remap
-  :custom
-  ;; gentler font resizing
-  (text-scale-mode-step 1.05))
-
-(use-package 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-package pixel-scroll
-  :defer 0.4
-  :config (pixel-scroll-mode 1))
-
-(use-package epg-config
-  :config
-  ;; ask for GPG passphrase in minibuffer
-  ;; this will fail if gpg>=2.1 is not available
-  (setq epg-pinentry-mode 'loopback)
-  :custom
-  (epg-gpg-program (executable-find "gpg")))
-
-(use-package epg
-  :after epg-config)
-
-(use-package pinentry
-  :disabled
-  :demand
-  :after (epa epg server)
-  :config
-  ;; workaround for systemd-based distros:
-  ;; (setq pinentry--socket-dir server-socket-dir)
-  (pinentry-start))
-
-(use-package auth-source
-  :custom
-  (auth-sources '("~/.authinfo.gpg"))
-  (authinfo-hidden (regexp-opt '("password" "client-secret" "token"))))
+;; (csetq replace-char-fold t)
+
+;; vc
+(global-set-key (kbd "C-x v C-=") #'vc-ediff)
+
+(with-eval-after-load 'vc-git
+  (csetq vc-git-print-log-follow t))
+
+(csetq ediff-window-setup-function 'ediff-setup-windows-plain
+       ediff-split-window-function 'split-window-horizontally)
+(with-eval-after-load 'ediff
+  (add-hook 'ediff-after-quit-hook-internal #'winner-undo))
+
+;; face-remap
+(csetq
+ ;; gentler font resizing
+ text-scale-mode-step 1.05)
+
+(run-with-idle-timer 0.4 nil #'require 'mwheel)
+(csetq 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
+
+(run-with-idle-timer 0.4 nil #'require 'pixel-scroll)
+(with-eval-after-load 'pixel-scroll
+  (pixel-scroll-mode 1))
+
+;; epg-config
+(csetq
+ epg-gpg-program (executable-find "gpg")
+ ;; ask for GPG passphrase in minibuffer
+ ;; this will fail if gpg>=2.1 is not available
+ epg-pinentry-mode 'loopback)
+
+;; (require 'pinentry)
+;; workaround for systemd-based distros:
+;; (setq pinentry--socket-dir server-socket-dir)
+;; (pinentry-start)
+
+;; auth-source
+(csetq
+ auth-sources '("~/.authinfo.gpg")
+ authinfo-hidden (regexp-opt '("password" "client-secret" "token")))
 
 \f
-;;; General bindings
+;;; General key bindings
 
-(bind-keys
- ("C-a"     . b/move-indentation-or-beginning-of-line)
- ("C-c a i" . ielm)
- ("C-c d"   . b/duplicate-line-or-region)
+(global-set-key (kbd "C-a") #'b/move-indentation-or-beginning-of-line)
+(global-set-key (kbd "C-c a i") #'ielm)
+(global-set-key (kbd "C-c d") #'b/duplicate-line-or-region)
+(global-set-key (kbd "C-S-j") #'b/join-line-top)
+(global-set-key (kbd "C-c x") #'execute-extended-command)
 
- ("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)
+;; evaling and macro-expanding
+(global-set-key (kbd "C-c e b") #'eval-buffer)
+(global-set-key (kbd "C-c e e") #'eval-last-sexp)
+(global-set-key (kbd "C-c e p") #'pp-macroexpand-last-sexp)
+(global-set-key (kbd "C-c e r") #'eval-region)
 
- ("C-c e i" . emacs-init-time)
- ("C-c e u" . emacs-uptime)
- ("C-c e v" . emacs-version)
+;; emacs things
+(global-set-key (kbd "C-c e i") #'emacs-init-time)
+(global-set-key (kbd "C-c e u") #'emacs-uptime)
+(global-set-key (kbd "C-c e v") #'emacs-version)
 
- ("C-c f ." . find-file)
- ("C-c f d" . find-name-dired)
- ("C-c f l" . find-library)
+;; finding
+(global-set-key (kbd "C-c f .") #'find-file)
+(global-set-key (kbd "C-c f d") #'find-name-dired)
+(global-set-key (kbd "C-c f l") #'find-library)
 
- ("C-c F m" . make-frame-command)
- ("C-c F d" . delete-frame)
+;; frames
+(global-set-key (kbd "C-c F m") #'make-frame-command)
+(global-set-key (kbd "C-c F d") #'delete-frame)
 
- ("C-S-h C" . describe-char)
- ("C-S-h F" . describe-face)
+;; help/describe
+(global-set-key (kbd "C-S-h C") #'describe-char)
+(global-set-key (kbd "C-S-h F") #'describe-face)
 
- ("C-S-j"   . b/join-line-top)
+;; (global-set-key (kbd "C-x k") #'b/kill-current-buffer)
+;; (global-set-key (kbd "C-x K") #'kill-buffer)
+;; (global-set-key (kbd "C-x s") #'save-buffer)
+;; (global-set-key (kbd "C-x S") #'save-some-buffers)
 
- ("C-c x"   . execute-extended-command)
-
- ("C-x k"   . b/kill-current-buffer)
- ("C-x K"   . kill-buffer)
- ("C-x s"   . save-buffer)
- ("C-x S"   . save-some-buffers)
-
- :map emacs-lisp-mode-map
- ("<C-return>" . b/add-elisp-section))
+(define-key emacs-lisp-mode-map (kbd "<C-return>") #'b/add-elisp-section)
 
 (when (display-graphic-p)
-  (unbind-key "C-z" global-map))
-
-(bind-keys
- ;; for back and forward mouse keys
- ("<XF86Back>"     . previous-buffer)
- ("<mouse-8>"      . previous-buffer)
- ;; ("<drag-mouse-8>" . previous-buffer)
- ("<XF86Forward>"  . next-buffer)
- ("<mouse-9>"      . next-buffer)
- ;; ("<drag-mouse-9>" . next-buffer)
- ;; ("<drag-mouse-2>" . kill-this-buffer)
- ;; ("<drag-mouse-3>" . switch-to-buffer)
- )
+  (global-unset-key (kbd "C-z")))
 
 \f
 ;;; Essential packages
 
-(when b/exwm-p
-  (require 'bandali-exwm))
+;; (require 'bandali-exwm)
 
 (require 'bandali-org)
 
 (require 'bandali-theme)
 
 ;; *the* right way to do git
-(use-package magit
-  :bind (("C-x g"   . magit-status)
-         ("C-c g g" . magit-status)
-         ("C-c g b" . magit-blame-addition)
-         ("C-c g l" . magit-log-buffer-file))
-  :config
+(with-eval-after-load 'magit
   (declare-function magit-add-section-hook "magit-section"
                     (hook function &optional at append local))
   (magit-add-section-hook 'magit-status-sections-hook
   ;;                         'magit-insert-ignored-files
   ;;                         'magit-insert-untracked-files
   ;;                         'append)
-  (setq magit-repository-directories '(("~/.emacs.d/" . 0)
-                                       ("~/src/git/" . 2)))
+  (declare-function magit-display-buffer-fullframe-status-v1
+                    "magit-mode" (buffer))
+  (csetq
+   magit-diff-refine-hunk t
+   magit-repository-directories '(("~/.emacs.d/" . 0)
+                                  ("~/src/git/" . 2))
+   ;; magit-completing-read-function 'magit-ido-completing-read
+   magit-display-buffer-function
+   #'magit-display-buffer-fullframe-status-v1)
   (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)
-  ;; (magit-completing-read-function 'magit-ido-completing-read)
-  :custom-face (magit-diff-file-heading ((t (:weight normal)))))
-
-(use-package magit-extras
-  :after magit
-  :config
-  (setq magit-pop-revision-stack-format
-        (pcase-let ((`(,pt ,_eob ,index-regexp)
-                     (default-value 'magit-pop-revision-stack-format)))
-          `(,pt "[%N: %h]: %ci\n  %s
+  (custom-set-faces '(magit-diff-file-heading ((t (:weight normal)))))
+
+  (with-eval-after-load 'magit-extras
+    (csetq
+     magit-pop-revision-stack-format
+     (pcase-let ((`(,pt ,_eob ,index-regexp)
+                  (default-value 'magit-pop-revision-stack-format)))
+       `(,pt "[%N: %h]: %ci\n  %s
   https://git.savannah.gnu.org/cgit/emacs.git/commit/?id=%H"
-                ,index-regexp))))
+             ,index-regexp)))))
+;; global key bindings
+(global-set-key (kbd "C-x g") #'magit-status)
+(global-set-key (kbd "C-c g b") #'magit-blame-addition)
+(global-set-key (kbd "C-c g l") #'magit-log-buffer-file)
+(global-set-key (kbd "C-c g y") #'magit-pop-revision-stack)
 
 ;; recently opened files
-(use-package recentf
-  :defer 0.2
-  :config
-  (add-to-list 'recentf-keep 'file-remote-p)
-  :config
-  (recentf-mode)
-  :custom
-  (recentf-max-saved-items 2000))
+(run-with-idle-timer 0.2 nil #'require 'recentf)
+(with-eval-after-load 'recentf
+  (csetq recentf-max-saved-items 2000)
+  (add-to-list 'recentf-keep #'file-remote-p)
+  (recentf-mode))
 
 ;; needed for history for counsel
-(use-package amx
-  :defer 0.3
-  :config
+(run-with-idle-timer 0.3 nil #'require 'amx)
+(with-eval-after-load 'amx
   (amx-mode))
 
 ;; (require 'bandali-ido)
 
 (require 'bandali-ibuffer)
 
-(use-package outline
-  :disabled
-  :hook (prog-mode . outline-minor-mode)
-  :bind
-  (:map
-   outline-minor-mode-map
-   ("<s-tab>"  . outline-toggle-children)
-   ("M-p"      . outline-previous-visible-heading)
-   ("M-n"      . outline-next-visible-heading)
-   :prefix-map b/outline-prefix-map
-   :prefix "s-O"
-   ("TAB" . outline-toggle-children)
-   ("a"   . outline-hide-body)
-   ("H"   . outline-hide-body)
-   ("S"   . outline-show-all)
-   ("h"   . outline-hide-subtree)
-   ("s"   . outline-show-subtree))
-  :config
-  (when (featurep 'which-key)
-    (which-key-add-key-based-replacements
-      "C-c @" "outline"
-      "s-O"   "outline")))
+;; outline
+;; (with-eval-after-load 'outline
+;;   (when (featurep 'which-key)
+;;     (which-key-add-key-based-replacements
+;;       "C-c @" "outline"
+;;       "s-O"   "outline"))
+;;   (define-key outline-minor-mode-map (kbd "<s-tab>")
+;;     #'outline-toggle-children)
+;;   (define-key outline-minor-mode-map (kbd "M-p")
+;;     #'outline-previous-visible-heading)
+;;   (define-key outline-minor-mode-map (kbd "M-n")
+;;     #'outline-next-visible-heading)
+;;   (defvar b/outline-prefix-map)
+;;   (define-prefix-command 'b/outline-prefix-map)
+;;   (define-key outline-minor-mode-map (kbd "s-O")
+;;     'b/outline-prefix-map)
+;;   (define-key b/outline-prefix-map (kbd "TAB")
+;;     #'outline-toggle-children)
+;;   (define-key b/outline-prefix-map (kbd "a")
+;;     #'outline-hide-body)
+;;   (define-key b/outline-prefix-map (kbd "H")
+;;     #'outline-hide-body)
+;;   (define-key b/outline-prefix-map (kbd "S")
+;;     #'outline-show-all)
+;;   (define-key b/outline-prefix-map (kbd "h")
+;;     #'outline-hide-subtree)
+;;   (define-key b/outline-prefix-map (kbd "s")
+;;     #'outline-show-subtree))
+;; (add-hook 'prog-mode-hook #'outline-minor-mode)
 
 (require 'bandali-dired)
 
-(use-package help
-  :bind
-  (:map help-mode-map
-        ("p" . backward-button)
-        ("n" . forward-button))
-  :config
+(with-eval-after-load 'help
   (temp-buffer-resize-mode)
-  (setq help-window-select t))
+  (csetq help-window-select t)
 
-(use-package tramp
-  :config
+  ;; local key bindings
+  (define-key help-mode-map (kbd "p") #'backward-button)
+  (define-key help-mode-map (kbd "n") #'forward-button))
+
+(with-eval-after-load 'tramp
   (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)))
 
-(use-package doc-view
-  :bind (:map doc-view-mode-map
-              ("M-RET" . image-previous-line)))
+(with-eval-after-load 'doc-view
+  (define-key doc-view-mode-map (kbd "M-RET") #'image-previous-line))
 
-(use-package shr
-  :custom
-  (shr-max-width 80))
+(csetq shr-max-width 80)
 
 ;; 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))
+(with-eval-after-load 'sendmail
+  (csetq 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:~"))
+(with-eval-after-load 'scpaste
+  (csetq scpaste-http-destination "https://p.bndl.org"
+         scpaste-scp-destination "p:~"))
 
 \f
 ;;; Editing
 
-;; highlight uncommitted changes in the left fringe
-(use-package diff-hl
-  :disabled
-  :defer 0.6
-  :config
-  (setq diff-hl-draw-borders nil)
-  (global-diff-hl-mode)
-  :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
-  :when (version< "25" emacs-version)
-  :config (global-eldoc-mode))
+(when (version< "25" emacs-version)
+  (with-eval-after-load 'eldoc
+       (global-eldoc-mode)))
 
 ;; highlight matching parens
-(use-package paren
-  :demand
-  :config (show-paren-mode))
-
-(use-package elec-pair
-  :disabled
-  :demand
-  :config (electric-pair-mode))
-
-(use-package simple
-  :config (column-number-mode)
-  :custom
-  ;; Save what I copy into clipboard from other applications into Emacs'
-  ;; kill-ring, which would allow me to still be able to easily access
-  ;; it in case I kill (cut or copy) something else inside Emacs before
-  ;; yanking (pasting) what I'd originally intended to.
-  (save-interprogram-paste-before-kill t))
+(require 'paren)
+(show-paren-mode)
+
+;; (require 'elec-pair)
+;; (electric-pair-mode)
+
+(csetq
+ ;; Save what I copy into clipboard from other applications into Emacs'
+ ;; kill-ring, which would allow me to still be able to easily access
+ ;; it in case I kill (cut or copy) something else inside Emacs before
+ ;; yanking (pasting) what I'd originally intended to.
+ save-interprogram-paste-before-kill t)
+(with-eval-after-load 'simple
+  (column-number-mode))
 
 ;; save minibuffer history
-(use-package savehist
-  :demand
-  :config
-  (savehist-mode)
-  (add-to-list 'savehist-additional-variables 'kill-ring))
+(require 'savehist)
+(savehist-mode)
+(add-to-list 'savehist-additional-variables 'kill-ring)
 
 ;; automatically save place in files
-(use-package saveplace
-  :when (version< "25" emacs-version)
-  :config (save-place-mode))
-
-(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))
-
-(use-package text-mode
-  :bind (:map text-mode-map ("C-*" . b/insert-asterism))
-  :hook ((text-mode . indicate-buffer-boundaries-left)
-         (text-mode . flyspell-mode)))
-
-(use-package conf-mode
-  :mode "\\.*rc$")
-
-(use-package sh-script
-  :mode ("\\.bashrc$" . sh-mode))
-
-(use-package company
-  :disabled
-  :bind
-  (:map company-active-map
-        ([tab]    . company-complete-common-or-cycle)
-        ([escape] . company-abort)
-        ("C-p"    . company-select-previous-or-abort)
-        ("C-n"    . company-select-next-or-abort))
-  :custom
-  (company-minimum-prefix-length 1)
-  (company-selection-wrap-around t)
-  (company-dabbrev-char-regexp "\\sw\\|\\s_\\|[-_]")
-  (company-dabbrev-downcase nil)
-  (company-dabbrev-ignore-case nil)
-  ;; :config
-  ;; (global-company-mode t)
-  )
-
-(use-package flycheck
-  :disabled
-  :defer 0.6
-  :hook (prog-mode . flycheck-mode)
-  :bind
-  (:map flycheck-mode-map
-        ("M-P" . flycheck-previous-error)
-        ("M-N" . flycheck-next-error))
-  :config
-  ;; Use the load-path from running Emacs when checking elisp files
-  (setq flycheck-emacs-lisp-load-path 'inherit)
-
-  ;; Only flycheck when I actually save the buffer
-  (setq flycheck-check-syntax-automatically '(mode-enabled save))
-  :custom (flycheck-mode-line-prefix "flyc"))
-
-;; (use-package flyspell)
-
+(when (version< "25" emacs-version)
+  (save-place-mode))
+
+(defun indicate-buffer-boundaries-left ()
+    (csetq indicate-buffer-boundaries 'left))
+(with-eval-after-load 'prog-mode
+  (global-prettify-symbols-mode))
+(add-hook 'prog-mode-hook #'indicate-buffer-boundaries-left)
+
+(define-key text-mode-map (kbd "C-*") #'b/insert-asterism)
+(add-hook 'text-mode-hook #'indicate-buffer-boundaries-left)
+(add-hook 'text-mode-hook #'flyspell-mode)
+
+(add-to-list 'auto-mode-alist '("\\.*rc$" . conf-mode))
+
+(add-to-list 'auto-mode-alist '("\\.bashrc$" . sh-mode))
+
+;; flycheck
+;; (run-with-idle-timer 0.6 nil #'require 'flycheck)
+;; (with-eval-after-load 'flycheck
+;;   (csetq
+;;    ;; Use the load-path from running Emacs when checking elisp files
+;;    flycheck-emacs-lisp-load-path 'inherit
+;;    ;; Only flycheck when I actually save the buffer
+;;    flycheck-check-syntax-automatically '(mode-enabled save)
+;;    flycheck-mode-line-prefix "flyc"))
+;; (define-key flycheck-mode-map (kbd "M-P") #'flycheck-previous-error)
+;; (define-key flycheck-mode-map (kbd "M-N") #'flycheck-next-error)
+;; (add-hook 'prog-mode-hook #'flycheck-mode)
+
+;; ispell
 ;; http://endlessparentheses.com/ispell-and-apostrophes.html
-(use-package ispell
-  :disabled
-  :defer 0.6
-  :config
-  ;; ’ can be part of a word
-  (setq ispell-local-dictionary-alist
-        `((nil "[[:alpha:]]" "[^[:alpha:]]"
-               "['\x2019]" nil ("-B") nil utf-8))
-        ispell-program-name (executable-find "hunspell"))
-  ;; don't send ’ to the subprocess
-  (defun endless/replace-apostrophe (args)
-    (cons (replace-regexp-in-string
-           "’" "'" (car args))
-          (cdr args)))
-  (advice-add #'ispell-send-string :filter-args
-              #'endless/replace-apostrophe)
-
-  ;; convert ' back to ’ from the subprocess
-  (defun endless/replace-quote (args)
-    (if (not (derived-mode-p 'org-mode))
-        args
-      (cons (replace-regexp-in-string
-             "'" "’" (car args))
-            (cdr args))))
-  (advice-add #'ispell-parse-output :filter-args
-              #'endless/replace-quote))
-
-(use-package abbrev
-  :hook (text-mode . abbrev-mode))
+;; (run-with-idle-timer 0.6 nil #'require 'ispell)
+;; (with-eval-after-load 'ispell
+;;   ;; ’ can be part of a word
+;;   (csetq ispell-local-dictionary-alist
+;;          `((nil "[[:alpha:]]" "[^[:alpha:]]"
+;;                 "['\x2019]" nil ("-B") nil utf-8))
+;;          ispell-program-name (executable-find "hunspell"))
+;;   ;; don't send ’ to the subprocess
+;;   (defun endless/replace-apostrophe (args)
+;;     (cons (replace-regexp-in-string
+;;            "’" "'" (car args))
+;;           (cdr args)))
+;;   (advice-add #'ispell-send-string :filter-args
+;;               #'endless/replace-apostrophe)
+;;   ;; convert ' back to ’ from the subprocess
+;;   (defun endless/replace-quote (args)
+;;     (if (not (derived-mode-p 'org-mode))
+;;         args
+;;       (cons (replace-regexp-in-string
+;;              "'" "’" (car args))
+;;             (cdr args))))
+;;   (advice-add #'ispell-parse-output :filter-args
+;;               #'endless/replace-quote))
+
+(add-hook 'text-mode-hook #'abbrev-mode)
 
 \f
 ;;; Programming modes
 
-(use-package lisp-mode
-  :config
+(with-eval-after-load 'lisp-mode
   (defun indent-spaces-mode ()
     (setq indent-tabs-mode nil))
   (add-hook 'lisp-interaction-mode-hook #'indent-spaces-mode))
 
-(use-package alloy-mode
-  :mode "\\.\\(als\\|dsh\\)\\'"
-  :config
-  (setq alloy-basic-offset 2)
+(with-eval-after-load 'alloy-mode
+  (csetq alloy-basic-offset 2)
   ;; (defun b/alloy-simple-indent (start end)
   ;;   (interactive "r")
   ;;   ;; (if (region-active-p)
   ;;   ;;                       (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
-  (require 'lean-input)
-  (setq default-input-method "Lean"
-        lean-input-tweak-all '(lean-input-compose
-                               (lean-input-prepend "/")
-                               (lean-input-nonempty))
-        lean-input-user-translations '(("/" "/")))
-  (lean-input-setup))
-
-(use-package sgml-mode
-  :config
-  (setq sgml-basic-offset 0))
-
-(use-package css-mode
-  :config
-  (setq css-indent-offset 2))
-
-(use-package geiser
-  :disabled)
-
-(use-package geiser-guile
-  :disabled
-  :config
-  (setq geiser-guile-load-path "~/src/git/guix"))
-
-(use-package guix
-  :disabled)
-
-(use-package go-mode
-  :disabled)
-
-(use-package po-mode
-  :disabled
-  :hook
-  (po-mode . (lambda () (run-with-timer 0.1 nil 'View-exit))))
-
-(use-package auctex
-  :disabled
-  :custom
-  (font-latex-fontify-sectioning 'color))
-
-(use-package tex-mode
-  :config
+  ;; local key bindings
+  (define-key alloy-mode-map (kbd "RET") #'electric-newline-and-maybe-indent)
+  ;; (define-key alloy-mode-map (kbd "TAB") #'b/alloy-simple-indent)
+  (define-key alloy-mode-map (kbd "TAB") #'indent-for-tab-command))
+(add-to-list 'auto-mode-alist '("\\.\\(als\\|dsh\\)\\'" . alloy-mode))
+(add-hook 'alloy-mode-hook (lambda nil (setq-local indent-tabs-mode nil)))
+
+;; lean
+;; (eval-when-compile (defvar lean-mode-map))
+;; (run-with-idle-timer 0.4 nil #'require 'lean-mode)
+;; (with-eval-after-load 'lean-mode
+;;   (require 'lean-input)
+;;   (csetq default-input-method "Lean"
+;;          lean-input-tweak-all '(lean-input-compose
+;;                                 (lean-input-prepend "/")
+;;                                 (lean-input-nonempty))
+;;          lean-input-user-translations '(("/" "/")))
+;;   (lean-input-setup)
+;;   ;; local key bindings
+;;   (define-key lean-mode-map (kbd "S-SPC") #'company-complete))
+
+(with-eval-after-load 'sgml-mode
+  (csetq sgml-basic-offset 0))
+
+(with-eval-after-load 'css-mode
+  (csetq css-indent-offset 2))
+
+;; po-mode
+;; (add-hook 'po-mode-hook (lambda nil (run-with-timer 0.1 nil 'View-exit)))
+
+;; auctex
+;; (csetq font-latex-fontify-sectioning 'color)
+
+(with-eval-after-load 'tex-mode
   (cl-delete-if
    (lambda (p) (string-match "^---?" (car p)))
-   tex--prettify-symbols-alist)
-  :hook ((tex-mode . auto-fill-mode)
-         (tex-mode . flyspell-mode)))
-
-;; (use-package george-mode
-;;   :straight (:host nil :repo "https://git.shemshak.org/amin/george-mode")
-;;   :mode "\\.grg\\'")
+   tex--prettify-symbols-alist))
+(add-hook 'tex-mode-hook #'auto-fill-mode)
+(add-hook 'tex-mode-hook #'flyspell-mode)
 
 \f
 ;;; Emacs enhancements & auxiliary packages
 
-(use-package man
-  :config (setq Man-width 80))
-
-(use-package which-key
-  :defer 0.4
-  :config
+(with-eval-after-load 'man
+  (csetq Man-width 80))
+
+(run-with-idle-timer 0.4 nil #'require 'which-key)
+(with-eval-after-load 'which-key
+  (csetq
+   which-key-add-column-padding 5
+   which-key-idle-delay 10000
+   which-key-idle-secondary-delay 0.05
+   which-key-max-description-length 32
+   which-key-show-early-on-C-h t)
   (which-key-add-key-based-replacements
     ;; prefixes for global prefixes and minor modes
     "C-c !"   "flycheck"
     "C-S-h"   "help(ful)"
     "C-c q"   "boxquote"
     "C-c t"   "themes")
-
   ;; prefixes for major modes
   (which-key-add-major-mode-key-based-replacements 'org-mode
     "C-c C-v" "org-babel")
-
-  (which-key-mode)
-  :custom
-  (which-key-add-column-padding 5)
-  (which-key-idle-delay 10000)
-  (which-key-idle-secondary-delay 0.05)
-  (which-key-max-description-length 32)
-  (which-key-show-early-on-C-h t))
+  (which-key-mode))
 
 ;; (require 'bandali-projectile)
 
-(use-package helpful
-  :disabled
-  :defer 0.6
-  :bind
-  (("C-S-h c" . helpful-command)
-   ("C-S-h f" . helpful-callable)        ; helpful-function
-   ("C-S-h v" . helpful-variable)
-   ("C-S-h k" . helpful-key)
-   ("C-S-h p" . helpful-at-point)))
-
-(use-package unkillable-scratch
-  :defer 0.6
-  :config
-  (unkillable-scratch 1)
-  :custom
-  (unkillable-buffers '("^\\*scratch\\*$" "^\\*Messages\\*$")))
+(run-with-idle-timer 0.6 nil #'require 'unkillable-scratch)
+(with-eval-after-load 'unkillable-scratch
+  (csetq unkillable-buffers '("^\\*scratch\\*$" "^\\*Messages\\*$"))
+  (unkillable-scratch 1))
 
 ;; ,----
 ;; | make pretty boxed quotes like this
 ;; `----
-(use-package boxquote
-  :defer 0.6
-  :bind
-  (:prefix-map
-   b/boxquote-prefix-map
-   :prefix "C-c q"
-   ("b"   . boxquote-buffer)
-   ("B"   . boxquote-insert-buffer)
-   ("d"   . boxquote-defun)
-   ("F"   . boxquote-insert-file)
-   ("hf"  . boxquote-describe-function)
-   ("hk"  . boxquote-describe-key)
-   ("hv"  . boxquote-describe-variable)
-   ("hw"  . boxquote-where-is)
-   ("k"   . boxquote-kill)
-   ("p"   . boxquote-paragraph)
-   ("q"   . boxquote-boxquote)
-   ("r"   . boxquote-region)
-   ("s"   . boxquote-shell-command)
-   ("t"   . boxquote-text)
-   ("T"   . boxquote-title)
-   ("u"   . boxquote-unbox)
-   ("U"   . boxquote-unbox-region)
-   ("y"   . boxquote-yank)
-   ("M-q" . boxquote-fill-paragraph)
-   ("M-w" . boxquote-kill-ring-save)))
-
-(use-package hl-todo
+(run-with-idle-timer 0.6 nil #'require 'boxquote)
+(with-eval-after-load 'boxquote
+  (defvar b/boxquote-prefix-map)
+  (define-prefix-command 'b/boxquote-prefix-map)
+  (global-set-key (kbd "C-c q") 'b/boxquote-prefix-map)
+  (define-key b/boxquote-prefix-map (kbd "b")   #'boxquote-buffer)
+  (define-key b/boxquote-prefix-map (kbd "B")   #'boxquote-insert-buffer)
+  (define-key b/boxquote-prefix-map (kbd "d")   #'boxquote-defun)
+  (define-key b/boxquote-prefix-map (kbd "F")   #'boxquote-insert-file)
+  (define-key b/boxquote-prefix-map (kbd "hf")  #'boxquote-describe-function)
+  (define-key b/boxquote-prefix-map (kbd "hk")  #'boxquote-describe-key)
+  (define-key b/boxquote-prefix-map (kbd "hv")  #'boxquote-describe-variable)
+  (define-key b/boxquote-prefix-map (kbd "hw")  #'boxquote-where-is)
+  (define-key b/boxquote-prefix-map (kbd "k")   #'boxquote-kill)
+  (define-key b/boxquote-prefix-map (kbd "p")   #'boxquote-paragraph)
+  (define-key b/boxquote-prefix-map (kbd "q")   #'boxquote-boxquote)
+  (define-key b/boxquote-prefix-map (kbd "r")   #'boxquote-region)
+  (define-key b/boxquote-prefix-map (kbd "s")   #'boxquote-shell-command)
+  (define-key b/boxquote-prefix-map (kbd "t")   #'boxquote-text)
+  (define-key b/boxquote-prefix-map (kbd "T")   #'boxquote-title)
+  (define-key b/boxquote-prefix-map (kbd "u")   #'boxquote-unbox)
+  (define-key b/boxquote-prefix-map (kbd "U")   #'boxquote-unbox-region)
+  (define-key b/boxquote-prefix-map (kbd "y")   #'boxquote-yank)
+  (define-key b/boxquote-prefix-map (kbd "M-q") #'boxquote-fill-paragraph)
+  (define-key b/boxquote-prefix-map (kbd "M-w") #'boxquote-kill-ring-save))
+
+(run-with-idle-timer 0.5 nil #'require 'hl-todo)
+(with-eval-after-load 'hl-todo
   ;; highlight TODOs in buffers
-  :defer 0.5
-  :config
   (global-hl-todo-mode))
 
-(use-package page-break-lines
-  :defer 0.5
-  :custom
-  (page-break-lines-max-width fill-column)
-  :config
+(run-with-idle-timer 0.5 nil #'require 'page-break-lines)
+(with-eval-after-load 'page-break-lines
+  (csetq page-break-lines-max-width fill-column)
   (global-page-break-lines-mode))
 
-(use-package expand-region
-  :bind ("C-=" . er/expand-region))
-
-(require 'bandali-yasnippet)
-
-(use-package debbugs
-  :bind
-  (("C-c D d" . debbugs-gnu)
-   ("C-c D b" . debbugs-gnu-bugs)
-   ("C-c D e" .
-    (lambda ()
-      (interactive)                     ; bug-gnu-emacs
-      (setq debbugs-gnu-current-suppress t)
-      (debbugs-gnu debbugs-gnu-default-severities '("emacs"))))
-   ("C-c D g" .                         ; bug-gnuzilla
-    (lambda ()
-      (interactive)
-      (setq debbugs-gnu-current-suppress t)
-      (debbugs-gnu debbugs-gnu-default-severities '("gnuzilla"))))
-   ("C-c D G b" .                       ; bug-guix
-    (lambda ()
-      (interactive)
-      (setq debbugs-gnu-current-suppress t)
-      (debbugs-gnu debbugs-gnu-default-severities '("guix"))))
-   ("C-c D G p" .                       ; guix-patches
-    (lambda ()
-      (interactive)
-      (setq debbugs-gnu-current-suppress t)
-      (debbugs-gnu debbugs-gnu-default-severities '("guix-patches"))))))
+;; expand-region
+(global-set-key (kbd "C-=") #'er/expand-region)
+
+(run-with-idle-timer 0.6 nil #'require 'yasnippet)
+(with-eval-after-load 'yasnippet
+  (declare-function yas-reload-all
+                    "yasnippet" (&optional no-jit interactive))
+  (declare-function yas-maybe-expand-abbrev-key-filter
+                    "yasnippet" (cmd))
+
+  (defconst yas-verbosity-cur yas-verbosity)
+  (setq yas-verbosity 2)
+  (add-to-list 'yas-snippet-dirs "~/src/git/guix/etc/snippets" t)
+  (yas-reload-all)
+  (setq yas-verbosity yas-verbosity-cur)
+
+  (defun b/yas-maybe-expand-abbrev-key-filter (cmd)
+    (when (and (yas-maybe-expand-abbrev-key-filter cmd)
+               (not (bound-and-true-p git-commit-mode)))
+      cmd))
+  (defconst b/yas-maybe-expand
+    '(menu-item "" yas-expand
+                :filter b/yas-maybe-expand-abbrev-key-filter))
+  (define-key yas-minor-mode-map (kbd "SPC") b/yas-maybe-expand)
+
+  (yas-global-mode))
+
+;; debbugs
+(global-set-key (kbd "C-c D d") #'debbugs-gnu)
+(global-set-key (kbd "C-c D b") #'debbugs-gnu-bugs)
+(global-set-key (kbd "C-c D e")         ; bug-gnu-emacs
+                (lambda ()
+                  (interactive)         
+                  (setq debbugs-gnu-current-suppress t)
+                  (debbugs-gnu debbugs-gnu-default-severities
+                               '("emacs"))))
+(global-set-key (kbd "C-c D g")         ; bug-gnuzilla
+                (lambda ()
+                  (interactive)
+                  (setq debbugs-gnu-current-suppress t)
+                  (debbugs-gnu debbugs-gnu-default-severities
+                               '("gnuzilla"))))
+(global-set-key (kbd "C-c D G b")       ; bug-guix
+                (lambda ()
+                  (interactive)
+                  (setq debbugs-gnu-current-suppress t)
+                  (debbugs-gnu debbugs-gnu-default-severities
+                               '("guix"))))
+(global-set-key (kbd "C-c D G p")       ; guix-patches
+                (lambda ()
+                  (interactive)
+                  (setq debbugs-gnu-current-suppress t)
+                  (debbugs-gnu debbugs-gnu-default-severities
+                               '("guix-patches"))))
+
+;; eww
+(csetq eww-download-directory (file-name-as-directory
+                               (getenv "XDG_DOWNLOAD_DIR")))
+(global-set-key (kbd "C-c a e w") #'eww)
 
 (comment
 
-(use-package org-ref
-  :init
-  (b/setq-every '("~/usr/org/references.bib")
-    reftex-default-bibliography
-    org-ref-default-bibliography)
-  (setq
-   org-ref-bibliography-notes "~/usr/org/notes.org"
-   org-ref-pdf-directory "~/usr/org/bibtex-pdfs/"))
-
-;; (use-package fill-column-indicator)
-
-(use-package window
-  :bind
-  (("C-c w s l" . (lambda ()
-                    (interactive)
-                    (split-window-right)
-                    (other-window 1)))
-   ("C-c w s j" . (lambda ()
-                    (interactive)
-                    (split-window-below)
-                    (other-window 1)))
-   ("C-c w q"   . quit-window))
-  :custom
-  (split-width-threshold 150))
-
-(use-package windmove
-  :defer 0.6
-  :bind
-  (("C-c w h" . windmove-left)
-   ("C-c w j" . windmove-down)
-   ("C-c w k" . windmove-up)
-   ("C-c w l" . windmove-right)
-   ("C-c w H" . windmove-swap-states-left)
-   ("C-c w J" . windmove-swap-states-down)
-   ("C-c w K" . windmove-swap-states-up)
-   ("C-c w L" . windmove-swap-states-right)))
-
-(use-package pass
-  :commands pass
-  :bind ("C-c a p" . pass)
-  :hook (pass-mode . View-exit))
-
-(use-package pdf-tools
-  :defer 0.5
-  :bind (:map pdf-view-mode-map
-              ("<C-XF86Back>"    . pdf-history-backward)
-              ("<mouse-8>"       . pdf-history-backward)
-              ("<drag-mouse-8>"  . pdf-history-backward)
-              ("<C-XF86Forward>" . pdf-history-forward)
-              ("<mouse-9>"       . pdf-history-forward)
-              ("<drag-mouse-9>"  . pdf-history-forward)
-              ("M-RET"           . image-previous-line)
-              ("C-s"             . isearch-forward)
-              ("s s"             . isearch-forward))
-  :config (pdf-tools-install nil t)
-  :custom (pdf-view-resize-factor 1.05))
-
-(use-package org-pdftools
-  :disabled
-  :straight (:host github :repo "fuxialexander/org-pdftools")
-  :demand
-  :after org
-  :config
-  (with-eval-after-load 'org
-    (require 'org-pdftools)))
-
-(use-package biblio)
-
-(use-package reftex
-  :hook (latex-mode . reftex-mode))
-
-(use-package reftex-cite
-  :after reftex
-  :disabled                             ; enable to disable
-                                        ; reftex-cite's default choice
-                                        ; of previous word
-  :config
-  (defun reftex-get-bibkey-default ()
-    "If the cursor is in a citation macro, return the word before the macro."
-    (let* ((macro (reftex-what-macro 1)))
-      (save-excursion
-        (when (and macro (string-match "cite" (car macro)))
-          (goto-char (cdr macro)))
-        (reftex-this-word)))))
-
-(use-package dmenu
-  :custom
-  (dmenu-prompt-string "run: ")
-  (dmenu-save-file (b/var "dmenu-items")))
-
-(use-package eosd
-  ;; TODO: fix build by properly building the eosd-pixbuf.c module
-  ;; e.g. see https://github.com/raxod502/straight.el/issues/386
-  :disabled
-  :straight (:host github :repo "clarete/eosd")
-  :demand
-  :after exwm
-  :config
-  (eosd-start))
-
-(use-package eww
-  :bind ("C-c a e w" . eww)
-  :custom
-  (eww-download-directory (file-name-as-directory
-                           (getenv "XDG_DOWNLOAD_DIR"))))
+;; org-ref
+(csetq
+ reftex-default-bibliography '("~/usr/org/references.bib")
+ org-ref-default-bibliography '("~/usr/org/references.bib")
+ org-ref-bibliography-notes "~/usr/org/notes.org"
+ org-ref-pdf-directory "~/usr/org/bibtex-pdfs/")
+
+;; fill-column-indicator ?
+
+;; window
+(csetq split-width-threshold 150)
+(global-set-key (kbd "C-c w s l")
+                (lambda ()
+                  (interactive)
+                  (split-window-right)
+                  (other-window 1)))
+(global-set-key (kbd "C-c w s j")
+                (lambda ()
+                  (interactive)
+                  (split-window-below)
+                  (other-window 1)))
+(global-set-key (kbd "C-c w q") #'quit-window)
+
+(run-with-idle-timer 0.6 nil #'require 'windmove)
+(global-set-key (kbd "C-c w h") #'windmove-left)
+(global-set-key (kbd "C-c w j") #'windmove-down)
+(global-set-key (kbd "C-c w k") #'windmove-up)
+(global-set-key (kbd "C-c w l") #'windmove-right)
+(global-set-key (kbd "C-c w H") #'windmove-swap-states-left)
+(global-set-key (kbd "C-c w J") #'windmove-swap-states-down)
+(global-set-key (kbd "C-c w K") #'windmove-swap-states-up)
+(global-set-key (kbd "C-c w L") #'windmove-swap-states-right)
+
+;; pass
+(global-set-key (kbd "C-c a p") #'pass)
+(add-hook 'pass-mode-hook #'View-exit)
+
+;; reftex
+;; uncomment to disable reftex-cite's default choice of previous word
+;; (with-eval-after-load 'reftex
+;;   (require 'reftex-cite)
+;;   (defun reftex-get-bibkey-default ()
+;;     "If the cursor is in a citation macro, return the word before the macro."
+;;     (let* ((macro (reftex-what-macro 1)))
+;;       (save-excursion
+;;         (when (and macro (string-match "cite" (car macro)))
+;;           (goto-char (cdr macro)))
+;;         (reftex-this-word)))))
+(add-hook 'latex-mode-hook #'reftex-mode)
+
+;; dmenu
+(csetq
+ dmenu-prompt-string "run: "
+ dmenu-save-file (b/var "dmenu-items"))
+
+;; eosd ?
 
 \f
 ;;; Post initialization
index c4ab6ff..394715d 100644 (file)
 
 ;;; Code:
 
-(use-package ls-lisp
-  :custom (ls-lisp-dirs-first t))
-
-(use-package dired
-  :config
-  (setq dired-dwim-target t
-        dired-listing-switches "-alh"
-        ls-lisp-use-insert-directory-program nil)
+(with-eval-after-load 'dired
+  (csetq dired-dwim-target t
+         dired-listing-switches "-alh"
+         ls-lisp-dirs-first t
+         ls-lisp-use-insert-directory-program nil)
 
   (declare-function dired-dwim-target-directory "dired-aux")
-
   ;; easily diff 2 marked files
   ;; https://oremacs.com/2017/03/18/dired-ediff/
   (defun dired-ediff-files ()
                         (set-window-configuration wnd))))
         (error "no more than 2 files should be marked"))))
 
+  ;; local key bindings
+  (define-key dired-mode-map (kbd "b") #'dired-up-directory)
+  (define-key dired-mode-map (kbd "E") #'dired-ediff-files)
+  (define-key dired-mode-map (kbd "e") #'dired-toggle-read-only)
+  (define-key dired-mode-map (kbd "\\") #'dired-hide-details-mode)
+  (define-key dired-mode-map (kbd "z")
+    (lambda ()
+      (interactive)
+      (b/dired-start-process "zathura")))
+
   (require 'dired-x)
-  (setq dired-guess-shell-alist-user
-        '(("\\.pdf\\'"  "evince" "zathura" "okular")
-          ("\\.doc\\'"  "libreoffice")
-          ("\\.docx\\'" "libreoffice")
-          ("\\.ppt\\'"  "libreoffice")
-          ("\\.pptx\\'" "libreoffice")
-          ("\\.xls\\'"  "libreoffice")
-          ("\\.xlsx\\'" "libreoffice")
-          ("\\.flac\\'" "mpv")))
-  :bind (:map dired-mode-map
-              ("b"  . dired-up-directory)
-              ("E"  . dired-ediff-files)
-              ("e"  . dired-toggle-read-only)
-              ("\\" . dired-hide-details-mode)
-              ("z"  . (lambda ()
-                        (interactive)
-                        (b/dired-start-process "zathura"))))
-  :hook (dired-mode . dired-hide-details-mode))
+  (csetq dired-guess-shell-alist-user
+         '(("\\.pdf\\'"  "evince" "zathura" "okular")
+           ("\\.doc\\'"  "libreoffice")
+           ("\\.docx\\'" "libreoffice")
+           ("\\.ppt\\'"  "libreoffice")
+           ("\\.pptx\\'" "libreoffice")
+           ("\\.xls\\'"  "libreoffice")
+           ("\\.xlsx\\'" "libreoffice")
+           ("\\.flac\\'" "mpv"))))
+;; hooks
+(add-hook 'dired-mode-hook #'dired-hide-details-mode)
 
 (provide 'bandali-dired)
 ;;; bandali-dired.el ends here
index a7315c4..4d21978 100644 (file)
 
 ;;; Code:
 
-(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 'gnus
+  (require 'ebdb)
+  (csetq ebdb-sources (b/var "ebdb"))
   (with-eval-after-load 'swiper
-    (add-to-list 'swiper-font-lock-exclude 'ebdb-mode t)))
+    (add-to-list 'swiper-font-lock-exclude #'ebdb-mode t))
+  ;; local key bindings
+  (define-key gnus-group-mode-map (kbd "e") #'ebdb))
 
-(use-package ebdb-com
-  :after ebdb)
+(with-eval-after-load 'ebdb
+  (with-eval-after-load 'ebdb-complete
+    ;; (csetq ebdb-complete-mail 'capf)
+    (ebdb-complete-enable))
 
-(use-package ebdb-complete
-  :after ebdb
-  :config
-  ;; (setq ebdb-complete-mail 'capf)
-  (ebdb-complete-enable))
+  (require 'ebdb-message)
+  
+  (require 'ebdb-gnus)
+  (csetq ebdb-gnus-window-size 0.3)
 
-(use-package ebdb-message
-  :demand
-  :after ebdb)
+  (require 'ebdb-mua)
+  (csetq ebdb-mua-pop-up t))
 
-;; (use-package company-ebdb
-;;   :config
+;; (with-eval-after-load 'company-ebdb
 ;;   (defun company-ebdb--post-complete (_) nil))
 
-(use-package ebdb-gnus
-  :demand
-  :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)
-
 (provide 'bandali-ebdb)
 ;;; bandali-ebdb.el ends here
index 89ec6a0..0166140 100644 (file)
 
 ;;; Code:
 
-(use-package erc
-  :bind ("C-c w e" . erc-switch-to-buffer-other-window)
-  :custom
-  (erc-auto-query 'bury)
-  (erc-autojoin-domain-only nil)
-  (erc-format-nick-function 'erc-format-@nick)
-  (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
+(with-eval-after-load 'erc
+  (csetq
+   erc-auto-query 'bury
+   erc-autojoin-domain-only nil
+   erc-format-nick-function 'erc-format-@nick
+   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)
+
   (declare-function erc-message "erc-backend"
                     (message-command line &optional force))
   (declare-function erc-default-target "erc")
   (add-to-list 'erc-modules 'smiley)
   (add-to-list 'erc-modules 'spelling)
   (declare-function erc-update-modules "erc")
-  (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-match
-  :disabled
-  :after erc
-  :config
-  (set-face-attribute
-   'erc-pal-face nil
-   :foreground 'unspecified
-   :weight 'unspecified
-   ;; :inherit 'font-lock-string-face
-   ;; :background (face-attribute 'font-lock-string-face :background)
-   :background "#ffffed")
-  :custom
-  (erc-pal-highlight-type 'message)
-  (erc-pals
-   '("aindilis" "blackbeard" "bremner" "brettgilio" "civodul" "dto"
-     "ggoes" "jrasata" "jxself" "mplsCorwin" "quiliro" "rindolf" "rwp"
-     "sachac" "technomancy")))
-
-(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)
-         ("C-c a e M-a" . erc-track-switch-buffer-other-window)
-         :map erc-mode-map
-         ("M-a" . erc-track-switch-buffer))
-  :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)
-  (erc-track-showcount t))
-
-(use-package erc-hl-nicks
-  :after erc)
-
-(use-package znc
-  :bind (("C-c a e e" . znc-erc)
-         ("C-c a e a" . znc-all))
-  :config
+  (erc-update-modules)
+
+  ;; erc-fill
+  (csetq
+   erc-fill-column 77
+   erc-fill-function 'erc-fill-static
+   erc-fill-static-center 18)
+
+  ;; erc-match
+  ;; (csetq
+  ;;  erc-pal-highlight-type 'message
+  ;;  erc-pals
+  ;;  '("aindilis" "blackbeard" "bremner" "brettgilio" "civodul" "dto"
+  ;;    "ggoes" "jrasata" "jxself" "mplsCorwin" "quiliro" "rindolf" "rwp"
+  ;;    "sachac" "technomancy"))
+  ;; (with-eval-after-load 'erc-match
+  ;;   (set-face-attribute
+  ;;    'erc-pal-face nil
+  ;;    :foreground 'unspecified
+  ;;    :weight 'unspecified
+  ;;    ;; :inherit 'font-lock-string-face
+  ;;    ;; :background (face-attribute 'font-lock-string-face :background)
+  ;;    :background "#ffffed"))
+
+  ;; erc-pcomplete
+  (csetq erc-pcomplete-nick-postfix ", ")
+
+  ;; erc-track
+  (csetq
+   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
+   erc-track-showcount t)
+
+  ;; key bindings
+  (global-set-key (kbd "C-c w e") #'erc-switch-to-buffer-other-window)
+  (define-key erc-mode-map (kbd "M-a") #'erc-track-switch-buffer))
+
+(with-eval-after-load 'znc
   (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.emacsconf.org" 6697 t
-             ((freenode "bandali/freenode" ,pwd)))
-            ("znc.emacsconf.org" 6697 t
-             ((oftc "bandali/oftc" ,pwd)))
-            ("znc.emacsconf.org" 6697 t
-             ((tildechat "bandali/tildechat" ,pwd)))))))
+    (csetq znc-servers
+           `(("znc.emacsconf.org" 6697 t
+              ((freenode "bandali/freenode" ,pwd)))
+             ("znc.emacsconf.org" 6697 t
+              ((oftc "bandali/oftc" ,pwd)))
+             ("znc.emacsconf.org" 6697 t
+              ((tildechat "bandali/tildechat" ,pwd)))))))
+;; global key bindings
+(global-set-key (kbd "C-c a e e") #'znc-erc)
+(global-set-key (kbd "C-c a e a") #'znc-all)
 
 (provide 'bandali-erc)
 ;;; bandali-erc.el ends here
index 099cbb3..5a83c6d 100644 (file)
 
 ;;; Code:
 
-(use-package eshell
-  :commands eshell
-  :bind ("C-c a s e" . eshell)
-  :config
+(with-eval-after-load 'eshell
+  (csetq
+   eshell-hist-ignoredups t
+   eshell-input-filter #'eshell-input-filter-initial-space
+   eshell-prompt-regexp "\\(.*\n\\)*[$#] "
+   eshell-prompt-function
+   (lambda ()
+     (concat
+      (propertize (format "%s@%s:" (user-login-name) (system-name))
+                  'face 'default)
+      (propertize (abbreviate-file-name default-directory)
+                  'face 'font-lock-comment-face)
+      (propertize "\n" 'face 'default)
+      (if (= (user-uid) 0)
+          (propertize "#" 'face 'red)
+        (propertize "$" 'face 'default))
+      (propertize " " 'face 'default))))
   (eval-when-compile
     (defvar eshell-prompt-regexp)
     (declare-function eshell-life-is-too-much "esh-mode")
     (if (and (eolp) (looking-back eshell-prompt-regexp nil))
         (eshell-life-is-too-much)
       (delete-char arg)))
-
   (defun b/eshell-clear ()
     (interactive)
     (let ((inhibit-read-only t))
       (erase-buffer))
     (eshell-send-input))
-
   (defun b/eshell-setup ()
     (make-local-variable 'company-idle-delay)
     (defvar company-idle-delay)
       (defvar eshell-mode-map)
       (defvar eshell-hist-mode-map))
     (setq company-idle-delay nil)
-    (bind-keys :map eshell-mode-map
-               ("C-d"   . b/eshell-quit-or-delete-char)
-               ("C-S-l" . b/eshell-clear)
-               ("M-r"   . counsel-esh-history)
-               ;; ([tab]   . company-complete)
-               :map eshell-hist-mode-map
-               ("M-r" . counsel-esh-history)))
-
-  (setq
-   eshell-prompt-regexp "\\(.*\n\\)*[$#] "
-   eshell-prompt-function
-   (lambda ()
-     (concat
-      (propertize (format "%s@%s:" (user-login-name) (system-name))
-                  'face 'default)
-      (propertize (abbreviate-file-name default-directory)
-                  'face 'font-lock-comment-face)
-      (propertize "\n" 'face 'default)
-      (if (= (user-uid) 0)
-          (propertize "#" 'face 'red)
-        (propertize "$" 'face 'default))
-      (propertize " " 'face 'default))))
-
-  :hook (eshell-mode . b/eshell-setup)
-  :custom
-  (eshell-hist-ignoredups t)
-  (eshell-input-filter 'eshell-input-filter-initial-space))
+    ;; local key bindings
+    (define-key eshell-mode-map (kbd "C-d")
+      #'b/eshell-quit-or-delete-char)
+    (define-key eshell-mode-map (kbd "C-S-l")
+      #'b/eshell-clear)
+    (define-key eshell-mode-map (kbd "M-r")
+      #'counsel-esh-history)
+    ;; (define-key eshell-mode-map [tab]
+    ;;   #'company-complete)
+    (define-key eshell-hist-mode-map (kbd "M-r")
+      #'counsel-esh-history)))
+;; global key bindings
+(global-set-key (kbd "C-c a s e") #'eshell)
+;; hooks
+(add-hook 'eshell-mode-hook #'b/eshell-setup)
 
 (provide 'bandali-eshell)
 ;;; bandali-eshell.el ends here
index 0c5dc97..4aa41ab 100644 (file)
 
 (declare-function article-make-date-line "gnus-art" (date type))
 
-(setq
- 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 "bandali@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")
-                                  ;; keep debbugs emails in INBOX
-                                  (list ".*<\\(.*\\)\\.debbugs\\.gnu\\.org>.*" "INBOX")
-                                  ;; gnu
-                                  (list ".*<\\(.*\\)\\.\\(non\\)?gnu\\.org>.*" "l.\\1")
-                                  ;; gnus
-                                  (list ".*<\\(.*\\)\\.gnus\\.org>.*" "l.\\1")
-                                  ;; libreplanet
-                                  (list ".*<\\(.*\\)\\.libreplanet\\.org>.*" "l.\\1")
-                                  ;; iana (e.g. tz-announce)
-                                  (list ".*<\\(.*\\)\\.iana\\.org>.*" "l.\\1")
-                                  ;; orbitalfox (e.g. gemini)
-                                  (list ".*<\\(.*\\)\\.lists\\.orbitalfox\\.eu>.*" "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")
-                                  ;; ----------------------------------
-                                  ;; legend: (u)nsubscribed | (d)ead
-                                  ;; ----------------------------------
-                                  ;; spam
-                                  ("X-Spam_action" "reject" "Junk")
-                                  ;; otherwise, leave mail in INBOX
-                                  "INBOX")))
-     (nnimap "uwaterloo"
-             (nnimap-stream plain)
-             (nnimap-address "127.0.0.1")
-             (nnimap-server-port 143)
-             (nnimap-authenticator plain)
-             (nnimap-user "abandali@uwaterloo.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@csclub.uwaterloo.local")
-             (nnimap-inbox "INBOX")
-             (nnimap-split-methods 'nnimap-split-fancy)
-             (nnimap-split-fancy (|
-                                  ;; cron reports and other messages from root
-                                  (from "root@\\(.*\\.\\)?csclub\\.uwaterloo\\.ca" "INBOX")
-                                  ;; spam
-                                  ("X-Spam-Flag" "YES" "Junk")
-                                  ;; catch-all
-                                  "INBOX")))
-     (nnimap "sfl"
-             (nnimap-stream tls)
-             (nnimap-address "mail.savoirfairelinux.com")
-             (nnimap-user "amin.bandali")))
-   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-org"
-      (to-address . "emacsconf-org@gnu.org")
-      (to-list    . "emacsconf-org@gnu.org"))
-     ("l\\.emacsconf-org-private"
-      (to-address . "emacsconf-org-private@gnu.org")
-      (to-list    . "emacsconf-org-private@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\\+uwaterloo:.*"
-      (gcc-self . t)))
-   ;; nnimap-record-commands 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
+(csetq
+ mail-user-agent 'gnus-user-agent
+ read-mail-command 'gnus
+
+ 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 "bandali@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")
+                                ;; keep debbugs emails in INBOX
+                                (list ".*<\\(.*\\)\\.debbugs\\.gnu\\.org>.*" "INBOX")
+                                ;; gnu
+                                (list ".*<\\(.*\\)\\.\\(non\\)?gnu\\.org>.*" "l.\\1")
+                                ;; gnus
+                                (list ".*<\\(.*\\)\\.gnus\\.org>.*" "l.\\1")
+                                ;; libreplanet
+                                (list ".*<\\(.*\\)\\.libreplanet\\.org>.*" "l.\\1")
+                                ;; iana (e.g. tz-announce)
+                                (list ".*<\\(.*\\)\\.iana\\.org>.*" "l.\\1")
+                                ;; orbitalfox (e.g. gemini)
+                                (list ".*<\\(.*\\)\\.lists\\.orbitalfox\\.eu>.*" "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")
+                                ;; ----------------------------------
+                                ;; legend: (u)nsubscribed | (d)ead
+                                ;; ----------------------------------
+                                ;; spam
+                                ("X-Spam_action" "reject" "Junk")
+                                ;; otherwise, leave mail in INBOX
+                                "INBOX")))
+   (nnimap "uwaterloo"
+           (nnimap-stream plain)
+           (nnimap-address "127.0.0.1")
+           (nnimap-server-port 143)
+           (nnimap-authenticator plain)
+           (nnimap-user "abandali@uwaterloo.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@csclub.uwaterloo.local")
+           (nnimap-inbox "INBOX")
+           (nnimap-split-methods 'nnimap-split-fancy)
+           (nnimap-split-fancy (|
+                                ;; cron reports and other messages from root
+                                (from "root@\\(.*\\.\\)?csclub\\.uwaterloo\\.ca" "INBOX")
+                                ;; spam
+                                ("X-Spam-Flag" "YES" "Junk")
+                                ;; catch-all
+                                "INBOX")))
+   (nnimap "sfl"
+           (nnimap-stream tls)
+           (nnimap-address "mail.savoirfairelinux.com")
+           (nnimap-user "amin.bandali")))
+ 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-org"
+    (to-address . "emacsconf-org@gnu.org")
+    (to-list    . "emacsconf-org@gnu.org"))
+   ("l\\.emacsconf-org-private"
+    (to-address . "emacsconf-org-private@gnu.org")
+    (to-list    . "emacsconf-org-private@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\\+uwaterloo:.*"
+    (gcc-self . t)))
+ ;; nnimap-record-commands 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)
+
+(with-eval-after-load 'gnus
   (when (version< emacs-version "27")
     (with-eval-after-load 'nnmail
       (add-to-list
   ;; (gnus-registry-initialize)
 
   (with-eval-after-load 'recentf
-    (add-to-list 'recentf-exclude gnus-home-directory)))
+    (add-to-list 'recentf-exclude gnus-home-directory))
+
+  ;; hooks
+  (add-hook 'gnus-group-mode-hook #'gnus-topic-mode)
+  (add-hook 'gnus-group-mode-hook #'gnus-agent-mode))
+;; global key bindings
+(global-set-key (kbd "s-m") #'gnus-plugged)
+(global-set-key (kbd "s-M") #'gnus-unplugged)
+(global-set-key (kbd "C-c a m") #'gnus-plugged)
+(global-set-key (kbd "C-c a M") #'gnus-unplugged)
 
-(use-package gnus-art
-  :config
-  (setq
+(with-eval-after-load 'gnus-art
+  (csetq
    gnus-buttonized-mime-types '("multipart/\\(signed\\|encrypted\\)")
    gnus-sorted-header-list '("^From:"
                              "^X-RT-Originator"
                      (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
-  :init
-  (defvar b/sfl-p nil)
-  :config
+  ;; local key bindings
+  (define-key gnus-article-mode-map (kbd "M-L") #'org-store-link))
+
+(with-eval-after-load 'gnus-sum
+  (csetq gnus-thread-sort-functions '(gnus-thread-sort-by-number
+                                      gnus-thread-sort-by-subject
+                                      gnus-thread-sort-by-date))
+  ;; local key bindings
+  (define-key gnus-summary-mode-map (kbd "M-L") #'org-store-link)
+  (defvar b/gnus-summary-prefix-map)
+  (define-prefix-command 'b/gnus-summary-prefix-map)
+  (define-key gnus-summary-mode-map (kbd "v")
+    'b/gnus-summary-prefix-map)
+  (define-key b/gnus-summary-prefix-map (kbd "r")
+    #'gnus-summary-reply)
+  (define-key b/gnus-summary-prefix-map (kbd "w")
+    #'gnus-summary-wide-reply)
+  (define-key b/gnus-summary-prefix-map (kbd "v")
+    #'gnus-summary-show-raw-article))
+;; hooks
+(add-hook 'gnus-summary-mode-hook #'b/no-mouse-autoselect-window)
+
+(defvar b/sfl-p nil)
+(with-eval-after-load 'gnus-msg
   (defvar b/shemshak-signature "Amin Bandali
 https://shemshak.org/~bandali")
   (defvar b/uwaterloo-signature "Amin Bandali, MMath
@@ -391,103 +392,89 @@ Computer Science Club, University of Waterloo")
 Free Software Consultant
 Savoir-faire Linux
 GNU Jami: bandali")
-  (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\\+uwaterloo:.*"
-           (address "bandali@uwaterloo.ca")
-           (body "\nBest,\n")
-           (signature b/uwaterloo-signature))
-          ("nnimap\\+uwaterloo:INBOX"
-           (gcc "\"nnimap+uwaterloo:Sent Items\""))
-          ("nnimap\\+csc:.*"
-           (address "bandali@csclub.uwaterloo.ca")
-           (signature b/csc-signature)
-           (gcc "nnimap+csc:Sent"))
-          ("nnimap\\+sfl:.*"
-           (address "amin.bandali@savoirfairelinux.com")
-           (signature b/sfl-signature)
-           (gcc "nnimap+sfl:Sent")
-           (eval (setq-local b/sfl-p t)))))
-  :hook (gnus-message-setup . (lambda ()
-                                (unless (or (mml-secure-is-encrypted-p)
-                                            b/sfl-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$\\)"))
+  (csetq
+   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\\+uwaterloo:.*"
+      (address "bandali@uwaterloo.ca")
+      (body "\nBest,\n")
+      (signature b/uwaterloo-signature))
+     ("nnimap\\+uwaterloo:INBOX"
+      (gcc "\"nnimap+uwaterloo:Sent Items\""))
+     ("nnimap\\+csc:.*"
+      (address "bandali@csclub.uwaterloo.ca")
+      (signature b/csc-signature)
+      (gcc "nnimap+csc:Sent"))
+     ("nnimap\\+sfl:.*"
+      (address "amin.bandali@savoirfairelinux.com")
+      (signature b/sfl-signature)
+      (gcc "nnimap+sfl:Sent")
+      (eval (setq-local b/sfl-p t))))))
+;; hooks
+(with-eval-after-load 'gnus
+  (add-hook 'gnus-message-setup-hook
+            (lambda ()
+              (unless (or (mml-secure-is-encrypted-p)
+                          b/sfl-p)
+                (mml-secure-message-sign)))))
+
+(with-eval-after-load 'gnus-topic
+  (csetq gnus-topic-line-format "%i[ %A: %(%{%n%}%) ]%v\n"))
+
+(with-eval-after-load 'gnus-agent
+  (csetq gnus-agent-synchronize-flags 'ask))
+
+(with-eval-after-load 'gnus-group
+  (csetq 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)))
+  (with-eval-after-load 'gnus-win
+    (csetq gnus-use-full-window nil)))
 
-(use-package gnus-dired
-  :commands gnus-dired-mode
-  :init
+(with-eval-after-load 'gnus-dired
   (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
+  (with-eval-after-load 'gnus-utils
+    (csetq gnus-completing-read-function 'gnus-ido-completing-read)))
+
+(with-eval-after-load 'mm-decode
+  (csetq mm-discouraged-alternatives '("text/html" "text/richtext")
+         mm-decrypt-option 'known
+         mm-verify-option 'known))
+
+(with-eval-after-load 'mm-uu
   (when (version< "27" emacs-version)
     (set-face-attribute 'mm-uu-extract nil :extend t))
   (when (version< emacs-version "27")
-    (setq mm-uu-diff-groups-regexp
-          "\\(gmane\\|gnu\\|l\\)\\..*\\(diff\\|commit\\|cvs\\|bug\\|dev\\)")))
-
-(use-package mml)
-
-(use-package mml-sec
-  :custom
-  (mml-secure-openpgp-encrypt-to-self t)
-  (mml-secure-openpgp-sign-with-sender t))
-
-(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]+ @@")))
+    (csetq mm-uu-diff-groups-regexp ".")))
+
+(with-eval-after-load 'mml-sec
+  (csetq mml-secure-openpgp-encrypt-to-self t
+         mml-secure-openpgp-sign-with-sender t))
+
+;; (require 'gnus-article-treat-patch)
+;; ;; 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]+ @@"))
 
 (provide 'bandali-gnus)
 ;;; bandali-gnus.el ends here
index bf42def..7cd4331 100644 (file)
 
 ;;; Code:
 
-(use-package ibuffer
-  :bind
-  (("C-x C-b" . ibuffer)
-   :map ibuffer-mode-map
-   ("P"   . ibuffer-backward-filter-group)
-   ("N"   . ibuffer-forward-filter-group)
-   ("M-p" . ibuffer-do-print)
-   ("M-n" . ibuffer-do-shell-command-pipe-replace))
-  :config
+(csetq
+ ibuffer-saved-filter-groups
+ '(("default"
+    ("dired" (mode . dired-mode))
+    ("org"   (mode . org-mode))
+    ("gnus"
+     (or
+      (mode . gnus-group-mode)
+      (mode . gnus-summary-mode)
+      (mode . gnus-article-mode)
+      (mode . message-mode)))
+    ("web"
+     (or
+      (mode . mhtml-mode)
+      (mode . css-mode)
+      (mode . scss-mode)
+      (mode . js2-mode)))
+    ("shell"
+     (or
+      (mode . eshell-mode)
+      (mode . shell-mode)
+      (mode . term-mode)))
+    ("programming"
+     (or
+      (mode . python-mode)
+      (mode . c-mode)
+      (mode . c++-mode)
+      (mode . java-mode)
+      (mode . emacs-lisp-mode)
+      (mode . scheme-mode)
+      (mode . haskell-mode)
+      (mode . lean-mode)
+      ;; (mode . go-mode)
+      (mode . alloy-mode)))
+    ("tex"
+     (or
+      (mode . bibtex-mode)
+      (mode . latex-mode)))
+    ("emacs"
+     (or
+      (name . "^\\*scratch\\*$")
+      (name . "^\\*Messages\\*$")))
+    ("exwm" (mode . exwm-mode))
+    ("erc" (mode . erc-mode))))
+ ibuffer-formats
+ '((mark modified read-only locked " "
+         (name 72 72 :left :elide)
+         " "
+         (size-h 9 -1 :right)
+         " "
+         (mode 16 16 :left :elide)
+         " " filename-and-process)
+   (mark " "
+         (name 16 -1)
+         " " filename)))
+(with-eval-after-load 'ibuffer
   ;; Use human readable Size column instead of original one
   (define-ibuffer-column size-h
     (:name "Size" :inline t)
      ((> (buffer-size) 100000) (format "%7.0fk" (/ (buffer-size) 1000.0)))
      ((> (buffer-size) 1000) (format "%7.1fk" (/ (buffer-size) 1000.0)))
      (t (format "%8d" (buffer-size)))))
-  (declare-function ibuffer-switch-to-saved-filter-groups "ibuf-ext"
+
+  ;; local key bindings
+  (define-key ibuffer-mode-map (kbd "P")
+    #'ibuffer-backward-filter-group)
+  (define-key ibuffer-mode-map (kbd "N")
+    #'ibuffer-forward-filter-group)
+  (define-key ibuffer-mode-map (kbd "M-p")
+    #'ibuffer-do-print)
+  (define-key ibuffer-mode-map (kbd "M-n")
+    #'ibuffer-do-shell-command-pipe-replace))
+;; global key bindings
+(global-set-key (kbd "C-x C-b") #'ibuffer)
+;; hooks
+(declare-function ibuffer-switch-to-saved-filter-groups "ibuf-ext"
                     (name))
-  :custom
-  (ibuffer-saved-filter-groups
-   '(("default"
-      ("dired" (mode . dired-mode))
-      ("org"   (mode . org-mode))
-      ("gnus"
-       (or
-        (mode . gnus-group-mode)
-        (mode . gnus-summary-mode)
-        (mode . gnus-article-mode)
-        ;; not really, but...
-        (mode . message-mode)))
-      ("web"
-       (or
-        (mode . mhtml-mode)
-        (mode . css-mode)
-        (mode . scss-mode)
-        (mode . js2-mode)))
-      ("shell"
-       (or
-        (mode . eshell-mode)
-        (mode . shell-mode)
-        (mode . term-mode)))
-      ("programming"
-       (or
-        (mode . python-mode)
-        (mode . c-mode)
-        (mode . c++-mode)
-        (mode . java-mode)
-        (mode . emacs-lisp-mode)
-        (mode . scheme-mode)
-        (mode . haskell-mode)
-        (mode . lean-mode)
-        ;; (mode . go-mode)
-        (mode . alloy-mode)))
-      ("tex"
-       (or
-        (mode . bibtex-mode)
-        (mode . latex-mode)))
-      ("emacs"
-       (or
-        (name . "^\\*scratch\\*$")
-        (name . "^\\*Messages\\*$")))
-      ("exwm" (mode . exwm-mode))
-      ("erc" (mode . erc-mode)))))
-  (ibuffer-formats
-   '((mark modified read-only locked " "
-           (name 72 72 :left :elide)
-           " "
-           (size-h 9 -1 :right)
-           " "
-           (mode 16 16 :left :elide)
-           " " filename-and-process)
-     (mark " "
-           (name 16 -1)
-           " " filename)))
-  :hook (ibuffer . (lambda () (ibuffer-switch-to-saved-filter-groups "default"))))
+(add-hook 'ibuffer-hook
+          (lambda () (ibuffer-switch-to-saved-filter-groups "default")))
 
 (provide 'bandali-ibuffer)
 ;;; bandali-ibuffer.el ends here
index 3a67cf1..973323a 100644 (file)
 
 ;;; Code:
 
-(use-package ivy
-  :defer 0.3
-  :bind
-  (:map ivy-minibuffer-map
-   ([escape] . keyboard-escape-quit)
-   ([S-up]   . ivy-previous-history-element)
-   ([S-down] . ivy-next-history-element)
-   ("DEL"    . ivy-backward-delete-char))
-  :config
-  (setq ivy-wrap t
-        ;; ivy-height 14
-        ivy-use-virtual-buffers t
-        ivy-virtual-abbreviate 'abbreviate
-        ivy-count-format "%d/%d ")
+(run-with-idle-timer 0.3 nil #'require 'ivy)
+(with-eval-after-load 'ivy
+  ;; ivy
+  (csetq ivy-wrap t
+         ;; ivy-height 14
+         ivy-use-virtual-buffers t
+         ivy-virtual-abbreviate 'abbreviate
+         ivy-count-format "%d/%d ")
 
   (defvar b/ivy-ignore-buffer-modes
     '(;; dired-mode
@@ -52,24 +46,29 @@ This function is intended for use with `ivy-ignore-buffers'."
            (mode (and buf (buffer-local-value 'major-mode buf))))
       (and mode
            (apply #'provided-mode-derived-p mode b/ivy-ignore-buffer-modes))))
-  (add-to-list 'ivy-ignore-buffers 'b/ivy-ignore-buffer-p)
-
-  (ivy-mode 1))
-
-(use-package swiper
-  :demand
-  :after ivy
-  :bind (("C-S-s" . swiper-isearch)))
-
-(use-package counsel
-  :demand
-  :after ivy
-  :bind (("C-c f r" . counsel-recentf)
-         :map minibuffer-local-map
-         ("C-r" . counsel-minibuffer-history))
-  :config
+  (add-to-list 'ivy-ignore-buffers #'b/ivy-ignore-buffer-p)
+
+  (define-key ivy-minibuffer-map [escape] #'keyboard-escape-quit)
+  (define-key ivy-minibuffer-map [S-up]
+    #'ivy-previous-history-element)
+  (define-key ivy-minibuffer-map [S-down]
+    #'ivy-next-history-element)
+  (define-key ivy-minibuffer-map (kbd "DEL")
+    #'ivy-backward-delete-char)
+
+  (ivy-mode 1)
+
+  ;; swiper
+  (require 'swiper)
+  (global-set-key (kbd "C-S-s") #'swiper-isearch)
+
+  ;; counsel
+  (require 'counsel)
   (counsel-mode 1)
-  (defalias 'locate #'counsel-locate))
+  (defalias 'locate #'counsel-locate)
+  (global-set-key (kbd "C-c f r") #'counsel-recentf)
+  (define-key minibuffer-local-map
+    (kbd "C-r") #'counsel-minibuffer-history))
 
 (provide 'bandali-ivy)
 ;;; bandali-ivy.el ends here
index 7d8edf4..e7e43f8 100644 (file)
@@ -24,9 +24,8 @@
 
 ;;; Code:
 
-(use-package message
-  :bind (:map message-mode-map ("<C-return>" . b/insert-asterism))
-  :config
+(with-eval-after-load 'message
+  ;; :bind (:map message-mode-map ("<C-return>" . b/insert-asterism))
   ;; redefine for a simplified In-Reply-To header
   ;; (see https://todo.sr.ht/~sircmpwn/lists.sr.ht/67)
   (defun message-make-in-reply-to ()
@@ -50,7 +49,9 @@
            (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
+  (csetq
+   message-elide-ellipsis "[...]\n"
+   ;; message-cite-style 'message-cite-style-bandali
    message-citation-line-format "%N writes:\n"
    message-citation-line-function 'message-insert-formatted-citation-line
    message-kill-buffer-on-exit t
    message-subscribed-address-functions
    '(gnus-find-subscribed-addresses)
    message-dont-reply-to-names
-   "\\(\\(amin@shemshak\\.org\\)\\|\\(.*@aminb\\.org\\)\\|\\(\\(bandali\\|mab\\|aminb?\\)@gnu\\.org\\)\\|bandali@fsf\\.org\\|\\(a?bandali@\\(csclub\\.\\)?uwaterloo\\.ca\\)\\)")
+   "\\(\\(amin@shemshak\\.org\\)\\|\\(.*@aminb\\.org\\)\\|\\(\\(bandali\\|mab\\|aminb?\\)@gnu\\.org\\)\\|bandali@fsf\\.org\\|\\(a?bandali@\\(csclub\\.\\)?uwaterloo\\.ca\\)\\|amin\\.bandali@savoirfairelinux\\.com\\)")
   ;; (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)
-                           (eval-when-compile (defvar company-idle-delay))
-                           (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 footnote
-  :after message
-  :config
-  ;; (setq footnote-start-tag ""
-  ;;       footnote-end-tag   ""
-  ;;       footnote-style     'unicode)
-  (when (featurep 'which-key)
-    (which-key-add-major-mode-key-based-replacements 'message-mode
-      "C-c f n" "footnote"))
-  :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)))
+  ;; (custom-set-faces
+  ;;  '(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))))
+
+  ;; footnote
+  (with-eval-after-load 'footnote
+    ;; (csetq footnote-start-tag ""
+    ;;        footnote-end-tag   ""
+    ;;        footnote-style     'unicode)
+    (when (featurep 'which-key)
+      (which-key-add-major-mode-key-based-replacements 'message-mode
+        "C-c f n" "footnote")))
+
+  ;; orgalist
+  (add-hook 'message-mode-hook
+            (lambda ()
+              ;; work around incompatibility between
+              ;; orgalist and yasnippet
+              (yas-minor-mode -1)
+              (orgalist-mode 1)
+              (yas-minor-mode 1)))
+
+  ;; local key bindings
+  (defvar b/footnote-prefix-map)
+  (define-prefix-command 'b/footnote-prefix-map)
+  (define-key message-mode-map (kbd "C-c f n")
+    'b/footnote-prefix-map)
+  (define-key b/footnote-prefix-map (kbd "a")
+    #'footnote-add-footnote)
+  (define-key b/footnote-prefix-map (kbd "b")
+    #'footnote-back-to-message)
+  (define-key b/footnote-prefix-map (kbd "c")
+    #'footnote-cycle-style)
+  (define-key b/footnote-prefix-map (kbd "d")
+    #'footnote-delete-footnote)
+  (define-key b/footnote-prefix-map (kbd "g")
+    #'footnote-goto-footnote)
+  (define-key b/footnote-prefix-map (kbd "r")
+    #'footnote-renumber-footnotes)
+  (define-key b/footnote-prefix-map (kbd "s")
+    #'footnote-set-style))
+;; hooks
+;; (add-hook 'message-setup-hook #'mml-secure-message-sign-pgpmime)
+(add-hook 'message-mode-hook #'flyspell-mode)
+(add-hook 'message-mode-hook
+          (lambda ()
+            ;; (setq-local fill-column b/fill-column
+            ;;             message-fill-column b/fill-column)
+            (eval-when-compile (defvar company-idle-delay))
+            (make-local-variable 'company-idle-delay)
+            (setq company-idle-delay 0.2)))
 
 (comment
-  (use-package message-x
-    :custom
-    (message-x-completion-alist
-     (quote
-      (("\\([rR]esent-\\|[rR]eply-\\)?[tT]o:\\|[bB]?[cC][cC]:" . gnus-harvest-find-address)
+  (with-eval-after-load 'message-x
+    (csetq
+     message-x-completion-alist
+     '(("\\([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))))))
+        . message-expand-group)))))
 
 (comment
-  (use-package gnus-harvest
-    :commands gnus-harvest-install
-    :demand
-    :config
-    (if (featurep 'message-x)
-        (gnus-harvest-install 'message-x)
-      (gnus-harvest-install))))
-
-(use-package orgalist
-  :after message
-  :hook (message-mode . (lambda ()
-                          ;; work around incompatibility between
-                          ;; orgalist and yasnippet
-                          (yas-minor-mode -1)
-                          (orgalist-mode 1)
-                          (yas-minor-mode 1))))
+  (require 'gnus-harvest)
+  (if (featurep 'message-x)
+      (gnus-harvest-install 'message-x)
+    (gnus-harvest-install)))
 
 (provide 'bandali-message)
 ;;; bandali-message.el ends here
index a9ab750..ed2a3bd 100644 (file)
 
 ;;; Code:
 
-(use-package org
-  :config
-  (setq org-src-tab-acts-natively t
-        org-src-preserve-indentation nil
-        org-edit-src-content-indentation 0
-        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)
+(with-eval-after-load 'org
+  (csetq org-src-tab-acts-natively t
+         org-src-preserve-indentation nil
+         org-edit-src-content-indentation 0
+         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
+         org-pretty-entities t
+         org-agenda-files '("~/usr/org/todos/personal.org"
+                            "~/usr/org/todos/habits.org"
+                            "~/src/git/masters-thesis/todo.org")
+         org-agenda-start-on-weekday 0
+         org-agenda-time-leading-zero t
+         org-habit-graph-column 44
+         org-latex-packages-alist '(("" "listings") ("" "color")))
   (add-to-list 'org-structure-template-alist '("L" . "src emacs-lisp") t)
   (add-to-list 'org-modules 'org-habit)
-  :bind
-  (("C-c a o a" . org-agenda)
-   :map org-mode-map
-   ("M-L" . org-insert-last-stored-link)
-   ("M-O" . org-toggle-link-display))
-  :hook ((org-mode . org-indent-mode)
-         (org-mode . auto-fill-mode)
-         (org-mode . flyspell-mode))
-  :custom
-  (org-pretty-entities t)
-  (org-agenda-files '("~/usr/org/todos/personal.org"
-                      "~/usr/org/todos/habits.org"
-                      "~/src/git/masters-thesis/todo.org"))
-  (org-agenda-start-on-weekday 0)
-  (org-agenda-time-leading-zero t)
-  (org-habit-graph-column 44)
-  (org-latex-packages-alist '(("" "listings") ("" "color")))
-  :custom-face
-  '(org-block-begin-line ((t (:foreground "#5a5b5a" :background "#1d1f21"))))
-  '(org-block ((t (:background "#1d1f21"))))
-  '(org-latex-and-related ((t (:foreground "#b294bb")))))
-
-(use-package ox-latex
-  :after ox
-  :config
-  (setq org-latex-listings 'listings
-        ;; org-latex-prefer-user-labels t
-        )
-  (add-to-list 'org-latex-classes
-               '("IEEEtran" "\\documentclass[11pt]{IEEEtran}"
-                 ("\\section{%s}"       . "\\section*{%s}")
-                 ("\\subsection{%s}"    . "\\subsection*{%s}")
-                 ("\\subsubsection{%s}" . "\\subsubsection*{%s}")
-                 ("\\paragraph{%s}"     . "\\paragraph*{%s}")
-                 ("\\subparagraph{%s}"  . "\\subparagraph*{%s}"))
-               t)
-  (require 'ox-beamer))
-
-(use-package ox-extra
-  :config
-  (declare-function ox-extras-activate "ox-extra" (extras))
-  (ox-extras-activate '(latex-header-blocks ignore-headlines)))
-
-;; asynchronous tangle, using emacs-async to asynchronously tangle an
-;; org file.  closely inspired by
-;; https://github.com/dieggsy/dotfiles/tree/cc10edf7701958eff1cd94d4081da544d882a28c/emacs.d#dotfiles
-(with-eval-after-load 'org
+  (custom-set-faces
+   '(org-block-begin-line
+     ((t (:foreground "#5a5b5a" :background "#1d1f21"))))
+   '(org-block ((t (:background "#1d1f21"))))
+   '(org-latex-and-related ((t (:foreground "#b294bb")))))
+  ;; local key bindings
+  (define-key org-mode-map (kbd "M-L") #'org-insert-last-stored-link)
+  (define-key org-mode-map (kbd "M-O") #'org-toggle-link-display)
+  ;; hooks
+  (add-hook 'org-mode-hook #'org-indent-mode)
+  (add-hook 'org-mode-hook #'auto-fill-mode)
+  (add-hook 'org-mode-hook #'flyspell-mode)
+
+  ;; asynchronous tangle, using emacs-async to asynchronously tangle an
+  ;; org file.  closely inspired by
+  ;; https://github.com/dieggsy/dotfiles/tree/cc10edf7701958eff1cd94d4081da544d882a28c/emacs.d#dotfiles
   (defvar b/show-async-tangle-results nil
     "Keep *emacs* async buffers around for later inspection.")
 
                                      (float-time (time-subtract (current-time)
                                                                 ',file-tangle-start-time)))
                            ""))
-              (message "Tangling %s failed" ,file-nodir))))))))
-
-(add-to-list
- 'safe-local-variable-values
- '(eval add-hook 'after-save-hook #'b/async-babel-tangle 'append 'local))
+              (message "Tangling %s failed" ,file-nodir)))))))
+  (add-to-list
+   'safe-local-variable-values
+   '(eval add-hook 'after-save-hook #'b/async-babel-tangle 'append 'local)))
+;; global key bindings
+(global-set-key (kbd "C-c a o a") #'org-agenda)
+
+(with-eval-after-load 'ox-latex
+  (csetq org-latex-listings 'listings
+         ;; org-latex-prefer-user-labels t
+         )
+  (add-to-list 'org-latex-classes
+               '("IEEEtran" "\\documentclass[11pt]{IEEEtran}"
+                 ("\\section{%s}"       . "\\section*{%s}")
+                 ("\\subsection{%s}"    . "\\subsection*{%s}")
+                 ("\\subsubsection{%s}" . "\\subsubsection*{%s}")
+                 ("\\paragraph{%s}"     . "\\paragraph*{%s}")
+                 ("\\subparagraph{%s}"  . "\\subparagraph*{%s}"))
+               t)
+  (require 'ox-beamer))
 
-(use-package org-tanglesync
-  :hook (org-mode . org-tanglesync-mode))
+(with-eval-after-load 'ox-extra  
+  (declare-function ox-extras-activate "ox-extra" (extras))
+  (ox-extras-activate '(latex-header-blocks ignore-headlines)))
 
 (provide 'bandali-org)
 ;;; bandali-org.el ends here
index 13be391..7706bcc 100644 (file)
 
 ;;; Code:
 
-(use-package refinery-theme
-  :demand
-  :config
-  (load-theme 'refinery t))
-
-(use-package smart-mode-line
-  :commands (sml/apply-theme)
-  :demand
-  :config
-  ;; thanks, but no thnaks; don't make fixed-width fills.
-  (defun sml/fill-for-buffer-identification () "")
-  (setq sml/theme 'respectful)
-  (sml/setup)
-  (smart-mode-line-enable))
-
-(use-package minions
-  :demand
-  :config (minions-mode))
+(require 'refinery-theme)
+(load-theme 'refinery t)
+
+(require 'smart-mode-line)
+;; thanks, but no thanks; don't make fixed-width fills.
+(defun sml/fill-for-buffer-identification nil "")
+(setq sml/theme 'respectful)
+(sml/setup)
+(smart-mode-line-enable)
+
+(require 'minions)
+(minions-mode)
 
 (defvar b/org-mode-font-lock-keywords
   '(("[ \t]*\\(#\\+\\(BEGIN\\|END\\|begin\\|end\\)_\\(\\S-+\\)\\)[ \t]*\\([^\n:]*\\)"
@@ -72,9 +66,9 @@
   "Go dark."
   (interactive)
   (mapc #'disable-theme custom-enabled-themes)
-  (load-theme 'tango-dark t)
+  (load-theme 'refinery-dark t)
   (when (featurep 'smart-mode-line)
-    (sml/apply-theme 'automatic))
+    (sml/apply-theme 'dark))
   (font-lock-add-keywords
    'org-mode b/org-mode-font-lock-keywords t)
   (when (featurep 'erc-hl-nicks)
@@ -82,9 +76,8 @@
   (when (featurep 'exwm-systemtray)
     (exwm-systemtray--refresh)))
 
-(bind-keys
- ("C-c t d" . b/lights-off)
- ("C-c t l" . b/lights-on))
+(global-set-key (kbd "C-c t d") #'b/lights-off)
+(global-set-key (kbd "C-c t l") #'b/lights-on)
 
 (provide 'bandali-theme)
 ;;; bandali-theme.el ends here
diff --git a/lisp/bandali-yasnippet.el b/lisp/bandali-yasnippet.el
deleted file mode 100644 (file)
index 6cdbc7a..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-(use-package yasnippet
-  :defer 0.6
-  :config
-  (declare-function yas-reload-all
-                    "yasnippet" (&optional no-jit interactive))
-  (declare-function yas-maybe-expand-abbrev-key-filter
-                    "yasnippet" (cmd))
-
-  (defconst yas-verbosity-cur yas-verbosity)
-  (setq yas-verbosity 2)
-  (add-to-list 'yas-snippet-dirs "~/src/git/guix/etc/snippets" t)
-  (yas-reload-all)
-  (setq yas-verbosity yas-verbosity-cur)
-
-  (defun b/yas-maybe-expand-abbrev-key-filter (cmd)
-    (when (and (yas-maybe-expand-abbrev-key-filter cmd)
-               (not (bound-and-true-p git-commit-mode)))
-      cmd))
-  (defconst b/yas-maybe-expand
-    '(menu-item "" yas-expand :filter b/yas-maybe-expand-abbrev-key-filter))
-  (define-key yas-minor-mode-map
-    (kbd "SPC") b/yas-maybe-expand)
-
-  (yas-global-mode))
-
-(provide 'bandali-yasnippet)