]> git.donarmstrong.com Git - lib.git/blobdiff - emacs_el/configuration/don-configuration.org
require diminish after bind-key
[lib.git] / emacs_el / configuration / don-configuration.org
index ec00578559b405996ce275e0f1aef1626a88db68..51b159eb8f56c267657332e4908099d5e75b400a 100644 (file)
@@ -7,33 +7,86 @@
 #+BEGIN_SRC emacs-lisp
 (setq debug-on-event 'siguser2)
 #+END_SRC
-* Add library paths
-
+* Initial startup stuff
+** Disable startup screen
 #+BEGIN_SRC emacs-lisp
-  (add-to-list 'load-path '"~/lib/emacs_el/")
-  (add-to-list 'load-path '"~/lib/emacs_el/tiny-tools/lisp/tiny")
-  (add-to-list 'load-path '"~/lib/emacs_el/tiny-tools/lisp/other")
-  (add-to-list 'load-path '"~/lib/emacs_el/magit-annex")
+  (setq inhibit-startup-screen t)
 #+END_SRC
-
-* Package management
-** package repositories and package manager
+** 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))
+#+END_SRC
+** Fullscreen
 #+BEGIN_SRC emacs-lisp
-  (require 'package)
-  (setq package-archives '(("gnu" . "https://elpa.gnu.org/packages/")
-                           ("melpa" . "https://melpa.org/packages/")
-                           ("org" . "http://orgmode.org/elpa/") ))
+  (setq frame-resize-pixelwise t)
+  (add-to-list 'default-frame-alist '(fullscreen . maximixed))
 #+END_SRC
-** [[https://github.com/jwiegley/use-package/][use-package]]
+* 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
-  (package-initialize)
-  (require 'use-package)
+  (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)
+    )
+#+END_SRC
+* Add library paths
+
+#+BEGIN_SRC emacs-lisp
+  (add-to-list 'load-path '"~/lib/emacs_el/")
+  (add-to-list 'load-path '"~/lib/emacs_el/magit-annex")
 #+END_SRC
 * Disable custom-vars
 #+BEGIN_SRC emacs-lisp
 * Variables
 ** Safe Local Variables
 #+BEGIN_SRC emacs-lisp
-  (setq safe-local-variable-values 
-        (quote ((auto-save-default)
-                (make-backup-files)
-                (cperl-indent-level . 4)
-                (indent-level . 4)
-                (indent-tabs-mode . f)
-                )))
+(setq safe-local-variable-values
+      (quote ((auto-save-default)
+              (make-backup-files)
+              (cperl-indent-level . 4)
+              (indent-level . 4)
+              (indent-tabs-mode . f)
+              (vcl-indent-level . 4)
+              )))
 #+END_SRC
 * Memory
 #+BEGIN_SRC emacs-lisp
   (add-hook 'minibuffer-exit-hook #'don/minibuffer-exit-hook)
 #+END_SRC
 * Modules
+** Spacemacs theme
+#+BEGIN_SRC emacs-lisp
+(use-package spacemacs-common
+  :ensure 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))
+    )
+#+END_SRC
 ** Flyspell 🐝 
 #+BEGIN_SRC emacs-lisp
   (use-package flyspell
     :ensure t
     :diminish flyspell-mode 🐝
     :config
-    (add-hook 'message-mode-hook 'turn-on-flyspell)
     (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)
     )
 
 #+END_SRC
+** Flymake
+#+begin_src emacs-lisp :tangle yes
+  (use-package flymake
+    :diminish "Φ")
+#+end_src
+
 ** Winnermode
 #+BEGIN_SRC emacs-lisp
   (winner-mode 1)
 ** Eyebrowse
 
 #+BEGIN_SRC emacs-lisp
