]> git.donarmstrong.com Git - lib.git/blobdiff - emacs_el/configuration/don-configuration.org
Switch to capf primarily in company, fix headers and pieces
[lib.git] / emacs_el / configuration / don-configuration.org
index ca5538a53d3f61cb8dce7704b4c74253e7c7ebee..003a8188062e24dbba26cc85a0113b40fe1087f5 100644 (file)
@@ -1,4 +1,5 @@
 #+PROPERTY: header-args:emacs-lisp :tangle don-configuration.el
+#+OPTIONS: auto-id:f
 * Load debugger
 
 # if for some reason, things get pear-shaped, we want to be able to
@@ -7,6 +8,25 @@
 #+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
+(eval-when-compile
+  (let ((default-directory "~/var/emacs/elpa"))
+    (normal-top-level-add-subdirs-to-load-path))
+  )
+(add-to-list 'load-path '"~/lib/emacs_el/")
+(let ((default-directory "~/lib/emacs_el/"))
+  (normal-top-level-add-subdirs-to-load-path))
+(let ((default-directory "~/var/emacs/elpa"))
+  (normal-top-level-add-subdirs-to-load-path))
+(setq package-user-dir "~/var/emacs/elpa")
+#+END_SRC
 * Initial startup stuff
 ** Disable startup screen
 #+BEGIN_SRC emacs-lisp
 #+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 'diminish)
-  (require 'bind-key)
+#+BEGIN_SRC emacs-lisp
+  (require 'use-package)
+(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)))
+
 #+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)
+    :config
+    (setq paradox-execute-asynchronously t)
+    (setq paradox-github-token t) ; I don't want to be prompted about this integration
     )
 #+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
   ;; Set the custom file to /dev/null and don't bother to load it
