]> git.donarmstrong.com Git - lib.git/blobdiff - emacs_el/configuration/don-configuration.org
remove magit and tiny-tools (I'm using straight to load them)
[lib.git] / emacs_el / configuration / don-configuration.org
index a48e0b716a1c88ecbf6441a71548af41e5cdaf3e..60f3c536bf3d40536761d963af0e11bd92987e80 100644 (file)
@@ -1,4 +1,11 @@
 #+PROPERTY: header-args:emacs-lisp :tangle don-configuration.el
+#+OPTIONS: auto-id:f
+
+* General Notes
+
+** Delight
+To look up options for symbols for delight, check out https://en.wikipedia.org/wiki/Emoji#Unicode_blocks
+
 * Load debugger
 
 # if for some reason, things get pear-shaped, we want to be able to
 
 #+BEGIN_SRC emacs-lisp
 (setq debug-on-event 'siguser2)
+#+END_SRC
+* Paths
+** Update PATH
+#+BEGIN_SRC emacs-lisp
+(add-to-list 'exec-path '"/usr/local/bin")
+(add-to-list 'exec-path '"~/bin/")
+#+END_SRC
+** Add library paths
+#+BEGIN_SRC emacs-lisp
+(let ((default-directory "~/lib/emacs_el/"))
+  (normal-top-level-add-subdirs-to-load-path))
+;; (eval-and-compile
+;;   (let ((default-directory "~/var/emacs/elpa"))
+;;     (normal-top-level-add-subdirs-to-load-path))
+;; )
+(add-to-list 'load-path '"~/lib/emacs_el")
+(setq package-user-dir "~/var/emacs/elpa")
+
 #+END_SRC
 * Initial startup stuff
 ** Disable startup screen
 #+BEGIN_SRC emacs-lisp
-  (setq inhibit-startup-screen t)
+(setq inhibit-startup-screen t)
 #+END_SRC
 ** Disable cluter
 #+BEGIN_SRC emacs-lisp
-  ; (if (fboundp 'menu-bar-mode) (menu-bar-mode -1))
-  (if (fboundp 'tool-bar-mode) (tool-bar-mode -1))
-  (if (fboundp 'scroll-bar-mode) (scroll-bar-mode -1))
+; (if (fboundp 'menu-bar-mode) (menu-bar-mode -1))
+(if (fboundp 'tool-bar-mode) (tool-bar-mode -1))
+(if (fboundp 'scroll-bar-mode) (scroll-bar-mode -1))
 #+END_SRC
 ** Fullscreen
 #+BEGIN_SRC emacs-lisp
-  (setq frame-resize-pixelwise t)
-  (add-to-list 'default-frame-alist '(fullscreen . maximixed))
+(setq frame-resize-pixelwise t)
+(add-to-list 'default-frame-alist '(fullscreen . maximixed))
 #+END_SRC
 * Package management
-** package repositories and package manager
-Borrowed from https://github.com/nilcons/emacs-use-package-fast/ to
-load  [[https://github.com/jwiegley/use-package/][use-package]] even faster
-#+BEGIN_SRC emacs-lisp
-  (eval-and-compile
-    ;; add /etc/ssl/ca-global/ca-certificates.crt so that we can
-    ;; download packages when we're on Debian hosts which chop down the
-    ;; list of available certificates
-    (require 'gnutls)
-    (add-to-list 'gnutls-trustfiles "/etc/ssl/ca-global/ca-certificates.crt")
-    (setq package-enable-at-startup nil)
-    (setq package--init-file-ensured t)
-    (setq package-user-dir "~/var/emacs/elpa")
-    (setq package-archives '(("gnu" . "https://elpa.gnu.org/packages/")
-                             ("melpa" . "https://melpa.org/packages/")
-                             ("org" . "http://orgmode.org/elpa/")))
-    (setq use-package-verbose (not (bound-and-true-p byte-compile-current-file))))
-  (mapc #'(lambda (add) (add-to-list 'load-path add))
-    (eval-when-compile
-      (package-initialize)
-      (unless (package-installed-p 'use-package)
-        (package-refresh-contents)
-        (package-install 'use-package))
-      (let ((package-user-dir-real (file-truename package-user-dir)))
-        ;; The reverse is necessary, because outside we mapc
-        ;; add-to-list element-by-element, which reverses.
-        (nreverse (apply #'nconc
-                 ;; Only keep package.el provided loadpaths.
-                 (mapcar #'(lambda (path)
-                     (if (string-prefix-p package-user-dir-real path)
-                         (list path)
-                       nil))
-                     load-path))))))
-
-  ;;; fix up info paths for packages
-  (with-eval-after-load "info"
-    (info-initialize)
-    (dolist (dir (directory-files package-user-dir))
-      (let ((fdir (concat (file-name-as-directory package-user-dir) dir)))
-        (unless (or (member dir '("." ".." "archives" "gnupg"))
-                    (not (file-directory-p fdir))
-                    (not (file-exists-p (concat (file-name-as-directory fdir) "dir"))))
-          (add-to-list 'Info-directory-list fdir)))))
-
-
-  (eval-when-compile
-    (require 'use-package))
-  (require 'bind-key)
-  (require 'diminish)
-#+END_SRC
-** Paradox
-#+BEGIN_SRC emacs-lisp
-  (use-package paradox
-    :ensure paradox
-    :commands (paradox-upgrade-packages paradox-list-packages)
-    :config
-    (setq paradox-execute-asynchronously t)
-    (setq paradox-github-token t) ; I don't want to be prompted about this integration
-    )
+** Bootstrap straight.el
+#+BEGIN_SRC emacs-lisp
+(defvar bootstrap-version)
+(setq straight-base-dir '"~/var/emacs/")
+(let ((bootstrap-file
+       (expand-file-name "straight/repos/straight.el/bootstrap.el" straight-base-dir))
+      (bootstrap-version 6))
+  (unless (file-exists-p bootstrap-file)
+    (with-current-buffer
+        (url-retrieve-synchronously
+         "https://raw.githubusercontent.com/radian-software/straight.el/develop/install.el"
+         'silent 'inhibit-cookies)
+      (goto-char (point-max))
+      (eval-print-last-sexp)))
+  (load bootstrap-file nil 'nomessage))
 #+END_SRC
-* Paths
-** Update PATH
+** package repositories and package manager
 #+BEGIN_SRC emacs-lisp
-  (add-to-list 'exec-path '"/usr/local/bin")
-  (add-to-list 'exec-path '"~/bin/")
+(straight-use-package 'use-package)
+(setq straight-use-package-by-default t)
+(setq use-package-verbose (not (bound-and-true-p byte-compile-current-file)))
+(require 'gnutls)
+(add-to-list 'gnutls-trustfiles "/etc/ssl/ca-global/ca-certificates.crt")
 #+END_SRC
-** Add library paths
-
+** Paradox
 #+BEGIN_SRC emacs-lisp
-  (add-to-list 'load-path '"~/lib/emacs_el/")
-  (add-to-list 'load-path '"~/lib/emacs_el/magit-annex")
+(use-package paradox
+  ;:ensure paradox
+  :commands (paradox-upgrade-packages paradox-list-packages)
+  :config
+  (setq paradox-execute-asynchronously t)
+  (setq paradox-github-token t) ; I don't want to be prompted about this integration
+  )
 #+END_SRC
 * Disable custom-vars
 #+BEGIN_SRC emacs-lisp
-  ;; Set the custom file to /dev/null and don't bother to load it
-  (setq custom-file "/dev/null")
+;; Set the custom file to /dev/null and don't bother to load it
+(setq custom-file "/dev/null")
 #+END_SRC
 * Misc functions
 ** with-library
 #+BEGIN_SRC emacs-lisp
 ;; From http://www.emacswiki.org/emacs/LoadingLispFiles
 ;; execute conditional code when loading libraries
-(defmacro with-library (symbol &rest body)
-  `(when (require ,symbol nil t)
-     ,@body))
-(put 'with-library 'lisp-indent-function 1)
+(defmacro with-library (symbol &rest body)
+  `(when (require ,symbol nil t)
+;     ,@body))
+(put 'with-library 'lisp-indent-function 1)
 #+END_SRC
 
 * Variables
@@ -126,54 +113,136 @@ load  [[https://github.com/jwiegley/use-package/][use-package]] even faster
 #+END_SRC
 * Memory
 #+BEGIN_SRC emacs-lisp
-  (setq global-mark-ring-max 128
-        mark-ring-max 128
-        kill-ring-max 128)
+(setq global-mark-ring-max 128
+      mark-ring-max 128
+      kill-ring-max 128)
 
-  (defun don/minibuffer-setup-hook ()
-    (setq gc-cons-threshold most-positive-fixnum))
+(defun don/minibuffer-setup-hook ()
+  (setq gc-cons-threshold most-positive-fixnum))
 
-  (defun don/minibuffer-exit-hook ()
-    (setq gc-cons-threshold 1048576))
+(defun don/minibuffer-exit-hook ()
+  (setq gc-cons-threshold 1048576))
 
-  (add-hook 'minibuffer-setup-hook #'don/minibuffer-setup-hook)
-  (add-hook 'minibuffer-exit-hook #'don/minibuffer-exit-hook)
+(add-hook 'minibuffer-setup-hook #'don/minibuffer-setup-hook)
+(add-hook 'minibuffer-exit-hook #'don/minibuffer-exit-hook)
 #+END_SRC
 * Modules
+** Tree sitter
+#+BEGIN_SRC emacs-lisp
+(use-package tree-sitter
+  :defer t
+  :config
+  (global-tree-sitter-mode)
+  )
+(use-package tree-sitter-langs
+  :ensure t
+  :defer 1
+  :after tree-sitter
+;   :config
+;   (defun dla/python-function-at-point ()
+;     "Return a list of function arguments
+; 
+; Borrowed from https://xenodium.com/emacs-generate-a-swift-initializer/
+; "
+;   (interactive)
+;   (cl-assert (seq-contains-p local-minor-modes 'tree-sitter-mode) "tree-sitter-mode not enabled")
+;   (let* ((node (tree-sitter-node-at-point 'function_definition)
+;                )
+;          (args)
+;          (arg)
+;          (ret))
+;     (unless node
+;       (error "Not in function"))
+;     (mapc
+;      (lambda (item)
+;        (cond ((eq 'func_name
+;                   (car item))
+;               ; (when arg
+;               ;   (setq args (append args (list arg)))
+;               ;   )
+;               (setq arg (list (cons 'function (tsc-node-text
+;                                            (cdr item))))))
+;              ((eq 'ident
+;                   (car item))
+;               (setq arg (map-insert arg 'ident (tsc-node-text
+;                                                (cdr item)))))
+;              ((eq 'ident_type
+;                   (car item))
+;               (setq arg (map-insert arg 'ident_type (tsc-node-text
+;                                                (cdr item)))))
+;              ((eq 'ret_type
+;                   (car item))
+;               (setq arg (map-insert arg 'ret_type (tsc-node-text
+;                                                (cdr item)))))
+;              ))
+;      (tsc-query-captures
+;       (tsc-make-query tree-sitter-language
+;                       "(function_definition (identifier) @func_name (parameters [(identifier) @ident (typed_parameter (identifier) @ident (type) @ident_type)]) (type)? @ret_type)")
+;       (tree-sitter-node-at-point 'function_definition) nil))
+;     (when arg
+;       (setq args (append args (list arg))))
+;     args))
+
+)
+#+END_SRC
 ** Spacemacs theme
 #+BEGIN_SRC emacs-lisp
-(use-package spacemacs-common
-  :ensure spacemacs-theme
+(use-package spacemacs-theme
   :config
   (load-theme 'spacemacs-dark t)
   )
 #+END_SRC
 ** Hippie Expand
 #+BEGIN_SRC emacs-lisp
-  (use-package hippie-exp
-    :bind* (("M-<SPC>" . hippie-expand))
-    )
+(use-package hippie-exp
+  :bind* (("M-<SPC>" . hippie-expand))
+  )
 #+END_SRC
 ** Flyspell 🐝 
 #+BEGIN_SRC emacs-lisp
-  (use-package flyspell
-    :ensure t
-    :diminish flyspell-mode 🐝
-    :config
-    (add-hook 'text-mode-hook 'turn-on-flyspell)
-    (add-hook 'c-mode-common-hook 'flyspell-prog-mode)
-    (add-hook 'cperl-mode-hook 'flyspell-prog-mode)
-    (add-hook 'tcl-mode-hook 'flyspell-prog-mode)
-    :init
-    (setq ispell-program-name "ispell")
-    )
-
+(use-package flyspell
+  ; :delight flyspell-mode 🐝
+  :config
+  (setq flyspell-mode-line-string " 🐝")
+  (add-hook 'text-mode-hook 'turn-on-flyspell)
+  (add-hook 'c-mode-common-hook 'flyspell-prog-mode)
+  (add-hook 'cperl-mode-hook 'flyspell-prog-mode)
+  (add-hook 'tcl-mode-hook 'flyspell-prog-mode)
+  :init
+  (setq ispell-program-name "ispell")
+  )
 #+END_SRC
-** Flymake
+
+** Flycheck
 #+begin_src emacs-lisp :tangle yes
+(use-package flycheck
+  :delight 🦋
+  :if (version<= "24.4" emacs-version)
+  :commands flycheck-mode
+  :hook ((prog-mode . flycheck-mode)
+         )
+)
+;; Other pkgs
+(use-package flycheck-tip
+  :commands 'flycheck-tip-cycle
+  :after flycheck
+  :bind (:map flycheck-mode-map
+              ("C-c C-n" . flycheck-tip-cycle)))
+
+(use-package flycheck-package)
+
+(use-package flycheck-checkpatch
+  :config (flycheck-checkpatch-setup)
+  :config (setq flycheck-checkers (delete 'checkpatch
+  flycheck-checkers))
+  :config (add-to-list 'flycheck-checkers 'checkpatch t))
+#+end_src  
+
+** Flymake
+#+BEGIN_SRC emacs-lisp
   (use-package flymake
-    :diminish "Φ")
-#+end_src
+    :delight "Φ")
+#+END_SRC
 
 ** Winnermode
 #+BEGIN_SRC emacs-lisp
@@ -184,7 +253,7 @@ load  [[https://github.com/jwiegley/use-package/][use-package]] even faster
 #+BEGIN_SRC emacs-lisp
   (use-package eyebrowse
     :ensure t
-    :diminish eyebrowse-mode
+    :delight eyebrowse-mode
     :init (setq eyebrowse-keymap-prefix (kbd "C-c e"))
     :config (progn
               (setq eyebrowse-wrap-around t)
@@ -310,16 +379,10 @@ value, scrolling continues until there is no more output.
 #+END_SRC
 
 ** Mode line cleaning
-*** Diminish
-#+BEGIN_SRC emacs-lisp
-  (use-package diminish
-    :ensure t)
-#+END_SRC
-
 *** Delight 
 #+BEGIN_SRC emacs-lisp
-  (use-package delight
-    :ensure t)
+(use-package delight
+  :demand t)
 #+END_SRC
 
 ** Jumping
@@ -363,7 +426,7 @@ value, scrolling continues until there is no more output.
 #+BEGIN_SRC emacs-lisp
 (use-package yasnippet
   :ensure t
-  :diminish yas-minor-mode
+  :delight yas-minor-mode
   :config (progn
             (yas-global-mode)
             (setq yas-verbosity 1)
@@ -380,709 +443,629 @@ value, scrolling continues until there is no more output.
 #+END_SRC
 *** Auto-YASnippet
 #+BEGIN_SRC emacs-lisp
-  (use-package auto-yasnippet
-    :ensure t
-    :bind (("H-w" . aya-create)
-           ("H-y" . aya-expand)
-           )
-    )
-#+END_SRC
-** Company
-#+BEGIN_SRC emacs-lisp
-(use-package company
+(use-package auto-yasnippet
   :ensure t
-  :bind (("M-/" . company-complete))
-  :config
-  (setq company-echo-delay 0     ; remove blinking
-        company-show-numbers t   ; show numbers for easy selection
-        company-selection-wrap-around t
-        company-require-match nil
-        company-dabbrev-ignore-case t
-        company-dabbrev-ignore-invisible t
-        company-dabbrev-other-buffers t
-        company-dabbrev-downcase nil
-        company-dabbrev-code-everywhere t
-        company-tooltip-align-annotations t
-        company-minimum-prefix-length 1
-        company-global-modes '(not)
-        company-lighter-base "(C)")
-  (global-company-mode 1)
-  :bind (:map company-active-map
-              ("C-n" . company-select-next)
-              ("C-p" . company-select-previous)
-              ("M-?" . company-show-doc-buffer)
-              ("M-." . company-show-location)
-              )
+  :bind (("H-w" . aya-create)
+         ("H-y" . aya-expand)
+         )
   )
 #+END_SRC
-*** C/C++
+** Treemacs: Tree file viewer
 #+BEGIN_SRC emacs-lisp
-  (use-package company-c-headers
-    :ensure t
-    :config (progn
-              (defun malb/ede-object-system-include-path ()
-                "Return the system include path for the current buffer."
-                (when ede-object
-                  (ede-system-include-path ede-object)))
-
-              (setq company-c-headers-path-system
-                    #'malb/ede-object-system-include-path)
+;; Provides workspaces with file browsing (tree file viewer)
+;; and project management when coupled with `projectile`.
 
-              (add-to-list 'company-backends #'company-c-headers)))
+; (use-package treemacs
+;   :ensure t
+;   :defer t
+;   :config
+;   (setq treemacs-no-png-images t
+;        treemacs-width 24)
+;   :bind ("C-c t" . treemacs))
 #+END_SRC
-*** Python
+** LSP mode
 #+BEGIN_SRC emacs-lisp
-(use-package company-anaconda
-  :ensure t
-  :config (add-to-list 'company-backends #'company-anaconda))
-#+END_SRC
-*** Perl
-#+BEGIN_SRC emacs-lisp
-  (use-package company-plsense
-    :ensure t
-    )
+(use-package lsp-mode
+  :defer t
+  :commands (lsp lsp-deferred)
+  :init (setq lsp-keymap-prefix "C-c l")
+  (defun my/orderless-dispatch-flex-first (_pattern index _total)
+    (and (eq index 0) 'orderless-flex))
+
+  (defun my/lsp-mode-setup-completion ()
+    (setf (alist-get 'styles (alist-get 'lsp-capf completion-category-defaults))
+          '(orderless)))
+
+  ;; Optionally configure the first word as flex filtered.
+  (add-hook 'orderless-style-dispatchers #'my/orderless-dispatch-flex-first nil 'local)
+
+  ;; Optionally configure the cape-capf-buster.
+  ; (setq-local completion-at-point-functions (list (cape-capf-buster #'lsp-completion-at-point)))
+
+  :hook (python-mode . lsp-deferred)
+        (cperl-mode . lsp-deferred)
+  (lsp-completion-mode . my/lsp-mode-setup-completion)
+  :custom
+  (lsp-completion-provider :none) ;; we use Corfu!
+  :config
+   (add-to-list 'lsp-file-watch-ignored-directories "[/\\\\]venv\\'")
+)
 #+END_SRC
-*** LaTeX
+** LSP mode
 #+BEGIN_SRC emacs-lisp
-  (use-package company-math
-    :ensure t)
+;; provides visual help in the buffer 
+;; for example definitions on hover. 
+;; the `imenu` lets me browse definitions quickly.
+(use-package lsp-ui
+  :defer t
+  :after lsp-mode
+  :config
+  (setq lsp-ui-sideline-enable t
+           lsp-ui-doc-delay 2)
+  :hook (lsp-mode . lsp-ui-mode)
+  :bind (:map lsp-ui-mode-map
+             ("C-c i" . lsp-ui-imenu)))
 #+END_SRC
+*** LSP Pyright -- Python language server
 #+BEGIN_SRC emacs-lisp
-  (use-package company-auctex
-    :ensure t
-    :config (progn
-              (defun company-auctex-labels (command &optional arg &rest ignored)
-                "company-auctex-labels backend"
-                (interactive (list 'interactive))
-                (case command
-                  (interactive (company-begin-backend 'company-auctex-labels))
-                  (prefix (company-auctex-prefix "\\\\.*ref{\\([^}]*\\)\\="))
-                  (candidates (company-auctex-label-candidates arg))))
-
-              (add-to-list 'company-backends
-                           '(company-auctex-macros
-                             company-auctex-environments
-                             company-math-symbols-unicode
-                             company-math-symbols-latex))
-
-              (add-to-list 'company-backends #'company-auctex-labels)
-              (add-to-list 'company-backends #'company-auctex-bibs)
+;; language server for python 
+;; read the docs for the different variables set in the config.
+(use-package lsp-pyright
+  :defer t
+  :config
+  (setq lsp-clients-python-library-directories '("/usr/"))
+  (setq lsp-pyright-disable-language-service nil
+       lsp-pyright-disable-organize-imports nil
+       lsp-pyright-auto-import-completions t
+       lsp-pyright-use-library-code-for-types t
+       lsp-pyright-venv-path "venv")
+  :hook ((python-mode . (lambda () 
+                          (require 'lsp-pyright) (lsp-deferred)))))
+#+END_SRC
+** Corfu
+#+BEGIN_SRC emacs-lisp
+(use-package corfu
+  ;; Optional customizations
+  :custom
+  (corfu-cycle t)                ;; Enable cycling for `corfu-next/previous'
+  (corfu-auto t)                 ;; Enable auto completion
+  (corfu-separator ?\s)          ;; Orderless field separator
+  (corfu-quit-at-boundary t)
+  (corfu-quit-no-match 'separator)
+  (corfu-preview-current nil)    ;; Disable current candidate preview
+  (corfu-preselect 'prompt)      ;; Preselect the prompt
+  (corfu-on-exact-match nil)     ;; Configure handling of exact matches
+  (corfu-scroll-margin 5)        ;; Use scroll margin
+
+  :bind (
+         :map corfu-map
+              ("M-m" . corfu-move-to-minibuffer)
               )
-    )
+  :init
+  (global-corfu-mode)
+  (setq completion-cycle-threshold 3)
+  (setq tab-always-indent 'complete)
+  :config
+  (defun corfu-move-to-minibuffer ()
+    (interactive)
+    (when completion-in-region--data
+      (let ((completion-extra-properties corfu--extra)
+            completion-cycle-threshold completion-cycling)
+        (apply #'consult-completion-in-region completion-in-region--data))))
+  (add-to-list 'corfu-continue-commands #'corfu-move-to-minibuffer)
+  )
 #+END_SRC
+** Dabbrv
 #+BEGIN_SRC emacs-lisp
-  (use-package company-bibtex
-    :ensure t
-    )
-#+END_SRC
-*** Shell
-
- #+BEGIN_SRC emacs-lisp
-   (use-package company-shell
-     :ensure t
-     :config (progn
-               (setq company-shell-modes '(sh-mode shell-mode))
-               (add-to-list 'company-backends 'company-shell)))
- #+END_SRC
-
-*** YaSnippet
-
- Add YasSippet support for all company backends. ([[https://github.com/syl20bnr/spacemacs/pull/179][source]])
-
- *Note:* Do this at the end of =company-mode= config.
-
- #+BEGIN_SRC emacs-lisp
-   (defvar malb/company-mode/enable-yas t
-     "Enable yasnippet for all backends.")
-
-   (defun malb/company-mode/backend-with-yas (backend)
-     (if (or (not malb/company-mode/enable-yas)
-             (and (listp backend)
-                  (member 'company-yasnippet backend)))
-         backend
-       (append (if (consp backend) backend (list backend))
-               '(:with company-yasnippet))))
-
-   (setq company-backends
-         (mapcar #'malb/company-mode/backend-with-yas company-backends))
- #+END_SRC
-
-*** All the words
-
- Enable/disable company completion from ispell dictionaries ([[https://github.com/redguardtoo/emacs.d/blob/master/lisp/init-company.el][source]])
-
- #+BEGIN_SRC emacs-lisp
-   (defun malb/toggle-company-ispell ()
-     (interactive)
-     (cond
-      ((member '(company-ispell :with company-yasnippet) company-backends)
-       (setq company-backends (delete '(company-ispell :with company-yasnippet) company-backends))
-       (add-to-list 'company-backends '(company-dabbrev :with company-yasnippet) t)
-       (message "company-ispell disabled"))
-      (t
-       (setq company-backends (delete '(company-dabbrev :with company-yasnippet) company-backends))
-       (add-to-list 'company-backends '(company-ispell :with company-yasnippet) t)
-       (message "company-ispell enabled!"))))
-
-   (defun malb/company-ispell-setup ()
-     ;; @see https://github.com/company-mode/company-mode/issues/50
-     (when (boundp 'company-backends)
-       (make-local-variable 'company-backends)
-       (setq company-backends (delete '(company-dabbrev :with company-yasnippet) company-backends))
-       (add-to-list 'company-backends '(company-ispell :with company-yasnippet) t)
-       ;; https://github.com/redguardtoo/emacs.d/issues/473
-       (if (and (boundp 'ispell-alternate-dictionary)
-                ispell-alternate-dictionary)
-           (setq company-ispell-dictionary ispell-alternate-dictionary))))
- #+END_SRC
-
-*** Tab DWIM
-
- 1. =yas-expand= is run first and does what it has to, then it calls =malb/indent-fold-or-complete=.
-
- 2. This function then hopefully does what I want:
-
-    a. if a region is active, just indent
-    b. if we’re looking at a space after a non-whitespace character, we try some company-expansion
-    c. If =hs-minor-mode= or =outline-minor-mode= is active, try those next
-    d. otherwise call whatever would have been called otherwise.
-
- ([[http://emacs.stackexchange.com/q/21182/8930][source]], [[http://emacs.stackexchange.com/q/7908/8930][source]])
-
-#+BEGIN_SRC emacs-lisp
-(defun malb/indent-fold-or-complete (&optional arg)
-  (interactive "P")
-  (cond
-   ;; if a region is active, indent
-   ((use-region-p)
-    (indent-region (region-beginning)
-                   (region-end)))
-   ;; if the next char is space or eol, but prev char not whitespace
-   ((and (not (active-minibuffer-window))
-         (or (looking-at " ")
-             (looking-at "$"))
-         (looking-back "[^[:space:]]")
-         (not (looking-back "^")))
-
-    (cond (company-mode (company-complete-common))
-          (auto-complete-mode (auto-complete))))
-
-   ;; no whitespace anywhere
-   ((and (not (active-minibuffer-window))
-         (looking-at "[^[:space:]]")
-         (looking-back "[^[:space:]]")
-         (not (looking-back "^")))
-    (cond
-     ((bound-and-true-p hs-minor-mode)
-      (save-excursion (end-of-line) (hs-toggle-hiding)))
-     ((bound-and-true-p outline-minor-mode)
-      (save-excursion (outline-cycle)))))
-
-   ;; by default just call whatever was bound
-   (t
-    (let ((fn (or (if (current-local-map) (lookup-key (current-local-map) (kbd "TAB")))
-                  'indent-for-tab-command)))
-      (if (not (called-interactively-p 'any))
-          (fn arg)
-        (setq this-command fn)
-        (call-interactively fn))))))
-
-(defun malb/toggle-fold ()
-  (interactive)
-  (cond ((eq major-mode 'org-mode)
-         (org-force-cycle-archived))
-        ((bound-and-true-p hs-minor-mode)
-         (save-excursion
-           (end-of-line)
-           (hs-toggle-hiding)))
-
-        ((bound-and-true-p outline-minor-mode)
-         (save-excursion
-           (outline-cycle)))))
-
-(bind-key "<tab>" #'malb/indent-fold-or-complete)
-(bind-key "C-<tab>" #'malb/toggle-fold)
+(use-package dabbrev
+  :ensure t
+  ;; Swap M-/ and C-M-/
+  :bind (("M-/" . dabbrev-completion)
+         ("C-M-/" . dabbrev-expand))
+  ;; Other useful Dabbrev configurations.
+  :custom
+  (dabbrev-ignored-buffer-regexps '("\\.\\(?:pdf\\|jpe?g\\|png\\)\\'")))
 #+END_SRC
 ** Tinyprocmail
 
 #+BEGIN_SRC emacs-lisp
-  ;; load tinyprocmail
-  (use-package tinyprocmail
-    :load-path "~/lib/emacs_el/tiny-tools/lisp/tiny"
-    :mode (".procmailrc" . turn-on-tinyprocmail-mode)
-    )
+;; load tinyprocmail
+(use-package tinyprocmail
+  :straight (tinytools :type git :type git :host github :repo "jaalto/project--emacs-tiny-tools")
+  :mode (".procmailrc" . turn-on-tinyprocmail-mode)
+  )
 #+END_SRC
 
 ** Magit
-#+BEGIN_SRC emacs-lisp :tangle don-configuration.el
-  (use-package magit
-    :ensure t
-    :bind (("C-x g" . magit-status)
-           ("C-x C-g" . magit-status))
-    :config
-    ;; refine diffs always (hilight words)
-    (setq magit-diff-refine-hunk nil)
-    )
-  (use-package magit-annex
-    :ensure t
-    :load-path "~/lib/emacs_el/magit-annex/"
-    )
-  (use-package magit-vcsh
-    :ensure t
-    )
+#+BEGIN_SRC emacs-lisp
+(use-package magit
+  :defer t
+  :bind (("C-x g" . magit-status)
+         ("C-x C-g" . magit-status))
+  :config
+  ;; refine diffs always (hilight words)
+  (setq magit-diff-refine-hunk nil)
+  )
+(use-package magit-annex
+  :defer t
+  :after magit
+  )
+(use-package magit-vcsh
+  :defer t
+  :after magit
+  )
+#+END_SRC
+
+*** Forge (github/gitlab)
+#+BEGIN_SRC emacs-lisp
+(use-package forge
+  :defer t
+  :after magit
+  )
 #+END_SRC
 
 ** Perl
 #+BEGIN_SRC emacs-lisp
-  (use-package cperl-mode
-    :config
-    (progn
-      ;; Use c-mode for perl .xs files
-      (add-to-list 'auto-mode-alist '("\\.xs\\'" . c-mode))
-      (add-to-list 'auto-mode-alist '("\\.\\([pP][Llm]\\|al\\)\\'" . cperl-mode))
-      (add-to-list 'interpreter-mode-alist '("perl" . cperl-mode))
-      (add-to-list 'interpreter-mode-alist '("perl5" . cperl-mode))
-      (add-to-list 'interpreter-mode-alist '("miniperl" . cperl-mode))
-      (setq cperl-hairy t
-            cperl-indent-level 4
-            cperl-auto-newline nil
-            cperl-auto-newline-after-colon nil
-            cperl-continued-statement-offset 4
-            cperl-brace-offset -1
-            cperl-continued-brace-offset 0
-            cperl-label-offset -4
-            cperl-highlight-variables-indiscriminately t
-            cperl-electric-lbrace-space nil
-            cperl-indent-parens-as-block nil
-            cperl-close-paren-offset -1
-            cperl-tab-always-indent t)
-      ;;(add-hook 'cperl-mode-hook (lambda () (cperl-set-style "PerlStyle")))
-  ))
+(use-package cperl-mode
+  :mode ("\\.pl'" . cperl-mode)
+  ("\\.perl5\\'" . cperl-mode)
+  ("\\.perl\\'" . cperl-mode)
+  ("\\.miniperl\\'" . cperl-mode)
+  ("\\.\\([Pp][Llm]\\|al\\)\\'" . cperl-mode)
+    ;; use c-mode for perl .xs files
+  ("\\.xs\\'" . c-mode)
+  :config
+       (setq cperl-hairy t
+          cperl-indent-level 4
+          cperl-auto-newline nil
+          cperl-auto-newline-after-colon nil
+          cperl-continued-statement-offset 4
+          cperl-brace-offset -1
+          cperl-continued-brace-offset 0
+          cperl-label-offset -4
+          cperl-highlight-variables-indiscriminately t
+          cperl-electric-lbrace-space nil
+          cperl-indent-parens-as-block nil
+          cperl-close-paren-offset -1
+          cperl-tab-always-indent t)
+    (setq cperl-lazy-help-time nil)
+    ;;(add-hook 'cperl-mode-hook (lambda () (cperl-set-style "PerlStyle")))
+)
 #+END_SRC
 
 ** Markdown mode
 #+BEGIN_SRC emacs-lisp
-  (use-package markdown-mode
-    :ensure t
-    :mode (("\\.md\\'" . markdown-mode)
-           ("\\.mdwn\\'" . markdown-mode)
-           ("README\\.md\\'" . gfm-mode)
-           )
-    :config
-    (setq markdown-enable-math t)
-    (setq markdown-follow-wiki-link-on-enter nil)
-    (bind-key "M-." #'markdown-jump markdown-mode-map)
-    (add-hook 'markdown-mode-hook #'flyspell-mode)
-    (add-hook 'markdown-mode-hook #'outline-minor-mode)
-    (bind-key "C-<tab>" #'outline-cycle markdown-mode-map)
-  )
+(use-package markdown-mode
+  :defer t
+  :mode (("\\.md\\'" . markdown-mode)
+         ("\\.mdwn\\'" . markdown-mode)
+         ("README\\.md\\'" . gfm-mode)
+         )
+  :config
+  (setq markdown-enable-math t)
+  (setq markdown-follow-wiki-link-on-enter nil)
+  (bind-key "M-." #'markdown-jump markdown-mode-map)
+  (add-hook 'markdown-mode-hook #'flyspell-mode)
+  (add-hook 'markdown-mode-hook #'outline-minor-mode)
+  (bind-key "C-<tab>" #'outline-cycle markdown-mode-map)
+)
 
 #+END_SRC
 ** SQL mode
 #+BEGIN_SRC emacs-lisp
-  ; load sql-indent when sql is loaded
+; load sql-indent when sql is loaded
+(use-package sql-indent
+  :after sql
+  :hook sql-mode
+  )
 (use-package sql
+  :commands (sql-mode)
   :mode (("\\.sql\\'" . sql-mode))
-  :config
-  (require sql-indent))
+  )
 #+END_SRC
 ** Ediff
 #+BEGIN_SRC emacs-lisp
-  (use-package ediff
-    :commands ediff ediff3
-    :ensure f
-    :config
-    ;; ediff configuration
-    ;; don't use the multi-window configuration
-    (setq ediff-window-setup-function 'ediff-setup-windows-plain)
-  )
+(use-package ediff
+  :commands ediff ediff3
+  :config
+  ;; ediff configuration
+  ;; don't use the multi-window configuration
+  (setq ediff-window-setup-function 'ediff-setup-windows-plain)
+)
 #+END_SRC
 ** Do the Right Thing Indenting
 Attempts to automatically identify the right indentation for a file
 #+BEGIN_SRC emacs-lisp
 (use-package dtrt-indent
-  :ensure t
 )  
 #+END_SRC
 ** VCL --editing varnish configuration files
 #+BEGIN_SRC emacs-lisp
-  (use-package vcl-mode
-    :ensure t
-    :mode "\\.vcl\\'"
-    )
-  
+(use-package vcl-mode
+  :mode "\\.vcl\\'"
+  )
 #+END_SRC
-** Helm
+** Vertico
 #+BEGIN_SRC emacs-lisp
-  (defun malb/helm-omni (&rest arg)
-    ;; just in case someone decides to pass an argument, helm-omni won't fail.
-    (interactive)
-    (unless helm-source-buffers-list
-      (setq helm-source-buffers-list
-            (helm-make-source "Buffers" 'helm-source-buffers)))
-    (helm-other-buffer
-     (append
-
-     (if (projectile-project-p)
-          '(helm-source-projectile-buffers-list
-            helm-source-buffers-list)
-        '(helm-source-buffers-list)) ;; list of all open buffers
-
-      `(((name . "Virtual Workspace")
-         (candidates . ,(--map (cons (eyebrowse-format-slot it) (car it))
-                               (eyebrowse--get 'window-configs)))
-         (action . (lambda (candidate)
-                     (eyebrowse-switch-to-window-config candidate)))))
-
-      (if (projectile-project-p)
-          '(helm-source-projectile-recentf-list
-            helm-source-recentf)
-        '(helm-source-recentf)) ;; all recent files
-
-      ;; always make some common files easily accessible
-      ;;'(((name . "Common Files")
-       ;;  (candidates . malb/common-file-targets)
-        ;; (action . (("Open" . (lambda (x) (find-file (eval x))))))))
-
-      '(helm-source-files-in-current-dir
-        helm-source-locate
-        helm-source-bookmarks
-        helm-source-buffer-not-found ;; ask to create a buffer otherwise
-        ))
-     "*Helm all the things*"))
-  (use-package helm
-    :ensure helm
-    :diminish helm-mode
-    :bind (("M-x" . helm-M-x)
-           ("C-x C-f" . helm-find-files)
-           ("C-x b" . helm-buffers-list) ; malb/helm-omni)
-           ("C-x C-b" . helm-buffers-list) ; malb/helm-omni)
-           ("C-c <SPC>" . helm-all-mark-rings))
-    :config
-    (require 'helm-config)
-    (require 'helm-for-files)
-    (require 'helm-bookmark)
-
-    (helm-mode 1)
-    (define-key global-map [remap find-file] 'helm-find-files)
-    (define-key global-map [remap occur] 'helm-occur)
-    (define-key global-map [remap list-buffers] 'helm-buffers-list)
-    (define-key global-map [remap dabbrev-expand] 'helm-dabbrev)
-    (unless (boundp 'completion-in-region-function)
-      (define-key lisp-interaction-mode-map [remap completion-at-point] 'helm-lisp-completion-at-point)
-      (define-key emacs-lisp-mode-map       [remap completion-at-point] 'helm-lisp-completion-at-point))
-    (add-hook 'kill-emacs-hook #'(lambda () (and (file-exists-p "$TMP") (delete-file "$TMP"))))
+(use-package vertico
+  :demand t
+  :config
+  (vertico-mode)
+  ; (define-key vertico-map "\r" #'vertico-directory-enter)
+  ; (define-key vertico-map "\d" #'vertico-directory-delete-char)
+  ; (define-key vertico-map "\M-\d" #'vertico-directory-delete-word)
+  ; (add-hook 'rfn-eshadow-update-overlay-hook #'vertico-directory-tidy)
+
+  ;; Different scroll margin
+  ;; (setq vertico-scroll-margin 0)
+
+  ;; Show more candidates
+  ;; (setq vertico-count 20)
+
+  ;; Grow and shrink the Vertico minibuffer
+  ;; (setq vertico-resize t)
+
+  ;; Optionally enable cycling for `vertico-next' and `vertico-previous'.
+  ;; (setq vertico-cycle t)
+  :custom
+  (vertico-grid-separator "       ")
+  (vertico-grid-lookahead 50)
+)
+(use-package vertico-multiform
+  :straight nil
+  :load-path "~/var/emacs/straight/build/vertico/extensions/"
+  :after vertico
+  :config
+  (setq vertico-multiform-categories
+     '((file reverse)
+       (consult-grep buffer)
+       (consult-location)
+       (imenu buffer)
+       (library reverse indexed)
+       (org-roam-node reverse indexed)
+       ; (t reverse)
+       )
+     )
+  (setq vertico-multiform-commands
+        '(("flyspell-correct-*" grid reverse)
+          (org-refile grid reverse indexed)
+          (consult-yank-pop indexed)
+          (consult-flycheck)
+          (consult-lsp-diagnostics)
+          )
+        )
+  (vertico-multiform-mode)
   )
-#+END_SRC
-*** Helm Flx
-
- [[https://github.com/PythonNut/helm-flx][helm-flx]] implements intelligent helm fuzzy sorting, provided by [[https://github.com/lewang/flx][flx]].
-
- #+BEGIN_SRC emacs-lisp
- (use-package helm-flx
-   :ensure t
-   :config (progn
-             ;; these are helm configs, but they kind of fit here nicely
-             (setq helm-M-x-fuzzy-match                  t
-                   helm-bookmark-show-location           t
-                   helm-buffers-fuzzy-matching           t
-                   helm-completion-in-region-fuzzy-match t
-                   helm-file-cache-fuzzy-match           t
-                   helm-imenu-fuzzy-match                t
-                   helm-mode-fuzzy-match                 t
-                   helm-locate-fuzzy-match               nil
-                   helm-quick-update                     t
-                   helm-recentf-fuzzy-match              nil
-                   helm-semantic-fuzzy-match             t)
-             (helm-flx-mode +1)))
- #+END_SRC
-*** Helm Swoop
-#+BEGIN_SRC emacs-lisp
-
-  ;;; stolen from https://github.com/malb/emacs.d/blob/master/malb.org
-  (defun malb/helm-swoop-pre-fill ()
-    (thing-at-point 'symbol))
-    (defvar malb/helm-swoop-ignore-major-mode "List of major modes to ignore for helm-swoop")
-    (setq malb/helm-swoop-ignore-major-mode '(dired-mode
-          paradox-menu-mode doc-view-mode pdf-view-mode
-          mu4e-headers-mode org-mode markdown-mode latex-mode
-          ein:notebook-multilang-mode))
-
-    (defun malb/swoop-or-search ()
-      (interactive)
-      (if (or (> (buffer-size) 1048576) ;; helm-swoop can be slow on big buffers
-              (memq major-mode malb/helm-swoop-ignore-major-mode))
-          (isearch-forward)
-        (helm-swoop)))
-
-    (use-package helm-swoop
-      :ensure t
-      :commands helm-swoop
-      :bind (("C-c o" . helm-multi-swoop-org)
-             ("C-s" . malb/swoop-or-search)
-             ("C-M-s" . helm-multi-swoop-all))
-      :config (progn
-
-                (setq helm-swoop-pre-input-function  #'malb/helm-swoop-pre-fill
-                      helm-swoop-split-with-multiple-windows nil
-                      helm-swoop-split-direction #'split-window-horizontally
-                      helm-swoop-split-window-function 'helm-default-display-buffer
-                      helm-swoop-speed-or-color t)
-
-                ;; https://emacs.stackexchange.com/questions/28790/helm-swoop-how-to-make-it-behave-more-like-isearch
-                (defun malb/helm-swoop-C-s ()
-                  (interactive)
-                  (if (boundp 'helm-swoop-pattern)
-                      (if (equal helm-swoop-pattern "")
-                          (previous-history-element 1)
-                        (helm-next-line))
-                    (helm-next-line)))
-
-                (bind-key "C-S-s" #'helm-swoop-from-isearch isearch-mode-map)
-                (bind-key "C-S-s" #'helm-multi-swoop-all-from-helm-swoop helm-swoop-map)
-                (bind-key "C-r"   #'helm-previous-line helm-swoop-map)
-                (bind-key "C-s"   #'malb/helm-swoop-C-s helm-swoop-map)
-                (bind-key "C-r"   #'helm-previous-line helm-multi-swoop-map)
-                (bind-key "C-s"   #'malb/helm-swoop-C-s helm-multi-swoop-map))
-      )
 
-#+END_SRC
-*** Helm Ag
-#+BEGIN_SRC emacs-lisp
-(use-package helm-ag
-  :ensure t
-  :config (setq helm-ag-base-command "ag --nocolor --nogroup"
-                helm-ag-command-option "--all-text"
-                helm-ag-insert-at-point 'symbol
-                helm-ag-fuzzy-match t
-                helm-ag-use-temp-buffer t
-                helm-ag-use-grep-ignore-list t
-                helm-ag-use-agignore t))
-#+END_SRC
-*** Helm Descbinds
-#+BEGIN_SRC emacs-lisp
-  (use-package helm-descbinds
-    :ensure t
-    :bind ("C-h b" . helm-descbinds)
-    :init (fset 'describe-bindings 'helm-descbinds))
-#+END_SRC
+(use-package vertico-grid
+  :straight nil
+  :after vertico
+  )
+(use-package vertico-reverse
+  :straight nil
+  :after vertico
+  )
+(use-package vertico-indexed
+  :straight nil
+  :after vertico
+  )
+(use-package vertico-buffer
+  :straight nil
+  :after vertico
+  )
 
-*** Helm YaSnippet
-#+BEGIN_SRC emacs-lisp
-  (use-package helm-c-yasnippet
-    :ensure t
-    :bind ("C-c h y" .  helm-yas-complete)
-    :config (progn
-              (setq helm-yas-space-match-any-greedy t)))
-#+END_SRC
-*** Helm Org Rifle
-#+BEGIN_SRC emacs-lisp
-  (use-package helm-org-rifle
-    :ensure t
-    :config (progn
-              (defun malb/helm-org-rifle-agenda-files (arg)
-                (interactive "p")
-                (let ((current-prefix-arg nil))
-                  (cond
-                   ((equal arg 4) (call-interactively #'helm-org-rifle-agenda-files nil))
-                   ((equal arg 16) (helm-org-rifle-occur-agenda-files))
-                   (t (helm-org-agenda-files-headings)))))))
-#+END_SRC
-*** Helm Google
-This can be used to link things pretty quickly if necessary
-#+BEGIN_SRC emacs-lisp
-  (use-package helm-google
-    :ensure t
-    :bind ("C-c h g" . helm-google)
-    :config
-    (progn (add-to-list 'helm-google-actions
-                        '("Copy URL" . (lambda (candidate)
-                                         (let ((url
-                                                (replace-regexp-in-string
-                                                 "https://.*q=\\(.*\\)\&sa=.*"
-                                                 "\\1" candidate)))
-                                           (kill-new url))))
-                        t
-                        )
-         
-           (add-to-list 'helm-google-actions
-                        '("Org Store Link" . (lambda (candidate)
-                                               (let ((title (car (split-string candidate "[\n]+")))
-                                                     (url
-                                                      (replace-regexp-in-string
-                                                       "https://.*q=\\(.*\\)\&sa=.*"
-                                                       "\\1" candidate)))
-                                                 (push (list url title) org-stored-links))))
-                        t)
-           ))
-#+END_SRC
 
-** Projectile -- Project management
+;; Persist history over Emacs restarts. Vertico sorts by history position.
+(use-package savehist
+  :demand t
+  :config
+  (savehist-mode))
+
+#+END_SRC
+** Orderless: advanced completion style
 #+begin_src emacs-lisp
-  (use-package projectile
-    :ensure t
-    :bind (("<f5>" . projectile-compile-project)
-           ("<f6>" . next-error))
-    :config (progn
-              (use-package magit :ensure t)
-              (require 'helm-projectile)
-              (helm-projectile-on)
+(use-package orderless
+  :init
+  ;; Configure a custom style dispatcher (see the Consult wiki)
+  ;; (setq orderless-style-dispatchers '(+orderless-dispatch)
+  ;;       orderless-component-separator #'orderless-escapable-split-on-space)
+  (setq completion-styles '(orderless basic)
+        completion-category-defaults nil
+        completion-category-overrides '((file (styles partial-completion)))))
+#+end_src
+** Marginalia: Rich annotations in the minibuffer
+#+begin_src emacs-lisp
+(use-package marginalia
+  :demand t
+  :bind (:map minibuffer-local-map
+         ("M-A" . marginalia-cycle))
+  :config
+  (marginalia-mode)
+  )
+#+end_src
+** Embark: Minibuffer actions and context menu
+#+begin_src emacs-lisp
+(use-package embark
+  :bind
+  (("C-." . embark-act)         ;; pick some comfortable binding
+   ("C-;" . embark-dwim)        ;; good alternative: M-.
+   ("C-h B" . embark-bindings)) ;; alternative for `describe-bindings'
 
-              (setq projectile-make-test-cmd "make check"
-                    projectile-switch-project-action 'helm-projectile
-                    projectile-mode-line  '(:eval (format "»{%s}" (projectile-project-name))))
+  :init
 
-              (projectile-global-mode)))
-#+end_src
+  ;; Optionally replace the key help with a completing-read interface
+  (setq prefix-help-command #'embark-prefix-help-command)
 
-*** helm integration
+  :config
+
+  ;; Hide the mode line of the Embark live/completions buffers
+  (add-to-list 'display-buffer-alist
+               '("\\`\\*Embark Collect \\(Live\\|Completions\\)\\*"
+                 nil
+                 (window-parameters (mode-line-format . none)))))
+
+(use-package embark-consult
+  :hook
+  (embark-collect-mode . consult-preview-at-point-mode))
+#+end_src
+** which-key (show possible completions of a key combination)
+#+BEGIN_SRC emacs-lisp
+(use-package which-key
+  :demand t
+  )
+#+END_SRC
+** Consult
 #+begin_src emacs-lisp
-  (use-package helm-projectile
-    :ensure t
-    :config (progn
-              (defvar malb/helm-source-file-not-found
-                (helm-build-dummy-source
-                    "Create file"
-                  :action 'find-file))
-
-              (add-to-list
-               'helm-projectile-sources-list
-               malb/helm-source-file-not-found t)
-
-              (helm-delete-action-from-source
-               "Grep in projects `C-s'"
-               helm-source-projectile-projects)
-
-              (helm-add-action-to-source
-               "Grep in projects `C-s'"
-               'helm-do-ag helm-source-projectile-projects 4)))
+(use-package consult
+  ;; Replace bindings. Lazily loaded due by `use-package'.
+  :bind (;; C-c bindings in `mode-specific-map'
+         ("C-c M-x" . consult-mode-command)
+         ("C-c h" . consult-history)
+         ("C-c k" . consult-kmacro)
+         ("C-c m" . consult-man)
+         ("C-c i" . consult-info)
+         ([remap Info-search] . consult-info)
+         ;; C-x bindings in `ctl-x-map'
+         ("C-x M-:" . consult-complex-command)     ;; orig. repeat-complex-command
+         ("C-x b" . consult-buffer)                ;; orig. switch-to-buffer
+         ("C-x 4 b" . consult-buffer-other-window) ;; orig. switch-to-buffer-other-window
+         ("C-x 5 b" . consult-buffer-other-frame)  ;; orig. switch-to-buffer-other-frame
+         ("C-x r b" . consult-bookmark)            ;; orig. bookmark-jump
+         ("C-x p b" . consult-project-buffer)      ;; orig. project-switch-to-buffer
+         ;; Custom M-# bindings for fast register access
+         ("M-#" . consult-register-load)
+         ("M-'" . consult-register-store)          ;; orig. abbrev-prefix-mark (unrelated)
+         ("C-M-#" . consult-register)
+         ;; Other custom bindings
+         ("M-y" . consult-yank-pop)                ;; orig. yank-pop
+         ;; M-g bindings in `goto-map'
+         ("M-g e" . consult-compile-error)
+         ("M-g f" . consult-flymake)               ;; Alternative: consult-flycheck
+         ("M-g g" . consult-goto-line)             ;; orig. goto-line
+         ("M-g M-g" . consult-goto-line)           ;; orig. goto-line
+         ("M-g o" . consult-outline)               ;; Alternative: consult-org-heading
+         ("M-g m" . consult-mark)
+         ("M-g k" . consult-global-mark)
+         ("M-g i" . consult-imenu)
+         ("M-g I" . consult-imenu-multi)
+         ;; M-s bindings in `search-map'
+         ("M-s d" . consult-find)
+         ("M-s D" . consult-locate)
+         ("M-s g" . consult-grep)
+         ("M-s G" . consult-git-grep)
+         ("M-s r" . consult-ripgrep)
+         ("M-s l" . consult-line)
+         ("M-s L" . consult-line-multi)
+         ("M-s k" . consult-keep-lines)
+         ("M-s u" . consult-focus-lines)
+         ;; Isearch integration
+         ("M-s e" . consult-isearch-history)
+         :map isearch-mode-map
+         ("M-e" . consult-isearch-history)         ;; orig. isearch-edit-string
+         ("M-s e" . consult-isearch-history)       ;; orig. isearch-edit-string
+         ("M-s l" . consult-line)                  ;; needed by consult-line to detect isearch
+         ("M-s L" . consult-line-multi)            ;; needed by consult-line to detect isearch
+         ;; Minibuffer history
+         :map minibuffer-local-map
+         ("M-s" . consult-history)                 ;; orig. next-matching-history-element
+         ("M-r" . consult-history))                ;; orig. previous-matching-history-element
+
+  ;; Enable automatic preview at point in the *Completions* buffer. This is
+  ;; relevant when you use the default completion UI.
+  :hook (completion-list-mode . consult-preview-at-point-mode)
+
+  :commands (consult-xref)
+
+  ;; The :init configuration is always executed (Not lazy)
+  :init
+
+  ;; Optionally configure the register formatting. This improves the register
+  ;; preview for `consult-register', `consult-register-load',
+  ;; `consult-register-store' and the Emacs built-ins.
+  (setq register-preview-delay 0.5
+        register-preview-function #'consult-register-format)
+
+  ;; Optionally tweak the register preview window.
+  ;; This adds thin lines, sorting and hides the mode line of the window.
+  (advice-add #'register-preview :override #'consult-register-window)
+
+  ;; Use Consult to select xref locations with preview
+  (setq xref-show-xrefs-function #'consult-xref
+        xref-show-definitions-function #'consult-xref)
+
+  ;; Configure other variables and modes in the :config section,
+  ;; after lazily loading the package.
+  :config
+  ;; Optionally configure preview. The default value
+  ;; is 'any, such that any key triggers the preview.
+  ;; (setq consult-preview-key 'any)
+  ;; (setq consult-preview-key "M-.")
+  ;; (setq consult-preview-key '("S-<down>" "S-<up>"))
+  ;; For some commands and buffer sources it is useful to configure the
+  ;; :preview-key on a per-command basis using the `consult-customize' macro.
+  (consult-customize
+   consult-theme :preview-key '(:debounce 0.2 any)
+   consult-ripgrep consult-git-grep consult-grep
+   consult-bookmark consult-recent-file consult-xref
+   consult--source-bookmark consult--source-file-register
+   consult--source-recent-file consult--source-project-recent-file
+   ;; :preview-key "M-."
+   :preview-key '(:debounce 0.4 any))
+
+  ;; Optionally configure the narrowing key.
+  ;; Both < and C-+ work reasonably well.
+  (setq consult-narrow-key "<") ;; "C-+"
+
+  ;; Optionally make narrowing help available in the minibuffer.
+  ;; You may want to use `embark-prefix-help-command' or which-key instead.
+  ;; (define-key consult-narrow-map (vconcat consult-narrow-key "?") #'consult-narrow-help)
+
+  ;; By default `consult-project-function' uses `project-root' from project.el.
+  ;; Optionally configure a different project root function.
+  ;;;; 1. project.el (the default)
+  ;; (setq consult-project-function #'consult--default-project--function)
+  ;;;; 2. vc.el (vc-root-dir)
+  ;; (setq consult-project-function (lambda (_) (vc-root-dir)))
+  ;;;; 3. locate-dominating-file
+  ;; (setq consult-project-function (lambda (_) (locate-dominating-file "." ".git")))
+  ;;;; 4. projectile.el (projectile-project-root)
+  ;; (autoload 'projectile-project-root "projectile")
+  ;; (setq consult-project-function (lambda (_) (projectile-project-root)))
+  ;;;; 5. No project support
+  ;; (setq consult-project-function nil)
+)
+#+end_src
+** Projectile -- Project management
+#+begin_src emacs-lisp
+(use-package projectile
+  :bind (("<f5>" . projectile-compile-project)
+         ("<f6>" . next-error))
+  :config (projectile-global-mode))
 #+end_src
+
 ** Zap to char
 #+BEGIN_SRC emacs-lisp
-  (use-package avy-zap
-    :ensure t
-    :bind ("M-z" . avy-zap-up-to-char-dwim))
+(use-package avy-zap
+  :bind ("M-z" . avy-zap-up-to-char-dwim))
 #+END_SRC
 ** Hydra
 #+BEGIN_SRC emacs-lisp
-  (use-package hydra
-    :bind (("C-c 2" . my/hydra-orgmodes/body)
-          ("C-c @" . my/hydra-orgmodes/body)
-          ("C-c #" . my/hydra-outline/body)
-          ("C-c 3" . my/hydra-outline/body)
-          )
-    :config
-    (defhydra my/hydra-orgmodes (:color blue :hint nil)
-    "
-  _n_: notes _c_: chaim _w_: wildman _o_: ool
-  _u_: uddin _s_: steve _r_: refile  _f_: fh    
-  _p_: read papers      _R_: paper notes
-  _h_: hpcbio
-  _q_: quit
-  _z_: quit
+(use-package hydra
+  :bind (("C-c 2" . my/hydra-orgmodes/body)
+        ("C-c @" . my/hydra-orgmodes/body)
+        ("C-c #" . my/hydra-outline/body)
+        ("C-c 3" . my/hydra-outline/body)
+        )
+  :config
+  (defhydra my/hydra-orgmodes (:color blue :hint nil)
   "
-    ("n" (find-file "~/projects/org-notes/notes.org"))
-    ("c" (find-file "~/projects/org-notes/chaim.org"))
-    ("w" (find-file "~/projects/org-notes/wildman.org"))
-    ("u" (find-file "~/projects/org-notes/uddin.org"))
-    ("o" (find-file "~/projects/org-notes/ool.org"))
-    ("f" (find-file "~/projects/org-notes/fh.org"))
-    ("s" (find-file "~/projects/org-notes/sndservers.org"))
-    ("r" (find-file my/org-refile-file))
-    ("p" (find-file "~/projects/research/papers_to_read.org"))
-    ("R" (find-file "~/projects/research/paper_notes.org"))
-    ("h" (find-file "~/projects/org-notes/hpcbio.org"))
-    ("q" nil "quit")
-    ("z" nil "quit")
-    )
-
-    ;; from https://github.com/abo-abo/hydra/wiki/Emacs
-    (defhydra my/hydra-outline (:color pink :hint nil)
-    "
-  ^Hide^             ^Show^           ^Move
-  ^^^^^^------------------------------------------------------
-  _q_: sublevels     _a_: all         _u_: up
-  _t_: body          _e_: entry       _n_: next visible
-  _o_: other         _i_: children    _p_: previous visible
-  _c_: entry         _k_: branches    _f_: forward same level
-  _l_: leaves        _s_: subtree     _b_: backward same level
-  _d_: subtree
+_n_: notes _c_: chaim _w_: wildman _o_: ool
+_u_: uddin _s_: steve _r_: refile  _f_: fh    
+_p_: read papers      _R_: paper notes
+_h_: hpcbio
+_q_: quit
+_z_: quit
+"
+  ("n" (find-file "~/projects/org-notes/notes.org"))
+  ("c" (find-file "~/projects/org-notes/chaim.org"))
+  ("w" (find-file "~/projects/org-notes/wildman.org"))
+  ("u" (find-file "~/projects/org-notes/uddin.org"))
+  ("o" (find-file "~/projects/org-notes/ool.org"))
+  ("f" (find-file "~/projects/org-notes/fh.org"))
+  ("s" (find-file "~/projects/org-notes/sndservers.org"))
+  ("r" (find-file my/org-refile-file))
+  ("p" (find-file "~/projects/research/papers_to_read.org"))
+  ("R" (find-file "~/projects/research/paper_notes.org"))
+  ("h" (find-file "~/projects/org-notes/hpcbio.org"))
+  ("q" nil "quit")
+  ("z" nil "quit")
+  )
 
+  ;; from https://github.com/abo-abo/hydra/wiki/Emacs
+  (defhydra my/hydra-outline (:color pink :hint nil)
   "
-    ;; Hide
-    ("q" outline-hide-sublevels)    ; Hide everything but the top-level headings
-    ("t" outline-hide-body)         ; Hide everything but headings (all body lines)
-    ("o" outline-hide-other)        ; Hide other branches
-    ("c" outline-hide-entry)        ; Hide this entry's body
-    ("l" outline-hide-leaves)       ; Hide body lines in this entry and sub-entries
-    ("d" outline-hide-subtree)      ; Hide everything in this entry and sub-entries
-    ;; Show
-    ("a" outline-show-all)          ; Show (expand) everything
-    ("e" outline-show-entry)        ; Show this heading's body
-    ("i" outline-show-children)     ; Show this heading's immediate child sub-headings
-    ("k" outline-show-branches)     ; Show all sub-headings under this heading
-    ("s" outline-show-subtree)      ; Show (expand) everything in this heading & below
-    ;; Move
-    ("u" outline-up-heading)                ; Up
-    ("n" outline-next-visible-heading)      ; Next
-    ("p" outline-previous-visible-heading)  ; Previous
-    ("f" outline-forward-same-level)        ; Forward - same level
-    ("b" outline-backward-same-level)       ; Backward - same level
-    ("z" nil "leave"))
-  )
+^Hide^             ^Show^           ^Move
+^^^^^^------------------------------------------------------
+_q_: sublevels     _a_: all         _u_: up
+_t_: body          _e_: entry       _n_: next visible
+_o_: other         _i_: children    _p_: previous visible
+_c_: entry         _k_: branches    _f_: forward same level
+_l_: leaves        _s_: subtree     _b_: backward same level
+_d_: subtree
+
+"
+  ;; Hide
+  ("q" outline-hide-sublevels)    ; Hide everything but the top-level headings
+  ("t" outline-hide-body)         ; Hide everything but headings (all body lines)
+  ("o" outline-hide-other)        ; Hide other branches
+  ("c" outline-hide-entry)        ; Hide this entry's body
+  ("l" outline-hide-leaves)       ; Hide body lines in this entry and sub-entries
+  ("d" outline-hide-subtree)      ; Hide everything in this entry and sub-entries
+  ;; Show
+  ("a" outline-show-all)          ; Show (expand) everything
+  ("e" outline-show-entry)        ; Show this heading's body
+  ("i" outline-show-children)     ; Show this heading's immediate child sub-headings
+  ("k" outline-show-branches)     ; Show all sub-headings under this heading
+  ("s" outline-show-subtree)      ; Show (expand) everything in this heading & below
+  ;; Move
+  ("u" outline-up-heading)                ; Up
+  ("n" outline-next-visible-heading)      ; Next
+  ("p" outline-previous-visible-heading)  ; Previous
+  ("f" outline-forward-same-level)        ; Forward - same level
+  ("b" outline-backward-same-level)       ; Backward - same level
+  ("z" nil "leave"))
+)
 #+END_SRC
 
 ** Tramp
 #+BEGIN_SRC emacs-lisp
-  (use-package tramp
-    :config
-    (add-to-list 'tramp-methods '("vcsh"
-                                  (tramp-login-program "vcsh")
-                                  (tramp-login-args
-                                   (("enter")
-                                    ("%h")))
-                                  (tramp-remote-shell "/bin/sh")
-                                  (tramp-remote-shell-args
-                                   ("-c")))))
+(use-package tramp
+  :demand t
+  ; use the built in tramp
+  :straight nil
+  :config
+  (setq tramp-use-ssh-controlmaster-options nil)
+  (add-to-list 'tramp-methods '("vcsh"
+                                (tramp-login-program "vcsh")
+                                (tramp-login-args
+                                 (("enter")
+                                  ("%h")))
+                                (tramp-remote-shell "/bin/sh")
+                                (tramp-remote-shell-args
+                                 ("-c")))))
 #+END_SRC
 ** Reftex
 #+BEGIN_SRC emacs-lisp
-  (use-package reftex
-    :ensure t
-    :config
-    (setq-default reftex-default-bibliography
-                    '("~/projects/research/references.bib")))
+(use-package reftex
+  :hook ((LaTeX-mode latex-mode) . reftex-mode)
+  :config
+  (setq-default reftex-default-bibliography
+                  '("~/projects/research/references.bib"))
+  (setq-default reftex-plug-into-AUCTeX t)
+  )
 #+END_SRC
 ** BibTex
 #+BEGIN_SRC emacs-lisp
-  (use-package bibtex
-    :config (setq bibtex-user-optional-fields
-                  (quote (("annote" "Personal annotation (ignored)")
-                          ("abstract" "")
-                  ("pmid" "")
-                  ("doi" ""))))
-    )
+(use-package bibtex
+  :mode "\\.bib\\'"
+  :config (setq bibtex-user-optional-fields
+                (quote (("annote" "Personal annotation (ignored)")
+                        ("abstract" "")
+                ("pmid" "")
+                ("doi" ""))))
+  )
 
 #+END_SRC
 ** LaTeX
 #+BEGIN_SRC emacs-lisp
 (use-package tex
-  :defer t
-  :ensure auctex
+  :straight auctex
+  :mode ("\\.tex\\'" . LaTeX-mode)
   :config
   ; (add-to-list 'TeX-style-path '"/home/don/lib/emacs_el/auctex/style")
-  ;; REFTEX (much enhanced management of cross-ref, labels, etc)
-  ;; http://www.strw.leidenuniv.nl/~dominik/Tools/reftex/
-  ; (autoload 'reftex-mode     "reftex" "RefTeX Minor Mode" t)
-  ; (autoload 'turn-on-reftex  "reftex" "RefTeX Minor Mode" nil)
-  ; (autoload 'reftex-citation "reftex-cite" "Make citation" nil)
-  ; (autoload 'reftex-index-phrase-mode "reftex-index" "Phrase mode" t)
-  (add-hook 'LaTeX-mode-hook 'turn-on-reftex)   ; with AUCTeX LaTeX mode
-  (add-hook 'latex-mode-hook 'turn-on-reftex)   ; with Emacs latex mode
   (add-hook 'LaTeX-mode-hook 'outline-minor-mode)   ; with AUCTeX LaTeX mode
   (add-hook 'latex-mode-hook 'outline-minor-mode)   ; with Emacs latex mode
 
-  (setq-default reftex-plug-into-AUCTeX t)
   ;; support fake section headers
   (setq TeX-outline-extra
         '(("%chapter" 1)
@@ -1142,31 +1125,28 @@ This can be used to link things pretty quickly if necessary
       "latex"
     '(add-to-list 'LaTeX-fill-excluded-macros
                   '("Sexpr")))
-
-  (use-package font-latex
-    :config
-    (setq font-latex-match-reference-keywords
-          '(
-            ("fref" "{")
-            ("Fref" "{")
-            ("citep" "{")
-            ("citet" "{")
-            ("acs" "{")
-            ("acsp" "{")
-            ("ac" "{")
-            ("acp" "{")
-            ("acl" "{")
-            ("aclp" "{")
-            ("acsu" "{")
-            ("aclu" "{")
-            ("acused" "{")
-            ("DLA" "{")
-            ("RZ" "{")
-            ("OM" "{")
-            ("DL" "{")
-            ("fixme" "{"))
-          )
-    )
+  
+  (setq font-latex-match-reference-keywords
+        '(
+          ("fref" "{")
+          ("Fref" "{")
+          ("citep" "{")
+          ("citet" "{")
+          ("acs" "{")
+          ("acsp" "{")
+          ("ac" "{")
+          ("acp" "{")
+          ("acl" "{")
+          ("aclp" "{")
+          ("acsu" "{")
+          ("aclu" "{")
+          ("acused" "{")
+          ("DLA" "{")
+          ("RZ" "{")
+          ("OM" "{")
+          ("DL" "{")
+          ("fixme" "{"))
+        )
   (setq font-latex-fontify-script nil)
   (setq font-latex-fontify-sectioning (quote color))
   (setq font-latex-script-display (quote (nil)))
@@ -1175,283 +1155,319 @@ This can be used to link things pretty quickly if necessary
 #+END_SRC
 ** ESS
 #+BEGIN_SRC emacs-lisp
-  (use-package ess
-    :ensure t
-    :commands R
-    :mode ("\\.R\\'" . ess-r-mode)
-    :bind (:map ess-mode-map
-                ("C-c C-R" . dla/ess-region-remote-eval))
-    :init
-    (autoload 'ess-r-mode "ess-site" nil t)
-    (autoload 'R "ess-site" nil t)
-    :config
-    ; actually load the rest of ess
-    (require 'ess-site)
-    (defun ess-change-directory (path)
-      "Set the current working directory to PATH for both *R* and Emacs."
-      (interactive "Directory to change to: ")
-    
-      (when (file-exists-p path)
-        (ess-command (concat "setwd(\"" path "\")\n"))
-        ;; use file-name-as-directory to ensure it has trailing /
-        (setq default-directory (file-name-as-directory path))))
-    (add-hook 'ess-mode-hook 'flyspell-prog-mode)
-    ;; outlining support for ess modes
-    (add-hook
-     'ess-mode-hook
-     '(lambda ()
-        (outline-minor-mode)
-        (setq outline-regexp "\\(^#\\{4,5\\} \\)\\|\\(^[a-zA-Z0-9_\.]+ ?<- ?function\\)")
-        (defun outline-level ()
-          (cond ((looking-at "^##### ") 1)
-                ((looking-at "^#### ") 2)
-                ((looking-at "^[a-zA-Z0-9_\.]+ ?<- ?function(.*{") 3)
-                (t 1000)))
-        ))
-    (defun dla/ess-region-remote-eval (start end)
-      "Evaluate region in a remote ESS instance"
-      (interactive "r")
-      (shell-command-on-region start end "eval_r" (get-buffer-create "***essregionremoteeval***") nil nil nil)
-      (kill-buffer "***essregionremoteeval***"))
-    ;; Don't restore history or save workspace image
-    '(inferior-R-args "--no-restore-history --no-save")
-    )
+(use-package ess
+  :commands R
+  :mode ("\\.R\\'" . ess-r-mode)
+  :bind (:map ess-mode-map
+              ("C-c C-R" . dla/ess-region-remote-eval))
+  :init
+  (autoload 'ess-r-mode "ess-site" nil t)
+  (autoload 'R "ess-site" nil t)
+  :config
+  ; actually load the rest of ess
+  (require 'ess-site)
+  (defun ess-change-directory (path)
+    "Set the current working directory to PATH for both *R* and Emacs."
+    (interactive "Directory to change to: ")
+
+    (when (file-exists-p path)
+      (ess-command (concat "setwd(\"" path "\")\n"))
+      ;; use file-name-as-directory to ensure it has trailing /
+      (setq default-directory (file-name-as-directory path))))
+  (add-hook 'ess-mode-hook 'flyspell-prog-mode)
+  ;; outlining support for ess modes
+  (add-hook
+   'ess-mode-hook
+   '(lambda ()
+      (outline-minor-mode)
+      (setq outline-regexp "\\(^#\\{4,5\\} \\)\\|\\(^[a-zA-Z0-9_\.]+ ?<- ?function\\)")
+      (defun outline-level ()
+        (cond ((looking-at "^##### ") 1)
+              ((looking-at "^#### ") 2)
+              ((looking-at "^[a-zA-Z0-9_\.]+ ?<- ?function(.*{") 3)
+              (t 1000)))
+      ))
+  (defun dla/ess-region-remote-eval (start end)
+    "Evaluate region in a remote ESS instance"
+    (interactive "r")
+    (shell-command-on-region start end "eval_r" (get-buffer-create "***essregionremoteeval***") nil nil nil)
+    (kill-buffer "***essregionremoteeval***"))
+  ;; Don't restore history or save workspace image
+  '(inferior-R-args "--no-restore-history --no-save")
+  )
 #+END_SRC
 
 ** Rainbowmode
 From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colorizes color strings
 
 #+BEGIN_SRC emacs-lisp
-  (use-package rainbow-mode
-    ;; add ess to the x major mode
-    :config (add-to-list 'rainbow-x-colors-major-mode-list 'ESS[S])
-    (add-to-list 'rainbow-x-colors-major-mode-list 'ESS[R])
-  )
+(use-package rainbow-mode
+  :hook ((LaTeX-mode ess-mode python-mode cperl-mode) . rainbow-mode)
+  :delight 🌈
+  ;; add ess to the x major mode
+  :config (add-to-list 'rainbow-x-colors-major-mode-list 'ESS[S])
+  (add-to-list 'rainbow-x-colors-major-mode-list 'ESS[R])
+)
 #+END_SRC
 
 ** YAML Mode
 #+BEGIN_SRC emacs-lisp
-  (use-package yaml-mode
-    ;; add ess to the x major mode
-    :mode ("\\.\\(yaml|yml\\)\\'" . yaml-mode)
-  )
+(use-package yaml-mode
+  ;; add ess to the x major mode
+  :mode ("\\.\\(yaml|yml\\)\\'" . yaml-mode)
+)
 #+END_SRC
 
 ** Polymode
 #+BEGIN_SRC emacs-lisp
 (use-package poly-noweb
-  :ensure t
   :after polymode
 
   )
 (use-package poly-markdown
-  :ensure t
   :after polymode
   )
 (use-package poly-R
-  :ensure t
   :after (:all polymode poly-markdown poly-noweb)
-  :mode ("\\.Snw" . poly-noweb+r-mode)
-  :mode ("\\.Rnw" . poly-noweb+r-mode)
-  :mode ("\\.Rmd" . poly-markdown+r-mode)
+  :mode ("\\.Snw" . poly-noweb+r-mode)
+  :mode ("\\.Rnw" . poly-noweb+r-mode)
+  :mode ("\\.Rmd" . poly-markdown+r-mode)
   )
 (use-package polymode
-  :ensure t
+  :defer t
   )
 
 #+END_SRC
 
 ** Outlining
-*** Outline magic
-#+BEGIN_SRC emacs-lisp
-  (use-package outline-magic)
+*** outline minor mode
+#+BEGIN_SRC emacs-lisp
+(use-package outline
+   :straight nil
+   :delight
+   :init
+   ; (setq outline-minor-mode-prefix nil)
+   :config
+   (define-prefix-command 'cm-map nil "Outline-")
+   (global-set-key "\M-o" cm-map)
+   ; Outline-minor-mode key map
+; HIDE
+(define-key cm-map "q" 'outline-hide-sublevels)    ; Hide everything but the top-level headings
+(define-key cm-map "t" 'outline-hide-body)         ; Hide everything but headings (all body lines)
+(define-key cm-map "o" 'outline-hide-other)        ; Hide other branches
+(define-key cm-map "c" 'outline-hide-entry)        ; Hide this entry's body
+(define-key cm-map "l" 'outline-hide-leaves)       ; Hide body lines in this entry and sub-entries
+(define-key cm-map "d" 'outline-hide-subtree)      ; Hide everything in this entry and sub-entries
+; SHOW
+(define-key cm-map "a" 'outline-show-all)          ; Show (expand) everything
+(define-key cm-map "e" 'outline-show-entry)        ; Show this heading's body
+(define-key cm-map "i" 'outline-show-children)     ; Show this heading's immediate child sub-headings
+(define-key cm-map "k" 'outline-show-branches)     ; Show all sub-headings under this heading
+(define-key cm-map "s" 'outline-show-subtree)      ; Show (expand) everything in this heading & below
+; MOVE
+(define-key cm-map "u" 'outline-up-heading)                ; Up
+(define-key cm-map "n" 'outline-next-visible-heading)      ; Next
+(define-key cm-map "p" 'outline-previous-visible-heading)  ; Previous
+(define-key cm-map "f" 'outline-forward-same-level)        ; Forward - same level
+(define-key cm-map "b" 'outline-backward-same-level)       ; Backward - same level
+
+)
 #+END_SRC
-*** Outline mode
+*** outshine (outlining) integration
 #+BEGIN_SRC emacs-lisp
-;; change the outline mode prefix from C-c @ to C-c C-2
-(setq outline-minor-mode-prefix "C-c C-2")
-;;(add-hook 'outline-minor-mode-hook
-;;          (lambda () (local-set-key (kbd "C-c C-2")
-;;                                    outline-mode-prefix-map)))
-
+; (use-package outshine
+;   :after outline
+;   :hook (outline-minor-mode . outshine-mode)
+; )
 #+END_SRC
 ** Writeroom Mode
 #+BEGIN_SRC emacs-lisp
-  (use-package writeroom-mode
-    :config
-    (defun my/writing-mode ()
-      "Start my writing mode; enable visual-line-mode and auto-fill-mode"
-      (interactive)
-      (if writeroom-mode
-          (progn
-            (writeroom-mode -1)
-            (visual-line-mode -1)
-            (auto-fill-mode -1)
-            (visual-fill-column-mode -1)
-            )
-        (visual-line-mode 1)
-        (auto-fill-mode 1)
-        (visual-fill-column-mode 1)
-        (writeroom-mode 1))
-      )
+(use-package writeroom-mode
+  :commands (writeroom-mode)
+  :config
+  (defun my/writing-mode ()
+    "Start my writing mode; enable visual-line-mode and auto-fill-mode"
+    (interactive)
+    (if writeroom-mode
+        (progn
+          (writeroom-mode -1)
+          (visual-line-mode -1)
+          (auto-fill-mode -1)
+          (visual-fill-column-mode -1)
+          )
+      (visual-line-mode 1)
+      (auto-fill-mode 1)
+      (visual-fill-column-mode 1)
+      (writeroom-mode 1))
     )
+  )
 #+END_SRC
 ** GhostText/Atomic Chrome
 #+BEGIN_SRC emacs-lisp
-  (use-package atomic-chrome
-    :config
-    (ignore-errors (atomic-chrome-start-server))
-    (setq atomic-chrome-buffer-open-style 'full)
-    )
+(use-package atomic-chrome
+  :config
+  (ignore-errors (atomic-chrome-start-server))
+  (setq atomic-chrome-buffer-open-style 'full)
+  )
 #+END_SRC
 ** Edit Server
 #+BEGIN_SRC emacs-lisp
-  (use-package edit-server
-    :ensure t
-    :commands edit-server-start
-    :init (if after-init-time
-              (edit-server-start)
-            (add-hook 'after-init-hook
-                      #'(lambda() (edit-server-start))))
-    :config (setq edit-server-new-frame-alist
-                  '((name . "Edit with Emacs FRAME")
-                    (top . 200)
-                    (left . 200)
-                    (width . 80)
-                    (height . 25)
-                    (minibuffer . t)
-                    (menu-bar-lines . t)
-                    (window-system . x)))
-    )
+(use-package edit-server
+  :commands edit-server-start
+  :init (if after-init-time
+            (edit-server-start)
+          (add-hook 'after-init-hook
+                    #'(lambda() (edit-server-start))))
+  :config (setq edit-server-new-frame-alist
+                '((name . "Edit with Emacs FRAME")
+                  (top . 200)
+                  (left . 200)
+                  (width . 80)
+                  (height . 25)
+                  (minibuffer . t)
+                  (menu-bar-lines . t)
+                  (window-system . x)))
+  )
 #+END_SRC
 ** Multiple Cursors
-   :PROPERTIES:
-   :ID:       6fcf218b-a762-4c37-9339-a8202ddeb544
-   :END:
 [[https://github.com/magnars/multiple-cursors.el][Multiple Cursors]]
 #+BEGIN_SRC emacs-lisp
-  (use-package multiple-cursors
-    :bind* (("C-;" . mc/mark-all-dwim)
-            ("C-<" . mc/mark-previous-like-this)
-            ("C->" . mc/mark-next-like-this)
-            ("C-S-c C-S-c" . mc/edit-lines))
-    )
+(use-package multiple-cursors
+  :bind* (("C-;" . mc/mark-all-dwim)
+          ("C-<" . mc/mark-previous-like-this)
+          ("C->" . mc/mark-next-like-this)
+          ("C-S-c C-S-c" . mc/edit-lines))
+  )
 #+END_SRC
 ** Web Mode
 #+BEGIN_SRC emacs-lisp
-  (use-package web-mode
-    :load-path "/home/don/projects/web-mode/"
-    :mode ("\\.\\(tx|tmpl\\)\\'" . web-mode)
-    :config
-    (add-to-list 'auto-mode-alist '("\\.tmpl\\'" . web-mode))
-    (setq web-mode-enable-engine-detection t)
-    (setq web-mode-engines-alist
-          '(("template-toolkit" . "\\.tmpl\\'")))
-    )
+(use-package web-mode
+  :mode ("\\.\\(tx|tmpl\\)\\'" . web-mode)
+  :config
+  (add-to-list 'auto-mode-alist '("\\.tmpl\\'" . web-mode))
+  (setq web-mode-enable-engine-detection t)
+  (setq web-mode-engines-alist
+        '(("template-toolkit" . "\\.tmpl\\'")))
+  )
 #+END_SRC
 ** Spamassassin Mode
 #+BEGIN_SRC emacs-lisp
-  (use-package spamassassin-mode
-    :commands spamassassin-mode
-    :ensure f
-    )
+(use-package spamassassin-mode
+  :straight nil
+  :load-path "~/lib/emacs_el"
+  :commands spamassassin-mode
+  )
 #+END_SRC
 ** Password Store
 #+BEGIN_SRC emacs-lisp
-  (use-package password-store
-    :ensure f
-    :commands password-store-edit password-store-generate
-    )
+(use-package password-store
+  :commands password-store-edit password-store-generate
+  :config
+  (defun dla/password-store-edit (entry)
+    "Edit password for ENTRY which doesn't require it to already exist"
+    (interactive (list (password-store--completing-read nil)))
+    (password-store--run-edit entry))
+  (advice-add 'password-store-edit :override #'dla/password-store-edit)
+  )
 #+END_SRC
 ** CSS mode
 #+BEGIN_SRC emacs-lisp
-  (use-package css
-    :mode "\\.css'"
-    :config
-    ;; fix up css mode to not be silly
-    ;; from http://www.stokebloke.com/wordpress/2008/03/21/css-mode-indent-buffer-fix/
-    (setq cssm-indent-level 4)
-    (setq cssm-newline-before-closing-bracket t)
-    (setq cssm-indent-function #'cssm-c-style-indenter)
-    (setq cssm-mirror-mode nil))
+(use-package css
+  :straight css-mode
+  :mode "\\.css'"
+  :config
+  ;; fix up css mode to not be silly
+  ;; from http://www.stokebloke.com/wordpress/2008/03/21/css-mode-indent-buffer-fix/
+  (setq cssm-indent-level 4)
+  (setq cssm-newline-before-closing-bracket t)
+  (setq cssm-indent-function #'cssm-c-style-indenter)
+  (setq cssm-mirror-mode nil))
 #+END_SRC
 ** Abbrev Mode
 #+BEGIN_SRC emacs-lisp
-  (use-package abbrev
-    :diminish abbrev-mode
-    :config
-    ;; load abbreviations from 
-    (setq abbrev-file-name       
-          "~/.emacs_abbrev_def")
+(use-package abbrev
+  :straight nil
+  :delight abbrev-mode
+  :config
+  ;; load abbreviations from 
+  (setq abbrev-file-name       
+        "~/.emacs_abbrev_def")
 
-    ;; read the abbrev file if it exists
-    (if (file-exists-p abbrev-file-name)
-        (quietly-read-abbrev-file))
+  ;; read the abbrev file if it exists
+  (if (file-exists-p abbrev-file-name)
+      (quietly-read-abbrev-file))
 
-    ;; for now, use abbrev mode everywhere
-    (setq default-abbrev-mode t))
+  ;; for now, use abbrev mode everywhere
+  :init 
+  (setq default-abbrev-mode t))
 #+END_SRC
 
-** Python Programming
+** Debugging (realgud)
 #+BEGIN_SRC emacs-lisp
-  (use-package python-mode
-    :hook
-    (python-mode . pyenv-mode)
-    (python-mode . flycheck-mode)
-    (python-mode . company-mode)
-    (python-mode . blacken-mode)
-    (python-mode . yas-minor-mode)
-    )
-  (use-package pyenv
-    :ensure t
-    )
-  (use-package blacken
-    :init
-    (setq-default blacken-fast-unsafe t)
-    (setq-default blacken-line-length 80)
-    :ensure t)
-
-  
-  (use-package elpy
-    :ensure t
-    :init
-    (elpy-enable)
-    )
+(use-package realgud
+  :commands (realgud:pdb realgud:gdb)
+  )
 #+END_SRC
-*** Jedi
+** Python Programming
 #+BEGIN_SRC emacs-lisp
-  (use-package company-jedi
-    :ensure t
-    :hook (python-mode . (add-to-list 'company-backends 'company-jedi))
-    :hook (python-mode  . 'jedi:setup)
-    :config
-    (setq jedi:complete-on-dot t)
-    )
+(use-package python-mode
+  :delight Py 🐍
+  :hook
+  (python-mode . pyvenv-mode)
+  (python-mode . flycheck-mode)
+  (python-mode . blacken-mode)
+  (python-mode . yas-minor-mode)
+  (python-mode . anaconda-mode)
+  )
+(use-package pyvenv
+  :delight
+  :after python-mode
+  )
+(use-package blacken
+  :delight
+  :after python-mode
+  :commands (blacken-buffer)
+  :config
+  (setq-default blacken-fast-unsafe t)
+)
 #+END_SRC
 *** Black
 #+begin_src emacs-lisp :tangle yes
-  (use-package python-black
-    :demand t
-    :after python)
+(use-package python-black
+  :delight
+  :commands (python-black-buffer python-black-statement)
+  :after python)
 #+end_src
 *** Sphinx Documentation
 #+begin_src emacs-lisp :tangle yes
-  (use-package numpydoc
-    :ensure t
-    :after python
-    :bind (:map python-mode-map
-                ("C-c C-n" . numpydoc-generate)))
-  (use-package sphinx-doc
-    :ensure t
-    :config
-    (sphinx-doc-mode t)
-    (setq sphinx-doc-include-types t)
-    :after python)
+(use-package numpydoc
+  :after python
+  :bind (:map python-mode-map
+              ("C-c C-n" . numpydoc-generate)))
+(use-package sphinx-doc
+  :delight 🐈
+  :config
+  (setq sphinx-doc-include-types t)
+  :after python
+  :hook (python-mode . sphinx-doc-mode)
+  )
+(use-package python-docstring
+  :delight 
+  :after python
+  :hook (python-mode . python-docstring-mode)
+  )
 #+end_src
+*** Anaconda Mode (Documentation lookup and completion)
+#+BEGIN_SRC emacs-lisp
+(use-package anaconda-mode
+  :delight
+  :after python
+)
+#+END_SRC
 ** Go language
 #+BEGIN_SRC emacs-lisp
 (use-package go-mode
-             :diminish "go"
+             :delight "go"
              :mode "\\.go"
              )
 #+END_SRC
@@ -1473,26 +1489,47 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori
 ** Beancount
 #+BEGIN_SRC emacs-lisp
 (use-package beancount
+  :straight (beancount
+             :type git
+             :host github
+             :repo "cnsunyour/beancount.el")
   :load-path "~/lib/emacs_el/beancount-mode/"
-  :ensure f
-  :mode "\\.beancount\\'"
+  :mode "\\.bean\\(?:count\\)?\\'"
   
   )
 #+END_SRC
+** Apache
+#+BEGIN_SRC emacs-lisp
+(use-package apache-mode
+  :delight 🪶
+  :mode "apache\\.conf\\'"
+  )
+#+END_SRC
+** ELDoc
+#+BEGIN_SRC emacs-lisp
+(use-package eldoc
+  :delight
+  :commands eldoc-mode
+  :straight nil
+  )
+#+END_SRC
+
 * Email
 ** Mutt
 *** Message-mode
 #+BEGIN_SRC emacs-lisp
 (use-package message
-  :ensure f
-  :diminish (message "✉")
+  :straight nil
+  :delight (message "✉")
+  :delight (message-mode "✉")
   :mode ("muttng-[a-z0-9]+-[0-9]+-" . message-mode)
   :mode ("mutt-[a-z0-9]+-[0-9]+-" . message-mode)
   :hook 'my/message-mode-settings
   :hook 'turn-on-flyspell
   :bind (:map message-mode-map
-      ("C-c C-a" . my/post-attach-file))
-  :delight (message-mode "✉")
+      ("C-c C-a" . my/post-attach-file)
+      ("C-x p" . my/message-kill-buffer)
+      )
   :config
   (defun my/message-mode-settings ()
     (font-lock-add-keywords nil
@@ -1501,7 +1538,10 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori
               ("^[ \t]*>[ \t]*>.*$"
                (0 'message-double-quoted-text-face))))
     )
-
+  (defun my/message-kill-buffer ()
+    (interactive)
+    (kill-buffer nil)
+    )
   (defun my/post-attach-file ()
     "Prompt for an attachment."
     (interactive)
@@ -1530,33 +1570,39 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori
 #+END_SRC
 *** Muttrc mode
 #+BEGIN_SRC emacs-lisp
-  (use-package muttrc-mode
-    :mode "muttngrc"
-    :mode "muttrc"
-  )
-
+(use-package mutt-mode
+  :mode "muttngrc"
+  :mode "muttrc"
+  :config
+  (setq mutt-alias-file-list (quote ("~/.mutt/aliases" "~/.mail_aliases")))
+)
+#+END_SRC
+*** Set mail User agent
+#+BEGIN_SRC emacs-lisp
+(setq mail-user-agent (quote sendmail-user-agent))
 #+END_SRC
 * Base emacs
 ** Reverting buffers
 #+BEGIN_SRC emacs-lisp
-  (use-package autorevert
-    :diminish auto-revert-mode
-    :config
-    (setq global-auto-revert-non-file-buffers t
-          global-auto-revert-ignore-modes '(pdf-view-mode)
-          auto-revert-verbose nil)
-    (global-auto-revert-mode 1))
+(use-package autorevert
+  :delight auto-revert-mode
+  :demand t
+  :config
+  (setq global-auto-revert-non-file-buffers t
+        global-auto-revert-ignore-modes '(pdf-view-mode)
+        auto-revert-verbose nil)
+  (global-auto-revert-mode 1))
 #+END_SRC
 * Org Mode
 ** Use-package and load things
 #+BEGIN_SRC emacs-lisp
 
-  (use-package org
-    :delight (org-mode "ø")
-    :mode ("\\.\\(org\\|org_archive\\|txt\\)\\'" . org-mode)
-    :bind (("C-c l"  . org-store-link)
-           ("C-c a"  . org-agenda)
-           ("C-c b"  . org-iswitchb))
+(use-package org
+  :delight (org-mode "ø")
+  :mode ("\\.\\(org\\|org_archive\\|txt\\)\\'" . org-mode)
+  :bind (("C-c l l" . org-store-link)
+         ("C-c a"  . org-agenda)
+         ("C-c b"  . org-iswitchb))
 #+END_SRC
 ** Agenda Configuration
 #+BEGIN_SRC emacs-lisp
@@ -1685,16 +1731,16 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori
   (set-register ?R (cons 'file "~/projects/reviews/reviews.org"))
   (set-register ?d (cons 'file "~/projects/org-notes/diary.org"))
   ; from https://emacs.stackexchange.com/questions/909/how-can-i-have-an-agenda-timeline-view-of-multiple-files
-  (defun org-agenda-timeline-all (&optional arg)
-    (interactive "P")
-    (with-temp-buffer
-      (dolist (org-agenda-file org-agenda-files)
-        (insert-file-contents org-agenda-file nil)
-        (goto-char (point-max))
-        (newline))
-      (write-file "/tmp/timeline.org")
-      (org-agenda arg "L")))
-  (define-key org-mode-map (kbd "C-c t") 'org-agenda-timeline-all)
+  (defun org-agenda-timeline-all (&optional arg)
+    (interactive "P")
+    (with-temp-buffer
+      (dolist (org-agenda-file org-agenda-files)
+        (insert-file-contents org-agenda-file nil)
+        (goto-char (point-max))
+        (newline))
+      (write-file "/tmp/timeline.org")
+      (org-agenda arg "L")))
+  (define-key org-mode-map (kbd "C-c t") 'org-agenda-timeline-all)
 
 #+END_SRC
 ** General config
@@ -1800,52 +1846,57 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori
 #+END_SRC
 ** Utility Functions
 #+BEGIN_SRC emacs-lisp
-  (defun bh/hide-other ()
-    (interactive)
-    (save-excursion
-      (org-back-to-heading 'invisible-ok)
-      (outline-hide-other)
-      (org-cycle)
-      (org-cycle)
-      (org-cycle)))
-
-  (defun bh/set-truncate-lines ()
-    "Toggle value of truncate-lines and refresh window display."
-    (interactive)
-    (setq truncate-lines (not truncate-lines))
-    ;; now refresh window display (an idiom from simple.el):
-    (save-excursion
-      (set-window-start (selected-window)
-                        (window-start (selected-window)))))
+(defun bh/hide-other ()
+  (interactive)
+  (save-excursion
+    (org-back-to-heading 'invisible-ok)
+    (outline-hide-other)
+    (org-cycle)
+    (org-cycle)
+    (org-cycle)))
+
+(defun bh/set-truncate-lines ()
+  "Toggle value of truncate-lines and refresh window display."
+  (interactive)
+  (setq truncate-lines (not truncate-lines))
+  ;; now refresh window display (an idiom from simple.el):
+  (save-excursion
+    (set-window-start (selected-window)
+                      (window-start (selected-window)))))
 
-  (defun bh/switch-to-scratch ()
-    (interactive)
-    (switch-to-buffer "*scratch*"))
+(defun bh/switch-to-scratch ()
+  (interactive)
+  (switch-to-buffer "*scratch*"))
 
-  (setq org-use-fast-todo-selection t)
-  (setq org-treat-S-cursor-todo-selection-as-state-change nil)
+(setq org-use-fast-todo-selection t)
+(setq org-treat-S-cursor-todo-selection-as-state-change nil)
 
-  ; create function to create headlines in file. This comes from
-  ; http://stackoverflow.com/questions/13340616/assign-ids-to-every-entry-in-org-mode
-  (defun my/org-add-ids-to-headlines-in-file ()
-    "Add ID properties to all headlines in the current file which
-  do not already have one."
-    (interactive)
-    (org-map-entries 'org-id-get-create))
-  (defun dla/org-update-ids-to-headlines-in-file ()
-    "Add or replace ID properties to all headlines in the current file 
-  (or narrowed region)."
-    (interactive)
-    (org-map-entries '(lambda () (org-id-get-create t))))
-  ; if we wanted to do this to every buffer, do the following:
-  ; (add-hook 'org-mode-hook
-  ;           (lambda ()
-  ;             (add-hook 'before-save-hook 'my/org-add-ids-to-headlines-in-file nil 'local)))
+; create function to create headlines in file. This comes from
+; http://stackoverflow.com/questions/13340616/assign-ids-to-every-entry-in-org-mode
+(defun my/org-add-ids-to-headlines-in-file ()
+  "Add ID properties to all headlines in the current file which
+do not already have one."
+  (interactive)
+  (save-excursion
+    (widen)
+    (goto-char (point-min))
+    (when (not (re-search-forward "^#\\+OPTIONS:.*auto-id:f" (point-max) t))
+      (org-map-entries 'org-id-get-create))))
+(defun dla/org-update-ids-to-headlines-in-file ()
+  "Add or replace ID properties to all headlines in the current file 
+(or narrowed region)."
+  (interactive)
+
+  (org-map-entries '(lambda () (org-id-get-create t))))
+; if we wanted to do this to every buffer, do the following:
+(add-hook 'org-mode-hook
+          (lambda ()
+            (add-hook 'before-save-hook 'my/org-add-ids-to-headlines-in-file nil 'local)))
 #+END_SRC
 ** Org ID locations
 #+BEGIN_SRC emacs-lisp
 (use-package find-lisp
-  :ensure t)
+  :demand t)
 (setq org-agenda-text-search-extra-files
       (append '(agenda-archives)
               (find-lisp-find-files "~/projects/org-notes" "\.org$")
@@ -2092,14 +2143,14 @@ Maildir, or by Message-ID."
 
 #+END_SRC
 ** LaTeX configuration
-   :PROPERTIES:
-   :ID:       7135ba17-6a50-4eed-84ca-b90afa5b12f8
-   :END:
 #+BEGIN_SRC emacs-lisp
-(use-package ox-extra
+(use-package org-contrib
+  :no-require t
+  :after org
   :config
-  (ox-extras-activate '(ignore-headlines)))
-(require 'ox-latex)
+  (require 'ox-extra)
+  (ox-extras-activate '(latex-header-blocks ignore-headlines))
+  (require 'ox-latex)
 (add-to-list 'org-latex-classes
          '("memarticle"
        "\\documentclass[11pt,oneside,article]{memoir}\n"
@@ -2217,6 +2268,7 @@ Maildir, or by Message-ID."
 ;; keep latex logfiles
 
 (setq org-latex-remove-logfiles nil)
+)
 
 ;; Resume clocking task when emacs is restarted
 (org-clock-persistence-insinuate)
@@ -2317,7 +2369,7 @@ as the default task."
   ;; We're in the agenda
   ;;
   (let* ((marker (org-get-at-bol 'org-hd-marker))
-         (tags (org-with-point-at marker (org-get-tags-at))))
+         (tags (org-with-point-at marker (org-get-tags))))
     (if (and (eq arg 4) tags)
         (org-agenda-clock-in '(16))
       (bh/clock-in-organization-task-as-default)))
@@ -2499,54 +2551,47 @@ same directory as the org-buffer and insert a link to this file."
 #+END_SRC
 ** appt integration
 #+BEGIN_SRC emacs-lisp
-  (use-package appt
-    :ensure f
-    :config
-    ;; Show notification 10 minutes before event
-    (setq appt-message-warning-time 10)
-    ;; Disable multiple reminders
-    (setq appt-display-interval appt-message-warning-time)
-    (setq appt-display-mode-line nil)
-
-    ;; add automatic reminders for appointments
-    (defun my/org-agenda-to-appt ()
-      (interactive)
-      (setq appt-time-msg-list nil)
-      (org-agenda-to-appt))
-    ;; add reminders when starting emacs
+(use-package appt
+  :straight nil
+  :config
+  ;; Show notification 10 minutes before event
+  (setq appt-message-warning-time 10)
+  ;; Disable multiple reminders
+  (setq appt-display-interval appt-message-warning-time)
+  (setq appt-display-mode-line nil)
+
+  ;; add automatic reminders for appointments
+  (defun my/org-agenda-to-appt ()
+    (interactive)
+    (setq appt-time-msg-list nil)
+    (org-agenda-to-appt))
+  ;; add reminders when starting emacs
+  (my/org-agenda-to-appt)
+  ;; when rebuilding the agenda
+  (defadvice  org-agenda-redo (after org-agenda-redo-add-appts)
+    "Pressing `r' on the agenda will also add appointments."
     (my/org-agenda-to-appt)
-    ;; when rebuilding the agenda
-    (defadvice  org-agenda-redo (after org-agenda-redo-add-appts)
-      "Pressing `r' on the agenda will also add appointments."
-      (my/org-agenda-to-appt)
-      )
-    ;; when saving all org buffers
-    (defadvice org-save-all-org-buffers (after org-save-all-org-buffers-add-appts)
-      "Re-add appts after saving all org buffers"
-      (my/org-agenda-to-appt))
-    ;; Display appointments as a window manager notification
-    (setq appt-disp-window-function 'my/appt-display)
-    (setq appt-delete-window-function (lambda () t))
-
-    (setq my/appt-notification-app (concat (getenv "HOME") "/bin/appt_notification"))
-
-    (defun my/appt-display (min-to-app new-time msg)
-      (if (atom min-to-app)
-      (start-process "my/appt-notification-app" nil my/appt-notification-app min-to-app msg)
-    (dolist (i (number-sequence 0 (1- (length min-to-app))))
-      (start-process "my/appt-notification-app" nil my/appt-notification-app
-                    (nth i min-to-app) (nth i msg))))
-      )
     )
+  ;; when saving all org buffers
+  (defadvice org-save-all-org-buffers (after org-save-all-org-buffers-add-appts)
+    "Re-add appts after saving all org buffers"
+    (my/org-agenda-to-appt))
+  ;; Display appointments as a window manager notification
+  (setq appt-disp-window-function 'my/appt-display)
+  (setq appt-delete-window-function (lambda () t))
+
+  (setq my/appt-notification-app (concat (getenv "HOME") "/bin/appt_notification"))
+
+  (defun my/appt-display (min-to-app new-time msg)
+    (if (atom min-to-app)
+    (start-process "my/appt-notification-app" nil my/appt-notification-app min-to-app msg)
+  (dolist (i (number-sequence 0 (1- (length min-to-app))))
+    (start-process "my/appt-notification-app" nil my/appt-notification-app
+            (nth i min-to-app) (nth i msg))))
+    )
+  )
 
 
-#+END_SRC
-** outshine (outlining) integration
-#+BEGIN_SRC emacs-lisp
-(use-package outshine
-  :ensure t
-  :hook (outline-minor-mode . outshine-hook-function)
-)
 #+END_SRC
 ** End use-package
 #+BEGIN_SRC emacs-lisp
@@ -2560,17 +2605,18 @@ same directory as the org-buffer and insert a link to this file."
 #+END_SRC
 ** Goto line
 #+BEGIN_SRC emacs-lisp
-  (global-unset-key "\M-g")
-  (global-set-key (kbd "M-g l") 'goto-line)
+  (global-unset-key "\M-g")
+  (global-set-key (kbd "M-g l") 'goto-line)
 #+END_SRC
 * Debian
 ** debian-changelog
 #+BEGIN_SRC emacs-lisp
-  (use-package debian-changelog-mode
-    :mode "debian/changelog"
-    :config
-    (setq debian-changelog-mailing-address "don@debian.org")
-    (setq debian-changelog-full-name "Don Armstrong"))
+(use-package debian-changelog-mode
+  :mode "debian/changelog"
+  :ensure debian-el
+  :config
+  (setq debian-changelog-mailing-address "don@debian.org")
+  (setq debian-changelog-full-name "Don Armstrong"))
 #+END_SRC
 * Misc (uncharacterized)
 #+BEGIN_SRC emacs-lisp
@@ -2578,18 +2624,11 @@ same directory as the org-buffer and insert a link to this file."
   (setq calendar-longitude -121.5)
   (setq case-fold-search t)
   (setq confirm-kill-emacs (quote y-or-n-p))
-  (setq cperl-lazy-help-time nil)
+
 #+END_SRC
-** Turn on fontlock and icomplete
+** Turn on fontlock
 #+BEGIN_SRC emacs-lisp
   (global-font-lock-mode 1)
-  (icomplete-mode 1)
-  (setq log-edit-keep-buffer t)
-#+END_SRC
-** Set mail User agent
-#+BEGIN_SRC emacs-lisp
-  (setq mail-user-agent (quote sendmail-user-agent))
-  (setq mutt-alias-file-list (quote ("~/.mutt/aliases" "~/.mail_aliases")))
 #+END_SRC
 ** PS Printing
 #+BEGIN_SRC emacs-lisp
@@ -2621,233 +2660,183 @@ same directory as the org-buffer and insert a link to this file."
 #+END_SRC
 ** Use primary selection on unix machines
 #+BEGIN_SRC emacs-lisp
-  ;; switch back to the old primary selection method
-  (if (or (string-equal system-type "darwin")
-          (string-equal system-type "windows")
-          )
-      (progn
-        (setq x-select-enable-clipboard t)
-        (setq x-select-enable-primary nil)
+;; switch back to the old primary selection method
+(if (or (string-equal system-type "darwin")
+        (string-equal system-type "windows")
         )
     (progn
-      (setq x-select-enable-clipboard nil)
-      (setq x-select-enable-primary t)
-      ))
-  ; (setq mouse-drag-copy-region t)
-
-  (fset 'perl-mode 'cperl-mode)
-  ;;(load-file "cperl-mode.el")
-
-  ;; tramp configuration
-  (setq tramp-use-ssh-controlmaster-options nil)
-
-  (setq-default c-indent-level 4)
-  (setq-default c-brace-imaginary-offset 0)
-  (setq-default c-brace-offset -4)
-  (setq-default c-argdecl-indent 4)
-  (setq-default c-label-offset -4)
-  (setq-default c-continued-statement-offset 4)
-  ; tabs are annoying
-  (setq-default indent-tabs-mode nil)
-  (setq-default tab-width 4)
-
-
-  ;; (autoload 'php-mode "php-mode" "PHP editing mode" t)
-  ;; (add-to-list 'auto-mode-alist '("\\.php3?\\'" . php-mode))
-  ;; (add-to-list 'auto-mode-alist '("\\.phtml?\\'" . php-mode))
-  ;; (add-to-list 'auto-mode-alist '("\\.php?\\'" . php-mode))
-  ;; (add-to-list 'auto-mode-alist '("\\.php4?\\'" . php-mode))
-
+      (setq select-enable-clipboard t)
+      (setq select-enable-primary nil)
+      )
+  (progn
+    (setq select-enable-clipboard nil)
+    (setq select-enable-primary t)
+    ))
+; (setq mouse-drag-copy-region t)
+
+(setq-default c-indent-level 4)
+(setq-default c-brace-imaginary-offset 0)
+(setq-default c-brace-offset -4)
+(setq-default c-argdecl-indent 4)
+(setq-default c-label-offset -4)
+(setq-default c-continued-statement-offset 4)
+; tabs are annoying
+(setq-default indent-tabs-mode nil)
+(setq-default tab-width 4)
+
+(defun insert-date ()
+  "Insert date at point."
+  (interactive)
+  (insert (format-time-string "%A, %B %e, %Y %k:%M:%S %Z")))
+(global-set-key "\C-[d" 'insert-date)
+
+(defun unfill-paragraph (arg)
+  "Pull this whole paragraph up onto one line."
+  (interactive "*p")
+  (let ((fill-column 10000))
+    (fill-paragraph arg))
+  )
 
-  (defun insert-date ()
-    "Insert date at point."
-    (interactive)
-    (insert (format-time-string "%A, %B %e, %Y %k:%M:%S %Z")))
-  (global-set-key "\C-[d" 'insert-date)
-
-  (defun unfill-paragraph (arg)
-    "Pull this whole paragraph up onto one line."
-    (interactive "*p")
-    (let ((fill-column 10000))
-      (fill-paragraph arg))
-    )
+(column-number-mode t)
 
-  (column-number-mode t)
 #+END_SRC
 ** Desktop-save-mode
 If the envvar EMACS_SERVER_NAME is set, consider this a separate
 emacs, and use a different desktop file to restore history
 #+BEGIN_SRC emacs-lisp
-  (use-package desktop
-    :demand
-    :config
-    (setq desktop-base-file-name
-          (convert-standard-filename
-           (concat ".emacs"
-                   (or (getenv "EMACS_SERVER_NAME")
-                       "")
-                   ".desktop")
-           ))
-    (setq desktop-base-lock-name
-          (convert-standard-filename
-           (concat desktop-base-file-name
-                   ".lock")))
-    (setq desktop-auto-save-timeout 60)
-    (setq desktop-restore-eager 5)
-    (setq desktop-lazy-verbose nil)
-    (desktop-save-mode 1)
-    ; (desktop-read)
-  )
+(use-package desktop
+  :demand
+  :config
+  (setq desktop-base-file-name
+        (convert-standard-filename
+         (concat ".emacs"
+                 (or (getenv "EMACS_SERVER_NAME")
+                     "")
+                 ".desktop")
+         ))
+  (setq desktop-base-lock-name
+        (convert-standard-filename
+         (concat desktop-base-file-name
+                 ".lock")))
+  (setq desktop-auto-save-timeout 60)
+  (setq desktop-restore-eager 5)
+  (setq desktop-lazy-verbose nil)
+  (desktop-save-mode 1)
+  ; (desktop-read)
+)
 #+END_SRC
 ** Misc (Uncharacterized)
 #+BEGIN_SRC emacs-lisp
-  '(icomplete-mode on)
-  (custom-set-faces
-   ;; custom-set-faces was added by Custom.
-   ;; If you edit it by hand, you could mess it up, so be careful.
-   ;; Your init file should contain only one such instance.
-   ;; If there is more than one, they won't work right.
-   '(menu ((((type x-toolkit)) (:background "black" :foreground "grey90")))))
-
-
-  (put 'upcase-region 'disabled nil)
-  (put 'downcase-region 'disabled nil)
-  (put 'narrow-to-region 'disabled nil)
-
-  ; (defun turn-on-flyspell ()
-  ;    "Force flyspell-mode on using a positive arg.  For use in hooks."
-  ;    (interactive)
-  ;    (flyspell-mode 1))
-
 
-   ; Outline-minor-mode key map
-   (define-prefix-command 'cm-map nil "Outline-")
-   ; HIDE
-   (define-key cm-map "q" 'outline-hide-sublevels)    ; Hide everything but the top-level headings
-   (define-key cm-map "t" 'outline-hide-body)         ; Hide everything but headings (all body lines)
-   (define-key cm-map "o" 'outline-hide-other)        ; Hide other branches
-   (define-key cm-map "c" 'outline-hide-entry)        ; Hide this entry's body
-   (define-key cm-map "l" 'outline-hide-leaves)       ; Hide body lines in this entry and sub-entries
-   (define-key cm-map "d" 'outline-hide-subtree)      ; Hide everything in this entry and sub-entries
-   ; SHOW
-   (define-key cm-map "a" 'outline-show-all)          ; Show (expand) everything
-   (define-key cm-map "e" 'outline-show-entry)        ; Show this heading's body
-   (define-key cm-map "i" 'outline-show-children)     ; Show this heading's immediate child sub-headings
-   (define-key cm-map "k" 'outline-show-branches)     ; Show all sub-headings under this heading
-   (define-key cm-map "s" 'outline-show-subtree)      ; Show (expand) everything in this heading & below
-   ; MOVE
-   (define-key cm-map "u" 'outline-up-heading)                ; Up
-   (define-key cm-map "n" 'outline-next-visible-heading)      ; Next
-   (define-key cm-map "p" 'outline-previous-visible-heading)  ; Previous
-   (define-key cm-map "f" 'outline-forward-same-level)        ; Forward - same level
-   (define-key cm-map "b" 'outline-backward-same-level)       ; Backward - same level
-   (global-set-key "\M-o" cm-map)
-  ; fix up tmux xterm keys
-  ; stolen from http://unix.stackexchange.com/questions/24414/shift-arrow-not-working-in-emacs-within-tmux
-  (defun fix-up-tmux-keys ()
-      "Fix up tmux xterm keys"
-      (if (getenv "TMUX")
-          (progn
-            (let ((x 2) (tkey ""))
-              (while (<= x 8)
-                ;; shift
-                (if (= x 2)
-                    (setq tkey "S-"))
-                ;; alt
-                (if (= x 3)
-                    (setq tkey "M-"))
-                ;; alt + shift
-                (if (= x 4)
-                    (setq tkey "M-S-"))
-                ;; ctrl
-                (if (= x 5)
-                    (setq tkey "C-"))
-                ;; ctrl + shift
-                (if (= x 6)
-                    (setq tkey "C-S-"))
-                ;; ctrl + alt
-                (if (= x 7)
-                    (setq tkey "C-M-"))
-                ;; ctrl + alt + shift
-                (if (= x 8)
-                    (setq tkey "C-M-S-"))
-
-                ;; arrows
-                (define-key key-translation-map (kbd (format "M-[ 1 ; %d A" x)) (kbd (format "%s<up>" tkey)))
-                (define-key key-translation-map (kbd (format "M-[ 1 ; %d B" x)) (kbd (format "%s<down>" tkey)))
-                (define-key key-translation-map (kbd (format "M-[ 1 ; %d C" x)) (kbd (format "%s<right>" tkey)))
-                (define-key key-translation-map (kbd (format "M-[ 1 ; %d D" x)) (kbd (format "%s<left>" tkey)))
-                ;; home
-                (define-key key-translation-map (kbd (format "M-[ 1 ; %d H" x)) (kbd (format "%s<home>" tkey)))
-                ;; end
-                (define-key key-translation-map (kbd (format "M-[ 1 ; %d F" x)) (kbd (format "%s<end>" tkey)))
-                ;; page up
-                (define-key key-translation-map (kbd (format "M-[ 5 ; %d ~" x)) (kbd (format "%s<prior>" tkey)))
-                ;; page down
-                (define-key key-translation-map (kbd (format "M-[ 6 ; %d ~" x)) (kbd (format "%s<next>" tkey)))
-                ;; insert
-                (define-key key-translation-map (kbd (format "M-[ 2 ; %d ~" x)) (kbd (format "%s<delete>" tkey)))
-                ;; delete
-                (define-key key-translation-map (kbd (format "M-[ 3 ; %d ~" x)) (kbd (format "%s<delete>" tkey)))
-                ;; f1
-                (define-key key-translation-map (kbd (format "M-[ 1 ; %d P" x)) (kbd (format "%s<f1>" tkey)))
-                ;; f2
-                (define-key key-translation-map (kbd (format "M-[ 1 ; %d Q" x)) (kbd (format "%s<f2>" tkey)))
-                ;; f3
-                (define-key key-translation-map (kbd (format "M-[ 1 ; %d R" x)) (kbd (format "%s<f3>" tkey)))
-                ;; f4
-                (define-key key-translation-map (kbd (format "M-[ 1 ; %d S" x)) (kbd (format "%s<f4>" tkey)))
-                ;; f5
-                (define-key key-translation-map (kbd (format "M-[ 15 ; %d ~" x)) (kbd (format "%s<f5>" tkey)))
-                ;; f6
-                (define-key key-translation-map (kbd (format "M-[ 17 ; %d ~" x)) (kbd (format "%s<f6>" tkey)))
-                ;; f7
-                (define-key key-translation-map (kbd (format "M-[ 18 ; %d ~" x)) (kbd (format "%s<f7>" tkey)))
-                ;; f8
-                (define-key key-translation-map (kbd (format "M-[ 19 ; %d ~" x)) (kbd (format "%s<f8>" tkey)))
-                ;; f9
-                (define-key key-translation-map (kbd (format "M-[ 20 ; %d ~" x)) (kbd (format "%s<f9>" tkey)))
-                ;; f10
-                (define-key key-translation-map (kbd (format "M-[ 21 ; %d ~" x)) (kbd (format "%s<f10>" tkey)))
-                ;; f11
-                (define-key key-translation-map (kbd (format "M-[ 23 ; %d ~" x)) (kbd (format "%s<f11>" tkey)))
-                ;; f12
-                (define-key key-translation-map (kbd (format "M-[ 24 ; %d ~" x)) (kbd (format "%s<f12>" tkey)))
-                ;; f13
-                (define-key key-translation-map (kbd (format "M-[ 25 ; %d ~" x)) (kbd (format "%s<f13>" tkey)))
-                ;; f14
-                (define-key key-translation-map (kbd (format "M-[ 26 ; %d ~" x)) (kbd (format "%s<f14>" tkey)))
-                ;; f15
-                (define-key key-translation-map (kbd (format "M-[ 28 ; %d ~" x)) (kbd (format "%s<f15>" tkey)))
-                ;; f16
-                (define-key key-translation-map (kbd (format "M-[ 29 ; %d ~" x)) (kbd (format "%s<f16>" tkey)))
-                ;; f17
-                (define-key key-translation-map (kbd (format "M-[ 31 ; %d ~" x)) (kbd (format "%s<f17>" tkey)))
-                ;; f18
-                (define-key key-translation-map (kbd (format "M-[ 32 ; %d ~" x)) (kbd (format "%s<f18>" tkey)))
-                ;; f19
-                (define-key key-translation-map (kbd (format "M-[ 33 ; %d ~" x)) (kbd (format "%s<f19>" tkey)))
-                ;; f20
-                (define-key key-translation-map (kbd (format "M-[ 34 ; %d ~" x)) (kbd (format "%s<f20>" tkey)))
-
-                (setq x (+ x 1))
-                ))
-            )
-        )
+(put 'upcase-region 'disabled nil)
+(put 'downcase-region 'disabled nil)
+(put 'narrow-to-region 'disabled nil)
+
+; fix up tmux xterm keys
+; stolen from http://unix.stackexchange.com/questions/24414/shift-arrow-not-working-in-emacs-within-tmux
+(defun fix-up-tmux-keys ()
+    "Fix up tmux xterm keys"
+    (if (getenv "TMUX")
+        (progn
+          (let ((x 2) (tkey ""))
+            (while (<= x 8)
+              ;; shift
+              (if (= x 2)
+                  (setq tkey "S-"))
+              ;; alt
+              (if (= x 3)
+                  (setq tkey "M-"))
+              ;; alt + shift
+              (if (= x 4)
+                  (setq tkey "M-S-"))
+              ;; ctrl
+              (if (= x 5)
+                  (setq tkey "C-"))
+              ;; ctrl + shift
+              (if (= x 6)
+                  (setq tkey "C-S-"))
+              ;; ctrl + alt
+              (if (= x 7)
+                  (setq tkey "C-M-"))
+              ;; ctrl + alt + shift
+              (if (= x 8)
+                  (setq tkey "C-M-S-"))
+
+              ;; arrows
+              (define-key key-translation-map (kbd (format "M-[ 1 ; %d A" x)) (kbd (format "%s<up>" tkey)))
+              (define-key key-translation-map (kbd (format "M-[ 1 ; %d B" x)) (kbd (format "%s<down>" tkey)))
+              (define-key key-translation-map (kbd (format "M-[ 1 ; %d C" x)) (kbd (format "%s<right>" tkey)))
+              (define-key key-translation-map (kbd (format "M-[ 1 ; %d D" x)) (kbd (format "%s<left>" tkey)))
+              ;; home
+              (define-key key-translation-map (kbd (format "M-[ 1 ; %d H" x)) (kbd (format "%s<home>" tkey)))
+              ;; end
+              (define-key key-translation-map (kbd (format "M-[ 1 ; %d F" x)) (kbd (format "%s<end>" tkey)))
+              ;; page up
+              (define-key key-translation-map (kbd (format "M-[ 5 ; %d ~" x)) (kbd (format "%s<prior>" tkey)))
+              ;; page down
+              (define-key key-translation-map (kbd (format "M-[ 6 ; %d ~" x)) (kbd (format "%s<next>" tkey)))
+              ;; insert
+              (define-key key-translation-map (kbd (format "M-[ 2 ; %d ~" x)) (kbd (format "%s<delete>" tkey)))
+              ;; delete
+              (define-key key-translation-map (kbd (format "M-[ 3 ; %d ~" x)) (kbd (format "%s<delete>" tkey)))
+              ;; f1
+              (define-key key-translation-map (kbd (format "M-[ 1 ; %d P" x)) (kbd (format "%s<f1>" tkey)))
+              ;; f2
+              (define-key key-translation-map (kbd (format "M-[ 1 ; %d Q" x)) (kbd (format "%s<f2>" tkey)))
+              ;; f3
+              (define-key key-translation-map (kbd (format "M-[ 1 ; %d R" x)) (kbd (format "%s<f3>" tkey)))
+              ;; f4
+              (define-key key-translation-map (kbd (format "M-[ 1 ; %d S" x)) (kbd (format "%s<f4>" tkey)))
+              ;; f5
+              (define-key key-translation-map (kbd (format "M-[ 15 ; %d ~" x)) (kbd (format "%s<f5>" tkey)))
+              ;; f6
+              (define-key key-translation-map (kbd (format "M-[ 17 ; %d ~" x)) (kbd (format "%s<f6>" tkey)))
+              ;; f7
+              (define-key key-translation-map (kbd (format "M-[ 18 ; %d ~" x)) (kbd (format "%s<f7>" tkey)))
+              ;; f8
+              (define-key key-translation-map (kbd (format "M-[ 19 ; %d ~" x)) (kbd (format "%s<f8>" tkey)))
+              ;; f9
+              (define-key key-translation-map (kbd (format "M-[ 20 ; %d ~" x)) (kbd (format "%s<f9>" tkey)))
+              ;; f10
+              (define-key key-translation-map (kbd (format "M-[ 21 ; %d ~" x)) (kbd (format "%s<f10>" tkey)))
+              ;; f11
+              (define-key key-translation-map (kbd (format "M-[ 23 ; %d ~" x)) (kbd (format "%s<f11>" tkey)))
+              ;; f12
+              (define-key key-translation-map (kbd (format "M-[ 24 ; %d ~" x)) (kbd (format "%s<f12>" tkey)))
+              ;; f13
+              (define-key key-translation-map (kbd (format "M-[ 25 ; %d ~" x)) (kbd (format "%s<f13>" tkey)))
+              ;; f14
+              (define-key key-translation-map (kbd (format "M-[ 26 ; %d ~" x)) (kbd (format "%s<f14>" tkey)))
+              ;; f15
+              (define-key key-translation-map (kbd (format "M-[ 28 ; %d ~" x)) (kbd (format "%s<f15>" tkey)))
+              ;; f16
+              (define-key key-translation-map (kbd (format "M-[ 29 ; %d ~" x)) (kbd (format "%s<f16>" tkey)))
+              ;; f17
+              (define-key key-translation-map (kbd (format "M-[ 31 ; %d ~" x)) (kbd (format "%s<f17>" tkey)))
+              ;; f18
+              (define-key key-translation-map (kbd (format "M-[ 32 ; %d ~" x)) (kbd (format "%s<f18>" tkey)))
+              ;; f19
+              (define-key key-translation-map (kbd (format "M-[ 33 ; %d ~" x)) (kbd (format "%s<f19>" tkey)))
+              ;; f20
+              (define-key key-translation-map (kbd (format "M-[ 34 ; %d ~" x)) (kbd (format "%s<f20>" tkey)))
+
+              (setq x (+ x 1))
+              ))
+          )
       )
-  ; (add-hook 'tty-setup-hook 'fix-up-tmux-keys)
-
-  (defadvice ask-user-about-supersession-threat (around ask-user-about-supersession-threat-if-necessary)
-    "Call ask-user-about-supersession-threat only if the buffer is actually obsolete."
-    (if (or (buffer-modified-p)
-            (verify-visited-file-modtime)
-            (< (* 8 1024 1024) (buffer-size))
-            (/= 0 (call-process-region 1 (+ 1 (buffer-size)) "diff" nil nil nil "-q" (buffer-file-name) "-")))
-        ad-do-it
-      (clear-visited-file-modtime)
-      (not-modified)))
-  (ad-activate 'ask-user-about-supersession-threat)
+    )
+; (add-hook 'tty-setup-hook 'fix-up-tmux-keys)
+
+(defadvice ask-user-about-supersession-threat (around ask-user-about-supersession-threat-if-necessary)
+  "Call ask-user-about-supersession-threat only if the buffer is actually obsolete."
+  (if (or (buffer-modified-p)
+          (verify-visited-file-modtime)
+          (< (* 8 1024 1024) (buffer-size))
+          (/= 0 (call-process-region 1 (+ 1 (buffer-size)) "diff" nil nil nil "-q" (buffer-file-name) "-")))
+      ad-do-it
+    (clear-visited-file-modtime)
+    (not-modified)))
+(ad-activate 'ask-user-about-supersession-threat)
 #+END_SRC
 
 * Start Server
@@ -2858,13 +2847,11 @@ emacs, and use a different desktop file to restore history
           (or (getenv "EMACS_SERVER_NAME")
               "server"))
     (unless (server-running-p)
-      (global-set-key "\C-xp" 'server-edit)
+      (global-set-key "\C-xp" 'server-edit)
       (server-start)))
 #+END_SRC
 
-
-
 * END
 #+BEGIN_SRC emacs-lisp
-  (provide 'don-configuration)
+(provide 'don-configuration)
 #+END_SRC