-  ;; (use-package eyebrowse
-  ;;   :ensure t
-  ;;   :diminish eyebrowse-mode
-  ;;   :init (setq eyebrowse-keymap-prefix (kbd "C-c C-\\"))
-  ;;   :config (progn
-  ;;             (setq eyebrowse-wrap-around t)
-  ;;             (eyebrowse-mode t)
-  ;; 
-  ;;             (defun my/eyebrowse-new-window-config ()
-  ;;               (interactive)
-  ;;               (let ((done nil))
-  ;;                 (dotimes (i 10)
-  ;;                   ;; start at 1 run till 0
-  ;;                   (let ((j (mod (+ i 1) 10)))
-  ;;                     (when (and (not done)
-  ;;                                (not (eyebrowse--window-config-present-p j)))
-  ;;                       (eyebrowse-switch-to-window-config j)
-  ;;                       (call-interactively 'eyebrowse-rename-window-config2 j)
-  ;;                       (setq done t)
-  ;;                       ))
-  ;;                   )))
-  ;; 
-  ;;             ;; I don't use latex-preview-pane
-  ;;             ;; (require 'latex-preview-pane)
-  ;;             ;; (defun my/close-latex-preview-pane-before-eyebrowse-switch ()
-  ;;             ;;   ;; latex-preview-pane uses window-parameters which are
-  ;;             ;;   ;; not preserved by eyebrowse, so we close the preview
-  ;;             ;;   ;; pane before switching, it will be regenerated when we
-  ;;             ;;   ;; edit the TeX file.
-  ;;             ;;   (when (lpp/window-containing-preview)
-  ;;             ;;     (delete-window (lpp/window-containing-preview))))
-  ;; 
-  ;;             ;; (add-to-list 'eyebrowse-pre-window-switch-hook
-  ;;             ;;              #'my/close-latex-preview-pane-before-eyebrowse-switch)
-  ;; 
-  ;;             ;; (my/set-menu-key "["  #'my/eyebrowse-new-window-config)
-  ;;             ;; (my/set-menu-key ";"  #'eyebrowse-prev-window-config)
-  ;;             ;; (my/set-menu-key "'"  #'eyebrowse-next-window-config)
-  ;;             ;; (my/set-menu-key "]"  #'eyebrowse-close-window-config)
-  ;;             ;; (my/set-menu-key "\\" #'eyebrowse-rename-window-config)
-  ;;             )
-  ;;   )
+  (use-package eyebrowse
+    :ensure t
+    :diminish eyebrowse-mode
+    :init (setq eyebrowse-keymap-prefix (kbd "C-c e"))
+    :config (progn
+              (setq eyebrowse-wrap-around t)
+              (eyebrowse-mode t)
+
+              (defun my/eyebrowse-new-window-config ()
+                (interactive)
+                (let ((done nil))
+                  (dotimes (i 10)
+                    ;; start at 1 run till 0
+                    (let ((j (mod (+ i 1) 10)))
+                      (when (and (not done)
+                                 (not (eyebrowse--window-config-present-p j)))
+                        (eyebrowse-switch-to-window-config j)
+                        (call-interactively 'eyebrowse-rename-window-config2 j)
+                        (setq done t)
+                        ))
+                    )))
+
+              ;; I don't use latex-preview-pane
+              ;; (require 'latex-preview-pane)
+              ;; (defun my/close-latex-preview-pane-before-eyebrowse-switch ()
+              ;;   ;; latex-preview-pane uses window-parameters which are
+              ;;   ;; not preserved by eyebrowse, so we close the preview
+              ;;   ;; pane before switching, it will be regenerated when we
+              ;;   ;; edit the TeX file.
+              ;;   (when (lpp/window-containing-preview)
+              ;;     (delete-window (lpp/window-containing-preview))))
+
+              ;; (add-to-list 'eyebrowse-pre-window-switch-hook
+              ;;              #'my/close-latex-preview-pane-before-eyebrowse-switch)
+
+              ;; (my/set-menu-key "["  #'my/eyebrowse-new-window-config)
+              ;; (my/set-menu-key ";"  #'eyebrowse-prev-window-config)
+              ;; (my/set-menu-key "'"  #'eyebrowse-next-window-config)
+              ;; (my/set-menu-key "]"  #'eyebrowse-close-window-config)
+              ;; (my/set-menu-key "\\" #'eyebrowse-rename-window-config)
+              )
+    )
 #+END_SRC
 
 ** Window handling
@@ -245,6 +318,7 @@ value, scrolling continues until there is no more output.
 *** Avy
 #+BEGIN_SRC emacs-lisp
   (use-package avy
+    :if (>= emacs-major-version 25)
     :ensure t
     :bind (("C-c C-<SPC>" . avy-goto-word-or-subword-1)
            ("C-c j j" . avy-goto-word-or-subword-1)
@@ -265,6 +339,7 @@ value, scrolling continues until there is no more output.
     :ensure t
     :bind (("C-c j ," . goto-last-change)
            ("C-c j ." . goto-last-change-reverse))
+    )
 #+END_SRC
 *** Jumping to bookmarks (visible bookmarks, bm)
 #+BEGIN_SRC emacs-lisp
@@ -291,51 +366,243 @@ value, scrolling continues until there is no more output.
                                        "~/lib/emacs_el/yasnippet-snippets/snippets/"))
               (add-to-list 'hippie-expand-try-functions-list
                                'yas-hippie-try-expand)
+              (yas-reload-all)
               )
     )
 #+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
-** Helm Flx
+** Company
+#+BEGIN_SRC emacs-lisp
+(use-package company
+  :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)
+              )
+  )
+#+END_SRC
+*** C/C++
+#+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)))
 
-[[https://github.com/PythonNut/helm-flx][helm-flx]] implements intelligent helm fuzzy sorting, provided by [[https://github.com/lewang/flx][flx]].
+              (setq company-c-headers-path-system
+                    #'malb/ede-object-system-include-path)
 
+              (add-to-list 'company-backends #'company-c-headers)))
+#+END_SRC
+*** Python
 #+BEGIN_SRC emacs-lisp
-(use-package helm-flx
+(use-package company-anaconda
   :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)))
+  :config (add-to-list 'company-backends #'company-anaconda))
 #+END_SRC
+*** Perl
+#+BEGIN_SRC emacs-lisp
+  (use-package company-plsense
+    :ensure t
+    )
+#+END_SRC
+*** LaTeX
+#+BEGIN_SRC emacs-lisp
+  (use-package company-math
+    :ensure t)
+#+END_SRC
+#+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)
+              )
+    )
+#+END_SRC
+#+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 (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)
+#+END_SRC
 ** Tinyprocmail
 
 #+BEGIN_SRC emacs-lisp
   ;; load tinyprocmail
   (use-package tinyprocmail
-    :ensure f
-    :config (with-library 'tinyprocmail
-              ;; (setq tinyprocmail--procmail-version "v3.22")
-              (add-hook 'tinyprocmail--load-hook 'tinyprocmail-install))
-  )
+    :load-path "~/lib/emacs_el/tiny-tools/lisp/tiny"
+    :mode (".procmailrc" . turn-on-tinyprocmail-mode)
+    )
 #+END_SRC
 
 ** Magit
@@ -345,84 +612,431 @@ value, scrolling continues until there is no more output.
     :bind (("C-x g" . magit-status)
            ("C-x C-g" . magit-status))
     :config
-    ;; don't verify where we are pushing
-    (setq magit-push-always-verify nil)
     ;; refine diffs always (hilight words)
     (setq magit-diff-refine-hunk nil)
-    ;; load magit-annex
-    (setq load-path
-          (append '("~/lib/emacs_el/magit-annex")
-                  load-path))
-    ;; load magit-vcsh
-    (setq load-path
-          (append '("~/lib/emacs_el/magit-vcsh")
-                  load-path))
     )
   (use-package magit-annex
     :ensure t
-  )
+    :load-path "~/lib/emacs_el/magit-annex/"
+    )
   (use-package magit-vcsh
     :ensure f ; currently not in melpa, so don't try to install
-  )
+    :load-path "~/lib/emacs_el/magit-vcsh/"
+    )
 #+END_SRC
 
 ** Perl
 #+BEGIN_SRC emacs-lisp
-  (require 'cperl-mode)
-  ;; 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
+    :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")))
+  ))
 #+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)
+  )
+
+#+END_SRC
+** SQL mode
+#+BEGIN_SRC emacs-lisp
+  ; load sql-indent when sql is loaded
+(use-package sql
+  :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)
+  )
+#+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\\'"
+    )
+  
+#+END_SRC
 ** Helm
 #+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 t
+    :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)
-    (global-set-key (kbd "M-x") 'helm-M-x)
     (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"))))
   )
 #+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
+
+*** 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
+#+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)
+
+              (setq projectile-make-test-cmd "make check"
+                    projectile-switch-project-action 'helm-projectile
+                    projectile-mode-line  '(:eval (format "»{%s}" (projectile-project-name))))
+
+              (projectile-global-mode)))
+#+end_src
+
+*** helm integration
+#+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)))
+#+end_src
+** Zap to char
+#+BEGIN_SRC emacs-lisp
+  (use-package avy-zap
+    :ensure t
+    :bind ("M-z" . avy-zap-up-to-char-dwim))
+#+END_SRC
 ** Hydra