@@ -98,10 +78,10 @@ load  [[https://github.com/jwiegley/use-package/][use-package]] even faster
 #+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
@@ -132,6 +112,14 @@ load  [[https://github.com/jwiegley/use-package/][use-package]] even faster
   (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
@@ -142,7 +130,7 @@ load  [[https://github.com/jwiegley/use-package/][use-package]] even faster
 #+BEGIN_SRC emacs-lisp
   (use-package flyspell
     :ensure t
-    :diminish flyspell-mode 🐝
+    :delight flyspell-mode 🐝
     :config
     (add-hook 'text-mode-hook 'turn-on-flyspell)
     (add-hook 'c-mode-common-hook 'flyspell-prog-mode)
@@ -153,10 +141,40 @@ load  [[https://github.com/jwiegley/use-package/][use-package]] even faster
     )
 
 #+END_SRC
+
+** Flycheck
+#+begin_src emacs-lisp :tangle yes
+(use-package flycheck
+  :ensure t
+  :delight 🦋
+  :if (version<= "24.4" emacs-version)
+  :commands flycheck-mode
+  :hook ((prog-mode . flycheck-mode)
+         )
+)
+;; Other pkgs
+(use-package flycheck-tip
+  :ensure t
+  :commands 'flycheck-tip-cycle
+  :after flycheck
+  :bind (:map flycheck-mode-map
+              ("C-c C-n" . flycheck-tip-cycle)))
+
+(use-package flycheck-package
+  :ensure t)
+
+(use-package flycheck-checkpatch
+  :ensure t
+  :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 :tangle yes
   (use-package flymake
-    :diminish "Φ")
+    :delight "Φ")
 #+end_src
 
 ** Winnermode
@@ -168,7 +186,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)
@@ -294,9 +312,9 @@ value, scrolling continues until there is no more output.
 #+END_SRC
 
 ** Mode line cleaning
-*** Diminish
+*** Delight
 #+BEGIN_SRC emacs-lisp
-  (use-package diminish
+  (use-package delight
     :ensure t)
 #+END_SRC
 
@@ -310,6 +328,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)
@@ -344,22 +363,22 @@ value, scrolling continues until there is no more output.
 ** Snippets
 *** Yasnippet
 #+BEGIN_SRC emacs-lisp
-  (use-package yasnippet
-    :ensure t
-    :diminish yas-minor-mode
-    :config (progn
-              (yas-global-mode)
-              (setq yas-verbosity 1)
-              (define-key yas-minor-mode-map (kbd "<tab>") nil)
-              (define-key yas-minor-mode-map (kbd "TAB") nil)
-              (define-key yas-minor-mode-map (kbd "<backtab>") 'yas-expand)
-              (setq yas-snippet-dirs '("~/lib/emacs_el/snippets/"
-                                       "~/lib/emacs_el/yasnippet-snippets/snippets/"))
-              (add-to-list 'hippie-expand-try-functions-list
-                               'yas-hippie-try-expand)
-              (yas-reload-all)
-              )
-    )
+(use-package yasnippet
+  :ensure t
+  :delight yas-minor-mode
+  :config (progn
+            (yas-global-mode)
+            (setq yas-verbosity 1)
+            (define-key yas-minor-mode-map (kbd "<tab>") nil)
+            (define-key yas-minor-mode-map (kbd "TAB") nil)
+            (define-key yas-minor-mode-map (kbd "<backtab>") nil)
+            (setq yas-snippet-dirs '("~/lib/emacs_el/snippets/"
+                                     "~/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
@@ -370,55 +389,116 @@ value, scrolling continues until there is no more output.
            )
     )
 #+END_SRC
+** Treemacs: Tree file viewer
+#+BEGIN_SRC emacs-lisp
+;; Provides workspaces with file browsing (tree file viewer)
+;; and project management when coupled with `projectile`.
+
+(use-package treemacs
+  :ensure t
+  :defer t
+  :config
+  (setq treemacs-no-png-images t
+         treemacs-width 24)
+  :bind ("C-c t" . treemacs))
+#+END_SRC
+** LSP mode
+#+BEGIN_SRC emacs-lisp
+(use-package lsp-mode
+  :ensure t
+  :defer t
+  :commands (lsp lsp-deferred)
+  :init (setq lsp-keymap-prefix "C-c l")
+  :hook (python-mode . lsp-deferred))
+;; Provides visual help in the buffer 
+;; For example definitions on hover. 
+;; The `imenu` lets me browse definitions quickly.
+(use-package lsp-ui
+  :ensure t
+  :defer t
+  :config
+  (setq lsp-ui-sideline-enable nil
+           lsp-ui-doc-delay 2)
+  :hook (lsp-mode . lsp-ui-mode)
+  :bind (:map lsp-ui-mode-map
+             ("C-c i" . lsp-ui-imenu)))
+;; Language server for Python 
+;; Read the docs for the different variables set in the config.
+(use-package lsp-pyright
+  :ensure t
+  :defer t
+  :config
+  (setq lsp-clients-python-library-directories '("/usr/" "~/miniconda3/pkgs"))
+  (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 "~/miniconda3/envs")
+  :hook ((python-mode . (lambda () 
+                          (require 'lsp-pyright) (lsp-deferred)))))
+#+END_SRC
 ** 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-key "C-n"   #'company-select-next company-active-map)
-    (bind-key "C-p"   #'company-select-previous company-active-map)
-    ; (bind-key "<tab>" #'company-complete company-active-map)
-    (bind-key "M-?"   #'company-show-doc-buffer company-active-map)
-    (bind-key "M-."   #'company-show-location company-active-map)
-    (bind-key "M-/"   #'company-complete-common org-mode-map)
-    )
+(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)")
+  (setq company-backends '(company-capf
+                           company-keywords
+                           company-semantic
+                           company-files
+                           company-etags
+                           company-elisp
+                           company-clang
+                           company-irony-c-headers
+                           company-irony
+                           company-jedi
+                           company-cmake
+                           company-ispell
+                           company-yasnippet))
+  (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)))
-
-              (setq company-c-headers-path-system
-                    #'malb/ede-object-system-include-path)
+(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)))
 
-              (add-to-list 'company-backends #'company-c-headers)))
+            (setq company-c-headers-path-system
+                  #'malb/ede-object-system-include-path)))
 #+END_SRC
 *** Python
 #+BEGIN_SRC emacs-lisp
-(use-package company-anaconda
+(use-package company-jedi
   :ensure t
-  :config (add-to-list 'company-backends #'company-anaconda))
+  :hook (python-mode  . 'jedi:setup)
+  :config
+  (setq jedi:complete-on-dot t)
+  )
 #+END_SRC
 *** Perl
 #+BEGIN_SRC emacs-lisp
@@ -454,6 +534,7 @@ value, scrolling continues until there is no more output.
               )
     )
 #+END_SRC
+**** Bibtex
 #+BEGIN_SRC emacs-lisp
   (use-package company-bibtex
     :ensure t
@@ -461,64 +542,64 @@ value, scrolling continues until there is no more output.
 #+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
+#+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]])
+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.
+*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.")
+#+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))))
+(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
+(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
+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
 
@@ -534,58 +615,58 @@ value, scrolling continues until there is no more output.
  ([[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")
+(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
-     ;; 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)
+     ((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)
 #+END_SRC
 ** Tinyprocmail
 
@@ -612,14 +693,22 @@ value, scrolling continues until there is no more output.
     :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/"
+    :ensure t
     )
 #+END_SRC
 
+*** Forge (github/gitlab)
+#+BEGIN_SRC emacs-lisp
+(use-package forge
+  :ensure t
+  :after magit
+  )
+#+END_SRC
+
 ** Perl
 #+BEGIN_SRC emacs-lisp
   (use-package cperl-mode
+    :ensure t
     :config
     (progn
       ;; Use c-mode for perl .xs files
@@ -665,11 +754,15 @@ value, scrolling continues until there is no more output.
 #+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
+  :ensure t
+  :hook sql-mode
+  )
 (use-package sql
+  :ensure t
   :mode (("\\.sql\\'" . sql-mode))
-  :config
-  (require sql-indent))
+  )
 #+END_SRC
 ** Ediff
 #+BEGIN_SRC emacs-lisp
@@ -697,251 +790,216 @@ Attempts to automatically identify the right indentation for a file
     )
   
 #+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
+  :ensure t
+  :init
+  (vertico-mode)
+
+  ;; 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)
+  :config
+  (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
   )
-#+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
+;; Persist history over Emacs restarts. Vertico sorts by history position.
+(use-package savehist
   :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
+  :init
+  (savehist-mode))
 
-*** 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
+** 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
+  :ensure t
+  :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
+  :ensure t
+  :bind (("M-A" . marginalia-cycle)
+         :map minibuffer-local-map
+         ("M-A" . marginalia-cycle))
+  :init
+  (marginalia-mode)
+  )
+#+end_src
+** Embark: Minibuffer actions and context menu
+#+begin_src emacs-lisp
+(use-package embark
+  :ensure t
+
+  :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
+
+  ;; Optionally replace the key help with a completing-read interface
+  (setq prefix-help-command #'embark-prefix-help-command)
+
+  :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)))))
 
-              (projectile-global-mode)))
+(use-package embark-consult
+  :ensure t
+  :hook
+  (embark-collect-mode . consult-preview-at-point-mode))
 #+end_src
+** Consult
+#+begin_src emacs-lisp
+(use-package consult
+  ;; Replace bindings. Lazily loaded due by `use-package'.
+  :bind (;; C-c bindings (mode-specific-map)
+         ("C-c h" . consult-history)
+         ("C-c m" . consult-mode-command)
+         ("C-c k" . consult-kmacro)
+         ;; C-x bindings (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 (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 (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)
+
+  ;; 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
 
-*** helm integration
+  ;; Optionally configure preview. The default value
+  ;; is 'any, such that any key triggers the preview.
+  ;; (setq consult-preview-key 'any)
+  ;; (setq consult-preview-key (kbd "M-."))
+  ;; (setq consult-preview-key (list (kbd "<S-down>") (kbd "<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 (kbd "M-.")
+   :preview-key '(:debounce 0.4 any))
+
+  ;; Optionally configure the narrowing key.
+  ;; Both < and C-+ work reasonably well.
+  (setq consult-narrow-key "<") ;; (kbd "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.
+  ;; There are multiple reasonable alternatives to chose from.
+  ;;;; 1. project.el (the default)
+  ;; (setq consult-project-function #'consult--default-project--function)
+  ;;;; 2. projectile.el (projectile-project-root)
+  ;; (autoload 'projectile-project-root "projectile")
+  ;; (setq consult-project-function (lambda (_) (projectile-project-root)))
+  ;;;; 3. vc.el (vc-root-dir)
+  ;; (setq consult-project-function (lambda (_) (vc-root-dir)))
+  ;;;; 4. locate-dominating-file
+  ;; (setq consult-project-function (lambda (_) (locate-dominating-file "." ".git")))
+)
+#+end_src
+** Projectile -- Project management
 #+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 projectile
+  :ensure t
+  :bind (("<f5>" . projectile-compile-project)
+         ("<f6>" . next-error))
+  :config (progn
+            (use-package magit :ensure t)
+            (projectile-global-mode)))
 #+end_src
+
 ** Zap to char
 #+BEGIN_SRC emacs-lisp
   (use-package avy-zap
@@ -973,7 +1031,7 @@ This can be used to link things pretty quickly if necessary
     ("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"))
+    ("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"))
@@ -1051,109 +1109,111 @@ This can be used to link things pretty quickly if necessary
 #+END_SRC
 ** LaTeX
 #+BEGIN_SRC emacs-lisp
-  (use-package tex
-    :defer t
-    :ensure auctex
+(use-package tex
+  :defer t
+  :ensure auctex
+  :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)
+          ("%section" 2)
+          ("%subsection" 3)
+          ("%subsubsection" 4)
+          ("%paragraph" 5)))
+  ;; add font locking to the headers
+  (font-lock-add-keywords
+   'latex-mode
+   '(("^%\\(chapter\\|\\(sub\\|subsub\\)?section\\|paragraph\\)"
+      0 'font-lock-keyword-face t)
+     ("^%chapter{\\(.*\\)}"       1 'font-latex-sectioning-1-face t)
+     ("^%section{\\(.*\\)}"       1 'font-latex-sectioning-2-face t)
+     ("^%subsection{\\(.*\\)}"    1 'font-latex-sectioning-3-face t)
+     ("^%subsubsection{\\(.*\\)}" 1 'font-latex-sectioning-4-face t)
+     ("^%paragraph{\\(.*\\)}"     1 'font-latex-sectioning-5-face t)))
+
+  ;; use smart quotes by default instead of `` and ''
+  ;; taken from http://kieranhealy.org/esk/kjhealy.html
+  (setq TeX-open-quote "“")
+  (setq TeX-close-quote "”")
+
+  ;; (TeX-add-style-hook
+  ;;  "latex"
+  ;;  (lambda ()
+  ;;    (TeX-add-symbols
+  ;;     '("DLA" 1))))
+  ;; (custom-set-variables
+  ;;  '(font-latex-user-keyword-classes 
+  ;;    '(("fixme" 
+  ;;       ("DLA" "RZ")
+  ;;       font-lock-function-name-face 2 (command 1 t))))
+  ;; ) 
+  (setq-default TeX-parse-self t)
+  (setq-default TeX-auto-save t)
+  (setq-default TeX-master nil)
+  (add-to-list 'LaTeX-font-list
+               '(?\C-a "\\alert{","}"))
+  (eval-after-load
+      "latex"
+    '(TeX-add-style-hook
+      "cleveref"
+      (lambda ()
+        (if (boundp 'reftex-ref-style-alist)
+            (add-to-list
+             'reftex-ref-style-alist
+             '("Cleveref" "cleveref"
+               (("\\cref" ?c) ("\\Cref" ?C) ("\\cpageref" ?d) ("\\Cpageref" ?D)))))
+        (reftex-ref-style-activate "Cleveref")
+        (TeX-add-symbols
+         '("cref" TeX-arg-ref)
+         '("Cref" TeX-arg-ref)
+         '("cpageref" TeX-arg-ref)
+         '("Cpageref" TeX-arg-ref)))))
+  (eval-after-load
+      "latex"
+    '(add-to-list 'LaTeX-fill-excluded-macros
+                  '("Sexpr")))
+
+  (use-package font-latex
     :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)
-            ("%section" 2)
-            ("%subsection" 3)
-            ("%subsubsection" 4)
-            ("%paragraph" 5)))
-    ;; add font locking to the headers
-    (font-lock-add-keywords
-     'latex-mode
-     '(("^%\\(chapter\\|\\(sub\\|subsub\\)?section\\|paragraph\\)"
-        0 'font-lock-keyword-face t)
-       ("^%chapter{\\(.*\\)}"       1 'font-latex-sectioning-1-face t)
-       ("^%section{\\(.*\\)}"       1 'font-latex-sectioning-2-face t)
-       ("^%subsection{\\(.*\\)}"    1 'font-latex-sectioning-3-face t)
-       ("^%subsubsection{\\(.*\\)}" 1 'font-latex-sectioning-4-face t)
-       ("^%paragraph{\\(.*\\)}"     1 'font-latex-sectioning-5-face t)))
-
-    ;; use smart quotes by default instead of `` and ''
-    ;; taken from http://kieranhealy.org/esk/kjhealy.html
-    (setq TeX-open-quote "“")
-    (setq TeX-close-quote "”")
-
-    ;; (TeX-add-style-hook
-    ;;  "latex"
-    ;;  (lambda ()
-    ;;    (TeX-add-symbols
-    ;;     '("DLA" 1))))
-    ;; (custom-set-variables
-    ;;  '(font-latex-user-keyword-classes 
-    ;;    '(("fixme" 
-    ;;       ("DLA" "RZ")
-    ;;       font-lock-function-name-face 2 (command 1 t))))
-    ;; ) 
-    (setq-default TeX-parse-self t)
-    (setq-default TeX-auto-save t)
-    (setq-default TeX-master nil)
-    (eval-after-load
-        "latex"
-      '(TeX-add-style-hook
-        "cleveref"
-        (lambda ()
-          (if (boundp 'reftex-ref-style-alist)
-              (add-to-list
-               'reftex-ref-style-alist
-               '("Cleveref" "cleveref"
-                 (("\\cref" ?c) ("\\Cref" ?C) ("\\cpageref" ?d) ("\\Cpageref" ?D)))))
-          (reftex-ref-style-activate "Cleveref")
-          (TeX-add-symbols
-           '("cref" TeX-arg-ref)
-           '("Cref" TeX-arg-ref)
-           '("cpageref" TeX-arg-ref)
-           '("Cpageref" TeX-arg-ref)))))
-    (eval-after-load
-        "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-fontify-script nil)
-    (setq font-latex-fontify-sectioning (quote color))
-    (setq font-latex-script-display (quote (nil)))
-  )
+    (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)))
+)
 
 #+END_SRC
 ** ESS
@@ -1194,8 +1254,8 @@ This can be used to link things pretty quickly if necessary
     (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***")
+      (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")
     )
@@ -1212,23 +1272,43 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori
   )
 #+END_SRC
 
+** YAML Mode
+#+BEGIN_SRC emacs-lisp
+  (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 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)
+; this package doesn't really do exactly what we want it to do
+;  (use-package outline-magic)
 #+END_SRC
 *** Outline mode
 #+BEGIN_SRC emacs-lisp
@@ -1268,10 +1348,27 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori
     (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)))
+    )
+#+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
@@ -1284,6 +1381,8 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori
 ** 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)
@@ -1295,13 +1394,13 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori
 #+BEGIN_SRC emacs-lisp
   (use-package spamassassin-mode
     :commands spamassassin-mode
-    :ensure f
+    :ensure t
     )
 #+END_SRC
 ** Password Store
 #+BEGIN_SRC emacs-lisp
   (use-package password-store
-    :ensure f
+    :ensure t
     :commands password-store-edit password-store-generate
     )
 #+END_SRC
@@ -1320,7 +1419,7 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori
 ** Abbrev Mode
 #+BEGIN_SRC emacs-lisp
   (use-package abbrev
-    :diminish abbrev-mode
+    :delight abbrev-mode
     :config
     ;; load abbreviations from 
     (setq abbrev-file-name       
@@ -1334,53 +1433,142 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori
     (setq default-abbrev-mode t))
 #+END_SRC
 
+** Debugging (realgud)
+#+BEGIN_SRC emacs-lisp
+(use-package realgud
+  :ensure t
+  )
+#+END_SRC
+** Python Programming
+#+BEGIN_SRC emacs-lisp
+(use-package python-mode
+  :delight 🐍
+  :hook
+  (python-mode . pyenv-mode)
+  (python-mode . flycheck-mode)
+  (python-mode . company-mode)
+  (python-mode . blacken-mode)
+  (python-mode . yas-minor-mode)
+  (python-mode . anaconda-mode)
+  )
+(use-package pyenv
+  :ensure t
+  )
+(use-package blacken
+  :delight ⚑
+  :init
+  (setq-default blacken-fast-unsafe t)
+  ; (setq-default blacken-line-length 80)
+  :ensure t)
+(use-package anaconda-mode
+  :ensure t
+  )
+
+(use-package elpy
+  :ensure t
+  :init
+  (elpy-enable)
+  )
+#+END_SRC
+*** Black
+#+begin_src emacs-lisp :tangle yes
+  (use-package python-black
+    :demand t
+    :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)
+#+end_src
+** Go language
+#+BEGIN_SRC emacs-lisp
+(use-package go-mode
+             :delight "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
+
+** Beancount
+#+BEGIN_SRC emacs-lisp
+(use-package beancount
+  :load-path "~/lib/emacs_el/beancount-mode/"
+  :ensure f
+  :mode "\\.beancount\\'"
+  
+  )
+#+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))))
-      )
+(use-package message
+  :ensure f
+  :delight (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 "> ")
-  )
+  (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
@@ -1518,24 +1706,19 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori
 
   ; org mode agenda files
   (setq org-agenda-files
-        (quote ("~/projects/org-notes/debbugs.org"
-            "~/projects/org-notes/notes.org"
-            "~/projects/org-notes/holidays.org"
-            "~/projects/org-notes/refile.org"
-            "~/projects/org-notes/diary.org"
-            "~/projects/org-notes/ool.org"
-            "~/projects/org-notes/sndservers.org"
-            "~/projects/org-notes/chaim.org"
-            "~/projects/org-notes/wildman.org"
-            "~/projects/org-notes/uddin.org"
-            "~/projects/org-notes/reviews.org"
-            "~/projects/org-notes/laurel.org"
-            "~/projects/org-notes/from-calendar.org"
-            "~/org-mode/from-mobile.org"
-            "~/projects/org-notes/fh.org")))
+        (append
+        (file-expand-wildcards "~/projects/org-notes/*.org")
+        (file-expand-wildcards "~/org-mode/from-mobile.org")
+        (file-expand-wildcards "~/org-notes-*/*.org")
+        )
+  )
+  (setq my/org-refile-file
+        (car (seq-filter
+              (lambda (file) (string-match-p (regexp-quote "/refile.org") file))
+              org-agenda-files)))
 
   (set-register ?n (cons 'file "~/projects/org-notes/notes.org"))
-  (set-register ?r (cons 'file "~/projects/org-notes/refile.org"))
+  (set-register ?r (cons 'file my/org-refile-file))
   (set-register ?o (cons 'file "~/projects/org-notes/ool.org"))
   (set-register ?s (cons 'file "~/projects/org-notes/sndservers.org"))
   (set-register ?c (cons 'file "~/projects/org-notes/chaim.org"))
@@ -1567,33 +1750,33 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori
 ** 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 my/org-refile-file)
            "* %?\n\n  Source: %u, [[%:link][%:description]]\n  %:initial")
-          ("t" "todo" entry (file "~/projects/org-notes/refile.org")
+          ("t" "todo" entry (file my/org-refile-file)
            "* TODO %?\n  :PROPERTIES:\n  :END:\n  :LOGBOOK:\n  :END:\n%U\n%a\n" :clock-in t :clock-resume t)
-          ("r" "respond" entry (file "~/projects/org-notes/refile.org")
+          ("r" "respond" entry (file my/org-refile-file)
            "* NEXT Respond to %:from on %:subject\nSCHEDULED: %t\n%U\n%a\n" :clock-in t :clock-resume t :immediate-finish t)
-          ("n" "note" entry (file "~/projects/org-notes/refile.org")
+          ("n" "note" entry (file my/org-refile-file)
            "* %? :NOTE:\n%U\n%a\n" :clock-in t :clock-resume t)
-          ("s" "schedule" entry (file "~/projects/org-notes/refile.org")
+          ("s" "schedule" entry (file my/org-refile-file)
            "* %? :cal:\n%^{scheduled:}t\n%U\n%a\n" :clock-in t :clock-resume t)
           ("j" "Journal" entry (file+datetree "~/projects/org-notes/diary.org")
            "* %?\n%U\n" :clock-in t :clock-resume t)
-          ("w" "org-protocol" entry (file "~/projects/org-notes/refile.org")
+          ("w" "org-protocol" entry (file my/org-refile-file)
            "* TODO Review %c\n%U\n" :immediate-finish t)
-          ("M" "Meeting" entry (file "~/projects/org-notes/refile.org")
+          ("M" "Meeting" entry (file my/org-refile-file)
            "* MEETING with %? :MEETING:\n%U" :clock-in t :clock-resume t)
-          ("S" "Seminar" entry (file "~/projects/org-notes/refile.org")
+          ("S" "Seminar" entry (file my/org-refile-file)
            "* SEMINAR notes %? :SEMINAR:\n%U" :clock-in t :clock-resume t)
           ("P" "Paper to read" entry (file+headline "~/projects/research/papers_to_read.org" "Refile")
            "* TODO Get/Read %? \n%U" :clock-in t :clock-resume t)
-          ("p" "Phone call" entry (file "~/projects/org-notes/refile.org")
+          ("p" "Phone call" entry (file my/org-refile-file)
            "* PHONE %? :PHONE:\n%U" :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")
+          ("h" "Habit" entry (file my/org-refile-file)
            "* 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")
           )
         )
@@ -1663,7 +1846,7 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori
     (interactive)
     (save-excursion
       (org-back-to-heading 'invisible-ok)
-      (hide-other)
+      (outline-hide-other)
       (org-cycle)
       (org-cycle)
       (org-cycle)))
@@ -1684,210 +1867,225 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori
   (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)
+(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
-        (quote ((sequence "TODO(t)" "NEXT(n)" "|" "DONE(d)")
-                (sequence "WAITING(w@/!)" "HOLD(h@/!)" "|" "CANCELLED(c@/!)" "PHONE" "MEETING"))))
-
-  (setq org-todo-keyword-faces
-        (quote (("TODO" :foreground "red" :weight bold)
-                ("NEXT" :foreground "blue" :weight bold)
-                ("DONE" :foreground "forest green" :weight bold)
-                ("WAITING" :foreground "orange" :weight bold)
-                ("HOLD" :foreground "magenta" :weight bold)
-                ("CANCELLED" :foreground "forest green" :weight bold)
-                ("MEETING" :foreground "forest green" :weight bold)
-                ("PHONE" :foreground "forest green" :weight bold))))
-
-  (setq org-todo-state-tags-triggers
-        (quote (("CANCELLED" ("CANCELLED" . t))
-                ("WAITING" ("WAITING" . t))
-                ("HOLD" ("WAITING") ("HOLD" . t))
-                (done ("WAITING") ("HOLD"))
-                ("TODO" ("WAITING") ("CANCELLED") ("HOLD"))
-                ("NEXT" ("WAITING") ("CANCELLED") ("HOLD"))
-                ("DONE" ("WAITING") ("CANCELLED") ("HOLD")))))
-
-
-
-  ; (add-hook 'org-clock-out-hook 'bh/remove-empty-drawer-on-clock-out 'append)
-  ; add ids on creation of nodes
-  (add-hook 'org-capture-prepare-finalize-hook 'my/org-add-id)
-
-
-  ; resolve clocks after 10 minutes of idle; use xprintidle
-  ; (setq org-clock-idle-time 10)
-  ; (setq org-clock-x11idle-program-name "xprintidle")
-
-  ; this is from http://doc.norang.ca/org-mode.html#Capture
-  ; use C-M-r for org mode capture
-  (global-set-key (kbd "C-M-r") 'org-capture)
-
-  ; Targets include this file and any file contributing to the agenda - up to 9 levels deep
-  (setq org-refile-targets (quote ((nil :maxlevel . 9)
-                                   (org-agenda-files :maxlevel . 9))))
-
-  ; Use full outline paths for refile targets - we file directly with IDO
-  (setq org-refile-use-outline-path t)
-
-  ; Targets complete directly with IDO
-  (setq org-outline-path-complete-in-steps nil)
-
-  ; Allow refile to create parent tasks with confirmation
-  (setq org-refile-allow-creating-parent-nodes (quote confirm))
-
-  ; ; Use IDO for both buffer and file completion and ido-everywhere to t
-  ; (setq org-completion-use-ido t)
-  ; (setq ido-everywhere t)
-  ; (setq ido-max-directory-size 100000)
-  ; (ido-mode (quote both))
-  ; ; Use the current window when visiting files and buffers with ido
-  ; (setq ido-default-file-method 'selected-window)
-  ; (setq ido-default-buffer-method 'selected-window)
-  ; ; Use the current window for indirect buffer display
-  ; (setq org-indirect-buffer-display 'current-window)
-
-
-  ;;;; Refile settings
-  ; Exclude DONE state tasks from refile targets
-  (defun bh/verify-refile-target ()
-    "Exclude todo keywords with a done state from refile targets"
-    (not (member (nth 2 (org-heading-components)) org-done-keywords)))
-
-  (setq org-refile-target-verify-function 'bh/verify-refile-target)
-
-  ;; ensure that emacsclient will show just the note to be edited when invoked
-  ;; from Mutt, and that it will shut down emacsclient once finished;
-  ;; fallback to legacy behavior when not invoked via org-protocol.
-  (require 'org-protocol)
-  ; (add-hook 'org-capture-mode-hook 'delete-other-windows)
-  (setq my-org-protocol-flag nil)
-  (defadvice org-capture-finalize (after delete-frame-at-end activate)
-    "Delete frame at remember finalization"
-    (progn (if my-org-protocol-flag (delete-frame))
-           (setq my-org-protocol-flag nil)))
-  (defadvice org-capture-refile (around delete-frame-after-refile activate)
-    "Delete frame at remember refile"
-    (if my-org-protocol-flag
-        (progn
-          (setq my-org-protocol-flag nil)
-          ad-do-it
-          (delete-frame))
-      ad-do-it)
-    )
-  (defadvice org-capture-kill (after delete-frame-at-end activate)
-    "Delete frame at remember abort"
-    (progn (if my-org-protocol-flag (delete-frame))
-           (setq my-org-protocol-flag nil)))
-  (defadvice org-protocol-capture (before set-org-protocol-flag activate)
-    (setq my-org-protocol-flag t))
-
-  (defadvice org-insert-todo-heading (after dla/create-id activate)
-    (unless (org-in-item-p)
-      (org-id-get-create)
-      )
-    )
-
-  ;; org modules
-  (add-to-list 'org-modules 'org-habit)
-
-  ; this comes from http://upsilon.cc/~zack/blog/posts/2010/02/integrating_Mutt_with_Org-mode/
-  (defun open-mail-in-mutt (message)
-    "Open a mail message in Mutt, using an external terminal.
-
-  Message can be specified either by a path pointing inside a
-  Maildir, or by Message-ID."
-    (interactive "MPath or Message-ID: ")
-    (shell-command
-     (format "faf xterm -e \"%s %s\""
-         (substitute-in-file-name "$HOME/bin/mutt_open") message)))
-
-  ;; add support for "mutt:ID" links
-  (org-add-link-type "mutt" 'open-mail-in-mutt)
-
-  (defun my-org-mode-setup ()
-    ; (load-library "reftex")
-    (and (buffer-file-name)
-         (file-exists-p (buffer-file-name))
-         (progn
-           ; (reftex-parse-all)
-           (reftex-set-cite-format
-            '((?b . "[[bib:%l][%l-bib]]")
-              (?n . "[[notes:%l][%l-notes]]")
-              (?c . "\\cite{%l}")
-              (?h . "*** %t\n:PROPERTIES:\n:Custom_ID: %l\n:END:\n[[papers:%l][%l xoj]] [[papers-pdf:%l][pdf]]")))
-           ))
-    (define-key org-mode-map (kbd "C-c )") 'reftex-citation)
-    (define-key org-mode-map (kbd "C-c [") 'reftex-citation)
-    (define-key org-mode-map (kbd "C-c (") 'org-mode-reftex-search)
-    (define-key org-mode-map (kbd "C-c 0") 'reftex-view-crossref)
+(setq org-todo-keywords
+      (quote ((sequence "TODO(t)" "NEXT(n)" "|" "DONE(d)")
+              (sequence "WAITING(w@/!)" "HOLD(h@/!)" "|" "CANCELLED(c@/!)" "PHONE" "MEETING"))))
+
+(setq org-todo-keyword-faces
+      (quote (("TODO" :foreground "red" :weight bold)
+              ("NEXT" :foreground "blue" :weight bold)
+              ("DONE" :foreground "forest green" :weight bold)
+              ("WAITING" :foreground "orange" :weight bold)
+              ("HOLD" :foreground "magenta" :weight bold)
+              ("CANCELLED" :foreground "forest green" :weight bold)
+              ("MEETING" :foreground "forest green" :weight bold)
+              ("PHONE" :foreground "forest green" :weight bold))))
+
+(setq org-todo-state-tags-triggers
+      (quote (("CANCELLED" ("CANCELLED" . t))
+              ("WAITING" ("WAITING" . t))
+              ("HOLD" ("WAITING") ("HOLD" . t))
+              (done ("WAITING") ("HOLD"))
+              ("TODO" ("WAITING") ("CANCELLED") ("HOLD"))
+              ("NEXT" ("WAITING") ("CANCELLED") ("HOLD"))
+              ("DONE" ("WAITING") ("CANCELLED") ("HOLD")))))
+
+
+
+; (add-hook 'org-clock-out-hook 'bh/remove-empty-drawer-on-clock-out 'append)
+; add ids on creation of nodes
+(add-hook 'org-capture-prepare-finalize-hook 'my/org-add-id)
+
+
+; resolve clocks after 10 minutes of idle; use xprintidle
+; (setq org-clock-idle-time 10)
+; (setq org-clock-x11idle-program-name "xprintidle")
+
+; this is from http://doc.norang.ca/org-mode.html#Capture
+; use C-M-r for org mode capture
+(global-set-key (kbd "C-M-r") 'org-capture)
+
+; Targets include this file and any file contributing to the agenda - up to 9 levels deep
+(setq org-refile-targets (quote ((nil :maxlevel . 9)
+                                 (org-agenda-files :maxlevel . 9))))
+
+; Use full outline paths for refile targets - we file directly with IDO
+(setq org-refile-use-outline-path t)
+
+; Targets complete directly with IDO
+(setq org-outline-path-complete-in-steps nil)
+
+; Allow refile to create parent tasks with confirmation
+(setq org-refile-allow-creating-parent-nodes (quote confirm))
+
+; ; Use IDO for both buffer and file completion and ido-everywhere to t
+; (setq org-completion-use-ido t)
+; (setq ido-everywhere t)
+; (setq ido-max-directory-size 100000)
+; (ido-mode (quote both))
+; ; Use the current window when visiting files and buffers with ido
+; (setq ido-default-file-method 'selected-window)
+; (setq ido-default-buffer-method 'selected-window)
+; ; Use the current window for indirect buffer display
+; (setq org-indirect-buffer-display 'current-window)
+
+
+;;;; Refile settings
+; Exclude DONE state tasks from refile targets
+(defun bh/verify-refile-target ()
+  "Exclude todo keywords with a done state from refile targets"
+  (not (member (nth 2 (org-heading-components)) org-done-keywords)))
+
+(setq org-refile-target-verify-function 'bh/verify-refile-target)
+
+;; ensure that emacsclient will show just the note to be edited when invoked
+;; from Mutt, and that it will shut down emacsclient once finished;
+;; fallback to legacy behavior when not invoked via org-protocol.
+(require 'org-protocol)
+; (add-hook 'org-capture-mode-hook 'delete-other-windows)
+(setq my-org-protocol-flag nil)
+(defadvice org-capture-finalize (after delete-frame-at-end activate)
+  "Delete frame at remember finalization"
+  (progn (if my-org-protocol-flag (delete-frame))
+         (setq my-org-protocol-flag nil)))
+(defadvice org-capture-refile (around delete-frame-after-refile activate)
+  "Delete frame at remember refile"
+  (if my-org-protocol-flag
+      (progn
+        (setq my-org-protocol-flag nil)
+        ad-do-it
+        (delete-frame))
+    ad-do-it)
+  )
+(defadvice org-capture-kill (after delete-frame-at-end activate)
+  "Delete frame at remember abort"
+  (progn (if my-org-protocol-flag (delete-frame))
+         (setq my-org-protocol-flag nil)))
+(defadvice org-protocol-capture (before set-org-protocol-flag activate)
+  (setq my-org-protocol-flag t))
+
+(defadvice org-insert-todo-heading (after dla/create-id activate)
+  (unless (org-in-item-p)
+    (org-id-get-create)
     )
-  (add-hook 'org-mode-hook 'my-org-mode-setup)
+  )
 
-  (defun org-mode-reftex-search ()
-    (interactive)
-    (org-open-link-from-string (format "[[notes:%s]]" (first (reftex-citation t)))))
-
-  (defun open-research-paper (bibtexkey)
-    "Open a paper by bibtex key"
-    (interactive "bibtex key: ")
-    (shell-command
-     (format "%s %s"
-         (substitute-in-file-name "$HOME/bin/bibtex_to_paper") bibtexkey)))
-  (org-add-link-type "papers" 'open-research-paper)
-  (defun open-research-paper-pdf (bibtexkey)
-    "Open a paper pdf by bibtex key"
-    (interactive "bibtex key: ")
-    (shell-command
-     (format "%s -p evince_annot %s"
-         (substitute-in-file-name "$HOME/bin/bibtex_to_paper") bibtexkey)))
-  (org-add-link-type "papers-pdf" 'open-research-paper-pdf)
-
-  (add-to-list 'org-link-abbrev-alist
-               '("notes" .
-                 "~/projects/research/paper_notes.org::#%s"))
-
-  ; I pretty much always want hiearchical checkboxes
-  (setq org-hierachical-checkbox-statistics nil)
-
-  ;; Add \begin{equation}\end{equation} templates to the org mode easy templates
-  (add-to-list 'org-structure-template-alist
-               '("E" "\\begin{equation}\n?\n\\end{equation}"))
-
-   ;; stolen from
-  ;; http://www-public.it-sudparis.eu/~berger_o/weblog/2012/03/23/how-to-manage-and-export-bibliographic-notesrefs-in-org-mode/
-  (defun my-rtcite-export-handler (path desc format)
-    (message "my-rtcite-export-handler is called : path = %s, desc = %s, format = %s" path desc format)
-    (let* ((search (when (string-match "::#?\\(.+\\)\\'" path)
-                     (match-string 1 path)))
-           (path (substring path 0 (match-beginning 0))))
-      (cond ((eq format 'latex)
-             (if (or (not desc) 
-                     (equal 0 (search "rtcite:" desc)))
-                 (format "\\cite{%s}" search)
-               (format "\\cite[%s]{%s}" desc search))))))
-
-  (org-add-link-type "rtcite" 
-                     'org-bibtex-open
-                     'my-rtcite-export-handler)
+;; org modules
+(add-to-list 'org-modules 'org-habit)
+
+; this comes from http://upsilon.cc/~zack/blog/posts/2010/02/integrating_Mutt_with_Org-mode/
+(defun open-mail-in-mutt (message)
+  "Open a mail message in Mutt, using an external terminal.
+
+Message can be specified either by a path pointing inside a
+Maildir, or by Message-ID."
+  (interactive "MPath or Message-ID: ")
+  (shell-command
+   (format "faf xterm -e \"%s %s\""
+       (substitute-in-file-name "$HOME/bin/mutt_open") message)))
+
+;; add support for "mutt:ID" links
+(org-add-link-type "mutt" 'open-mail-in-mutt)
+
+(defun my-org-mode-setup ()
+  ; (load-library "reftex")
+  (and (buffer-file-name)
+       (file-exists-p (buffer-file-name))
+       (progn
+         ; (reftex-parse-all)
+         (reftex-set-cite-format
+          '((?b . "[[bib:%l][%l-bib]]")
+            (?n . "[[notes:%l][%l-notes]]")
+            (?c . "\\cite{%l}")
+            (?h . "*** %t\n:PROPERTIES:\n:Custom_ID: %l\n:END:\n[[papers:%l][%l xoj]] [[papers-pdf:%l][pdf]]")))
+         ))
+  (define-key org-mode-map (kbd "C-c )") 'reftex-citation)
+  (define-key org-mode-map (kbd "C-c [") 'reftex-citation)
+  (define-key org-mode-map (kbd "C-c (") 'org-mode-reftex-search)
+  (define-key org-mode-map (kbd "C-c 0") 'reftex-view-crossref)
+  )
+(add-hook 'org-mode-hook 'my-org-mode-setup)
+
+(defun org-mode-reftex-search ()
+  (interactive)
+  (org-open-link-from-string (format "[[notes:%s]]" (first (reftex-citation t)))))
+
+(defun open-research-paper (bibtexkey)
+  "Open a paper by bibtex key"
+  (interactive "bibtex key: ")
+  (shell-command
+   (format "%s %s"
+       (substitute-in-file-name "$HOME/bin/bibtex_to_paper") bibtexkey)))
+(org-add-link-type "papers" 'open-research-paper)
+(defun open-research-paper-pdf (bibtexkey)
+  "Open a paper pdf by bibtex key"
+  (interactive "bibtex key: ")
+  (shell-command
+   (format "%s -p evince_annot %s"
+       (substitute-in-file-name "$HOME/bin/bibtex_to_paper") bibtexkey)))
+(org-add-link-type "papers-pdf" 'open-research-paper-pdf)
+
+(add-to-list 'org-link-abbrev-alist
+             '("notes" .
+               "~/projects/research/paper_notes.org::#%s"))
+
+; I pretty much always want hiearchical checkboxes
+(setq org-hierachical-checkbox-statistics nil)
+
+;; Add \begin{equation}\end{equation} templates to the org mode easy templates
+(add-to-list 'org-structure-template-alist
+             '("E" "\\begin{equation}\n?\n\\end{equation}"))
+
+ ;; stolen from
+;; http://www-public.it-sudparis.eu/~berger_o/weblog/2012/03/23/how-to-manage-and-export-bibliographic-notesrefs-in-org-mode/
+(defun my-rtcite-export-handler (path desc format)
+  (message "my-rtcite-export-handler is called : path = %s, desc = %s, format = %s" path desc format)
+  (let* ((search (when (string-match "::#?\\(.+\\)\\'" path)
+                   (match-string 1 path)))
+         (path (substring path 0 (match-beginning 0))))
+    (cond ((eq format 'latex)
+           (if (or (not desc) 
+                   (equal 0 (search "rtcite:" desc)))
+               (format "\\cite{%s}" search)
+             (format "\\cite[%s]{%s}" desc search))))))
+
+(org-add-link-type "rtcite" 
+                   'org-bibtex-open
+                   'my-rtcite-export-handler)
 
 
 #+END_SRC
@@ -1920,6 +2118,8 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori
    (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
@@ -1939,406 +2139,407 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori
 
 #+END_SRC
 ** LaTeX configuration
-   :PROPERTIES:
-   :ID:       7135ba17-6a50-4eed-84ca-b90afa5b12f8
-   :END:
-#+BEGIN_SRC emacs-lisp
-  (require 'ox-latex)
-  (add-to-list 'org-latex-classes
-           '("memarticle"
-         "\\documentclass[11pt,oneside,article]{memoir}\n"
-         ("\\section{%s}" . "\\section*{%s}")
-         ("\\subsection{%s}" . "\\subsection*{%s}")
-         ("\\subsubsection{%s}" . "\\subsubsection*{%s}")
-         ("\\paragraph{%s}" . "\\paragraph*{%s}")
-         ("\\subparagraph{%s}" . "\\subparagraph*{%s}")))
-
-  (setq org-beamer-outline-frame-options "")
-  (add-to-list 'org-latex-classes
-           '("beamer"
-         "\\documentclass[ignorenonframetext]{beamer}
-  [NO-DEFAULT-PACKAGES]
-  [PACKAGES]
-  [EXTRA]"
-         ("\\section{%s}" . "\\section*{%s}")
-         ("\\subsection{%s}" . "\\subsection*{%s}")
-         ("\\subsubsection{%s}" . "\\subsubsection*{%s}")
-         ("\\paragraph{%s}" . "\\paragraph*{%s}")
-         ("\\subparagraph{%s}" . "\\subparagraph*{%s}")))
-
-  (add-to-list 'org-latex-classes
-           '("membook"
-         "\\documentclass[11pt,oneside]{memoir}\n"
-         ("\\chapter{%s}" . "\\chapter*{%s}")
-         ("\\section{%s}" . "\\section*{%s}")
-         ("\\subsection{%s}" . "\\subsection*{%s}")
-         ("\\subsubsection{%s}" . "\\subsubsection*{%s}")))
-
-  (add-to-list 'org-latex-classes
-           '("letter"
-         "\\documentclass[11pt]{letter}
-  [NO-DEFAULT-PACKAGES]
-  [PACKAGES]
-  [EXTRA]"
-     ("\\section{%s}" . "\\section*{%s}")
-         ("\\subsection{%s}" . "\\subsection*{%s}")
-         ("\\subsubsection{%s}" . "\\subsubsection*{%s}")
-         ("\\paragraph{%s}" . "\\paragraph*{%s}")
-         ("\\subparagraph{%s}" . "\\subparagraph*{%s}")))
-
-  (add-to-list 'org-latex-classes
-           '("dlacv"
-         "\\documentclass{dlacv}
-  [NO-DEFAULT-PACKAGES]
-  [NO-PACKAGES]
-  [NO-EXTRA]"
-         ("\\section{%s}" . "\\section*{%s}")
-         ("\\subsection{%s}" . "\\subsection*{%s}")
-         ("\\subsubsection{%s}" . "\\subsubsection*{%s}")
-         ("\\paragraph{%s}" . "\\paragraph*{%s}")
-         ("\\subparagraph{%s}" . "\\subparagraph*{%s}")))
-
-
-  (add-to-list 'org-latex-classes
-           '("dlaresume"
-         "\\documentclass{dlaresume}
-  [NO-DEFAULT-PACKAGES]
-  [NO-PACKAGES]
-  [NO-EXTRA]"
-         ("\\section{%s}" . "\\section*{%s}")
-         ("\\subsection{%s}" . "\\subsection*{%s}")
-         ("\\subsubsection{%s}" . "\\subsubsection*{%s}")
-         ("\\paragraph{%s}" . "\\paragraph*{%s}")
-         ("\\subparagraph{%s}" . "\\subparagraph*{%s}")))
-
-
-  ;; Originally taken from Bruno Tavernier: http://thread.gmane.org/gmane.emacs.orgmode/31150/focus=31432
-  ;; but adapted to use latexmk 4.22 or higher.  
-  (setq org-latex-pdf-process '("latexmk -f -pdflatex=xelatex -bibtex -use-make -pdf %f"))
-
-  ;; Default packages included in /every/ tex file, latex, pdflatex or xelatex
-  (setq org-latex-default-packages-alist
-    '(("" "amsmath" t)
-      ("" "unicode-math" t)
-      ))
-  (setq org-latex-packages-alist
-    '(("" "graphicx" t)
-      ("" "fontspec" t)
-      ("" "xunicode" t)
-      ("" "hyperref" t)
-      ("" "url" t)
-      ("" "rotating" t)
-      ("" "longtable" nil)
-      ("" "float" )))
-
-  ;; make equations larger
-  (setq org-format-latex-options (plist-put org-format-latex-options :scale 2.0))
-
-  (defun org-create-formula--latex-header ()
-    "Return LaTeX header appropriate for previewing a LaTeX snippet."
-    (let ((info (org-combine-plists (org-export--get-global-options
-             (org-export-get-backend 'latex))
-            (org-export--get-inbuffer-options
-             (org-export-get-backend 'latex)))))
-      (org-latex-guess-babel-language
-       (org-latex-guess-inputenc
-    (org-splice-latex-header
-     org-format-latex-header
-     org-latex-default-packages-alist
-     nil t
-     (plist-get info :latex-header)))
-       info)))
-
-
-  ; support ignoring headers in org mode export to latex
-  ; from http://article.gmane.org/gmane.emacs.orgmode/67692
-  (defadvice org-latex-headline (around my-latex-skip-headlines
-                    (headline contents info) activate)
-    (if (member "ignoreheading" (org-element-property :tags headline))
-    (setq ad-return-value contents)
-      ad-do-it))
-
-  ;; keep latex logfiles
-
-  (setq org-latex-remove-logfiles nil)
-
-  ;; Resume clocking task when emacs is restarted
-  (org-clock-persistence-insinuate)
-  ;;
-  ;; Show lot of clocking history so it's easy to pick items off the C-F11 list
-  (setq org-clock-history-length 23)
-  ;; Resume clocking task on clock-in if the clock is open
-  (setq org-clock-in-resume t)
-  ;; Change tasks to NEXT when clocking in; this avoids clocking in when
-  ;; there are things like PHONE calls
-  (setq org-clock-in-switch-to-state 'bh/clock-in-to-next)
-  ;; Separate drawers for clocking and logs
-  (setq org-drawers (quote ("PROPERTIES" "LOGBOOK")))
-  ;; Save clock data and state changes and notes in the LOGBOOK drawer
-  (setq org-clock-into-drawer t)
-  (setq org-log-into-drawer t)
-  ;; Sometimes I change tasks I'm clocking quickly - this removes clocked tasks with 0:00 duration
-  (setq org-clock-out-remove-zero-time-clocks t)
-  ;; Clock out when moving task to a done state
-  (setq org-clock-out-when-done t)
-  ;; Save the running clock and all clock history when exiting Emacs, load it on startup
-  (setq org-clock-persist t)
-  ;; Do not prompt to resume an active clock
-  (setq org-clock-persist-query-resume nil)
-  ;; Enable auto clock resolution for finding open clocks
-  (setq org-clock-auto-clock-resolution (quote when-no-clock-is-running))
-  ;; Include current clocking task in clock reports
-  (setq org-clock-report-include-clocking-task t)
-
-  ;; the cache seems to be broken
-  (setq org-element-use-cache nil)
-
-  (defvar bh/keep-clock-running nil)
-
-  (defun bh/is-task-p ()
-    "Any task with a todo keyword and no subtask"
-    (save-restriction
-      (widen)
-      (let ((has-subtask)
-            (subtree-end (save-excursion (org-end-of-subtree t)))
-            (is-a-task (member (nth 2 (org-heading-components)) org-todo-keywords-1)))
-        (save-excursion
-          (forward-line 1)
-          (while (and (not has-subtask)
-                      (< (point) subtree-end)
-                      (re-search-forward "^\*+ " subtree-end t))
-            (when (member (org-get-todo-state) org-todo-keywords-1)
-              (setq has-subtask t))))
-        (and is-a-task (not has-subtask)))))
-  (defun bh/is-project-p ()
-    "Any task with a todo keyword subtask"
-    (save-restriction
-      (widen)
-      (let ((has-subtask)
-            (subtree-end (save-excursion (org-end-of-subtree t)))
-            (is-a-task (member (nth 2 (org-heading-components)) org-todo-keywords-1)))
-        (save-excursion
-          (forward-line 1)
-          (while (and (not has-subtask)
-                      (< (point) subtree-end)
-                      (re-search-forward "^\*+ " subtree-end t))
-            (when (member (org-get-todo-state) org-todo-keywords-1)
-              (setq has-subtask t))))
-        (and is-a-task has-subtask))))
-
-  (defun bh/is-subproject-p ()
-    "Any task which is a subtask of another project"
-    (let ((is-subproject)
+#+BEGIN_SRC emacs-lisp
+(use-package ox-extra
+  :config
+  (ox-extras-activate '(ignore-headlines)))
+(require 'ox-latex)
+(add-to-list 'org-latex-classes
+         '("memarticle"
+       "\\documentclass[11pt,oneside,article]{memoir}\n"
+       ("\\section{%s}" . "\\section*{%s}")
+       ("\\subsection{%s}" . "\\subsection*{%s}")
+       ("\\subsubsection{%s}" . "\\subsubsection*{%s}")
+       ("\\paragraph{%s}" . "\\paragraph*{%s}")
+       ("\\subparagraph{%s}" . "\\subparagraph*{%s}")))
+
+(setq org-beamer-outline-frame-options "")
+(add-to-list 'org-latex-classes
+         '("beamer"
+       "\\documentclass[ignorenonframetext]{beamer}
+[NO-DEFAULT-PACKAGES]
+[PACKAGES]
+[EXTRA]"
+       ("\\section{%s}" . "\\section*{%s}")
+       ("\\subsection{%s}" . "\\subsection*{%s}")
+       ("\\subsubsection{%s}" . "\\subsubsection*{%s}")
+       ("\\paragraph{%s}" . "\\paragraph*{%s}")
+       ("\\subparagraph{%s}" . "\\subparagraph*{%s}")))
+
+(add-to-list 'org-latex-classes
+         '("membook"
+       "\\documentclass[11pt,oneside]{memoir}\n"
+       ("\\chapter{%s}" . "\\chapter*{%s}")
+       ("\\section{%s}" . "\\section*{%s}")
+       ("\\subsection{%s}" . "\\subsection*{%s}")
+       ("\\subsubsection{%s}" . "\\subsubsection*{%s}")))
+
+(add-to-list 'org-latex-classes
+         '("letter"
+       "\\documentclass[11pt]{letter}
+[NO-DEFAULT-PACKAGES]
+[PACKAGES]
+[EXTRA]"
+   ("\\section{%s}" . "\\section*{%s}")
+       ("\\subsection{%s}" . "\\subsection*{%s}")
+       ("\\subsubsection{%s}" . "\\subsubsection*{%s}")
+       ("\\paragraph{%s}" . "\\paragraph*{%s}")
+       ("\\subparagraph{%s}" . "\\subparagraph*{%s}")))
+
+(add-to-list 'org-latex-classes
+         '("dlacv"
+       "\\documentclass{dlacv}
+[NO-DEFAULT-PACKAGES]
+[NO-PACKAGES]
+[NO-EXTRA]"
+       ("\\section{%s}" . "\\section*{%s}")
+       ("\\subsection{%s}" . "\\subsection*{%s}")
+       ("\\subsubsection{%s}" . "\\subsubsection*{%s}")
+       ("\\paragraph{%s}" . "\\paragraph*{%s}")
+       ("\\subparagraph{%s}" . "\\subparagraph*{%s}")))
+
+
+(add-to-list 'org-latex-classes
+         '("dlaresume"
+       "\\documentclass{dlaresume}
+[NO-DEFAULT-PACKAGES]
+[NO-PACKAGES]
+[NO-EXTRA]"
+       ("\\section{%s}" . "\\section*{%s}")
+       ("\\subsection{%s}" . "\\subsection*{%s}")
+       ("\\subsubsection{%s}" . "\\subsubsection*{%s}")
+       ("\\paragraph{%s}" . "\\paragraph*{%s}")
+       ("\\subparagraph{%s}" . "\\subparagraph*{%s}")))
+
+
+;; Originally taken from Bruno Tavernier: http://thread.gmane.org/gmane.emacs.orgmode/31150/focus=31432
+;; but adapted to use latexmk 4.22 or higher.  
+(setq org-latex-pdf-process '("latexmk -f -pdflatex=xelatex -bibtex -use-make -pdf %f"))
+
+;; Default packages included in /every/ tex file, latex, pdflatex or xelatex
+(setq org-latex-default-packages-alist
+  '(("" "amsmath" t)
+    ("" "unicode-math" t)
+    ))
+(setq org-latex-packages-alist
+  '(("" "graphicx" t)
+    ("" "fontspec" t)
+    ("" "xunicode" t)
+    ("" "hyperref" t)
+    ("" "url" t)
+    ("" "rotating" t)
+    ("" "longtable" nil)
+    ("" "float" )))
+
+;; make equations larger
+(setq org-format-latex-options (plist-put org-format-latex-options :scale 2.0))
+
+(defun org-create-formula--latex-header ()
+  "Return LaTeX header appropriate for previewing a LaTeX snippet."
+  (let ((info (org-combine-plists (org-export--get-global-options
+           (org-export-get-backend 'latex))
+          (org-export--get-inbuffer-options
+           (org-export-get-backend 'latex)))))
+    (org-latex-guess-babel-language
+     (org-latex-guess-inputenc
+  (org-splice-latex-header
+   org-format-latex-header
+   org-latex-default-packages-alist
+   nil t
+   (plist-get info :latex-header)))
+     info)))
+
+
+; support ignoring headers in org mode export to latex
+; from http://article.gmane.org/gmane.emacs.orgmode/67692
+(defadvice org-latex-headline (around my-latex-skip-headlines
+                  (headline contents info) activate)
+  (if (member "ignoreheading" (org-element-property :tags headline))
+  (setq ad-return-value contents)
+    ad-do-it))
+
+;; keep latex logfiles
+
+(setq org-latex-remove-logfiles nil)
+
+;; Resume clocking task when emacs is restarted
+(org-clock-persistence-insinuate)
+;;
+;; Show lot of clocking history so it's easy to pick items off the C-F11 list
+(setq org-clock-history-length 23)
+;; Resume clocking task on clock-in if the clock is open
+(setq org-clock-in-resume t)
+;; Change tasks to NEXT when clocking in; this avoids clocking in when
+;; there are things like PHONE calls
+(setq org-clock-in-switch-to-state 'bh/clock-in-to-next)
+;; Separate drawers for clocking and logs
+(setq org-drawers (quote ("PROPERTIES" "LOGBOOK")))
+;; Save clock data and state changes and notes in the LOGBOOK drawer
+(setq org-clock-into-drawer t)
+(setq org-log-into-drawer t)
+;; Sometimes I change tasks I'm clocking quickly - this removes clocked tasks with 0:00 duration
+(setq org-clock-out-remove-zero-time-clocks t)
+;; Clock out when moving task to a done state
+(setq org-clock-out-when-done t)
+;; Save the running clock and all clock history when exiting Emacs, load it on startup
+(setq org-clock-persist t)
+;; Do not prompt to resume an active clock
+(setq org-clock-persist-query-resume nil)
+;; Enable auto clock resolution for finding open clocks
+(setq org-clock-auto-clock-resolution (quote when-no-clock-is-running))
+;; Include current clocking task in clock reports
+(setq org-clock-report-include-clocking-task t)
+
+;; the cache seems to be broken
+(setq org-element-use-cache nil)
+
+(defvar bh/keep-clock-running nil)
+
+(defun bh/is-task-p ()
+  "Any task with a todo keyword and no subtask"
+  (save-restriction
+    (widen)
+    (let ((has-subtask)
+          (subtree-end (save-excursion (org-end-of-subtree t)))
           (is-a-task (member (nth 2 (org-heading-components)) org-todo-keywords-1)))
       (save-excursion
-        (while (and (not is-subproject) (org-up-heading-safe))
-          (when (member (nth 2 (org-heading-components)) org-todo-keywords-1)
-            (setq is-subproject t))))
-      (and is-a-task is-subproject)))
-
-
-  (defun bh/clock-in-to-next (kw)
-    "Switch a task from TODO to NEXT when clocking in.
-  Skips capture tasks, projects, and subprojects.
-  Switch projects and subprojects from NEXT back to TODO"
-    (when (not (and (boundp 'org-capture-mode) org-capture-mode))
-      (cond
-       ((and (member (org-get-todo-state) (list "TODO"))
-         (bh/is-task-p))
-    "NEXT")
-       ((and (member (org-get-todo-state) (list "NEXT"))
-         (bh/is-project-p))
-    "TODO"))))
-
-  (defun bh/punch-in (arg)
-    "Start continuous clocking and set the default task to the
-  selected task.  If no task is selected set the Organization task
-  as the default task."
-    (interactive "p")
-    (setq bh/keep-clock-running t)
-    (if (equal major-mode 'org-agenda-mode)
-    ;;
-    ;; We're in the agenda
-    ;;
-    (let* ((marker (org-get-at-bol 'org-hd-marker))
-           (tags (org-with-point-at marker (org-get-tags-at))))
-      (if (and (eq arg 4) tags)
-          (org-agenda-clock-in '(16))
-        (bh/clock-in-organization-task-as-default)))
-      ;;
-      ;; We are not in the agenda
-      ;;
-      (save-restriction
+        (forward-line 1)
+        (while (and (not has-subtask)
+                    (< (point) subtree-end)
+                    (re-search-forward "^\*+ " subtree-end t))
+          (when (member (org-get-todo-state) org-todo-keywords-1)
+            (setq has-subtask t))))
+      (and is-a-task (not has-subtask)))))
+(defun bh/is-project-p ()
+  "Any task with a todo keyword subtask"
+  (save-restriction
     (widen)
-    ; Find the tags on the current task
-    (if (and (equal major-mode 'org-mode) (not (org-before-first-heading-p)) (eq arg 4))
-        (org-clock-in '(16))
-      (bh/clock-in-organization-task-as-default)))))
-
-  (defun bh/punch-out ()
-    (interactive)
-    (setq bh/keep-clock-running nil)
-    (when (org-clock-is-active)
-      (org-clock-out))
-    (org-agenda-remove-restriction-lock))
-
-  (defun bh/clock-in-default-task ()
-    (save-excursion
-      (org-with-point-at org-clock-default-task
-    (org-clock-in))))
-
-  (defun bh/clock-in-parent-task ()
-    "Move point to the parent (project) task if any and clock in"
-    (let ((parent-task))
+    (let ((has-subtask)
+          (subtree-end (save-excursion (org-end-of-subtree t)))
+          (is-a-task (member (nth 2 (org-heading-components)) org-todo-keywords-1)))
       (save-excursion
-    (save-restriction
-      (widen)
-      (while (and (not parent-task) (org-up-heading-safe))
+        (forward-line 1)
+        (while (and (not has-subtask)
+                    (< (point) subtree-end)
+                    (re-search-forward "^\*+ " subtree-end t))
+          (when (member (org-get-todo-state) org-todo-keywords-1)
+            (setq has-subtask t))))
+      (and is-a-task has-subtask))))
+
+(defun bh/is-subproject-p ()
+  "Any task which is a subtask of another project"
+  (let ((is-subproject)
+        (is-a-task (member (nth 2 (org-heading-components)) org-todo-keywords-1)))
+    (save-excursion
+      (while (and (not is-subproject) (org-up-heading-safe))
         (when (member (nth 2 (org-heading-components)) org-todo-keywords-1)
-          (setq parent-task (point))))
-      (if parent-task
-          (org-with-point-at parent-task
-        (org-clock-in))
-        (when bh/keep-clock-running
-          (bh/clock-in-default-task)))))))
+          (setq is-subproject t))))
+    (and is-a-task is-subproject)))
 
-  (defvar bh/organization-task-id "e22cb8bf-07c7-408b-8f60-ff3aadac95e4")
 
-  (defun bh/clock-in-organization-task-as-default ()
-    (interactive)
-    (org-with-point-at (org-id-find bh/organization-task-id 'marker)
-      (org-clock-in '(16))))
-
-  (defun bh/clock-out-maybe ()
-    (when (and bh/keep-clock-running
-           (not org-clock-clocking-in)
-           (marker-buffer org-clock-default-task)
-           (not org-clock-resolving-clocks-due-to-idleness))
-      (bh/clock-in-parent-task)))
-
-  ; (add-hook 'org-clock-out-hook 'bh/clock-out-maybe 'append)
-
-  (require 'org-id)
-  (defun bh/clock-in-task-by-id (id)
-    "Clock in a task by id"
-    (org-with-point-at (org-id-find id 'marker)
-      (org-clock-in nil)))
-
-  (defun bh/clock-in-last-task (arg)
-    "Clock in the interrupted task if there is one
-  Skip the default task and get the next one.
-  A prefix arg forces clock in of the default task."
-    (interactive "p")
-    (let ((clock-in-to-task
-       (cond
-        ((eq arg 4) org-clock-default-task)
-        ((and (org-clock-is-active)
-          (equal org-clock-default-task (cadr org-clock-history)))
-         (caddr org-clock-history))
-        ((org-clock-is-active) (cadr org-clock-history))
-        ((equal org-clock-default-task (car org-clock-history)) (cadr org-clock-history))
-        (t (car org-clock-history)))))
-      (widen)
-      (org-with-point-at clock-in-to-task
-    (org-clock-in nil))))
-
-
-  (defun org-export-to-ods ()
-    (interactive)
-    (let ((csv-file "data.csv"))
-      (org-table-export csv-file "orgtbl-to-csv")
-      (org-odt-convert csv-file "ods" 'open)))
-
-  ; allow for zero-width-space to be a break in regexp too
-  ; (setcar org-emphasis-regexp-components "​ [:space:] \t('\"{")
-  ; (setcar (nthcdr 1 org-emphasis-regexp-components) "​ [:space:]- \t.,:!?;'\")}\\")
-  ; (org-set-emph-re 'org-emphasis-regexp-components org-emphasis-regexp-components)
-
-  ;; support inserting screen shots
-  (defun my/org-insert-screenshot ()
-    "Take a screenshot into a time stamped unique-named file in the
-  same directory as the org-buffer and insert a link to this file."
-    (interactive)
-    (defvar my/org-insert-screenshot/filename)
-    (setq my/org-insert-screenshot/filename
-      (read-file-name
-       "Screenshot to insert: "
-       nil
-       (concat (buffer-file-name) "_" (format-time-string "%Y%m%d_%H%M%S") ".png")
-       )
-      )
-    (call-process "import" nil nil nil my/org-insert-screenshot/filename)
-    (insert (concat "[[" my/org-insert-screenshot/filename "]]"))
-    (org-display-inline-images))
-
-  (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)
-
-  ;; use xelatex to preview with imagemagick
-  (add-to-list 'org-preview-latex-process-alist
-           '(xelateximagemagick
-        :programs ("xelatex" "convert")
-        :description "pdf > png"
-        :message "you need to install xelatex and imagemagick"
-        :use-xcolor t
-        :image-input-type "pdf"
-        :image-output-type "png"
-        :image-size-adjust (1.0 . 1.0)
-        :latex-compiler ("xelatex -interaction nonstopmode -output-directory %o %f")
-        :image-converter ("convert -density %D -trim -antialias %f -quality 100 %O"))
-           )
-  ;; use xelatex by default
-  (setq org-preview-latex-default-process 'xelateximagemagick)
+(defun bh/clock-in-to-next (kw)
+  "Switch a task from TODO to NEXT when clocking in.
+Skips capture tasks, projects, and subprojects.
+Switch projects and subprojects from NEXT back to TODO"
+  (when (not (and (boundp 'org-capture-mode) org-capture-mode))
+    (cond
+     ((and (member (org-get-todo-state) (list "TODO"))
+       (bh/is-task-p))
+  "NEXT")
+     ((and (member (org-get-todo-state) (list "NEXT"))
+       (bh/is-project-p))
+  "TODO"))))
+
+(defun bh/punch-in (arg)
+  "Start continuous clocking and set the default task to the
+selected task.  If no task is selected set the Organization task
+as the default task."
+  (interactive "p")
+  (setq bh/keep-clock-running t)
+  (if (equal major-mode 'org-agenda-mode)
+  ;;
+  ;; We're in the agenda
+  ;;
+  (let* ((marker (org-get-at-bol 'org-hd-marker))
+         (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)))
+    ;;
+    ;; We are not in the agenda
+    ;;
+    (save-restriction
+  (widen)
+  ; Find the tags on the current task
+  (if (and (equal major-mode 'org-mode) (not (org-before-first-heading-p)) (eq arg 4))
+      (org-clock-in '(16))
+    (bh/clock-in-organization-task-as-default)))))
+
+(defun bh/punch-out ()
+  (interactive)
+  (setq bh/keep-clock-running nil)
+  (when (org-clock-is-active)
+    (org-clock-out))
+  (org-agenda-remove-restriction-lock))
+
+(defun bh/clock-in-default-task ()
+  (save-excursion
+    (org-with-point-at org-clock-default-task
+  (org-clock-in))))
+
+(defun bh/clock-in-parent-task ()
+  "Move point to the parent (project) task if any and clock in"
+  (let ((parent-task))
+    (save-excursion
+  (save-restriction
+    (widen)
+    (while (and (not parent-task) (org-up-heading-safe))
+      (when (member (nth 2 (org-heading-components)) org-todo-keywords-1)
+        (setq parent-task (point))))
+    (if parent-task
+        (org-with-point-at parent-task
+      (org-clock-in))
+      (when bh/keep-clock-running
+        (bh/clock-in-default-task)))))))
+
+(defvar bh/organization-task-id "e22cb8bf-07c7-408b-8f60-ff3aadac95e4")
+
+(defun bh/clock-in-organization-task-as-default ()
+  (interactive)
+  (org-with-point-at (org-id-find bh/organization-task-id 'marker)
+    (org-clock-in '(16))))
+
+(defun bh/clock-out-maybe ()
+  (when (and bh/keep-clock-running
+         (not org-clock-clocking-in)
+         (marker-buffer org-clock-default-task)
+         (not org-clock-resolving-clocks-due-to-idleness))
+    (bh/clock-in-parent-task)))
+
+; (add-hook 'org-clock-out-hook 'bh/clock-out-maybe 'append)
+
+(require 'org-id)
+(defun bh/clock-in-task-by-id (id)
+  "Clock in a task by id"
+  (org-with-point-at (org-id-find id 'marker)
+    (org-clock-in nil)))
+
+(defun bh/clock-in-last-task (arg)
+  "Clock in the interrupted task if there is one
+Skip the default task and get the next one.
+A prefix arg forces clock in of the default task."
+  (interactive "p")
+  (let ((clock-in-to-task
+     (cond
+      ((eq arg 4) org-clock-default-task)
+      ((and (org-clock-is-active)
+        (equal org-clock-default-task (cadr org-clock-history)))
+       (caddr org-clock-history))
+      ((org-clock-is-active) (cadr org-clock-history))
+      ((equal org-clock-default-task (car org-clock-history)) (cadr org-clock-history))
+      (t (car org-clock-history)))))
+    (widen)
+    (org-with-point-at clock-in-to-task
+  (org-clock-in nil))))
+
+
+(defun org-export-to-ods ()
+  (interactive)
+  (let ((csv-file "data.csv"))
+    (org-table-export csv-file "orgtbl-to-csv")
+    (org-odt-convert csv-file "ods" 'open)))
+
+; allow for zero-width-space to be a break in regexp too
+; (setcar org-emphasis-regexp-components "​ [:space:] \t('\"{")
+; (setcar (nthcdr 1 org-emphasis-regexp-components) "​ [:space:]- \t.,:!?;'\")}\\")
+; (org-set-emph-re 'org-emphasis-regexp-components org-emphasis-regexp-components)
+
+;; support inserting screen shots
+(defun my/org-insert-screenshot ()
+  "Take a screenshot into a time stamped unique-named file in the
+same directory as the org-buffer and insert a link to this file."
+  (interactive)
+  (defvar my/org-insert-screenshot/filename)
+  (setq my/org-insert-screenshot/filename
+    (read-file-name
+     "Screenshot to insert: "
+     nil
+     (concat (buffer-file-name) "_" (format-time-string "%Y%m%d_%H%M%S") ".png")
+     )
+    )
+  (call-process "import" nil nil nil my/org-insert-screenshot/filename)
+  (insert (concat "[[" my/org-insert-screenshot/filename "]]"))
+  (org-display-inline-images))
 
-  ; from http://orgmode.org/Changes.html
-  (defun my/org-repair-property-drawers ()
-    "Fix properties drawers in current buffer.
-   Ignore non Org buffers."
-    (interactive)
-    (when (eq major-mode 'org-mode)
-      (org-with-wide-buffer
-       (goto-char (point-min))
-       (let ((case-fold-search t)
-         (inline-re (and (featurep 'org-inlinetask)
-                 (concat (org-inlinetask-outline-regexp)
-                     "END[ \t]*$"))))
-     (org-map-entries
-      (lambda ()
-        (unless (and inline-re (org-looking-at-p inline-re))
-          (save-excursion
-        (let ((end (save-excursion (outline-next-heading) (point))))
-          (forward-line)
-          (when (org-looking-at-p org-planning-line-re) (forward-line))
-          (when (and (< (point) end)
-                 (not (org-looking-at-p org-property-drawer-re))
-                 (save-excursion
-                   (and (re-search-forward org-property-drawer-re end t)
-                    (eq (org-element-type
-                     (save-match-data (org-element-at-point)))
-                    'drawer))))
-            (insert (delete-and-extract-region
-                 (match-beginning 0)
-                 (min (1+ (match-end 0)) end)))
-            (unless (bolp) (insert "\n"))))))))))))
+(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)
+
+;; use xelatex to preview with imagemagick
+(add-to-list 'org-preview-latex-process-alist
+         '(xelateximagemagick
+      :programs ("xelatex" "convert")
+      :description "pdf > png"
+      :message "you need to install xelatex and imagemagick"
+      :use-xcolor t
+      :image-input-type "pdf"
+      :image-output-type "png"
+      :image-size-adjust (1.0 . 1.0)
+      :latex-compiler ("xelatex -interaction nonstopmode -output-directory %o %f")
+      :image-converter ("convert -density %D -trim -antialias %f -quality 100 %O"))
+         )
+;; use xelatex by default
+(setq org-preview-latex-default-process 'xelateximagemagick)
+
+; from http://orgmode.org/Changes.html
+(defun my/org-repair-property-drawers ()
+  "Fix properties drawers in current buffer.
+ Ignore non Org buffers."
+  (interactive)
+  (when (eq major-mode 'org-mode)
+    (org-with-wide-buffer
+     (goto-char (point-min))
+     (let ((case-fold-search t)
+       (inline-re (and (featurep 'org-inlinetask)
+               (concat (org-inlinetask-outline-regexp)
+                   "END[ \t]*$"))))
+   (org-map-entries
+    (lambda ()
+      (unless (and inline-re (org-looking-at-p inline-re))
+        (save-excursion
+      (let ((end (save-excursion (outline-next-heading) (point))))
+        (forward-line)
+        (when (org-looking-at-p org-planning-line-re) (forward-line))
+        (when (and (< (point) end)
+               (not (org-looking-at-p org-property-drawer-re))
+               (save-excursion
+                 (and (re-search-forward org-property-drawer-re end t)
+                  (eq (org-element-type
+                   (save-match-data (org-element-at-point)))
+                  'drawer))))
+          (insert (delete-and-extract-region
+               (match-beginning 0)
+               (min (1+ (match-end 0)) end)))
+          (unless (bolp) (insert "\n"))))))))))))
 
 #+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"))
-              )
-    )
+(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
 ** appt integration
 #+BEGIN_SRC emacs-lisp
@@ -2383,12 +2584,24 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori
     )
 
 
+#+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
   )
 #+END_SRC
 * Keybindings
+** Home/End Begining/End of line
+#+BEGIN_SRC emacs-lisp
+  (global-set-key [home] 'move-beginning-of-line)
+  (global-set-key [end] 'move-end-of-line)
+#+END_SRC
 ** Goto line
 #+BEGIN_SRC emacs-lisp
   (global-unset-key "\M-g")
@@ -2410,13 +2623,20 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori
   (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
+#+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 markdown-enable-math t)
-  (setq markdown-follow-wiki-link-on-enter nil)
   (setq mutt-alias-file-list (quote ("~/.mutt/aliases" "~/.mail_aliases")))
+#+END_SRC
+** PS Printing
+#+BEGIN_SRC emacs-lisp
   (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)))
@@ -2424,28 +2644,41 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori
   (setq ps-print-footer t)
   (setq ps-print-footer-frame nil)
   (setq ps-print-only-one-header t)
+#+END_SRC
+** Only single spacing on sentences
+#+BEGIN_SRC emacs-lisp
   (setq sentence-end "[.?!][]\"')]*\\($\\|   \\| \\)[    
   ]*")
   (setq sentence-end-double-space nil)
   ; enable matching parenthesis
+#+END_SRC
+** Display paren mode
+#+BEGIN_SRC emacs-lisp
   (show-paren-mode 1)
-  (tool-bar-mode -1)
-  (setq user-mail-address "don@donarmstrong.com")
-  (setq vc-delete-logbuf-window nil)
-  (setq vc-follow-symlinks t)
+  (setq show-paren-delay 0.2)
 
-  ;; use git before SVN; use CVS earlier, because I have CVS
-  ;; repositories inside of git directories
-  (setq vc-handled-backends (quote (CVS Git RCS SVN SCCS Bzr Hg Mtn Arch)))
+#+END_SRC
+** My Username
+#+BEGIN_SRC emacs-lisp
+  (setq user-mail-address "don@donarmstrong.com")
 
+#+END_SRC
+** Use primary selection on unix machines
+#+BEGIN_SRC emacs-lisp
   ;; switch back to the old primary selection method
-  (setq x-select-enable-clipboard nil)
-  (setq x-select-enable-primary t)
+  (if (or (string-equal system-type "darwin")
+          (string-equal system-type "windows")
+          )
+      (progn
+        (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)
 
-  (fset 'perl-mode 'cperl-mode)
-  ;;(load-file "cperl-mode.el")
-
   ;; tramp configuration
   (setq tramp-use-ssh-controlmaster-options nil)