-#+BEGIN_SRC emacs-lisp :tangle don-configuration.el
-(require 'don-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
+  "
+    ("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 "~/projects/org-notes/refile.org"))
+    ("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
+
+  "
+    ;; 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
-  (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
+    :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")))))
 #+END_SRC
 ** Reftex
 #+BEGIN_SRC emacs-lisp
@@ -432,6 +1046,17 @@ value, scrolling continues until there is no more output.
     (setq-default reftex-default-bibliography
                     '("~/projects/research/references.bib")))
 #+END_SRC
+** BibTex
+#+BEGIN_SRC emacs-lisp
+  (use-package bibtex
+    :config (setq bibtex-user-optional-fields
+                  (quote (("annote" "Personal annotation (ignored)")
+                          ("abstract" "")
+                  ("pmid" "")
+                  ("doi" ""))))
+    )
+
+#+END_SRC
 ** LaTeX
 #+BEGIN_SRC emacs-lisp
   (use-package tex
@@ -533,32 +1158,29 @@ value, scrolling continues until there is no more output.
               ("fixme" "{"))
             )
       )
+    (setq font-latex-fontify-script nil)
+    (setq font-latex-fontify-sectioning (quote color))
+    (setq font-latex-script-display (quote (nil)))
   )
 
 #+END_SRC
-*** Org-Gcal
-#+BEGIN_SRC emacs-lisp
-  (use-package calfw
-    :ensure f
-    )
-  (use-package calfw-org
-    :ensure f
-    )
-  (use-package org-gcal
-    :ensure f
-    :config '((if (file-readable-p "~/.hide/org_gcal.el")
-                  (load-file "~/.hide/org_gcal.el"))
-              )
-    )
-#+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 "DDirectory to change to: ")
+      (interactive "Directory to change to: ")
     
       (when (file-exists-p path)
         (ess-command (concat "setwd(\"" path "\")\n"))
@@ -577,11 +1199,11 @@ value, scrolling continues until there is no more output.
                 ((looking-at "^[a-zA-Z0-9_\.]+ ?<- ?function(.*{") 3)
                 (t 1000)))
         ))
-    (add-hook 'ess-mode-hook
-              '(lambda ()
-                 (local-set-key (kbd "C-c C-R")
-                                'dla/ess-region-remote-eval)))
-
+    (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***"))
+      kill-buffer "***essregionremoteeval***")
     ;; Don't restore history or save workspace image
     '(inferior-R-args "--no-restore-history --no-save")
     )
@@ -600,21 +1222,41 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori
 
 ** Polymode
 #+BEGIN_SRC emacs-lisp
-  (use-package polymode
-    :config
-    (use-package poly-R)
-    (use-package poly-noweb)
-    (use-package poly-markdown)
-    :mode ("\\.Snw" . poly-noweb+r-mode)
-    :mode ("\\.Rnw" . poly-noweb+r-mode)
-    :mode ("\\.Rmd" . poly-markdown+r-mode)
-    )
+(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)
+  )
+(use-package polymode
+  :ensure t
+  )
+
 #+END_SRC
 
 ** Outlining
 *** Outline magic
 #+BEGIN_SRC emacs-lisp
   (use-package outline-magic)
+#+END_SRC
+*** Outline mode
+#+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)))
+
 #+END_SRC
 ** Writeroom Mode
 #+BEGIN_SRC emacs-lisp
@@ -640,7 +1282,8 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori
 ** GhostText/Atomic Chrome
 #+BEGIN_SRC emacs-lisp
   (use-package atomic-chrome
-    :config (atomic-chrome-start-server)
+    :config
+    (ignore-errors (atomic-chrome-start-server))
     (setq atomic-chrome-buffer-open-style 'full)
     )
 #+END_SRC
@@ -651,30 +1294,192 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori
 [[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))
+    :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\\'")))
+    )
+#+END_SRC
+** Spamassassin Mode
+#+BEGIN_SRC emacs-lisp
+  (use-package spamassassin-mode
+    :commands spamassassin-mode
+    :ensure f
+    )
+#+END_SRC
+** Password Store
+#+BEGIN_SRC emacs-lisp
+  (use-package password-store
+    :ensure f
+    :commands password-store-edit password-store-generate
     )
 #+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))
+#+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")
+
+    ;; 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))
+#+END_SRC
+
+** Go language
+#+BEGIN_SRC emacs-lisp
+(use-package go-mode
+             :diminish "go"
+             :mode "\\.go"
+             )
+#+END_SRC
+
+** Expand region
+#+BEGIN_SRC emacs-lisp
+(use-package expand-region
+  :bind (("C-=" . 'er/expand-region))
+  )
+#+END_SRC
+
+** Dockerfile
+#+BEGIN_SRC emacs-lisp
+(use-package dockerfile-mode
+  :mode "Dockerfile"
+  )
+#+END_SRC
+
+* Email
+** Mutt
+*** Message-mode
+#+BEGIN_SRC emacs-lisp
+(use-package message
+  :ensure f
+  :diminish (message "✉")
+  :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 "✉")
+  :config
+  (defun my/message-mode-settings ()
+    (font-lock-add-keywords nil
+                '(("^[ \t]*>[ \t]*>[ \t]*>.*$"
+               (0 'message-multiply-quoted-text-face))
+              ("^[ \t]*>[ \t]*>.*$"
+               (0 'message-double-quoted-text-face))))
+    )
+
+  (defun my/post-attach-file ()
+    "Prompt for an attachment."
+    (interactive)
+    (let ((file (read-file-name "Attach file: " nil nil t nil)))
+      (my/header-attach-file file "")))
+
+  (defun my/header-attach-file (file description)
+    "Attach a FILE to the current message (works with Mutt).
+  Argument DESCRIPTION MIME description."
+    (interactive "fAttach file: \nsDescription: ")
+    (when (> (length file) 0)
+  (save-excursion
+    (save-match-data
+      (save-restriction
+        (widen)
+        (goto-char (point-min))
+        (search-forward-regexp "^$")
+        (insert (concat "Attach: " (replace-regexp-in-string "\\([[:space:]\\]\\)" "\\\\\\1" (file-truename file)) " "
+                description "\n"))
+        (message (concat "Attached '" file "'."))
+        (setq post-has-attachment t))))))
+
+  (setq mail-yank-prefix "> ")
+  (setq mail-header-separator "") ; fix broken header detection
+)
+#+END_SRC
+*** Muttrc mode
+#+BEGIN_SRC emacs-lisp
+  (use-package muttrc-mode
+    :mode "muttngrc"
+    :mode "muttrc"
+  )
+
+#+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))
+#+END_SRC
 * Org Mode
 ** Use-package and load things
 #+BEGIN_SRC emacs-lisp
 
   (use-package org
-    :config 
-
+    :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))
 #+END_SRC
 ** Agenda Configuration
 #+BEGIN_SRC emacs-lisp
-  ;; The following lines are always needed. Choose your own keys.
-  (add-to-list 'auto-mode-alist '("\\.\\(org\\|org_archive\\|txt\\)$" . org-mode))
-  (global-set-key "\C-cl" 'org-store-link)
-  (global-set-key "\C-ca" 'org-agenda)
-  (global-set-key "\C-cb" 'org-iswitchb)
+  :config
   (setq-default org-log-done 'time)
   (setq-default org-agenda-ndays 5)
 
+  (setq org-agenda-sticky t)
+  (defun dla/show-org-agenda ()
+    (interactive)
+    (let (agendabuffer
+          '(delq nil 
+                (mapcar (lambda (x)
+                          (and (string-match-p
+                                "\*Org Agenda.*\*"
+                                (buffer-name x))
+                               x)
+                          )
+                        (buffer-list))))
+      (if agendabuffer
+          (switch-to-buffer
+           (buffer-name agendabuffer))
+        (org-agenda-list)))
+      (delete-other-windows))
+
   ;; agenda configuration
   ;; Do not dim blocked tasks
   (setq org-agenda-dim-blocked-tasks nil)
@@ -768,7 +1573,8 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori
             "~/projects/org-notes/wildman.org"
             "~/projects/org-notes/uddin.org"
             "~/projects/org-notes/reviews.org"
-            "~/projects/org-notes/hpcbio.org"
+            "~/projects/org-notes/laurel.org"
+            "~/projects/org-notes/from-calendar.org"
             "~/org-mode/from-mobile.org"
             "~/projects/org-notes/fh.org")))
 
@@ -787,17 +1593,11 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori
     (with-temp-buffer
       (dolist (org-agenda-file org-agenda-files)
         (insert-file-contents org-agenda-file nil)
-        (end-of-buffer)
+        (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)
-  ;; add automatic reminders for appointments
-  (defadvice  org-agenda-redo (after org-agenda-redo-add-appts)
-    "Pressing `r' on the agenda will also add appointments."
-    (progn 
-      (setq appt-time-msg-list nil)
-      (org-agenda-to-appt)))
 
 #+END_SRC
 ** General config
@@ -806,12 +1606,12 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori
   (setq org-columns-default-format "%40ITEM(Task) %6Effort{:} %CLOCKSUM %PRIORITY %TODO %13SCHEDULED %13DEADLINE %TAGS")
 
   (setq org-default-notes-file "~/projects/org-notes/notes.org")
-  (setq org-id-link-to-org-use-id t)
+  (setq org-id-link-to-org-use-id 'use-existing)
 #+END_SRC
 ** Capture Templates
 #+BEGIN_SRC emacs-lisp
   (setq org-capture-templates  ;; mail-specific note template, identified by "m"
-        '(("m" "Mail" entry (file "~/projects/org-notes/refile.org")
+        `(("m" "Mail" entry (file "~/projects/org-notes/refile.org")
            "* %?\n\n  Source: %u, [[%:link][%:description]]\n  %:initial")
           ("t" "todo" entry (file "~/projects/org-notes/refile.org")
            "* TODO %?\n  :PROPERTIES:\n  :END:\n  :LOGBOOK:\n  :END:\n%U\n%a\n" :clock-in t :clock-resume t)
@@ -833,8 +1633,10 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori
            "* TODO Get/Read %? \n%U" :clock-in t :clock-resume t)
           ("p" "Phone call" entry (file "~/projects/org-notes/refile.org")
            "* PHONE %? :PHONE:\n%U" :clock-in t :clock-resume t)
-          ("J" "job" entry (file "~/projects/org-notes/refile.org")
-           "* TODO Apply for %a%? :job:\nSCHEDULED: %(format-time-string \"<%Y-%m-%d 17:00-17:30>\")\n%U\n%a\n" :clock-in t :clock-resume t)
+           ("J" "job" entry (file+olp "~/projects/org-notes/notes.org"
+                                       "Jobs"
+                                       ,(format-time-string "Positions %Y"))
+           "* TODO Apply for %? :job:\nSCHEDULED: <%<%Y-%m-%d>>\n%U\n%x\n" :clock-in t :clock-resume t)
           ("h" "Habit" entry (file "~/projects/org-notes/refile.org")
            "* NEXT %?\n%U\n%a\nSCHEDULED: %(format-time-string \"<%Y-%m-%d .+1d/3d>\")\n:PROPERTIES:\n:STYLE: habit\n:REPEAT_TO_STATE: NEXT\n:END:\n%a\n")
           )
@@ -861,50 +1663,43 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori
 #+END_SRC
 ** Org mode key bindings
 #+BEGIN_SRC emacs-lisp
-  ; org mode configuration from http://doc.norang.ca/org-mode.html
+  ;; org mode configuration from http://doc.norang.ca/org-mode.html
   ;; Custom Key Bindings
-  (global-set-key (kbd "<f12>") 'org-agenda)
-  (global-set-key (kbd "<f5>") 'bh/org-todo)
-  (global-set-key (kbd "<S-f5>") 'bh/widen)
-  (global-set-key (kbd "<f7>") 'bh/set-truncate-lines)
-  (global-set-key (kbd "<f8>") 'org-cycle-agenda-files)
-  (global-set-key (kbd "<f9> <f9>") 'bh/show-org-agenda)
-  (global-set-key (kbd "<f9> b") 'bbdb)
-  (global-set-key (kbd "<f9> c") 'calendar)
-  (global-set-key (kbd "<f9> f") 'boxquote-insert-file)
-  (global-set-key (kbd "<f9> h") 'bh/hide-other)
-  (global-set-key (kbd "<f9> n") 'bh/toggle-next-task-display)
-  (global-set-key (kbd "<f9> w") 'widen)
-
-  ; 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)))
-
-  (global-set-key (kbd "<f9> I") 'bh/punch-in)
-  (global-set-key (kbd "<f9> O") 'bh/punch-out)
-
-  (global-set-key (kbd "<f9> o") 'bh/make-org-scratch)
-
-  (global-set-key (kbd "<f9> r") 'boxquote-region)
-  (global-set-key (kbd "<f9> s") 'bh/switch-to-scratch)
-
-  (global-set-key (kbd "<f9> t") 'bh/insert-inactive-timestamp)
-  (global-set-key (kbd "<f9> T") 'bh/toggle-insert-inactive-timestamp)
-
-  (global-set-key (kbd "<f9> v") 'visible-mode)
-  (global-set-key (kbd "<f9> l") 'org-toggle-link-display)
-  (global-set-key (kbd "<f9> SPC") 'bh/clock-in-last-task)
-  (global-set-key (kbd "C-<f9>") 'previous-buffer)
-  (global-set-key (kbd "M-<f9>") 'org-toggle-inline-images)
-  (global-set-key (kbd "C-x n r") 'narrow-to-region)
-  (global-set-key (kbd "C-<f10>") 'next-buffer)
-  (global-set-key (kbd "<f11>") 'org-clock-goto)
-  (global-set-key (kbd "C-<f11>") 'org-clock-in)
-  (global-set-key (kbd "C-s-<f12>") 'bh/save-then-publish)
-  (global-set-key (kbd "C-c c") 'org-capture)
-
+  :bind* (("<f9> a" . org-agenda)
+          ("<f9> I" . bh/punch-in)
+          ("<f9> O" . bh/punch-out)
+          ("<f9> SPC" . bh/clock-in-last-task)
+          ("<f12>" . dla/show-org-agenda)
+          ;; ("<f5>" . bh/org-todo)
+          ("<S-f5>" . bh/widen)
+          ("<f7>" . bh/set-truncate-lines)
+          ("<f8>" . org-cycle-agenda-files)
+          ("<f9> <f9>" . dla/show-org-agenda)
+          ("<f9> b" . bbdb)
+          ("<f9> c" . calendar)
+          ("<f9> f" . boxquote-insert-file)
+          ("<f9> h" . bh/hide-other)
+          ("<f9> n" . bh/toggle-next-task-display)
+          ("<f9> w" . widen)
+
+          ("<f9> r" . boxquote-region)
+          ("<f9> s" . bh/switch-to-scratch)
+
+          ("<f9> t" . bh/insert-inactive-timestamp)
+          ("<f9> T" . bh/toggle-insert-inactive-timestamp)
+
+          ("<f9> v" . visible-mode)
+          ("<f9> l" . org-toggle-link-display)
+          ("<f9> SPC" . bh/clock-in-last-task)
+          ("C-<f9>" . previous-buffer)
+          ("M-<f9>" . org-toggle-inline-images)
+          ("C-x n r" . narrow-to-region)
+          ("C-<f10>" . next-buffer)
+          ("<f11>" . org-clock-goto)
+          ("C-<f11>" . org-clock-in)
+          ("C-s-<f12>" . bh/save-then-publish)
+          ("C-c c" . org-capture))
+  :config
 #+END_SRC
 ** Utility Functions
 #+BEGIN_SRC emacs-lisp
@@ -926,11 +1721,6 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori
       (set-window-start (selected-window)
                         (window-start (selected-window)))))
 
-  (defun bh/make-org-scratch ()
-    (interactive)
-    (find-file "/tmp/publish/scratch.org")
-    (gnus-make-directory "/tmp/publish"))
-
   (defun bh/switch-to-scratch ()
     (interactive)
     (switch-to-buffer "*scratch*"))
@@ -945,11 +1735,26 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori
   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)))
 #+END_SRC
+** Org ID locations
+#+BEGIN_SRC emacs-lisp
+(use-package find-lisp
+  :ensure t)
+(setq org-agenda-text-search-extra-files
+      (append '(agenda-archives)
+              (find-lisp-find-files "~/projects/org-notes" "\.org$")
+              (find-lisp-find-files "~/projects/org-notes" "\.org_archive$")
+              ))
+#+END_SRC
 ** Keywords (TODO)
 #+BEGIN_SRC emacs-lisp
   (setq org-todo-keywords
@@ -1050,7 +1855,9 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori
     (setq my-org-protocol-flag t))
 
   (defadvice org-insert-todo-heading (after dla/create-id activate)
-    (org-id-get-create)
+    (unless (org-in-item-p)
+      (org-id-get-create)
+      )
     )
 
   ;; org modules
@@ -1071,11 +1878,11 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori
   (org-add-link-type "mutt" 'open-mail-in-mutt)
 
   (defun my-org-mode-setup ()
-    (load-library "reftex")
+    (load-library "reftex")
     (and (buffer-file-name)
          (file-exists-p (buffer-file-name))
          (progn
-           (reftex-parse-all)
+           (reftex-parse-all)
            (reftex-set-cite-format
             '((?b . "[[bib:%l][%l-bib]]")
               (?n . "[[notes:%l][%l-notes]]")
@@ -1153,34 +1960,38 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori
   (setq org-icalendar-timezone "America/Los_Angeles")
   (setq org-icalendar-use-scheduled '(todo-start event-if-todo))
   ;; we already add the id manually
-  ;; (setq org-icalendar-store-UID t)
+  (setq org-icalendar-store-UID t)
 
 #+END_SRC
 ** General Org Babel Configuration
 #+BEGIN_SRC emacs-lisp
-  ;; org babel support
-  (org-babel-do-load-languages
-   'org-babel-load-languages
-   '((emacs-lisp . t )
-     (R . t)
-     (latex . t)
-     (ditaa . t)
-     (dot . t)
-     ))
-  ;; use graphviz-dot for dot things
-  (add-to-list 'org-src-lang-modes '("dot" . graphviz-dot))
-  ;; org-babel-by-backend
-  (defmacro org-babel-by-backend (&rest body)
-     `(case (if (boundp 'backend) 
-                (org-export-backend-name backend)
-              nil) ,@body))
-
-  (defun my/fix-inline-images ()
-    (when org-inline-image-overlays
-      (org-redisplay-inline-images)))
-
-  (add-hook 'org-babel-after-execute-hook
-             'my/fix-inline-images)
+;; org babel support
+(org-babel-do-load-languages
+ 'org-babel-load-languages
+ '((emacs-lisp . t )
+   (R . t)
+   (latex . t)
+   (ditaa . t)
+   (dot . t)
+   ))
+;; set the right path to ditaa.jar
+(setq org-ditaa-jar-path "/usr/share/ditaa/ditaa.jar")
+;; use graphviz-dot for dot things
+(add-to-list 'org-src-lang-modes '("dot" . graphviz-dot))
+;; do not indent begin_src blocks
+(setq org-edit-src-content-indentation 0)
+;; org-babel-by-backend
+(defmacro org-babel-by-backend (&rest body)
+   `(case (if (boundp 'backend) 
+              (org-export-backend-name backend)
+            nil) ,@body))
+
+(defun my/fix-inline-images ()
+  (when org-inline-image-overlays
+    (org-redisplay-inline-images)))
+
+(add-hook 'org-babel-after-execute-hook
+           'my/fix-inline-images)
 
 #+END_SRC
 ** LaTeX configuration
@@ -1570,62 +2381,92 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori
             (unless (bolp) (insert "\n"))))))))))))
 
 #+END_SRC
-** End use-package
+** Org-Gcal
 #+BEGIN_SRC emacs-lisp
+(use-package calfw
+  :ensure f
+  )
+(use-package calfw-org
+  :ensure f
+  )
+(use-package org-gcal
+  :if (file-readable-p "~/.hide/org_gcal.el")
+  :ensure f
+  :config '((if (file-readable-p "~/.hide/org_gcal.el")
+                (load-file "~/.hide/org_gcal.el"))
+            )
   )
 #+END_SRC
-* Keybindings
-** Override other things
+** appt integration
 #+BEGIN_SRC emacs-lisp
-  ; apparently things like to step on C-;, so we'll use a hack from
-  ; http://stackoverflow.com/questions/683425/globally-override-key-binding-in-emacs/5340797#5340797 to fix this
-
-  (defvar my-keys-minor-mode-map (make-keymap) "my-keys-minor-mode keymap.")
-
-  ; use mc everywhere
-  (define-key my-keys-minor-mode-map (kbd "C-;") 'mc/mark-all-dwim)
-  ;; use outline mode keybindings everywhere
-  ;; (define-key my-keys-minor-mode-map (kbd "C-;") 'my/mydra-outline/body)
-
-  (define-minor-mode my-keys-minor-mode
-    "A minor mode so that my key settings override annoying major modes."
-    t " my-keys" 'my-keys-minor-mode-map)
+  (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
+    (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))))
+      )
+    )
 
-  (my-keys-minor-mode 1)
-  (defun my-minibuffer-setup-hook ()
-    (my-keys-minor-mode 0))
 
-  (add-hook 'minibuffer-setup-hook 'my-minibuffer-setup-hook)
-  (defadvice load (after give-my-keybindings-priority)
-    "Try to ensure that my keybindings always have priority."
-    (if (not (eq (car (car minor-mode-map-alist)) 'my-keys-minor-mode))
-        (let ((mykeys (assq 'my-keys-minor-mode minor-mode-map-alist)))
-          (assq-delete-all 'my-keys-minor-mode minor-mode-map-alist)
-          (add-to-list 'minor-mode-map-alist mykeys))))
-  (ad-activate 'load)
 #+END_SRC
+** End use-package
+#+BEGIN_SRC emacs-lisp
+  )
+#+END_SRC
+* Keybindings
 ** Goto line
 #+BEGIN_SRC emacs-lisp
   (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"))
+#+END_SRC
 * Misc (uncharacterized)
 #+BEGIN_SRC emacs-lisp
-  (setq bibtex-user-optional-fields (quote (("annote" "Personal annotation (ignored)") ("abstract" "") ("pmid" "") ("doi" ""))))
-  (setq calendar-latitude 40.11)
-  (setq calendar-longitude -88.24)
+  (setq calendar-latitude 38.6)
+  (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)
-  (setq debian-changelog-mailing-address "don@debian.org")
-  (display-time)
-  (setq display-time-24hr-format t)
-  (setq display-time-day-and-date t)
-  (display-time-mode 1)
-  (setq font-latex-fontify-script nil)
-  (setq font-latex-fontify-sectioning (quote color))
-  (setq font-latex-script-display (quote (nil)))
-  (global-auto-revert-mode 1)
   (global-font-lock-mode 1)
   (icomplete-mode 1)
   (setq log-edit-keep-buffer t)
@@ -1633,10 +2474,6 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori
   (setq markdown-enable-math t)
   (setq markdown-follow-wiki-link-on-enter nil)
   (setq mutt-alias-file-list (quote ("~/.mutt/aliases" "~/.mail_aliases")))
-  (setq post-email-address "don@donarmstrong.com")
-  (setq post-kill-quoted-sig nil)
-  (setq post-mail-message "mutt\\(ng\\|\\)-[a-z0-9]+-[0-9]+-.*")
-  (setq post-uses-fill-mode nil)
   (setq ps-footer-font-size (quote (8 . 10)))
   (setq ps-header-font-size (quote (8 . 10)))
   (setq ps-header-title-font-size (quote (10 . 10)))
@@ -1666,91 +2503,9 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori
   (fset 'perl-mode 'cperl-mode)
   ;;(load-file "cperl-mode.el")
 
-  (require 'vcl-mode)
-
-  (require 'tex-site)
-  ;;(require 'psvn)
-  ;;(require 'ecasound)
-  ;;(require 'emacs-wiki)
-  (require 'bibtex)
-  (require 'post)
-  ;;(require 'fixme)
-  ; (require 'google-weather)
-  ; (require 'org-google-weather)
-  ; (setq-default org-google-weather-format "%i %c, [%l,%h] %s %C")
-  
-  (global-set-key "\C-xp" 'server-edit)
-
-  (setq-default auto-mode-alist (cons '("\.wml$" . 
-                    (lambda () (html-mode) (auto-fill-mode)))
-                  auto-mode-alist))
-
-
-  ; use markdown mode for mdwn files
-  (add-to-list 'auto-mode-alist '("\\.mdwn$" . markdown-mode))
-  (add-to-list 'auto-mode-alist '("\\.md$" . markdown-mode))
-
-
   ;; tramp configuration
   (setq tramp-use-ssh-controlmaster-options nil)
 
-  ; mail configuration
-  (add-to-list 'auto-mode-alist '("muttng-[a-z0-9]+-[0-9]+-" . message-mode))
-  (add-to-list 'auto-mode-alist '("muttngrc" . muttrc-mode))
-
-  (add-to-list 'auto-mode-alist '("mutt-[a-z0-9]+-[0-9]+-" . message-mode))
-  (add-to-list 'auto-mode-alist '("muttrc" . muttrc-mode))
-  (defun my-message-mode-settings ()
-    (font-lock-add-keywords nil
-                            '(("^[ \t]*>[ \t]*>[ \t]*>.*$"
-                               (0 'message-multiply-quoted-text-face))
-                              ("^[ \t]*>[ \t]*>.*$"
-                               (0 'message-double-quoted-text-face))))
-    (local-set-key (kbd "C-c C-a") 'my-post-attach-file)
-    )
-  (add-hook 'message-mode-hook 'my-message-mode-settings)
-
-  (defun my-post-attach-file ()
-    "Prompt for an attachment."
-    (interactive)
-    (let ((file (read-file-name "Attach file: " nil nil t nil))
-          (description (string-read "Description: ")))
-      (my-header-attach-file file description)))
-
-  (symbol-function 'my-post-attach-file)
-
-  (defun my-header-attach-file (file description)
-    "Attach a FILE to the current message (works with Mutt).
-  Argument DESCRIPTION MIME description."
-    (interactive "fAttach file: \nsDescription: ")
-    (when (> (length file) 0)
-      (save-excursion
-        (save-match-data
-          (save-restriction
-            (widen)
-            (goto-char (point-min))
-            (search-forward-regexp "^$")
-            (insert (concat "Attach: " (replace-regexp-in-string "\\([[:space:]\\]\\)" "\\\\\\1" (file-truename file)) " "
-                            description "\n"))
-            (message (concat "Attached '" file "'."))
-            (setq post-has-attachment t))))))
-
-
-
-  (setq mail-yank-prefix "> ")
-
-  ;; self-insert-command hack.
-  ;;   Without this, "if<SP>" expands to
-  ;;   if ( -!-) {
-  ;;   }
-  ;;   which really should be,
-  ;;   if (-!-) {
-  ;;   }
-
-
-
-  ;(load-library "php-mode")
-
   (setq-default c-indent-level 4)
   (setq-default c-brace-imaginary-offset 0)
   (setq-default c-brace-offset -4)
@@ -1783,60 +2538,35 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori
     )
 
   (column-number-mode t)
-
-  (server-start)
-
-  ; (require 'mode-compile)
-
-  (defadvice server-process-filter (after post-mode-message first activate)
-    "If the buffer is in post mode, overwrite the server-edit
-      message with a post-save-current-buffer-and-exit message."
-    (if (eq major-mode 'post-mode)
-        (message
-         (substitute-command-keys "Type \\[describe-mode] for help composing; \\[post-save-current-buffer-and-exit] when done."))))
-                      ; This is also needed to see the magic message.  Set to a higher
-                      ; number if you have a faster computer or read slower than me.
-  '(font-lock-verbose 1000)
-  ;(setq-default server-temp-file-regexp "mutt\(-\|ng-\)")
-  ; (add-hook 'server-switch-hook 
-  ;     (function (lambda()
-  ;             (cond ((string-match "Post" mode-name)
-  ;                (post-goto-body)))
-  ;             set-buffer-file-coding-system 'utf-8
-  ;             )))
-  ; 
-
-  (add-hook 'post-mode-hook
-        (auto-fill-mode nil)
-        )
-  ; abbrev mode settings
-  ; 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))
-
-  ; for now, use abbrev mode everywhere
-  (setq default-abbrev-mode t)
-
-
-  (defun insert-function-documentation ()
-    "Insert function documentation"
-    (interactive)
-    (insert-file-contents "/home/don/lib/templates/perl_function_documentation" nil))
-  (global-set-key "\M-f" 'insert-function-documentation)
-
-  (eval-after-load "lilypond-mode" 
-    '(progn
-       (load-library "lyqi-mode")
-       (define-key LilyPond-mode-map "\C-cq" 'lyqi-mode)))
-
-  (autoload 'spamassassin-mode "spamassassin-mode" nil t)
-
-  (desktop-load-default)
-  (desktop-read)
+#+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)
+  )
+#+END_SRC
+** Misc (Uncharacterized)
+#+BEGIN_SRC emacs-lisp
   '(icomplete-mode on)
   (custom-set-faces
    ;; custom-set-faces was added by Custom.
@@ -1859,18 +2589,18 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori
    ; Outline-minor-mode key map
    (define-prefix-command 'cm-map nil "Outline-")
    ; HIDE
-   (define-key cm-map "q" 'hide-sublevels)    ; Hide everything but the top-level headings
-   (define-key cm-map "t" 'hide-body)         ; Hide everything but headings (all body lines)
-   (define-key cm-map "o" 'hide-other)        ; Hide other branches
-   (define-key cm-map "c" 'hide-entry)        ; Hide this entry's body
-   (define-key cm-map "l" 'hide-leaves)       ; Hide body lines in this entry and sub-entries
-   (define-key cm-map "d" 'hide-subtree)      ; Hide everything in this entry and sub-entries
+   (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" 'show-all)          ; Show (expand) everything
-   (define-key cm-map "e" 'show-entry)        ; Show this heading's body
-   (define-key cm-map "i" 'show-children)     ; Show this heading's immediate child sub-headings
-   (define-key cm-map "k" 'show-branches)     ; Show all sub-headings under this heading
-   (define-key cm-map "s" 'show-subtree)      ; Show (expand) everything in this heading & below
+   (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
@@ -1878,51 +2608,6 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori
    (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)
-
-
-  ; debian stuff
-  (setq-default debian-changelog-mailing-address "don@debian.org")
-  (setq-default debian-changelog-full-name "Don Armstrong")
-
-  ; ediff configuration
-  ; don't use the multi-window configuration
-  (setq ediff-window-setup-function 'ediff-setup-windows-plain)
-
-  ; 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)
-
-  (require 'multi-web-mode)
-  (setq mweb-default-major-mode 'html-mode)
-  (setq mweb-tags '((php-mode "<\\?php\\|<\\? \\|<\\?=" "\\?>")
-                    (js-mode "<script +\\(type=\"text/javascript\"\\|language=\"javascript\"\\)[^>]*>" "</script>")
-                    (css-mode "<style +type=\"text/css\"[^>]*>" "</style>")))
-  (setq mweb-filename-extensions '("php" "htm" "html" "ctp" "phtml" "php4" "php5"))
-  (multi-web-global-mode 1)
-
-  ;;; alias the new `flymake-report-status-slim' to
-  ;;; `flymake-report-status'
-  (defalias 'flymake-report-status 'flymake-report-status-slim)
-  (defun flymake-report-status-slim (e-w &optional status)
-    "Show \"slim\" flymake status in mode line."
-    (when e-w
-      (setq flymake-mode-line-e-w e-w))
-    (when status
-      (setq flymake-mode-line-status status))
-    (let* ((mode-line " Φ"))
-      (when (> (length flymake-mode-line-e-w) 0)
-        (setq mode-line (concat mode-line ":" flymake-mode-line-e-w)))
-      (setq mode-line (concat mode-line flymake-mode-line-status))
-      (setq flymake-mode-line mode-line)
-      (force-mode-line-update)))
-
-  ; load sql-indent when sql is loaded
-  (eval-after-load "sql"
-    '(load-library "sql-indent"))
-
   ; 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 ()
@@ -2018,11 +2703,6 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori
       )
   ; (add-hook 'tty-setup-hook 'fix-up-tmux-keys)
 
-  ; procmailmode configuration
-  (load "procmail_mode")
-
-  (load "mode-line-cleaner")
-
   (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)
@@ -2033,34 +2713,21 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori
       (clear-visited-file-modtime)
       (not-modified)))
   (ad-activate 'ask-user-about-supersession-threat)
+#+END_SRC
 
-  ; apparently things like to step on C-;, so we'll use a hack from
-  ; http://stackoverflow.com/questions/683425/globally-override-key-binding-in-emacs/5340797#5340797 to fix this
-
-  (defvar my-keys-minor-mode-map (make-keymap) "my-keys-minor-mode keymap.")
-
-  ; use iedit everywhere
-  (define-key my-keys-minor-mode-map (kbd "C-;") 'mc/mark-all-dwim)
-
-  (define-minor-mode my-keys-minor-mode
-    "A minor mode so that my key settings override annoying major modes."
-    t " my-keys" 'my-keys-minor-mode-map)
-
-  (my-keys-minor-mode 1)
-  (defun my-minibuffer-setup-hook ()
-    (my-keys-minor-mode 0))
+* Start Server
+#+BEGIN_SRC emacs-lisp
+  (use-package server
+    :config
+    (setq server-name
+          (or (getenv "EMACS_SERVER_NAME")
+              "server"))
+    (unless (server-running-p)
+      (global-set-key "\C-xp" 'server-edit)
+      (server-start)))
+#+END_SRC
 
-  (add-hook 'minibuffer-setup-hook 'my-minibuffer-setup-hook)
-  (defadvice load (after give-my-keybindings-priority)
-    "Try to ensure that my keybindings always have priority."
-    (if (not (eq (car (car minor-mode-map-alist)) 'my-keys-minor-mode))
-        (let ((mykeys (assq 'my-keys-minor-mode minor-mode-map-alist)))
-          (assq-delete-all 'my-keys-minor-mode minor-mode-map-alist)
-          (add-to-list 'minor-mode-map-alist mykeys))))
-  (ad-activate 'load)
-  (global-set-key "\M- " 'hippie-expand)
 
-#+END_SRC
 
 * END
 #+BEGIN_SRC emacs-lisp