updates
[emacs.git] / .emacs.d / config / emacs.org
index 26f9214..61d5706 100644 (file)
@@ -12,7 +12,7 @@
 :END:
 The following functions are used throughout my config, and so I load
 them first.
-
+*** safe-load
 safe-load does not break emacs initialization, should a file be
 unreadable while emacs boots up.
 #+BEGIN_SRC emacs-lisp :tangle yes
@@ -37,7 +37,7 @@ unreadable while emacs boots up.
   (if (string-equal safe-load-error-list "") ()
                (message (concat "****** error loading: " safe-load-error-list))))
 #+END_SRC
-
+*** Local autoloads
 I have some stuff put away in my local dir. I don't want to load it all
 at startup time, so it is using the autoload feature. For that to work
 load the loaddefs, so autoload knows where to grab stuff
@@ -45,7 +45,7 @@ load the loaddefs, so autoload knows where to grab stuff
 (safe-load (concat jj-elisp-dir "/tiny/loaddefs.el"))
 (safe-load (concat jj-elisp-local-dir "/loaddefs.el"))
 #+END_SRC
-
+*** Keep *scratch* around
 Always ensure to have a scratch buffer around.
 #+BEGIN_SRC emacs-lisp :tangle yes
 (with-current-buffer (get-buffer-create "*scratch*")
@@ -53,7 +53,7 @@ Always ensure to have a scratch buffer around.
     (make-local-variable 'kill-buffer-query-functions)
     (add-hook 'kill-buffer-query-functions 'kill-scratch-buffer))
 #+END_SRC
-
+*** add-auto-mode
 Handier way to add modes to auto-mode-alist
 #+BEGIN_SRC emacs-lisp :tangle yes
 (defun add-auto-mode (mode &rest patterns)
@@ -61,58 +61,76 @@ Handier way to add modes to auto-mode-alist
   (dolist (pattern patterns)
     (add-to-list 'auto-mode-alist (cons pattern mode))))
 #+END_SRC
-
+*** config helpers use-package/bind-key
 Helpers for the config
+https://github.com/jwiegley/use-package
 #+BEGIN_SRC emacs-lisp :tangle yes
 (require 'use-package)
 (require 'bind-key)
 #+END_SRC
+*** hook-into-modes
+[2014-05-20 Tue 22:36]
+#+BEGIN_SRC emacs-lisp :tangle yes
+(defmacro hook-into-modes (func modes)
+  `(dolist (mode-hook ,modes)
+     (add-hook mode-hook ,func)))
+#+END_SRC
+
+*** elpa
+The Emacs Lisp Package Archive contains things I want.
+#+BEGIN_SRC emacs-lisp :tangle yes
+(when (> emacs-major-version 23)
+  (require 'package)
+  (setq package-user-dir (expand-file-name "elpa" jj-elisp-dir))
+  (dolist (source '(("melpa" . "http://melpa.org/packages/")
+                    ("melpa-stable" . "http://stable.melpa.org/packages/")
+                    ("marmalade" . "http://marmalade-repo.org/packages/")
+                    ("elpy"         . "http://jorgenschaefer.github.io/packages/")
+                    ("elpa" . "http://elpa.gnu.org/packages/")
+))
+    (add-to-list 'package-archives source t))
+  (package-initialize)
+)
+#+END_SRC
 
 ** Path settings
 *** Load path
 We need to define the load-path. As I have lots of things I add
-locally, its getting a few entries. I only leave out org-mode here, as
-that is already done in =init.el=.
+locally, its getting a few entries. I disliked the repeated
+/add-to-list/ lines, so I now just take all subdirectories of
+jj-elisp-dir and add them.
 
-I also disliked the repeated /add-to-list/ lines, so I now just have
-one variable and go over that in a loop.
+Additionally I also ensure that files in there are recompiled, when
+neccessary.
 #+BEGIN_SRC emacs-lisp :tangle yes
-(defvar jj-elisp-subdirs '(local gnus icicle org/contrib tiny mo-git-blame cedet
-                           cedet/eieio ecb jdee/lisp sunrise multiple-cursors
-                           auto-complete yasnippet magit mmm emms/lisp
-                           elpy find-file-in-project fuzzy idomenu nose
-                           popup pyvenv git-rebase-mode git-commit-mode)
-  "List of subdirectories in jj-elisp-dir to add to load-path")
-
-(let (dirval)
-  (dolist (dirval jj-elisp-subdirs)
-    (let ((name (expand-file-name (symbol-name dirval) jj-elisp-dir)))
-      (when (file-exists-p name)
-          (add-to-list 'load-path name)))))
-;; For older emacsen we need an extra directory, which should be at
-;; THE END of the load path
-(when (version< emacs-version "24")
-  (add-to-list 'load-path (expand-file-name "emacs23" jj-elisp-dir) t))
-
+(dolist
+    (project (directory-files jj-elisp-dir t "\\w+"))
+  (when (file-directory-p project)
+    (if (string= project "emacs23")
+        (when (version< emacs-version "24")
+          (add-to-list 'load-path project))
+      (add-to-list 'load-path project))
+    ;(byte-recompile-directory project 0)
+   ))
 #+END_SRC
 
 *** Info path
 Help emacs to find the info files
-#+BEGIN_SRC emacs-lisp :tangle yes
-(setq Info-directory-list '("~/emacs/info"
-                            "/usr/local/share/info/"
-                            "/usr/local/info/"
-                            "/usr/local/gnu/info/"
-                            "/usr/local/gnu/lib/info/"
-                            "/usr/local/gnu/lib/emacs/info/"
-                            "/usr/local/emacs/info/"
-                            "/usr/local/lib/info/"
-                            "/usr/local/lib/emacs/info/"
-                            "/usr/share/info/emacs-23"
-                            "/usr/share/info/"
-                            "/usr/share/info/"))
+#+BEGIN_SRC emacs-lisp :tangle no
+(setq Info-directory-list (cons jj-info-dir
+                                '("/usr/local/share/info/"
+                                  "/usr/local/info/"
+                                  "/usr/local/gnu/info/"
+                                  "/usr/local/gnu/lib/info/"
+                                  "/usr/local/gnu/lib/emacs/info/"
+                                  "/usr/local/emacs/info/"
+                                  "/usr/local/lib/info/"
+                                  "/usr/local/lib/emacs/info/"
+                                  "/usr/share/info/emacs-23"
+                                  "/usr/share/info/"
+                                  "/usr/share/info/")))
 (setq Info-default-directory-list
-      (cons "~/emacs/info" Info-default-directory-list))
+      (cons jj-info-dir Info-default-directory-list))
 #+END_SRC
 
 ** Interface related
@@ -128,14 +146,14 @@ I dislike the startup message
 
 Usually I want the lines to break at 72 characters.
 #+BEGIN_SRC emacs-lisp :tangle yes
-(if (version<= emacs-version "22")
-    (setq default-fill-column 72)
-  (setq fill-column 72))
+(setq fill-column 72)
 #+END_SRC
 
 And it is nice to have a final newline in files.
+(Now off, ethan-wspace is doing it better).
 #+BEGIN_SRC emacs-lisp :tangle yes
-(setq require-final-newline t)
+(setq require-final-newline nil)
+(setq mode-require-final-newline nil)
 #+END_SRC
 
 After I typed 300 characters or took a break for more than a minute it
@@ -171,19 +189,17 @@ Emacs forbids a certain set of commands, as they can be very confusing
 for new users. Enable them.
 #+BEGIN_SRC emacs-lisp :tangle yes
 (put 'narrow-to-region 'disabled nil)
-(put 'narrow-to-page 'disabled nil)
-(put 'narrow-to-defun 'disabled nil)
-(put 'upcase-region 'disabled nil)
-(put 'downcase-region 'disabled nil)
+(put 'narrow-to-page   'disabled nil)
+(put 'narrow-to-defun  'disabled nil)
+(put 'upcase-region    'disabled nil)
+(put 'downcase-region  'disabled nil)
 #+END_SRC
 
 *** Look / Theme
 I've tried various different fonts and while I like the Terminus font
 most for my shells, in Emacs Inconsolata clearly wins.
 #+BEGIN_SRC emacs-lisp :tangle yes
-(if (version<= emacs-version "22")
-    (set-default-font "Inconsolata-14")
-  (set-frame-font "Inconsolata-14"))
+(set-frame-font "Inconsolata-14")
 #+END_SRC
 
 I always use dark backgrounds, so tell Emacs about it. No need to
@@ -197,7 +213,7 @@ switched through multiple themes doing it in emacs too, but never
 entirely liked it. Until I found solarized, which is now not only my
 emacs theme, but also for most of my other software too, especially my
 shell. Consistent look is great.
-#+BEGIN_SRC emacs-lisp :tangle yes
+#+BEGIN_SRC emacs-lisp :tangle no
 (if (or (> emacs-major-version 23) (boundp 'custom-theme-load-path))
     (progn
       (defun jj-init-theme ()
@@ -215,11 +231,27 @@ shell. Consistent look is great.
   (color-theme-solarized-dark)
 )
 #+END_SRC
+#+BEGIN_SRC emacs-lisp :tangle yes
+(use-package solarized
+  :load-path "elisp/emacs-color-theme-solarized"
+  :init
+  (progn
+    (defun jj-init-theme ()
+      (interactive)
+      (if (eq jj-color-style 'dark )(load-theme 'solarized-dark t)
+        (load-theme 'solarized-light t))
+      (set-face-attribute 'org-date nil :underline nil)
+      (message "Initializing theme solarized-dark")
+      )
+    (add-to-list 'custom-theme-load-path jj-theme-dir)
+    (add-hook 'after-init-hook 'jj-init-theme)
+    (jj-init-theme)))
+#+END_SRC
 
 Make the fringe (gutter) smaller, the argument is a width in pixels (the default is 8)
 #+BEGIN_SRC emacs-lisp :tangle yes
 (if (fboundp 'fringe-mode)
-    (fringe-mode 4))
+    (fringe-mode 8))
 #+END_SRC
 
 A bit more spacing between buffer lines
@@ -236,9 +268,8 @@ I do not want my cursor to blink.
 I don't want to see the menu-bar, tool-bar or scrollbar.
 #+BEGIN_SRC emacs-lisp :tangle yes
 (when window-system
-  (menu-bar-mode -1)
-  (tool-bar-mode -1)
-  (set-scroll-bar-mode nil))
+  (dolist (mode '(menu-bar-mode tool-bar-mode scroll-bar-mode))
+  (when (fboundp mode) (funcall mode -1))))
 #+END_SRC
 **** When using emacs in daemon mode
 Emacs has a very nice mode where it detaches itself and runs as daemon -
@@ -280,19 +311,27 @@ Size indication lets me know how far I am in a buffer.
 And modeline-posn is great. It will hilight the column number in the
 modeline in red as soon as you are over the defined limit.
 
+
 #+BEGIN_SRC emacs-lisp :tangle yes
 (line-number-mode 1)
 (column-number-mode 1)
 (size-indication-mode 1)
 (display-time-mode 1)
 (setq display-time-day-and-date nil)
+(setq display-time-default-load-average nil)
 (setq display-time-24hr-format t)
 (setq modelinepos-column-limit 72)
 
-(require 'modeline-posn)
-(set-face-foreground 'modelinepos-column-warning "grey20")
-(set-face-background 'modelinepos-column-warning "red")
+(use-package modeline-posn
+  :ensure modeline-posn
+  :config
+  (progn
+    (set-face-foreground 'modelinepos-column-warning "grey20")
+    (set-face-background 'modelinepos-column-warning "red")
+    (setq modelinepos-column-limit 72))
+  )
 #+END_SRC
+
 **** diminish
 [2013-04-22 Mon 11:27]
 The modeline is easily cluttered up with stuff I don't really need to
@@ -317,7 +356,8 @@ character(s).
       (org-mode . "Ω")
       (org-indent-mode . "")
       (sh-mode . " Σ")
-      (nxhtml-mode . "nx"))
+      (nxhtml-mode . "nx")
+      (subword-mode . ""))
 
     "Alist for `clean-mode-line'.
 
@@ -345,9 +385,7 @@ be org-mode - it is just so much better to use. And does sensible things
 with many README files out there, and various other "crap" you get to
 read in emacs.
 #+BEGIN_SRC emacs-lisp :tangle yes
-(if (> emacs-major-version 22)
-  (setq major-mode 'org-mode)
-  (setq default-major-mode 'org-mode))
+(setq major-mode 'org-mode)
 (setq initial-major-mode 'org-mode)
 #+END_SRC
 
@@ -371,32 +409,81 @@ Shell. zsh in my case.
 
 *** Emacs shell
 Basic settings for emacs integrated shell
-#+BEGIN_SRC emacs-lisp :tangle yes
-(setq eshell-cmpl-cycle-completions nil
-      eshell-save-history-on-exit t
-      eshell-cmpl-dir-ignore "\\`\\(\\.\\.?\\|CVS\\|\\.svn\\|\\.git\\)/\\'")
-(eval-after-load 'esh-opt
-  '(progn
-     (require 'em-cmpl)
-     (require 'em-prompt)
-     (require 'em-term)
-     ;; TODO: for some reason requiring this here breaks it, but
-     ;; requiring it after an eshell session is started works fine.
-     ;; (require 'eshell-vc)
-     (after 'eshell-mode
-       (setenv "PAGER" "cat")
-       (add-to-list 'eshell-visual-commands "ssh")
-       (add-to-list 'eshell-visual-commands "tail")
-       (add-to-list 'eshell-command-completions-alist
-                    '("gunzip" "gz\\'"))
-       (add-to-list 'eshell-command-completions-alist
-                    '("tar" "\\(\\.tar|\\.tgz\\|\\.tar\\.gz\\)\\'")))
-
-     ; (set-face-attribute 'eshell-prompt nil :foreground "turquoise1")
-     (add-hook 'eshell-mode-hook ;; for some reason this needs to be a hook
-               '(lambda () (define-key eshell-mode-map "\C-a" 'eshell-bol)))
-     (add-hook 'eshell-preoutput-filter-functions
-               'ansi-color-filter-apply)))
+#+BEGIN_SRC emacs-lisp :tangle no
+(use-package eshell
+  :defer t
+  :init
+  (progn
+    (defun eshell-initialize ()
+      (defun eshell-spawn-external-command (beg end)
+        "Parse and expand any history references in current input."
+        (save-excursion
+          (goto-char end)
+          (when (looking-back "&!" beg)
+            (delete-region (match-beginning 0) (match-end 0))
+            (goto-char beg)
+            (insert "spawn "))))
+      (add-hook 'eshell-expand-input-functions 'eshell-spawn-external-command)
+      (eval-after-load "em-unix"
+        '(progn
+           (unintern 'eshell/su)
+           (unintern 'eshell/sudo))))
+    (add-hook 'eshell-first-time-mode-hook 'eshell-initialize)
+    )
+  :config
+  (progn
+    (require 'em-cmpl)
+    (require 'em-prompt)
+    (require 'em-term)
+    (use-package f
+      :ensure f)
+    (setq eshell-cmpl-cycle-completions nil
+          eshell-save-history-on-exit t
+          eshell-cmpl-dir-ignore "\\`\\(\\.\\.?\\|CVS\\|\\.svn\\|\\.git\\)/\\'")
+    (setenv "PAGER" "cat")
+    (setq eshell-visual-commands
+          '("less" "tmux" "htop" "top" "bash" "zsh" "tail"))
+    (setq eshell-visual-subcommands
+          '(("git" "log" "l" "diff" "show")))
+
+    (add-to-list 'eshell-command-completions-alist
+                 '("gunzip" "gz\\'"))
+    (add-to-list 'eshell-command-completions-alist
+                 '("tar" "\\(\\.tar|\\.tgz\\|\\.tar\\.gz\\)\\'"))
+
+    ;(set-face-attribute 'eshell-prompt nil :foreground "turquoise1")
+    (add-hook 'eshell-mode-hook ;; for some reason this needs to be a hook
+              '(lambda () (define-key eshell-mode-map "\C-a" 'eshell-bol)))
+    (add-hook 'eshell-preoutput-filter-functions
+              'ansi-color-filter-apply)
+    ;; Prompt with a bit of help from http://www.emacswiki.org/emacs/EshellPrompt
+
+    (defmacro with-face (str &rest properties)
+      `(propertize ,str 'face (list ,@properties)))
+
+    (defun eshell/abbr-pwd ()
+      (let ((home (getenv "HOME"))
+            (path (eshell/pwd)))
+        (cond
+         ((string-equal home path) "~")
+         ((f-ancestor-of? home path) (concat "~/" (f-relative path home)))
+         (path))))
+
+    (defun eshell/my-prompt ()
+      (let ((header-bg "#161616"))
+        (concat
+         (with-face user-login-name :foreground "cyan")
+         (with-face (concat "@" hostname) :foreground "white")
+         " "
+         (with-face (eshell/abbr-pwd) :foreground "#009900")
+         (if (= (user-uid) 0)
+             (with-face "#" :foreground "red")
+           (with-face "$" :foreground "#69b7f0"))
+         " ")))
+
+    (setq eshell-prompt-function 'eshell/my-prompt)
+    (setq eshell-highlight-prompt nil)
+    (setq eshell-prompt-regexp "^[^#$\n]+[#$] ")))
 #+END_SRC
 
 *** Isearch related
@@ -406,9 +493,9 @@ occurence of what is at your cursor position use the following.
 *C-x* will insert the current word while *M-up* and *M-down* will just
 jump to the next/previous occurence of it.
 #+BEGIN_SRC emacs-lisp :tangle yes
-(define-key isearch-mode-map (kbd "C-x") 'sacha/isearch-yank-current-word)
-(global-set-key '[M-up] 'sacha/search-word-backward)
-(global-set-key '[M-down] 'sacha/search-word-forward)
+(bind-key "C-x" 'sacha/isearch-yank-current-word isearch-mode-map)
+(bind-key* "<M-up>" 'sacha/search-word-backward)
+(bind-key* "<M-down>" 'sacha/search-word-forward)
 #+END_SRC
 
 *** Frame configuration
@@ -423,11 +510,14 @@ I don't want some buffers to be killed, **scratch** for example.
 In the past I had a long function that just recreated them, but the
 =keep-buffers= package is easier.
 #+BEGIN_SRC emacs-lisp :tangle yes
-(require 'keep-buffers)
-(keep-buffers-mode 1)
-(push '("\\`*scratch" . erase) keep-buffers-protected-alist)
-(push '("\\`*Org Agenda" . nil) keep-buffers-protected-alist)
-(push '("\\`*Group" . nil) keep-buffers-protected-alist)
+(use-package keep-buffers
+  :init
+  (progn
+    (keep-buffers-mode 1)
+    (push '("\\`*scratch" . erase) keep-buffers-protected-alist)
+    (push '("\\`*Org Agenda" . nil) keep-buffers-protected-alist)
+    (push '("\\`*Group" . nil) keep-buffers-protected-alist)
+    ))
 #+END_SRC
 
 *** yes-or-no-p
@@ -448,21 +538,24 @@ In this day and age, UTF-8 is the way to go.
 (prefer-coding-system 'utf-8)
 (set-charset-priority 'unicode)
 (setq default-process-coding-system '(utf-8-unix . utf-8-unix))
+(when (display-graphic-p)
+  (setq x-select-request-type '(UTF8_STRING COMPOUND_TEXT TEXT STRING)))
 #+END_SRC
 
 *** Hilight matching parentheses
 While I do have the nifty shortcut to jump to the other parentheses,
 hilighting them makes it obvious where they are.
 #+BEGIN_SRC emacs-lisp :tangle yes
-(require 'paren)
-(setq show-paren-style 'parenthesis)
-(show-paren-mode +1)
+(use-package mic-paren
+  :init
+  (paren-activate))
 #+END_SRC
 *** Kill other buffers
 While many editors allow you to close "all the other files, not the one
 you are in", emacs doesn't have this... Except, now it will.
-#+BEGIN_SRC emacs-lisp :tangle yes
-(global-set-key (kbd "C-c k") 'prelude-kill-other-buffers)
+(Update 30.05.2014: Not used ever, deactivated)
+#+BEGIN_SRC emacs-lisp :tangle no
+(bind-key "C-c k" 'prelude-kill-other-buffers)
 #+END_SRC
 *** Scrolling
 Default scrolling behaviour in emacs is a bit annoying, who wants to
@@ -480,18 +573,40 @@ jump half-windows?
 The default how emacs handles cutting/pasting with the primary selection
 changed in emacs24. I am used to the old way, so get it back.
 #+BEGIN_SRC emacs-lisp :tangle yes
-(setq x-select-enable-primary t)
-(setq x-select-enable-clipboard t        ;; copy-paste should work ...
-  interprogram-paste-function            ;; ...with...
-  'x-cut-buffer-or-selection-value)      ;; ...other X clients
-
+(setq select-enable-primary t)
+(setq select-enable-clipboard nil)
+(setq interprogram-paste-function 'x-cut-buffer-or-selection-value)
+(setq mouse-drag-copy-region t)
 #+END_SRC
-
 *** Global keyboard changes not directly related to a mode
 Disable /suspend_frame/ function, I dislike it.
 #+BEGIN_SRC emacs-lisp :tangle yes
-(global-unset-key [(control z)])
-(global-unset-key [(control x) (control z)])
+(unbind-key "C-z")
+(unbind-key "C-x C-z")
+#+END_SRC
+
+http://endlessparentheses.com/kill-entire-line-with-prefix-argument.html?source=rss
+#+BEGIN_SRC emacs-lisp :tangle yes
+(defmacro bol-with-prefix (function)
+  "Define a new function which calls FUNCTION.
+Except it moves to beginning of line before calling FUNCTION when
+called with a prefix argument. The FUNCTION still receives the
+prefix argument."
+  (let ((name (intern (format "endless/%s-BOL" function))))
+    `(progn
+       (defun ,name (p)
+         ,(format
+           "Call `%s', but move to BOL when called with a prefix argument."
+           function)
+         (interactive "P")
+         (when p
+           (forward-line 0))
+         (call-interactively ',function))
+       ',name)))
+
+(global-set-key [remap paredit-kill] (bol-with-prefix paredit-kill))
+(global-set-key [remap org-kill-line] (bol-with-prefix org-kill-line))
+(global-set-key [remap kill-line] (bol-with-prefix kill-line))
 #+END_SRC
 
 Default of *C-k* is to kill from the point to the end of line. If
@@ -499,7 +614,7 @@ Default of *C-k* is to kill from the point to the end of line. If
 set, including newline. But to kill the entire line, one still needs a
 *C-a* in front of it. So I change it, by defining a function to do just this for
 me. Lazyness++.
-#+BEGIN_SRC emacs-lisp :tangle yes
+#+BEGIN_SRC emacs-lisp :tangle no
 (defun kill-entire-line ()
   "Kill this entire line (including newline), regardless of where point is within the line."
   (interactive)
@@ -507,14 +622,13 @@ me. Lazyness++.
   (kill-line)
   (back-to-indentation))
 
-(global-unset-key [(control k)])
-(global-set-key [(control k)] 'kill-entire-line)
+(bind-key* "C-k" 'kill-entire-line)
 (global-set-key [remap kill-whole-line] 'kill-entire-line)
 #+END_SRC
 
 And the same is true when I'm in org-mode, which has an own kill function...
 (the keybinding happens later, after org-mode is loaded fully)
-#+BEGIN_SRC emacs-lisp :tangle yes
+#+BEGIN_SRC emacs-lisp :tangle no
 (defun jj-org-kill-line (&optional arg)
   "Kill the entire line, regardless of where point is within the line, org-mode-version"
   (interactive "P")
@@ -533,73 +647,81 @@ file/project, but luckily none of those I work in is as broken.
 
 Make the % key jump to the matching {}[]() if on another, like vi, see [[id:b6e6cf73-9802-4a7b-bd65-fdb6f9745319][the function]]
 #+BEGIN_SRC emacs-lisp :tangle yes
-(global-set-key "\M-5" 'match-paren)
+(bind-key* "M-5" 'match-paren)
 #+END_SRC
 
 Instead of the default "mark-defun" I want a more readline-like setting.
-#+begin_src emacs-lisp
-(global-set-key (kbd "C-M-h") 'backward-kill-word)
-#+end_src
+#+BEGIN_SRC emacs-lisp :tangle yes
+(bind-key "C-M-h" 'backward-kill-word)
+#+END_SRC
 
 Align whatever with a regexp.
-#+begin_src emacs-lisp
-(global-set-key (kbd "C-x \\") 'align-regexp)
-#+end_src
+#+BEGIN_SRC emacs-lisp :tangle yes
+(bind-key "C-x \\" 'align-regexp)
+#+END_SRC
 
 Font size changes
-#+begin_src emacs-lisp
-(global-set-key (kbd "C-+") 'text-scale-increase)
-(global-set-key (kbd "C--") 'text-scale-decrease)
-#+end_src
+#+BEGIN_SRC emacs-lisp :tangle yes
+(bind-key "C-+" 'text-scale-increase)
+(bind-key "C--" 'text-scale-decrease)
+#+END_SRC
 
 Regexes are too useful, so use the regex search by default.
 #+begin_src emacs-lisp
-(global-set-key (kbd "C-s") 'isearch-forward-regexp)
-(global-set-key (kbd "\C-r") 'isearch-backward-regexp)
-(global-set-key (kbd "C-M-s") 'isearch-forward)
-(global-set-key (kbd "C-M-r") 'isearch-backward)
+(bind-key "C-s"   'isearch-forward-regexp)
+(bind-key "C-r"   'isearch-backward-regexp)
+(bind-key "C-M-s" 'isearch-forward)
+(bind-key "C-M-r" 'isearch-backward)
 #+end_src
 
 Rgrep is infinitely useful in multi-file projects.
 #+begin_src emacs-lisp
-(define-key global-map "\C-x\C-g" 'rgrep)
+(bind-key "C-x C-g" 'rgrep)
 #+end_src
 
 Easy way to move a line up - or down. Simpler than dealing with C-x C-t
 AKA transpose lines.
 #+BEGIN_SRC emacs-lisp :tangle yes
-(global-set-key [(meta shift up)]  'move-line-up)
-(global-set-key [(meta shift down)]  'move-line-down)
+(bind-key "<M-S-up>"  'move-line-up)
+(bind-key "<M-S-down>" 'move-line-down)
 #+END_SRC
 
 "Pull" lines up, join them
 #+BEGIN_SRC emacs-lisp :tangle yes
-(global-set-key (kbd "M-j")
-                (lambda ()
-                  (interactive)
-                  (join-line -1)))
+(defun join-line-or-lines-in-region ()
+  "Join this line or the lines in the selected region.
+Joins single lines in reverse order to the default, ie. pulls the next one up."
+  (interactive)
+  (cond ((region-active-p)
+         (let ((min (line-number-at-pos (region-beginning))))
+           (goto-char (region-end))
+           (while (> (line-number-at-pos) min)
+             (join-line ))))
+        (t (let ((current-prefix-arg '(4)))
+             (call-interactively 'join-line)))))
+(bind-key "M-j" 'join-line-or-lines-in-region)
 #+END_SRC
 
 When I press Enter I almost always want to go to the right indentation on the next line.
 #+BEGIN_SRC emacs-lisp :tangle yes
-(global-set-key (kbd "RET") 'newline-and-indent)
+(bind-key "RET" 'newline-and-indent)
 #+END_SRC
 
 Easier undo, and i don't need suspend-frame
 #+BEGIN_SRC emacs-lisp :tangle yes
-(global-set-key (kbd "C-z") 'undo)
+(bind-key "C-z" 'undo)
 #+END_SRC
 
 Window switching, go backwards. (C-x o goes to the next window)
 #+BEGIN_SRC emacs-lisp :tangle yes
-(global-set-key (kbd "C-x O") (lambda ()
-                                (interactive)
-                                (other-window -1)))
+(bind-key "C-x O" (lambda ()
+                    (interactive)
+                    (other-window -1)))
 #+END_SRC
 
 Edit file as root
 #+BEGIN_SRC emacs-lisp :tangle yes
-(global-set-key (kbd "C-x C-r") 'prelude-sudo-edit)
+(bind-key "C-x C-r" 'prelude-sudo-edit)
 #+END_SRC
 
 M-space is bound to just-one-space, which is great for programming. What
@@ -608,20 +730,19 @@ be really useful, it also should include newlines. It doesn’t do this by
 default. Rather, you have to call it with a negative argument. Sure
 not, bad Emacs.
 #+BEGIN_SRC emacs-lisp :tangle yes
-(global-set-key (kbd "M-SPC") 'just-one-space-with-newline)
+(bind-key "M-SPC" 'just-one-space-with-newline)
 #+END_SRC
 
 Count which commands I use how often.
 #+BEGIN_SRC emacs-lisp :tangle yes
-(defvar keyfreq-file
-  (expand-file-name "keyfreq" jj-cache-dir)
-  "Keyfreq cache file")
-(defvar keyfreq-file-lock
-  (expand-file-name "keyfreq.lock" jj-cache-dir)
-  "Keyfreq cache file")
-(require 'keyfreq)
-(keyfreq-mode 1)
-(keyfreq-autosave-mode 1)
+(use-package keyfreq
+  :ensure keyfreq
+  :init
+  (progn
+    (setq keyfreq-file (expand-file-name "keyfreq" jj-cache-dir))
+    (setq keyfreq-file-lock (expand-file-name "keyfreq.lock" jj-cache-dir))
+    (keyfreq-mode 1)
+    (keyfreq-autosave-mode 1)))
 #+END_SRC
 
 Duplicate current line
@@ -637,7 +758,7 @@ Duplicate current line
       (newline)
       (insert line-text))))
 
-(global-set-key (kbd "C-c p") 'duplicate-line)
+(bind-key "C-c p" 'duplicate-line)
 #+END_SRC
 
 Smarter move to the beginning of the line. That is, it first moves to
@@ -678,69 +799,111 @@ above point. With a prefix argument, only copy ARG characters (never
 past EOL), no argument copies rest of line.
 #+BEGIN_SRC emacs-lisp :tangle yes
 (require 'misc)
-(global-set-key (kbd "H-y") 'copy-from-above-command)
+(bind-key "H-y" 'copy-from-above-command)
 #+END_SRC
 
 Open a new X Terminal pointing to the directory of the current
 buffers path.
 #+BEGIN_SRC emacs-lisp :tangle yes
-(global-set-key (kbd "H-t") 'jj-open-shell)
+(bind-key "H-t" 'jj-open-shell)
 #+END_SRC
-**** ace-jump-mode
-[2013-04-28 So 11:26]
 
-Quickly move around in buffers.
+Align code
 #+BEGIN_SRC emacs-lisp :tangle yes
-(autoload 'ace-jump-mode "ace-jump-mode" "Emacs quick move minor mode" t)
-(define-key global-map (kbd "H-SPC") 'ace-jump-mode)
-;; enable a more powerful jump back function from ace jump mode
-(autoload 'ace-jump-mode-pop-mark "ace-jump-mode" "Ace jump back :-)" t)
-(eval-after-load "ace-jump-mode" '(ace-jump-mode-enable-mark-sync))
-(define-key global-map (kbd "H-c SPC") 'ace-jump-mode-pop-mark)
+(bind-key "H-a" 'align-code)
 #+END_SRC
-**** Overwrite mode
-Usually you can press the *Ins*ert key, to get into overwrite mode. I
-don't like that, have broken much with it and so just forbid it by
-disabling that.
+
+Insert date
 #+BEGIN_SRC emacs-lisp :tangle yes
-(global-unset-key [insert])
-(global-unset-key [kp-insert])
+(bind-key "C-c d" 'insert-date)
 #+END_SRC
 
-** Miscellaneous stuff
-Emacs should keep backup copies of files I edit, but I do not want them
-to clutter up the filesystem everywhere. So I put them into one defined
-place, backup-directory, which even contains my username (for systems
-where =temporary-file-directory= is not inside my home).
+Another key for indenting
 #+BEGIN_SRC emacs-lisp :tangle yes
-(setq backup-directory-alist `(("." . ,jj-backup-directory)))
-(setq auto-save-file-name-transforms `((".*" ,jj-backup-directory t)))
-
-(setq version-control t)     ;; Use version numbers for backups
-(setq kept-new-versions 10)  ;; Number of newest versions to keep
-(setq kept-old-versions 2)   ;; Number of oldest versions to keep
-(setq delete-old-versions t) ;; Ask to delete excess backup versions?
-
-(add-hook 'before-save-hook  'force-backup-of-buffer)
+(bind-key "H-i" 'indent-region)
+#+END_SRC
 
-(setq backup-by-copying-when-linked t) ;; Copy linked files, don't rename.
-(setq backup-by-copying t)
-(setq make-backup-files t)
+Clean all whitespace stuff
+#+BEGIN_SRC emacs-lisp :tangle yes
+(bind-key "H-w" 'whitespace-cleanup)
+#+END_SRC
 
-(setq backup-enable-predicate
-      (lambda (name)
-        (and (normal-backup-enable-predicate name)
-             (not
-              (let ((method (file-remote-p name 'method)))
-                (when (stringp method)
-                  (member method '("su" "sudo"))))))))
+Comment/Uncomment
+#+BEGIN_SRC emacs-lisp :tangle yes
+(bind-key "H-c" 'comment-dwim)
+#+END_SRC
 
+Show keystrokes in progress
+#+BEGIN_SRC emacs-lisp :tangle yes
+(setq echo-keystrokes 0.1)
+#+END_SRC
+**** Overwrite mode
+Usually you can press the *Ins*ert key, to get into overwrite mode. I
+don't like that, have broken much with it and so just forbid it by
+disabling that.
+#+BEGIN_SRC emacs-lisp :tangle yes
+(unbind-key "<insert>")
+(unbind-key "<kp-insert>")
 #+END_SRC
 
-Weeks start on Monday, not sunday.
+*** Easily navigate sillyCased words
+#+BEGIN_SRC emacs-lisp :tangle yes
+(global-subword-mode 1)
+#+END_SRC
+*** Delete file of current buffer, then kill buffer
+[2014-06-14 Sat 23:03]
 #+BEGIN_SRC emacs-lisp :tangle yes
-(setq calendar-week-start-day 1)
+(defun delete-current-buffer-file ()
+  "Removes file connected to current buffer and kills buffer."
+  (interactive)
+  (let ((filename (buffer-file-name))
+        (buffer (current-buffer))
+        (name (buffer-name)))
+    (if (not (and filename (file-exists-p filename)))
+        (ido-kill-buffer)
+      (when (yes-or-no-p "Are you sure you want to remove this file? ")
+        (delete-file filename)
+        (kill-buffer buffer)
+        (message "File '%s' successfully removed" filename)))))
+
+(global-set-key (kbd "C-x C-k") 'delete-current-buffer-file)
+#+END_SRC
+*** Rename file of current buffer
+[2014-06-14 Sat 23:04]
+#+BEGIN_SRC emacs-lisp :tangle yes
+(defun rename-current-buffer-file ()
+  "Renames current buffer and file it is visiting."
+  (interactive)
+  (let ((name (buffer-name))
+        (filename (buffer-file-name)))
+    (if (not (and filename (file-exists-p filename)))
+        (error "Buffer '%s' is not visiting a file!" name)
+      (let ((new-name (read-file-name "New name: " filename)))
+        (if (get-buffer new-name)
+            (error "A buffer named '%s' already exists!" new-name)
+          (rename-file filename new-name 1)
+          (rename-buffer new-name)
+          (set-visited-file-name new-name)
+          (set-buffer-modified-p nil)
+          (message "File '%s' successfully renamed to '%s'"
+                   name (file-name-nondirectory new-name)))))))
+
+(global-set-key (kbd "C-x C-S-r") 'rename-current-buffer-file)
+#+END_SRC
+*** Quickly find emacs lisp sources
+[2014-06-22 Sun 23:05]
+#+BEGIN_SRC emacs-lisp :tangle yes
+(bind-key "C-l" 'find-library 'help-command)
+(bind-key "C-f" 'find-function 'help-command)
+(bind-key "C-k" 'find-function-on-key 'help-command)
+(bind-key "C-v" 'find-variable 'help-command)
+#+END_SRC
+*** Adjust occur
+[2015-01-26 Mon 16:01]
+#+BEGIN_SRC emacs-lisp :tangle yes
+(bind-key "M-s o" 'occur-dwim)
 #+END_SRC
+** Miscellaneous stuff
 
 Searches and matches should ignore case.
 #+BEGIN_SRC emacs-lisp :tangle yes
@@ -789,10 +952,12 @@ From https://raw.github.com/qdot/conf_emacs/master/emacs_conf.org
   (interactive)
   (let ((fill-column (point-max)))
     (fill-paragraph nil)))
+(bind-key "H-u" 'unfill-paragraph)
 #+END_SRC
 
 #+BEGIN_SRC emacs-lisp :tangle yes
 (setq-default indicate-empty-lines t)
+(setq sentence-end-double-space nil)
 #+END_SRC
 
 Hilight annotations in comments, like FIXME/TODO/...
@@ -813,9 +978,10 @@ Hilight annotations in comments, like FIXME/TODO/...
 
 *** Emacs Server
 #+BEGIN_SRC emacs-lisp :tangle yes
-(require 'server)
-(unless (server-running-p)
-  (server-start))
+(use-package server
+  :init
+  (progn
+    (add-hook 'after-init-hook 'server-start)))
 #+END_SRC
 
 ** Customized variables
@@ -824,28 +990,28 @@ The following contains a set of variables i may reasonably want to
 change on other systems - which don't affect the init file loading
 process. So I *can* use the customization interface for it...
 #+BEGIN_SRC emacs-lisp :tangle yes
-  (defgroup ganneff nil
-    "Modify ganneffs settings"
-    :group 'environment)
+(defgroup ganneff nil
+  "Modify ganneffs settings"
+  :group 'environment)
 
-  (defgroup ganneff-org-mode nil
-    "Ganneffs org-mode settings"
-    :tag "Ganneffs org-mode settings"
-    :group 'ganneff
-    :link '(custom-group-link "ganneff"))
+(defgroup ganneff-org-mode nil
+  "Ganneffs org-mode settings"
+  :tag "Ganneffs org-mode settings"
+  :group 'ganneff
+  :link '(custom-group-link "ganneff"))
 
-  (defcustom bh/organization-task-id "d0db0d3c-f22e-42ff-a654-69524ff7cc91"
-    "ID of the organization task."
-    :tag "Organization Task ID"
-    :type 'string
-    :group 'ganneff-org-mode)
+(defcustom bh/organization-task-id "d0db0d3c-f22e-42ff-a654-69524ff7cc91"
+  "ID of the organization task."
+  :tag "Organization Task ID"
+  :type 'string
+  :group 'ganneff-org-mode)
 
-  (defcustom org-my-archive-expiry-days 2
-    "The number of days after which a completed task should be auto-archived.
-  This can be 0 for immediate, or a floating point value."
-    :tag "Archive expiry days"
-    :type 'float
-    :group 'ganneff-org-mode)
+(defcustom org-my-archive-expiry-days 2
+  "The number of days after which a completed task should be auto-archived.
+This can be 0 for immediate, or a floating point value."
+  :tag "Archive expiry days"
+  :type 'float
+  :group 'ganneff-org-mode)
 #+END_SRC
 
 
@@ -856,7 +1022,6 @@ Restore removed var alias, used by ruby-electric-brace and others
 (unless (boundp 'last-command-char)
   (defvaralias 'last-command-char 'last-command-event))
 #+END_SRC
-
 * Customized variables
 :PROPERTIES:
 :ID: 0102208d-fdf6-4928-9e40-7e341bd3aa3a
@@ -876,354 +1041,363 @@ The source of this is:
 
 
 * Extra modes and their configuration
-** mode alists
-For some file endings we need to tell emacs what mode we want for them.
-I only list modes here where I don't have any other special
-configuration.
-
-- Markdown syntax
-#+BEGIN_SRC emacs-lisp :tangle yes
-(add-auto-mode 'markdown-mode "\\.mdwn$")
-#+END_SRC
-
-- diff
-#+BEGIN_SRC emacs-lisp :tangle yes
-(add-auto-mode 'diff-mode "COMMIT_EDITMSG$")
-#+END_SRC
-
-** Region bindings mode
-[2013-05-01 Wed 22:51]
-This mode allows to have keybindings that are only alive when the
-region is active. Helpful for things that only do any useful action
-then, like for example the [[*multiple%20cursors][multiple cursors]] mode I load later.
-#+BEGIN_SRC emacs-lisp :tangle yes
-(require 'region-bindings-mode)
-(region-bindings-mode-enable)
-#+END_SRC
-** tramp
-Transparent Remote (file) Access, Multiple Protocol, remote file editing.
-#+BEGIN_SRC emacs-lisp :tangle yes
-(require 'tramp)
-(setq tramp-default-method "ssh")
-(setq tramp-persistency-file-name (expand-file-name "tramp" jj-cache-dir))
-(setq shell-prompt-pattern "^[^a-zA-Z].*[#$%>] *")
-(add-to-list 'tramp-default-method-alist
-                         '("\\`localhost\\'" "\\`root\\'" "su")
-                         )
-(setq tramp-debug-buffer nil)
-(setq tramp-default-method "sshx")
-(setq tramp-verbose 5)
-#+END_SRC
-
-** tiny-tools
-We configure only a bit of the tiny-tools to load when I should need
-them. I don't need much actually, but these things are nice to have.
-
-#+BEGIN_SRC emacs-lisp :tangle yes
-(autoload 'turn-on-tinyperl-mode "tinyperl" "" t)
-(add-hook 'perl-mode-hook  'turn-on-tinyperl-mode)
-(add-hook 'cperl-mode-hook 'turn-on-tinyperl-mode)
-
-(autoload 'tinycomment-indent-for-comment      "tinycomment" "" t)
-(autoload 'tinyeat-forward-preserve            "tinyeat" "" t)
-(autoload 'tinyeat-backward-preserve           "tinyeat" "" t)
-(autoload 'tinyeat-delete-paragraph            "tinyeat" "" t)
-(autoload 'tinyeat-kill-line                   "tinyeat" "" t)
-(autoload 'tinyeat-zap-line                    "tinyeat" "" t)
-(autoload 'tinyeat-kill-line-backward          "tinyeat" "" t)
-(autoload 'tinyeat-kill-buffer-lines-point-max "tinyeat" "" t)
-(autoload 'tinyeat-kill-buffer-lines-point-min "tinyeat" "" t)
-#+END_SRC
-*** Keyboard changes for tiny-tools
-#+BEGIN_SRC emacs-lisp :tangle yes
-(global-set-key  "\M-;" 'tinycomment-indent-for-comment)
-
-(global-set-key (kbd "ESC C-k")       'tinyeat-kill-line-backward)
-(global-set-key (kbd "ESC d")         'tinyeat-forward-preserve)
-(global-set-key (kbd "ESC z")         'tinyeat-kill-buffer-lines-main)
-(global-set-key (kbd "<M-backspace>") 'tinyeat-backward-preserve)
-(global-set-key (kbd "<C-delete>")    'tinyeat-forward-preserve)
-(global-set-key (kbd "<S-backspace>") 'tinyeat-delete-whole-word)
-#+END_SRC
-
-** dired & co
-I like dired and work a lot with it, but it tends to leave lots of
-windows around.
-dired-single to the rescue.
-#+BEGIN_SRC emacs-lisp :tangle yes
-(require 'dired)
-(autoload 'dired-single-buffer "dired-single" "" t)
-(autoload 'dired-single-buffer-mouse "dired-single" "" t)
-(autoload 'dired-single-magic-buffer "dired-single" "" t)
-(autoload 'dired-single-toggle-buffer-name "dired-single" "" t)
-#+END_SRC
-
-wdired
-#+BEGIN_SRC emacs-lisp :tangle yes
-(autoload 'wdired-change-to-wdired-mode "wdired")
-(setq wdired-allow-to-change-permissions t)
-(define-key dired-mode-map "r" 'wdired-change-to-wdired-mode)
-#+END_SRC
-
-We want some extra key bindings loaded. In case we haven't loaded dired
-yet, there won't be a keymap to add to, so add our setup function to the
-load hook only. Otherwise just bind the keys.
-#+BEGIN_SRC emacs-lisp :tangle yes
-(define-key dired-mode-map
-  [menu-bar immediate wdired-change-to-wdired-mode]
-  '("Edit File Names" . wdired-change-to-wdired-mode))
-(define-key dired-mode-map [return] 'dired-single-buffer)
-(define-key dired-mode-map [mouse-1] 'dired-single-buffer-mouse)
-(define-key dired-mode-map "^"
-  (function
-   (lambda nil (interactive) (dired-single-buffer ".."))))
-#+END_SRC
-
-A few settings
-#+BEGIN_SRC emacs-lisp :tangle yes
-(setq dired-auto-revert-buffer (quote dired-directory-changed-p))
-(setq dired-dwim-target t)
-(setq dired-listing-switches "-alh")
-(setq dired-recursive-copies (quote top))
-(setq dired-recursive-deletes (quote top))
-#+END_SRC
-
-and gnus-dired makes it easy to attach files
-#+BEGIN_SRC emacs-lisp :tangle yes
-(eval-after-load "gnus"
-  '(progn
-     (require 'gnus-dired)
-     (add-hook 'dired-mode-hook 'turn-on-gnus-dired-mode)
-     (define-key dired-mode-map "a" 'gnus-dired-attach)))
-#+END_SRC
-
-** filladapt
-[2013-05-02 Thu 00:04]
-#+BEGIN_SRC emacs-lisp :tangle yes
-(require 'filladapt)
-(eval-after-load "filladapt" '(diminish 'filladapt-mode))
-(setq-default filladapt-mode t)
-#+END_SRC
-** ffap
-[2013-05-03 Fri 16:09]
-Replace default find-file with find-file-at-point, which tries to
-guess the default file/URL from text around the point.
-#+BEGIN_SRC emacs-lisp :tangle yes
-(ffap-bindings)
-#+END_SRC
-** icicles
-[[http://article.gmane.org/gmane.emacs.orgmode/4574/match%3Dicicles]["In case you never heard of it, Icicles is to ‘TAB’ completion what
-‘TAB’ completion is to typing things manually every time.”]]
-#+BEGIN_SRC emacs-lisp :tangle yes
-(require 'icicles)
-(icy-mode 1)
-#+END_SRC
-** uniquify
-Always have unique buffernames. See [[http://www.gnu.org/software/emacs/manual/html_node/emacs/Uniquify.html][Uniquify - GNU Emacs Manual]]
-#+BEGIN_SRC emacs-lisp :tangle yes
-(require 'uniquify)
-(setq uniquify-buffer-name-style 'post-forward)
-(setq uniquify-after-kill-buffer-p t)
-(setq uniquify-ignore-buffers-re "^\\*")
-#+END_SRC
-
 ** abbrev
 A defined abbrev is a word which expands, if you insert it, into some
 different text. Abbrevs are defined by the user to expand in specific
 ways.
 #+BEGIN_SRC emacs-lisp :tangle yes
-(setq save-abbrevs 'silently)
-(setq abbrev-file-name (expand-file-name "abbrev_defs" jj-cache-dir))
-(if (file-exists-p abbrev-file-name)
-    (quietly-read-abbrev-file))
-(abbrev-mode 1)
-#+END_SRC
-
-** font-lock
-Obviously emacs can do syntax hilighting. For more things than you ever
-heard about.
-And I want to have it everywhere.
+(use-package abbrev
+  :commands abbrev-mode
+  :diminish abbrev-mode
+  :idle
+  (hook-into-modes #'abbrev-mode '(text-mode-hook))
+  :config
+  (progn
+    (setq save-abbrevs 'silently)
+    (setq abbrev-file-name (expand-file-name "abbrev_defs" jj-cache-dir))
+    (if (file-exists-p abbrev-file-name)
+        (quietly-read-abbrev-file))
+
+    (add-hook 'expand-load-hook
+              (lambda ()
+                (add-hook 'expand-expand-hook 'indent-according-to-mode)
+                (add-hook 'expand-jump-hook 'indent-according-to-mode)))))
+#+END_SRC
+** ace-jump-mode
+[2013-04-28 So 11:26]
+Quickly move around in buffers.
 #+BEGIN_SRC emacs-lisp :tangle yes
-(require 'font-lock)
-(global-font-lock-mode 1)
-(setq font-lock-maximum-decoration t)
+(use-package ace-jump-mode
+  :ensure ace-jump-mode
+  :commands ace-jump-mode
+  :bind ("H-SPC" . ace-jump-mode))
 #+END_SRC
-** miniedit
-Edit minibuffer in a full (text-mode) buffer by pressing *M-C-e*.
-#+BEGIN_SRC emacs-lisp :tangle yes
-(require 'miniedit)
-(miniedit-install)
+** ace-window
+[2013-04-21 So 20:27]
+Use H-w to switch windows
+#+BEGIN_SRC emacs-lisp :tangle yes
+(use-package ace-window
+  :ensure ace-window
+  :commands ace-window
+  :bind ("H-w" . ace-window))
+#+END_SRC
+** aggressive-indent
+[2014-10-27 Mon 13:08]
+electric-indent-mode is enough to keep your code nicely aligned when
+all you do is type. However, once you start shifting blocks around,
+transposing lines, or slurping and barfing sexps, indentation is bound
+to go wrong.
+
+aggressive-indent-mode is a minor mode that keeps your code always
+indented. It reindents after every command, making it more reliable
+than electric-indent-mode.
+#+BEGIN_SRC emacs-lisp :tangle yes
+(use-package aggressive-indent
+  :ensure aggressive-indent
+  :commands (aggressive-indent-mode global-aggressive-indent-mode)
+  :config
+  (progn
+    (global-aggressive-indent-mode 0)
+    (setq aggressive-indent-comments-too 0)
+    (add-to-list 'aggressive-indent-excluded-modes 'html-mode)
+    ))
 #+END_SRC
-
-** timestamp
-By default, Emacs can update the time stamp for the following two
-formats if one exists in the first 8 lines of the file.
-- Time-stamp: <>
-- Time-stamp: " "
-#+BEGIN_SRC emacs-lisp :tangle yes
-(require 'time-stamp)
-(setq time-stamp-active t)
-(setq time-stamp-format "%02H:%02M:%02S (%z) - %02d.%02m.%:y from %u (%U) on %s")
-(setq time-stamp-old-format-warn nil)
-(setq time-stamp-time-zone nil)
-(add-hook 'write-file-hooks 'time-stamp)
+** anzu
+[2014-06-01 Sun 23:02]
+Provides a minor mode which displays current match and total matches
+information in the mode-line in various search modes.
+#+BEGIN_SRC emacs-lisp :tangle yes
+(use-package anzu
+  :ensure anzu
+  :diminish anzu-mode
+  :defer t
+  :idle
+  (progn
+    (global-anzu-mode 1))
+  :config
+  (progn
+    (setq anzu-search-threshold 1000)
+    (set-face-attribute 'anzu-mode-line nil :foreground "yellow" :weight 'bold)))
+#+END_SRC
+** ascii
+[2014-05-21 Wed 00:33]
+#+BEGIN_SRC emacs-lisp :tangle yes
+(use-package ascii
+  :commands (ascii-on ascii-toggle ascii-display)
+  :bind (("C-c e A" . ascii-toggle))
+  :init
+  (progn
+    (defun ascii-toggle ()
+      (interactive)
+      (defvar ascii-display nil)
+      (if ascii-display
+          (ascii-off)
+        (ascii-on)))
+
+    (bind-key "C-c e A" 'ascii-toggle)))
 #+END_SRC
-
-** perl / cperl
-I like /cperl-mode/ a bit more than the default /perl-mode/, so set it
-up here to be used.
+** auctex
 #+BEGIN_SRC emacs-lisp :tangle yes
-(autoload 'cperl-mode "cperl-mode" )
-(defalias 'perl-mode 'cperl-mode)
-(add-auto-mode 'cperl-mode "\\.\\([pP][Llm]\\|al\\)\\'")
-(add-auto-mode 'pod-mode   "\\.pod$")
-(add-auto-mode 'tt-mode    "\\.tt$")
-(add-to-list 'interpreter-mode-alist '("perl" . cperl-mode))
-(add-to-list 'interpreter-mode-alist '("perl5" . cperl-mode))
-(add-to-list 'interpreter-mode-alist '("miniperl" . cperl-mode))
-
-(after 'cperl-mode
-  (setq cperl-hairy t)
-  (setq cperl-electric-keywords t)
-  (setq cperl-electric-lbrace-space t)
-  (setq cperl-electric-parens nil)
-  (setq cperl-highlight-variables-indiscriminately t)
-  (setq cperl-imenu-addback t)
-  (setq cperl-invalid-face (quote underline))
-  (setq cperl-lazy-help-time 5)
-  (setq cperl-mode-hook (quote (turn-on-tinyperl-mode)))
-  (setq cperl-scan-files-regexp "\\.\\([pP][Llm]\\|xs\\|cgi\\)$")
-  (setq cperl-syntaxify-by-font-lock t)
-  (setq cperl-use-syntax-table-text-property-for-tags t)
-
-  ;; And have cperl mode give ElDoc a useful string
-  (defun my-cperl-eldoc-documentation-function ()
-    "Return meaningful doc string for `eldoc-mode'."
-    (car
-     (let ((cperl-message-on-help-error nil))
-       (cperl-get-help))))
-
-  (add-hook 'cperl-mode-hook
-            (lambda ()
-              (set (make-local-variable 'eldoc-documentation-function)
-                   'my-cperl-eldoc-documentation-function)
-              (eldoc-mode))))
+(setq auto-mode-alist (cons '("\\.tex\\'" . latex-mode) auto-mode-alist))
+(setq TeX-auto-save t)
+(setq TeX-parse-self t)
+(setq TeX-PDF-mode t)
 #+END_SRC
-
-** sh
-I prefer comments to be indented too
+** auto-complete mode
+[2013-04-27 Sa 16:33]
+And aren't we all lazy? I definitely am, and I like my emacs doing as
+much possible work for me as it can.
+So here, auto-complete-mode, which lets emacs do this, based on what I
+already had typed.
 #+BEGIN_SRC emacs-lisp :tangle yes
-(setq sh-indent-comment t)
+(use-package auto-complete-config
+  :ensure auto-complete
+  :idle
+  (ac-config-default)
+  :config
+  (progn
+    ;; hook AC into completion-at-point
+    (defun sanityinc/auto-complete-at-point ()
+      (when (and (not (minibufferp))
+                 (fboundp 'auto-complete-mode)
+                 auto-complete-mode)
+        (auto-complete)))
+    (defun set-auto-complete-as-completion-at-point-function ()
+      (add-to-list 'completion-at-point-functions 'sanityinc/auto-complete-at-point))
+    ;; Exclude very large buffers from dabbrev
+    (defun sanityinc/dabbrev-friend-buffer (other-buffer)
+      (< (buffer-size other-buffer) (* 1 1024 1024)))
+
+    (use-package pos-tip
+      :ensure t)
+
+    ;; custom keybindings to use tab, enter and up and down arrows
+    (bind-key "\t" 'ac-expand ac-complete-mode-map)
+    (bind-key "\r" 'ac-complete ac-complete-mode-map)
+    (bind-key "M-n" 'ac-next ac-complete-mode-map)
+    (bind-key "M-p" 'ac-previous ac-complete-mode-map)
+    (bind-key "C-s" 'ac-isearch ac-completing-map)
+    (bind-key "M-TAB" 'auto-complete ac-mode-map)
+
+    (setq ac-comphist-file (expand-file-name "ac-comphist.dat" jj-cache-dir))
+    (setq ac-use-comphist t)
+    (setq ac-expand-on-auto-complete nil)
+    (setq ac-dwim t)
+    (setq ac-auto-start 3)
+    (setq ac-delay 0.3)
+    (setq ac-menu-height 15)
+    (setq ac-quick-help-delay 0.5)
+    (setq ac-use-fuzzy t)
+
+    (ac-flyspell-workaround)
+
+    ;; use 't when auto-complete is disabled
+    (setq tab-always-indent 'complete)
+    (add-to-list 'completion-styles 'initials t)
+
+     ;; Use space and punctuation to accept the current the most likely completion.
+    (setq auto-completion-syntax-alist (quote (global accept . word)))
+     ;; Avoid completion for short trivial words.
+    (setq auto-completion-min-chars (quote (global . 3)))
+    (setq completion-use-dynamic t)
+
+    (add-hook 'auto-complete-mode-hook 'set-auto-complete-as-completion-at-point-function)
+
+    ;; Exclude very large buffers from dabbrev
+    (setq dabbrev-friend-buffer-function 'sanityinc/dabbrev-friend-buffer)
+
+    (use-package ac-dabbrev
+      :ensure t)
+
+    (set-default 'ac-sources
+                 '(ac-source-imenu
+                   ac-source-dictionary
+                   ac-source-words-in-buffer
+                   ac-source-words-in-same-mode-buffers
+    ;               ac-source-words-in-all-buffer
+                   ac-source-dabbrev))
+
+    (dolist (mode '(magit-log-edit-mode log-edit-mode org-mode text-mode haml-mode
+                                        sass-mode yaml-mode csv-mode espresso-mode haskell-mode
+                                        html-mode nxml-mode sh-mode smarty-mode clojure-mode
+                                        lisp-mode textile-mode markdown-mode tuareg-mode python-mode
+                                        js3-mode css-mode less-css-mode sql-mode ielm-mode))
+      (add-to-list 'ac-modes mode))
+
+    (add-hook 'latex-mode-hook 'auto-complete-mode)
+    (add-hook 'LaTeX-mode-hook 'auto-complete-mode)
+    (add-hook 'prog-mode-hook 'auto-complete-mode)
+    (add-hook 'org-mode-hook 'auto-complete-mode)))
+
 #+END_SRC
 
 ** auto-revert
 When files change outside emacs for whatever reason I want emacs to deal
 with it. Not to have to revert buffers myself
 #+BEGIN_SRC emacs-lisp :tangle yes
-(require 'autorevert)
-(setq global-auto-revert-mode t)
-(global-auto-revert-mode)
+(use-package autorevert
+  :commands auto-revert-mode
+  :diminish auto-revert-mode
+  :idle
+  (progn
+    (setq global-auto-revert-mode t)
+    (setq global-auto-revert-non-file-buffers t)
+    (global-auto-revert-mode)))
 #+END_SRC
 
-** linum (line number)
-Various modes should have line numbers in front of each line.
-
-But then there are some where it would just be deadly - like org-mode,
-gnus, so we have a list of modes where we don't want to see it.
+** backups
+Emacs should keep backup copies of files I edit, but I do not want them
+to clutter up the filesystem everywhere. So I put them into one defined
+place, backup-directory, which even contains my username (for systems
+where =temporary-file-directory= is not inside my home).
 #+BEGIN_SRC emacs-lisp :tangle yes
-(require 'linum)
-(setq linum-format "%3d ")
-(setq linum-mode-inhibit-modes-list '(org-mode
-                                      eshell-mode
-                                      shell-mode
-                                      gnus-group-mode
-                                      gnus-summary-mode
-                                      gnus-article-mode))
-
-(defadvice linum-on (around linum-on-inhibit-for-modes)
-  "Stop the load of linum-mode for some major modes."
-    (unless (member major-mode linum-mode-inhibit-modes-list)
-      ad-do-it))
-
-(ad-activate 'linum-on)
-(global-linum-mode 1)
+(use-package backups-mode
+  :load-path "elisp/backups-mode"
+  :bind   (("\C-cv" . save-version)
+           ("\C-cb" . list-backups)
+           ("\C-ck" . kill-buffer-prompt)
+           ("\C-cw" . backup-walker-start))
+  :init
+  (progn
+    (setq backup-directory jj-backup-directory)
+    ;(setq tramp-backup-directory (concat jj-backup-directory "/tramp"))
+    ;(if (not (file-exists-p tramp-backup-directory))
+    ;    (make-directory tramp-backup-directory))
+    ;(setq tramp-backup-directory-alist `((".*" . ,tramp-backup-directory)))
+    (setq backup-directory-alist `(("." . ,jj-backup-directory)))
+    (setq auto-save-list-file-prefix (concat jj-backup-directory ".auto-saves-"))
+    (setq auto-save-file-name-transforms `((".*" ,jj-backup-directory t)))
+
+    (setq version-control t)     ;; Use version numbers for backups
+    (setq kept-new-versions 10)  ;; Number of newest versions to keep
+    (setq kept-old-versions 2)   ;; Number of oldest versions to keep
+    (setq delete-old-versions t) ;; Ask to delete excess backup versions?
+    (setq backup-by-copying t)
+    (setq backup-by-copying-when-linked t) ;; Copy linked files, don't rename.
+    (setq make-backup-files t)
+
+    (defadvice kill-buffer (around kill-buffer)
+      "Always save before killing a file buffer"
+      (when (and (buffer-modified-p)
+                 (buffer-file-name)
+                 (file-exists-p (buffer-file-name)))
+        (save-buffer))
+      ad-do-it)
+    (ad-activate 'kill-buffer)
+
+    (defadvice save-buffers-kill-emacs (around save-buffers-kill-emacs)
+      "Always save before killing emacs"
+      (save-some-buffers t)
+      ad-do-it)
+    (ad-activate 'save-buffers-kill-emacs)
+
+    (defun kill-buffer-prompt ()
+      "Allows one to kill a buffer without saving it.
+This is necessary since once you start backups-mode all file based buffers
+are saved automatically when they are killed"
+      (interactive)
+      (if (and (buffer-modified-p) (buffer-file-name) (file-exists-p (buffer-file-name)) (y-or-n-p "Save buffer?"))
+          (save-buffer)
+        (set-buffer-modified-p nil))
+      (kill-buffer))
+
+    (setq backup-enable-predicate
+          (lambda (name)
+            (and (normal-backup-enable-predicate name)
+                 (not
+                  (let ((method (file-remote-p name 'method)))
+                    (when (stringp method)
+                      (member method '("su" "sudo"))))))))))
+
+#+END_SRC
+** browse-kill-ring
+[2014-12-11 Thu 11:31]
+#+BEGIN_SRC emacs-lisp :tangle yes
+(use-package browse-kill-ring
+  :commands (browse-kill-ring browse-kill-ring-mode)
+  :bind ("M-y" . browse-kill-ring)
+  )
 #+END_SRC
+** calendar
+[2014-06-10 Tue 22:20]
+#+BEGIN_SRC emacs-lisp :tangle yes
+(use-package cal
+  :commands (cal/insert)
+  :bind ("C-c c" . cal/insert)
+  :config
+  (progn
+    ; Weeks start on Monday, not sunday.
+    (setq calendar-week-start-day 1)
+
+    ; Display ISO week numbers in Calendar Mode
+    (copy-face font-lock-constant-face 'calendar-iso-week-face)
+    (set-face-attribute 'calendar-iso-week-face nil :height 0.7)
+    (setq calendar-intermonth-text
+          '(propertize
+            (format "%2d"
+                    (car
+                     (calendar-iso-from-absolute
+                      (calendar-absolute-from-gregorian (list month day year)))))
+            'font-lock-face 'calendar-iso-week-face))
+    (copy-face 'default 'calendar-iso-week-header-face)
+    (set-face-attribute 'calendar-iso-week-header-face nil :height 0.7)
+    (setq calendar-intermonth-header
+          (propertize "Wk"                  ; or e.g. "KW" in Germany
+                      'font-lock-face 'calendar-iso-week-header-face))))
 
-** css
-#+BEGIN_SRC emacs-lisp :tangle yes
-(autoload 'css-mode "css-mode")
-(add-auto-mode 'css-mode "\\.css")
-
-(after 'css-mode
-  ;;; CSS flymake
-  (require 'flymake-css)
-  (defun maybe-flymake-css-load ()
-    "Activate flymake-css as necessary, but not in derived modes."
-    (when (eq major-mode 'css-mode)
-      (flymake-css-load)))
-  (add-hook 'css-mode-hook 'maybe-flymake-css-load)
-  ;;; Auto-complete CSS keywords
-  (eval-after-load 'auto-complete
-    '(progn
-       (dolist (hook '(css-mode-hook sass-mode-hook scss-mode-hook))
-         (add-hook hook 'ac-css-mode-setup)))))
 #+END_SRC
 
-** mmm-mode
-[2013-05-21 Tue 23:39]
-MMM Mode is a minor mode for Emacs that allows Multiple Major Modes to
-coexist in one buffer.
+** crontab-mode
+[2013-05-21 Tue 23:18]
 #+BEGIN_SRC emacs-lisp :tangle yes
-(require 'mmm-auto)
-(setq mmm-global-mode 'buffers-with-submode-classes)
-(setq mmm-submode-decoration-level 2)
-(eval-after-load 'mmm-vars
-  '(progn
-     (mmm-add-group
-      'html-css
-      '((css-cdata
-         :submode css-mode
-         :face mmm-code-submode-face
-         :front "<style[^>]*>[ \t\n]*\\(//\\)?<!\\[CDATA\\[[ \t]*\n?"
-         :back "[ \t]*\\(//\\)?]]>[ \t\n]*</style>"
-         :insert ((?j js-tag nil @ "<style type=\"text/css\">"
-                      @ "\n" _ "\n" @ "</script>" @)))
-        (css
-         :submode css-mode
-         :face mmm-code-submode-face
-         :front "<style[^>]*>[ \t]*\n?"
-         :back "[ \t]*</style>"
-         :insert ((?j js-tag nil @ "<style type=\"text/css\">"
-                      @ "\n" _ "\n" @ "</style>" @)))
-        (css-inline
-         :submode css-mode
-         :face mmm-code-submode-face
-         :front "style=\""
-         :back "\"")))
-     (dolist (mode (list 'html-mode 'nxml-mode))
-       (mmm-add-mode-ext-class mode "\\.r?html\\(\\.erb\\)?\\'" 'html-css))
-    (mmm-add-mode-ext-class 'html-mode "\\.php\\'" 'html-php)
-    ))
+(use-package crontab-mode
+  :ensure crontab-mode
+  :commands crontab-mode
+  :mode ("\\.?cron\\(tab\\)?\\'" . crontab-mode))
+#+END_SRC
 
+** css
+web-mode takes over, see [[*web-mode][web-mode]]
+#+BEGIN_SRC emacs-lisp :tangle no
+(use-package css-mode
+  :mode ("\\.css\\'" . css-mode)
+  :defer t
+  :config
+  (progn
+  ;;; CSS flymake
+    (use-package flymake-css
+      :ensure flymake-css
+      :config
+      (progn
+        (defun maybe-flymake-css-load ()
+          "Activate flymake-css as necessary, but not in derived modes."
+          (when (eq major-mode 'css-mode)
+            (flymake-css-load)))
+        (add-hook 'css-mode-hook 'maybe-flymake-css-load)))
+    ;;; Auto-complete CSS keywords
+    (eval-after-load 'auto-complete
+      '(progn
+         (dolist (hook '(css-mode-hook sass-mode-hook scss-mode-hook))
+           (add-hook hook 'ac-css-mode-setup))))))
 #+END_SRC
 
-** html-helper
-Instead of default /html-mode/ I use /html-helper-mode/.
+** cua
+I know that this lets it look "more like windows", but I don't much care
+about its paste/copy/cut keybindings, the really nice part is the great
+support for rectangular regions, which I started to use a lot since I
+know this mode. The normal keybindings for those are just to useless.
 #+BEGIN_SRC emacs-lisp :tangle yes
-(autoload 'html-helper-mode "html-helper-mode" "Yay HTML" t)
-(add-auto-mode 'html-helper-mode "\\.html$")
-(add-auto-mode 'html-helper-mode "\\.asp$")
-(add-auto-mode 'html-helper-mode "\\.phtml$")
-(add-auto-mode 'html-helper-mode "\\.(jsp|tmpl)\\'")
-(defalias 'html-mode 'html-helper-mode)
+(cua-mode t)
+(setq cua-enable-cua-keys (quote shift))
 #+END_SRC
 
-** auctex
+Luckily cua-mode easily supports this, with the following line I just
+get the CUA selection and rectangle stuff, not the keybindings. Yes,
+even though the above =cua-enable-cua-keys= setting would only enable
+them if the selection is done when the region was marked with a shifted
+movement keys.
 #+BEGIN_SRC emacs-lisp :tangle yes
-(setq auto-mode-alist (cons '("\\.tex\\'" . latex-mode) auto-mode-alist))
-(setq TeX-auto-save t)
-(setq TeX-parse-self t)
-(setq TeX-PDF-mode t)
+(cua-selection-mode t)
 #+END_SRC
 
 ** Debian related
@@ -1235,1788 +1409,2594 @@ Instead of default /html-mode/ I use /html-helper-mode/.
 (setq debian-changelog-mailing-address "joerg@debian.org")
 #+END_SRC
 
-** org                                                                :FIXME:
-*** General settings
-[2013-04-28 So 17:06]
+** diff-mode
+#+BEGIN_SRC emacs-lisp :tangle yes
+(use-package diff-mode
+  :commands diff-mode
+  :mode (("\\.diff" . diff-mode))
+  :config
+  (use-package diff-mode-))
+#+END_SRC
 
-I use org-mode a lot and, having my config for this based on [[*Bernt%20Hansen][the config of Bernt Hansen]],
-it is quite extensive. Nevertheless, it starts out small, loading it.
-#+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
-(require 'org)
-#+END_SRC
-
-My browsers (Conkeror, Iceweasel) can store links in org-mode. For
-that we need org-protocol.
-#+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
-(require 'org-protocol)
-#+END_SRC
 
-*** Agenda
+** dired & co
+#+BEGIN_SRC emacs-lisp :tangle yes
+(use-package dired
+  :commands (dired dired-other-window dired-other-frame dired-noselect
+                   dired-mode dired-jump)
+  :defines (dired-omit-regexp-orig)
+  :init
+  (progn
+    (setq diredp-hide-details-initially-flag nil))
+  :config
+  (progn
+    (setq dired-auto-revert-buffer (quote dired-directory-changed-p))
+    (setq dired-dwim-target t)
+    (setq dired-listing-switches "-alh")
+    (setq dired-recursive-copies (quote top))
+    (setq dired-recursive-deletes (quote top))
+    (bind-key "F" 'find-name-dired dired-mode-map)
+
+    (defvar mark-files-cache (make-hash-table :test #'equal))
+
+    (defun mark-similar-versions (name)
+      (let ((pat name))
+        (if (string-match "^\\(.+?\\)-[0-9._-]+$" pat)
+            (setq pat (match-string 1 pat)))
+        (or (gethash pat mark-files-cache)
+            (ignore (puthash pat t mark-files-cache)))))
+
+    (defun dired-mark-similar-version ()
+      (interactive)
+      (setq mark-files-cache (make-hash-table :test #'equal))
+      (dired-mark-sexp '(mark-similar-versions name)))
+
+    (use-package dired+
+      :ensure dired+)
+
+    (use-package dired-x)
+    (setq dired-guess-shell-alist-user
+          '(("\\.pdf\\'" "mupdf" "evince")
+            ("\\.\\(?:djvu\\|eps\\)\\'" "evince")
+            ("\\.\\(?:jpg\\|jpeg\\|png\\|gif\\|xpm\\)\\'" "eog")
+            ("\\.\\(?:xcf\\)\\'" "gimp")
+            ("\\.csv\\'" "libreoffice")
+            ("\\.tex\\'" "pdflatex" "latex")
+            ("\\.\\(?:mp4\\|mkv\\|avi\\|flv\\|ogv\\)\\(?:\\.part\\)?\\'" "vlc")
+            ("\\.html?\\'" "conkeror")))
+
+    (use-package dired-single
+      :ensure dired-single
+      :init
+      (progn
+        (bind-key "<return>" 'dired-single-buffer dired-mode-map)
+        (bind-key "<mouse-1>" 'dired-single-buffer-mouse dired-mode-map)
+        (bind-key "^"
+                  (function
+           (lambda nil (interactive) (dired-single-buffer ".."))) dired-mode-map )))
+
+    (use-package wdired
+      :ensure wdired
+      :init
+      (progn
+        (setq wdired-allow-to-change-permissions t)
+        (bind-key "r" 'wdired-change-to-wdired-mode dired-mode-map)))
 
-My current =org-agenda-files= variable only includes a set of
-directories.
-#+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
-(setq org-agenda-files (quote ("~/org/"
-                               "~/org/debian"
-                               "~/org/debconf"
-                               "~/org/spi"
-                               "~/org/nsb"
-                               )))
-(setq org-default-notes-file "~/org/notes.org")
+    (use-package gnus-dired
+      :commands (gnus-dired-attach gnus-dired-mode)
+      :init
+      (progn
+        ;;(add-hook 'dired-mode-hook 'turn-on-gnus-dired-mode)
+        (bind-key "a" 'gnus-dired-attach dired-mode-map)))
+
+    (defun dired-package-initialize ()
+      (unless (featurep 'runner)
+        (use-package dired-x)
+        (use-package runner
+          :ensure runner)
+
+        (bind-key "M-!" 'async-shell-command dired-mode-map)
+        (unbind-key "M-s f" dired-mode-map)
+
+        (defadvice dired-omit-startup (after diminish-dired-omit activate)
+          "Make sure to remove \"Omit\" from the modeline."
+          (diminish 'dired-omit-mode) dired-mode-map)
+
+        ;; Omit files that Git would ignore
+        (defun dired-omit-regexp ()
+          (let ((file (expand-file-name ".git"))
+                parent-dir)
+            (while (and (not (file-exists-p file))
+                        (progn
+                          (setq parent-dir
+                                (file-name-directory
+                                 (directory-file-name
+                                  (file-name-directory file))))
+                          ;; Give up if we are already at the root dir.
+                          (not (string= (file-name-directory file)
+                                        parent-dir))))
+              ;; Move up to the parent dir and try again.
+              (setq file (expand-file-name ".git" parent-dir)))
+            ;; If we found a change log in a parent, use that.
+            (if (file-exists-p file)
+                (let ((regexp (funcall dired-omit-regexp-orig))
+                      (omitted-files
+                       (shell-command-to-string "git clean -d -x -n")))
+                  (if (= 0 (length omitted-files))
+                      regexp
+                    (concat
+                     regexp
+                     (if (> (length regexp) 0)
+                         "\\|" "")
+                     "\\("
+                     (mapconcat
+                      #'(lambda (str)
+                          (concat
+                           "^"
+                           (regexp-quote
+                            (substring str 13
+                                       (if (= ?/ (aref str (1- (length str))))
+                                           (1- (length str))
+                                         nil)))
+                           "$"))
+                      (split-string omitted-files "\n" t)
+                      "\\|")
+                     "\\)")))
+              (funcall dired-omit-regexp-orig))))))
+
+    (add-hook 'dired-mode-hook 'dired-package-initialize)
+
+    (defun dired-double-jump (first-dir second-dir)
+      (interactive
+       (list (read-directory-name "First directory: "
+                                  (expand-file-name "~")
+                                  nil nil "/Downloads/")
+             (read-directory-name "Second directory: "
+                                  (expand-file-name "~")
+                                  nil nil "/")))
+      (dired first-dir)
+      (dired-other-window second-dir))
+    (bind-key "C-c J" 'dired-double-jump)
+
+    (defun dired-back-to-top ()
+      (interactive)
+      (goto-char (point-min))
+      (dired-next-line 4))
+
+    (define-key dired-mode-map
+      (vector 'remap 'beginning-of-buffer) 'dired-back-to-top)
+
+    (defun dired-jump-to-bottom ()
+      (interactive)
+      (goto-char (point-max))
+      (dired-next-line -1))
+
+    (define-key dired-mode-map
+      (vector 'remap 'end-of-buffer) 'dired-jump-to-bottom)))
+
+#+END_SRC
+** discover-my-major
+[2014-06-01 Sun 23:32]
+Discover key bindings and their meaning for the current Emacs major mode.
+#+BEGIN_SRC emacs-lisp :tangle yes
+(use-package discover-my-major
+  :ensure discover-my-major
+  :commands discover-my-major
+  :bind ("C-h C-m" . discover-my-major))
 #+END_SRC
-=org-mode= manages the =org-agenda-files= variable automatically using
-=C-c [= and =C-c ]= to add and remove files respectively.  However,
-this replaces my directory list with a list of explicit filenames
-instead and is not what I want.  If this occurs then adding a new org
-file to any of the above directories will not contribute to my agenda
-and I will probably miss something important.
-
-I have disabled the =C-c [= and =C-c ]= keys in =org-mode-hook= to
-prevent messing up my list of directories in the =org-agenda-files=
-variable.  I just add and remove directories manually here.  Changing
-the list of directories in =org-agenda-files= happens very rarely
-since new files in existing directories are automatically picked up.
-
-#+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
-;; Keep tasks with dates on the global todo lists
-(setq org-agenda-todo-ignore-with-date nil)
-
-;; Keep tasks with deadlines on the global todo lists
-(setq org-agenda-todo-ignore-deadlines nil)
-
-;; Keep tasks with scheduled dates on the global todo lists
-(setq org-agenda-todo-ignore-scheduled nil)
+** easypg
+EasyPG is a GnuPG interface for Emacs.
+Bookmark: [[http://www.emacswiki.org/emacs/EasyPG][EmacsWiki: Easy PG]]
+#+BEGIN_SRC emacs-lisp :tangle yes
+(use-package epa-file
+  :config
+  (progn
+    (epa-file-enable)
+    ;; I took the following from [[http://www.emacswiki.org/emacs/EasyPG][EmacsWiki: Easy PG]]
+    (defadvice epg--start (around advice-epg-disable-agent disable)
+      "Don't allow epg--start to use gpg-agent in plain text
+    terminals . "
+      (if (display-graphic-p)
+          ad-do-it
+        (let ((agent (getenv "GPG_AGENT_INFO")))
+          (setenv "GPG_AGENT_INFO" nil) ; give us a usable text password prompt
+          ad-do-it
+          (setenv "GPG_AGENT_INFO" agent))))
+    (ad-enable-advice 'epg--start 'around 'advice-epg-disable-agent)
+    (ad-activate 'epg--start)
+    ))
+#+END_SRC
+** ediff
+[2013-04-21 So 20:36]
+ediff - don't start another frame
+#+BEGIN_SRC emacs-lisp :tangle yes
+(use-package ediff
+  :pre-init
+  (progn
+    (defvar ctl-period-equals-map)
+    (define-prefix-command 'ctl-period-equals-map)
+    (bind-key "C-. =" 'ctl-period-equals-map)
+    (bind-key "C-. = c" 'compare-windows)) ; not an ediff command, but it fits
+
+  :bind (("C-. = b" . ediff-buffers)
+         ("C-. = B" . ediff-buffers3)
+         ("C-. = =" . ediff-files)
+         ("C-. = f" . ediff-files)
+         ("C-. = F" . ediff-files3)
+         ("C-. = r" . ediff-revision)
+         ("C-. = p" . ediff-patch-file)
+         ("C-. = P" . ediff-patch-buffer)
+         ("C-. = l" . ediff-regions-linewise)
+         ("C-. = w" . ediff-regions-wordwise))
+  :config (progn
+            (setq ediff-window-setup-function 'ediff-setup-windows-plain)
+            (setq ediff-split-window-function 'split-window-horizontally)
+            )
+)
+#+END_SRC
+** emms
+EMMS is the Emacs Multimedia System.
+#+BEGIN_SRC emacs-lisp :tangle no
+(require 'emms-source-file)
+(require 'emms-source-playlist)
+(require 'emms-info)
+(require 'emms-cache)
+(require 'emms-playlist-mode)
+(require 'emms-playing-time)
+(require 'emms-player-mpd)
+(require 'emms-playlist-sort)
+(require 'emms-mark)
+(require 'emms-browser)
+(require 'emms-lyrics)
+(require 'emms-last-played)
+(require 'emms-score)
+(require 'emms-tag-editor)
+(require 'emms-history)
+(require 'emms-i18n)
 
-;; Keep tasks with timestamps on the global todo lists
-(setq org-agenda-todo-ignore-timestamp nil)
+(setq emms-playlist-default-major-mode 'emms-playlist-mode)
+(add-to-list 'emms-track-initialize-functions 'emms-info-initialize-track)
+(emms-playing-time 1)
+(emms-lyrics 1)
+(add-hook 'emms-player-started-hook 'emms-last-played-update-current)
+;(add-hook 'emms-player-started-hook 'emms-player-mpd-sync-from-emms)
+(emms-score 1)
+(when (fboundp 'emms-cache) ; work around compiler warning
+  (emms-cache 1))
+(setq emms-score-default-score 3)
 
-;; Remove completed deadline tasks from the agenda view
-(setq org-agenda-skip-deadline-if-done t)
+(defun emms-mpd-init ()
+  "Connect Emms to mpd."
+  (interactive)
+  (emms-player-mpd-connect))
 
-;; Remove completed scheduled tasks from the agenda view
-(setq org-agenda-skip-scheduled-if-done t)
+;; players
+(require 'emms-player-mpd)
+(setq emms-player-mpd-server-name "localhost")
+(setq emms-player-mpd-server-port "6600")
+(add-to-list 'emms-info-functions 'emms-info-mpd)
+(add-to-list 'emms-player-list 'emms-player-mpd)
+(setq emms-volume-change-function 'emms-volume-mpd-change)
+(setq emms-player-mpd-sync-playlist t)
 
-;; Remove completed items from search results
-(setq org-agenda-skip-timestamp-if-done t)
+(setq emms-source-file-default-directory "/var/lib/mpd/music")
+(setq emms-player-mpd-music-directory "/var/lib/mpd/music")
+(setq emms-info-auto-update t)
+(setq emms-lyrics-scroll-p t)
+(setq emms-lyrics-display-on-minibuffer t)
+(setq emms-lyrics-display-on-modeline nil)
+(setq emms-lyrics-dir "~/.emacs.d/var/lyrics")
 
-;; Include agenda archive files when searching for things
-(setq org-agenda-text-search-extra-files (quote (agenda-archives)))
+(setq emms-last-played-format-alist
+      '(((emms-last-played-seconds-today) . "%H:%M")
+        (604800                           . "%a %H:%M") ; this week
+        ((emms-last-played-seconds-month) . "%d.%m.%Y")
+        ((emms-last-played-seconds-year)  . "%d.%m.%Y")
+        (t                                . "Never played")))
 
-;; Show all future entries for repeating tasks
-(setq org-agenda-repeating-timestamp-show-all t)
+;; Playlist format
+(defun my-describe (track)
+  (let* ((empty "...")
+         (name (emms-track-name track))
+         (type (emms-track-type track))
+         (short-name (file-name-nondirectory name))
+         (play-count (or (emms-track-get track 'play-count) 0))
+         (last-played (or (emms-track-get track 'last-played) '(0 0 0)))
+         (artist (or (emms-track-get track 'info-artist) empty))
+         (year (emms-track-get track 'info-year))
+         (playing-time (or (emms-track-get track 'info-playing-time) 0))
+         (min (/ playing-time 60))
+         (sec (% playing-time 60))
+         (album (or (emms-track-get track 'info-album) empty))
+         (tracknumber (emms-track-get track 'info-tracknumber))
+         (short-name (file-name-sans-extension
+                      (file-name-nondirectory name)))
+         (title (or (emms-track-get track 'info-title) short-name))
+         (rating (emms-score-get-score name))
+         (rate-char ?☭)
+         )
+    (format "%12s %20s (%.4s) [%-20s] - %2s. %-30s | %2d %s"
+            (emms-last-played-format-date last-played)
+            artist
+            year
+            album
+            (if (and tracknumber ; tracknumber
+                     (not (zerop (string-to-number tracknumber))))
+                (format "%02d" (string-to-number tracknumber))
+              "")
+            title
+            play-count
+            (make-string rating rate-char)))
+)
 
-;; Show all agenda dates - even if they are empty
-(setq org-agenda-show-all-dates t)
+(setq emms-track-description-function 'my-describe)
 
-;; Sorting order for tasks on the agenda
-(setq org-agenda-sorting-strategy
-      (quote ((agenda habit-down time-up user-defined-up priority-down effort-up category-keep)
-              (todo category-up priority-down effort-up)
-              (tags category-up priority-down effort-up)
-              (search category-up))))
+;; (global-set-key (kbd "C-<f9> t") 'emms-play-directory-tree)
+;; (global-set-key (kbd "H-<f9> e") 'emms-play-file)
+(global-set-key (kbd "H-<f9> <f9>") 'emms-mpd-init)
+(global-set-key (kbd "H-<f9> d") 'emms-play-dired)
+(global-set-key (kbd "H-<f9> x") 'emms-start)
+(global-set-key (kbd "H-<f9> v") 'emms-stop)
+(global-set-key (kbd "H-<f9> n") 'emms-next)
+(global-set-key (kbd "H-<f9> p") 'emms-previous)
+(global-set-key (kbd "H-<f9> o") 'emms-show)
+(global-set-key (kbd "H-<f9> h") 'emms-shuffle)
+(global-set-key (kbd "H-<f9> SPC") 'emms-pause)
+(global-set-key (kbd "H-<f9> a") 'emms-add-directory-tree)
+(global-set-key (kbd "H-<f9> b") 'emms-smart-browse)
+(global-set-key (kbd "H-<f9> l") 'emms-playlist-mode-go)
 
-;; Start the weekly agenda on Monday
-(setq org-agenda-start-on-weekday 1)
+(global-set-key (kbd "H-<f9> r") 'emms-toggle-repeat-track)
+(global-set-key (kbd "H-<f9> R") 'emms-toggle-repeat-playlist)
+(global-set-key (kbd "H-<f9> m") 'emms-lyrics-toggle-display-on-minibuffer)
+(global-set-key (kbd "H-<f9> M") 'emms-lyrics-toggle-display-on-modeline)
 
-;; Enable display of the time grid so we can see the marker for the current time
-(setq org-agenda-time-grid (quote ((daily today remove-match)
-                                   #("----------------" 0 16 (org-heading t))
-                                   (0800 1000 1200 1400 1500 1700 1900 2100))))
+(global-set-key (kbd "H-<f9> <left>") (lambda () (interactive) (emms-seek -10)))
+(global-set-key (kbd "H-<f9> <right>") (lambda () (interactive) (emms-seek +10)))
+(global-set-key (kbd "H-<f9> <down>") (lambda () (interactive) (emms-seek -60)))
+(global-set-key (kbd "H-<f9> <up>") (lambda () (interactive) (emms-seek +60)))
 
-;; Display tags farther right
-(setq org-agenda-tags-column -102)
+(global-set-key (kbd "H-<f9> s u") 'emms-score-up-playing)
+(global-set-key (kbd "H-<f9> s d") 'emms-score-down-playing)
+(global-set-key (kbd "H-<f9> s o") 'emms-score-show-playing)
+(global-set-key (kbd "H-<f9> s s") 'emms-score-set-playing)
 
-; position the habit graph on the agenda to the right of the default
-(setq org-habit-graph-column 50)
+(define-key emms-playlist-mode-map "u" 'emms-score-up-playing)
+(define-key emms-playlist-mode-map "d" 'emms-score-down-playing)
+(define-key emms-playlist-mode-map "o" 'emms-score-show-playing)
+(define-key emms-playlist-mode-map "s" 'emms-score-set-playing)
+(define-key emms-playlist-mode-map "r" 'emms-mpd-init)
+(define-key emms-playlist-mode-map "N"  'emms-playlist-new)
 
-; turn habits back on
-(run-at-time "06:00" 86400 '(lambda () (setq org-habit-show-habits t)))
+(define-key emms-playlist-mode-map "x" 'emms-start)
+(define-key emms-playlist-mode-map "v" 'emms-stop)
+(define-key emms-playlist-mode-map "n" 'emms-next)
+(define-key emms-playlist-mode-map "p" 'emms-previous)
 
-;;
-;; Agenda sorting functions
-;;
-(setq org-agenda-cmp-user-defined 'bh/agenda-sort)
+(setq emms-playlist-buffer-name "*EMMS Playlist*"
+      emms-playlist-mode-open-playlists t)
 
+;; Faces
+(if (window-system)
+    ((lambda ()
+       (set-face-attribute
+        'emms-browser-artist-face nil
+        :family "Arno Pro")
+       )
+))
 
-(setq org-deadline-warning-days 30)
+(setq emms-player-mpd-supported-regexp
+      (or (emms-player-mpd-get-supported-regexp)
+          (concat "\\`http://\\|"
+                  (emms-player-simple-regexp
+                   "m3u" "ogg" "flac" "mp3" "wav" "mod" "au" "aiff"))))
+(emms-player-set emms-player-mpd 'regex emms-player-mpd-supported-regexp)
 
-;; Always hilight the current agenda line
-(add-hook 'org-agenda-mode-hook
-          '(lambda () (hl-line-mode 1))
-          'append)
+#+END_SRC
+** ethan-wspace
+[2014-06-01 Sun 15:00]
+Proper whitespace handling
+#+BEGIN_SRC emacs-lisp :tangle yes
+(use-package ethan-wspace
+  :ensure ethan-wspace
+  :diminish (ethan-wspace-mode . "ew")
+  :init
+  (global-ethan-wspace-mode 1))
 #+END_SRC
 
-#+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
-(setq org-agenda-persistent-filter t)
-(add-hook 'org-agenda-mode-hook
-          '(lambda () (org-defkey org-agenda-mode-map "W" 'bh/widen))
-          'append)
-
-(add-hook 'org-agenda-mode-hook
-          '(lambda () (org-defkey org-agenda-mode-map "F" 'bh/restrict-to-file-or-follow))
-          'append)
-
-(add-hook 'org-agenda-mode-hook
-          '(lambda () (org-defkey org-agenda-mode-map "N" 'bh/narrow-to-subtree))
-          'append)
+** expand-region
+[2014-06-01 Sun 15:16]
+#+BEGIN_SRC emacs-lisp :tangle yes
+(use-package expand-region
+  :ensure expand-region
+  :bind ("C-M-+" . er/expand-region)
+  :commands er/expand-region)
+#+END_SRC
+** filladapt
+[2013-05-02 Thu 00:04]
+Filladapt by KyleJones enhances Emacs’ fill functions by guessing a
+fill prefix, such as a comment sequence in program code, and handling
+bullet points like “1.” or “*”.
+#+BEGIN_SRC emacs-lisp :tangle yes
+(use-package filladapt
+  :diminish filladapt-mode
+  :idle
+  (setq-default filladapt-mode t))
+#+END_SRC
+** flycheck
+[2013-04-28 So 22:21]
+Flycheck is a on-the-fly syntax checking tool, supposedly better than Flymake.
+As the one time I tried Flymake i wasn't happy, thats easy to
+understand for me.
+#+BEGIN_SRC emacs-lisp :tangle yes
+(use-package flycheck
+  :ensure flycheck
+  :diminish flycheck-mode
+  :bind (("M-n" . next-error)
+         ("M-p" . previous-error))
+  :idle
+  (progn
+    (add-hook 'find-file-hook
+          (lambda ()
+            (when (not (equal 'emacs-lisp-mode major-mode))
+              (flycheck-mode)))))
+  :config
+  (progn
+    (use-package flycheck-color-mode-line
+      :ensure flycheck-color-mode-line)
+    (setq flycheck-highlighting-mode nil)
+    (add-hook 'flycheck-mode-hook 'flycheck-color-mode-line-mode)
+    ))
+#+END_SRC
+** font-lock
+Obviously emacs can do syntax hilighting. For more things than you ever
+heard about.
+And I want to have it everywhere.
+#+BEGIN_SRC emacs-lisp :tangle yes
+(use-package font-lock
+  :init
+  (progn
+    (global-font-lock-mode 1)
+    (setq font-lock-maximum-decoration t)))
+#+END_SRC
+** git commit mode
+#+BEGIN_SRC emacs-lisp :tangle yes
+(use-package git-commit-mode
+  :ensure git-commit-mode
+  :commands git-commit-mode
+  :mode ("COMMIT_EDITMSG" . git-commit-mode))
+#+END_SRC
 
-(add-hook 'org-agenda-mode-hook
-          '(lambda () (org-defkey org-agenda-mode-map "U" 'bh/narrow-up-one-level))
-          'append)
+** git rebase mode
+#+BEGIN_SRC emacs-lisp :tangle yes
+(use-package git-rebase-mode
+  :ensure git-rebase-mode
+  :commands git-rebase-mode
+  :mode ("git-rebase-todo" . git-rebase-mode))
+#+END_SRC
+** git-gutter+
+[2014-05-21 Wed 22:56]
+#+BEGIN_SRC emacs-lisp :tangle yes
+(use-package git-gutter+
+  :ensure git-gutter+
+  :diminish git-gutter+-mode
+  :bind (("C-x n" . git-gutter+-next-hunk)
+         ("C-x p" . git-gutter+-previous-hunk)
+         ("C-x v =" . git-gutter+-show-hunk)
+         ("C-x r" . git-gutter+-revert-hunks)
+         ("C-x s" . git-gutter+-stage-hunks)
+         ("C-x c" . git-gutter+-commit)
+         )
+  :idle
+  (progn
+    (setq git-gutter+-disabled-modes '(org-mode))
+    (global-git-gutter+-mode 1))
+  :config
+  (progn
+    (use-package git-gutter-fringe+
+      :ensure git-gutter-fringe+
+      :config
+      (progn
+        (setq git-gutter-fr+-side 'right-fringe)
+        ;(git-gutter-fr+-minimal)
+        ))))
+
+#+END_SRC
+** git-messenger
+[2015-02-22 Sun 14:00]
+Provides function that popup commit message at current line. This is
+useful when you want to know why this line was changed.
+#+BEGIN_SRC emacs-lisp :tangle yes
+(use-package git-messenger
+  :ensure git-messenger
+  :commands (git-messenger:popup-message)
+  :bind (("C-x v p" . git-messenger:popup-message))
+  :config
+  (progn
+    (bind-key "m" 'git-messenger:copy-message git-messenger-map)
+    (add-hook 'git-messenger:popup-buffer-hook 'magit-commit-mode)
+    (setq git-messenger:show-detail t)))
+#+END_SRC
+** git timemachine
+[2014-07-23 Mi 12:57]
+Browse historic versions of a file with p (previous) and n (next).
+#+BEGIN_SRC emacs-lisp :tangle yes
+(use-package git-timemachine
+  :ensure git-timemachine
+  :commands git-timemachine)
+#+END_SRC
+** gnus
+Most of my gnus config is in an own file, [[file:gnus.org][gnus.org]], here I only have
+what I want every emacs to know.
+#+BEGIN_SRC emacs-lisp :tangle yes
+(bind-key "C-c g" 'gnus) ; Start gnus with M-n
+(after 'gnus
+  (jj-init-theme)
+)
+#+END_SRC
+** golden ratio
+[2015-02-20 Fri 16:27]
+When working with many windows at the same time, each window has a
+size that is not convenient for editing.
+
+golden-ratio helps on this issue by resizing automatically the windows
+you are working on to the size specified in the "Golden Ratio". The
+window that has the main focus will have the perfect size for editing,
+while the ones that are not being actively edited will be re-sized to
+a smaller size that doesn't get in the way, but at the same time will
+be readable enough to know it's content.
+#+BEGIN_SRC emacs-lisp :tangle yes
+(use-package golden-ratio
+  :ensure golden-ratio
+  :diminish golden-ratio-mode
+  :init
+  (progn
+    (golden-ratio-mode 1)
+    (setq golden-ratio-exclude-buffer-names '("*LV*" "*guide-key*"))
+    (setq golden-ratio-exclude-modes '("calendar-mode" "gnus-summary-mode"
+                                       "gnus-article-mode" "calc-mode" "calc-trail-mode"
+                                       "bbdb-mode"))
+    ))
+#+END_SRC
+** goto last change
+[2015-02-22 Sun 13:28]
+Move point through buffer-undo-list positions.
+#+BEGIN_SRC emacs-lisp :tangle yes
+(use-package goto-last-change
+  :commands (goto-last-change)
+  :bind (("M-g l" . goto-last-change))
+  )
+#+END_SRC
+** guide-key
+[2014-06-11 Wed 22:27]
+guide-key.el displays the available key bindings automatically and
+dynamically.
 
-(add-hook 'org-agenda-mode-hook
-          '(lambda () (org-defkey org-agenda-mode-map "P" 'bh/narrow-to-project))
-          'append)
+For whatever reason I like this more than icicles <backtab> completion
+for this.
+#+BEGIN_SRC emacs-lisp :tangle yes
+(use-package guide-key
+  :ensure guide-key
+  :diminish guide-key-mode
+  :init
+  (progn
+    (setq guide-key/guide-key-sequence '("C-x" "C-c" "M-g"))
+    (guide-key-mode 1)
+    (setq guide-key/recursive-key-sequence-flag t)
+    (setq guide-key/popup-window-position 'bottom)
+    (setq guide-key/idle-delay 0.5)))
 
-; Rebuild the reminders everytime the agenda is displayed
-(add-hook 'org-finalize-agenda-hook 'bh/org-agenda-to-appt 'append)
+#+END_SRC
 
-;(if (file-exists-p "~/org/refile.org")
-;    (add-hook 'after-init-hook 'bh/org-agenda-to-appt))
+** highlight mode
+[2014-05-21 Wed 23:51]
+#+BEGIN_SRC emacs-lisp :tangle yes
+(use-package hi-lock
+  :bind (("M-o l" . highlight-lines-matching-regexp)
+         ("M-o r" . highlight-regexp)
+         ("M-o w" . highlight-phrase)))
 
-; Activate appointments so we get notifications
-(appt-activate t)
+(use-package hilit-chg
+  :bind ("M-o C" . highlight-changes-mode))
 
-(setq org-agenda-log-mode-items (quote (closed clock state)))
-(if (> emacs-major-version 23)
-    (setq org-agenda-span 3)
-  (setq org-agenda-ndays 3))
+#+END_SRC
+** hippie-exp
+Crazy way of completion. It looks at the word before point and then
+tries to expand it in various ways.
+#+BEGIN_SRC emacs-lisp :tangle yes
+(use-package hippie-exp
+  :bind ("M-/" . hippie-expand)
+  :commands hippie-expand
+  :config
+  (progn
+    (setq hippie-expand-try-functions-list '(try-expand-dabbrev
+                                             try-expand-dabbrev-all-buffers
+                                             try-expand-dabbrev-from-kill
+                                             try-complete-file-name-partially
+                                             try-complete-file-name
+                                             try-expand-all-abbrevs try-expand-list
+                                             try-expand-line
+                                             try-complete-lisp-symbol-partially
+                                             try-complete-lisp-symbol))))
+#+END_SRC
+** html-helper
+Replaced by web-mode [[*web-mode][web-mode]]
+#+BEGIN_SRC emacs-lisp :tangle no
+(autoload 'html-helper-mode "html-helper-mode" "Yay HTML" t)
+(add-auto-mode 'html-helper-mode "\\.html$")
+(add-auto-mode 'html-helper-mode "\\.asp$")
+(add-auto-mode 'html-helper-mode "\\.phtml$")
+(add-auto-mode 'html-helper-mode "\\.(jsp|tmpl)\\'")
+(defalias 'html-mode 'html-helper-mode)
+#+END_SRC
+** hydra
+[2015-01-26 Mon 15:50]
+This is a package for GNU Emacs that can be used to tie related
+commands into a family of short bindings with a common prefix - a
+Hydra.
+
+Once you summon the Hydra through the prefixed binding (the body + any
+one head), all heads can be called in succession with only a short
+extension.
+
+The Hydra is vanquished once Hercules, any binding that isn't the
+Hydra's head, arrives. Note that Hercules, besides vanquishing the
+Hydra, will still serve his orignal purpose, calling his proper
+command. This makes the Hydra very seamless, it's like a minor mode
+that disables itself auto-magically.
+#+BEGIN_SRC emacs-lisp :tangle yes
+(use-package hydra
+  :ensure hydra
+  :init
+  (progn
+    (setq hydra-is-helpful t)
+    (setq hydra-lv t)
+
+    (defhydra hydra-zoom (:color red)
+      "zoom"
+      ("g" text-scale-increase "in")
+      ("l" text-scale-decrease "out")
+      ("q" nil "quit"))
+    (bind-key "<F2>" 'hydra-zoom/toggle)
+
+    (defhydra hydra-error (:color red)
+      "goto-error"
+      ("h" first-error "first")
+      ("j" next-error "next")
+      ("k" previous-error "prev")
+      ("v" recenter-top-bottom "recenter")
+      ("q" nil "quit"))
+    (bind-key "M-g e" 'hydra-error/body)
+
+    (defhydra hydra-launcher (:color blue)
+      "Launch"
+      ("h" man "man")
+      ("r" (browse-url "http://www.reddit.com/r/emacs/") "reddit")
+      ("w" (browse-url "http://www.emacswiki.org/") "emacswiki")
+      ("s" shell "shell")
+      ("q" nil "cancel"))
+    (bind-key "C-c r" 'hydra-launcher/body)
+
+    ; whitespace mode gets loaded late, so variable may not be there yet. Workaround...
+    (defvar whitespace-mode nil)
+    (defhydra hydra-toggle (:color pink)
+      "
+_a_ abbrev-mode:        % 4`abbrev-mode^^^^     _f_ auto-fill-mode:    %`auto-fill-function
+_c_ auto-complete-mode: % 4`auto-complete-mode     _r_ auto-revert-mode:  %`auto-revert-mode
+_d_ debug-on-error:     % 4`debug-on-error^     _t_ truncate-lines:    %`truncate-lines
+_w_ whitespace-mode:    % 4`whitespace-mode     _g_ golden-ratio-mode: %`golden-ratio-mode
+_l_ linum-mode:         % 4`linum-mode     _k_ linum relative:    %`linum-format
+
+"
+      ("a" abbrev-mode nil)
+      ("c" auto-complete-mode nil)
+      ("i" aggressive-indent-mode nil)
+      ("d" toggle-debug-on-error nil)
+      ("f" auto-fill-mode nil)
+      ("g" golden-ratio-mode nil)
+      ("t" toggle-truncate-lines nil)
+      ("w" whitespace-mode nil)
+      ("r" auto-revert-mode nil)
+      ("l" linum-mode nil)
+      ("k" linum-relative-toggle nil)
+      ("q" nil "cancel"))
+    (bind-key "C-c C-v" 'hydra-toggle/body)
+    ))
 
-(setq org-agenda-show-all-dates t)
-(setq org-agenda-start-on-weekday nil)
-(setq org-deadline-warning-days 14)
 
 #+END_SRC
-*** Global keybindings.
-Start off by defining a series of keybindings.
+** ibuffer
+[2014-05-21 Wed 23:54]
+#+BEGIN_SRC emacs-lisp :tangle yes
+(use-package ibuffer
+  :defer t
+  :bind (("C-h h" . ibuffer)
+         ("C-x C-b" . ibuffer)
+         ("<XF86WebCam>" . ibuffer)
+         )
+  :commands (ibuffer)
+  :defines (ibuffer-filtering-alist
+            ibuffer-filter-groups ibuffer-compile-formats ibuffer-git-column-length
+            ibuffer-show-empty-filter-groups ibuffer-saved-filter-groups)
+  :config
+  (progn
+    (defvar my-ibufffer-separator " • ")
+    (setq ibuffer-filter-group-name-face 'variable-pitch
+          ibuffer-use-header-line t
+          ibuffer-old-time 12)
+    (unbind-key "M-o" ibuffer-mode-map)
+    (bind-key "s" 'isearch-forward-regexp ibuffer-mode-map)
+    (bind-key "." 'ibuffer-invert-sorting ibuffer-mode-map)
+
+    (use-package ibuffer-vc
+      :ensure t
+      :commands
+      (ibuffer-vc-set-filter-groups-by-vc-root
+       ibuffer-vc-generate-filter-groups-by-vc-root))
+    (use-package ibuffer-tramp
+      :ensure t
+      :commands (ibuffer-tramp-generate-filter-groups-by-tramp-connection
+                 ibuffer-tramp-set-filter-groups-by-tramp-connection))
+    ;; Switching to ibuffer puts the cursor on the most recent buffer
+    (defadvice ibuffer (around ibuffer-point-to-most-recent activate)
+      "Open ibuffer with cursor pointed to most recent buffer name"
+      (let ((recent-buffer-name (buffer-name)))
+        ad-do-it
+        (ibuffer-update nil t)
+        (unless (string= recent-buffer-name "*Ibuffer*")
+          (ibuffer-jump-to-buffer recent-buffer-name))))
+
+    (defun ibuffer-magit-status ()
+      (interactive)
+      (--when-let (get-buffer "*Ibuffer*")
+        (with-current-buffer it
+          (let* ((selected-buffer (ibuffer-current-buffer))
+                 (buffer-path (with-current-buffer
+                                  selected-buffer
+                                (or (buffer-file-name)
+                                   list-buffers-directory
+                                   default-directory)))
+                 (default-directory
+                   (if (file-regular-p buffer-path)
+                       (file-name-directory buffer-path)
+                     buffer-path)))
+            (magit-status default-directory)))))
+    (bind-key "i" 'ibuffer-magit-status ibuffer-mode-map)
+    (bind-key "G" 'ibuffer-magit-status ibuffer-mode-map)
+
+    (setq ibuffer-directory-abbrev-alist
+          (-uniq
+           (-flatten
+            (--map
+             (list
+              (cons  (f-slash (f-expand (cdr it))) my-ibufffer-separator)
+              (cons  (f-slash (f-canonical (cdr it))) (concat (car it) my-ibufffer-separator)))
+             '(
+               ("dak" . "/develop/dak/")
+               ("org" . "~/org/")
+               ("config" . "~/.emacs.d/config/")
+               ("tmp" . "~/tmp/")
+               ("systmp" . "/tmp/")
+               ("puppet" . "~/git/puppet")
+               ("git" . "~/git/")
+               )))))
+
+    (use-package ibuffer-git
+      :ensure t)
+    (use-package ibuffer-vc
+      :ensure t)
+
+    (define-ibuffer-column size-h
+      (:name "Size" :inline t)
+      (cond
+       ((> (buffer-size) 1000)
+        (format "%7.1fk" (/ (buffer-size) 1000.0)))
+       ((> (buffer-size) 1000000)
+        (format "%7.1fM" (/ (buffer-size) 1000000.0)))
+       (t
+        (format "%8d" (buffer-size)))))
+
+    (use-package ibuf-ext)
+    (define-ibuffer-filter filename2
+        "Toggle current view to buffers with filename matching QUALIFIER."
+      (:description "filename2"
+                    :reader (read-from-minibuffer "Filter by filename (regexp): "))
+      ;; (ibuffer-awhen (buffer-local-value 'buffer-file-name buf)
+      (ibuffer-awhen (with-current-buffer buf
+                       (or buffer-file-name
+                          default-directory))
+        (string-match qualifier it)))
+
+    (defvar ibuffer-magit-filter-groups nil)
+    (defun ibuffer-magit-define-filter-groups ()
+      (when (and (not ibuffer-magit-filter-groups)
+               (boundp 'magit-repo-dirs))
+        (setq ibuffer-magit-filter-groups
+              (--map (list
+                      (concat "git:: "
+                              (file-name-nondirectory (directory-file-name it)))
+                      `(filename2 . ,it))
+                     (mapcar 'cdr (magit-list-repos magit-repo-dirs))))))
+
+    (defun ibuffer-set-filter-groups-by-root  ()
+      (interactive)
+      ;; (ibuffer-projectile-define-filter-groups)
+      ;; (ibuffer-magit-define-filter-groups)
+      (setq ibuffer-filter-groups
+            (-concat
+             ;; ibuffer-projectile-filter-groups
+             ibuffer-magit-filter-groups
+
+             '(("MORE"
+                (or (mode . magit-log-edit-mode)
+                   (name . "^\\*\\(traad-server\\|httpd\\|epc con.*\\|tramp/.*\\|Completions\\)\\*$")
+                   (name . "^\\*Pymacs\\*$")
+                   (name . "^\\*helm.*\\*")
+                   (name . "^\\*Compile-log\\*$")
+                   (name . "^\\*Ido Completions\\*$")
+                   (name . "^\\*magit-\\(process\\)\\*$")
+                   (name . "^ "))))
+             '(("EMACS"
+                (or
+                 (name . "^\\*scratch")
+                 (name . "^\\*Messages")
+                 (name . "^\\*Help")
+                 )))
+             (ibuffer-vc-generate-filter-groups-by-vc-root)
+             (ibuffer-tramp-generate-filter-groups-by-tramp-connection))))
+
+    (defun toggle-ibuffer-filter-groups ()
+      "DOCSTRING"
+      (interactive)
+      (let ((ibuf (get-buffer "*Ibuffer*")))
+        (when ibuf
+          (with-current-buffer ibuf
+            (let ((selected-buffer (ibuffer-current-buffer)))
+              (if (not ibuffer-filter-groups)
+                  (ibuffer-set-filter-groups-by-root)
+                (setq ibuffer-filter-groups nil))
+              (pop-to-buffer ibuf)
+              (ibuffer-update nil t)
+              (ibuffer-jump-to-buffer (buffer-name selected-buffer )))))))
+
+    (bind-key "h" 'toggle-ibuffer-filter-groups ibuffer-mode-map)
+
+    (setq ibuffer-default-sorting-mode 'recency
+          ibuffer-eliding-string "…"
+          ibuffer-compile-formats t
+          ibuffer-git-column-length 6
+          ibuffer-show-empty-filter-groups nil
+          ibuffer-default-directory "~/"
+          )
+    (setq ibuffer-formats '((mark vc-status-mini
+                                  " "
+                                  (git-status 8 8 :left)
+                                  " "
+                                  read-only modified
+                                  " "
+                                  (name 18 18 :left :elide)
+                                  " "
+                                  (size-h 9 -1 :right)
+                                  " "
+                                  (mode 16 16 :left :elide)
+                                  " " filename-and-process)
+                            (mark " "
+                                  (git-status 8 8 :left)
+                                  " "
+                                  (name 16 -1)
+                                  " " filename)
+                            ))
+
+     (setq ibuffer-saved-filter-groups
+           (quote (("flat")
+                   ("default"
+                    ("dired"  (mode . dired-mode))
+                    ("perl"   (mode . cperl-mode))
+                    ("puppet" (or
+                               (mode . puppet-mode)
+                               (mode . yaml-mode)))
+                    ("ruby"   (mode . ruby-mode))
+                    ("emacs" (or
+                              (name . "^\\*scratch\\*$")
+                              (name . "^\\*Compile-log\\*$")
+                              (name . "^\\*Completions\\*$")
+                              (name . "^\\*Messages\\*$")
+                              (name . "^\\*Backtrace\\*$")
+                              (name . "^\\*Packages*\\*$")
+                              (name . "^\\*Help*\\*$")
+                              ))
+                    ("gnus"  (or
+                              (mode . message-mode)
+                              (mode . bbdb-mode)
+                              (mode . mail-mode)
+                              (mode . gnus-group-mode)
+                              (mode . gnus-summary-mode)
+                              (mode . gnus-article-mode)
+                              (name . "^\\.bbdb$")
+                              (name . "^\\.newsrc-dribble")))
+                    ("org"   (or
+                              (filename . ".*/org/.*")
+                              (mode . org-agenda-mode)
+                              (name . "^diary$")))
+                    ("other" (or
+                              (mode . magit-log-edit-mode)
+                              (name . "^\\*magit-\\(process\\|commit\\)\\*$"))))
+                   ("categorized"
+              ;; -------------------------------------------------
+              ;; programming languages #1
+                    ("code" (or
+                             (mode . emacs-lisp-mode)
+                             (mode . python-mode)
+                             (mode . ruby-mode)
+                             (mode . coffee-mode)
+                             (mode . js-mode)
+                             (mode . js2-mode)
+                             (mode . actionscript-mode)
+                             (mode . java-mode)
+                             (mode . sh-mode)
+                             (mode . haskell-mode)
+                             (mode . html-mode)
+                             (mode . web-mode)
+                             (mode . haml-mode)
+                             (mode . nxml-mode)
+                             (mode . css-mode)))
+                    ;; -------------------------------------------------
+                    ;; configuration/data files
+                    ("conf" (or
+                             (mode . json-mode)
+                             (mode . yaml-mode)
+                             (mode . conf-mode)))
+                    ;; -------------------------------------------------
+                    ;; text/notetaking/org
+                    ("org agenda"  (mode . org-agenda-mode))
+                    ("org" (or
+                            (mode . org-mode)
+                            (name . "^\\*Calendar\\*$")
+                            (name . "^diary$")))
+                    ("text misc" (or
+                                  (mode . text-mode)
+                                  (mode . rst-mode)
+                                  (mode . markdown-mode)))
+                    ;; -------------------------------------------------
+                    ;; media
+                    ("media" (or
+                              (mode . image-mode)))
+                    ;; -------------------------------------------------
+                    ;; misc
+                    ("w3m" (mode . w3m-mode))
+                    ("scm" (or
+                            (mode . magit-status-mode)
+                            (mode . magit-log-mode)
+                            (mode . vc-annotate-mode)))
+                    ("dired" (mode . dired-mode))
+                    ("help" (or
+                             (mode . Info-mode)
+                             (mode . help-mode)
+                             (mode . Man-mode)
+                             (name . "^\\*Personal Keybindings\\*$")))
+                    ;; -------------------------------------------------
+                    ;; *buffer* buffers
+                    ("MORE" (or (mode . magit-log-edit-mode)
+                                (name . "^\\*\\(traad-server\\|httpd\\|epc con.*\\|tramp/.*\\|Completions\\)\\*$")
+                                (name . "^\\*Pymacs\\*$")
+                                (name . "^\\*Compile-log\\*$")
+                                (name . "^\\*Completions\\*$")
+                                (name . "^\\*magit-\\(process\\|commit\\)\\*$")
+                                (name . "^ ")))
+                    ("*buffer*" (name . "\\*.*\\*"))))))
+
+    (add-hook 'ibuffer-mode-hook
+              (lambda ()
+                (ibuffer-auto-mode 1)
+                (ibuffer-switch-to-saved-filter-groups "default")))
+
+  ;; Unless you turn this variable on you will be prompted every time
+  ;; you want to delete a buffer, even unmodified ones, which is way
+  ;; too cautious for most people. You’ll still be prompted for
+  ;; confirmation when deleting modified buffers after the option has
+  ;; been turned off.
+  (setq ibuffer-expert t)
 
-Well, first we remove =C-c [= and =C-c ]=, as all agenda directories are
-setup manually, not by org-mode. Also turn off =C-c ;=, which
-comments headlines - a function never used.
-#+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
-(add-hook 'org-mode-hook
-          (lambda ()
-            (org-defkey org-mode-map "\C-c["    'undefined)
-            (org-defkey org-mode-map "\C-c]"    'undefined)
-            (org-defkey org-mode-map "\C-c;"    'undefined))
-          'append)
+))
 #+END_SRC
-
-And now a largish set of keybindings...
-#+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
-(global-set-key "\C-cl" 'org-store-link)
-(global-set-key "\C-ca" 'org-agenda)
-(global-set-key "\C-cb" 'org-iswitchb)
-(define-key mode-specific-map [?a] 'org-agenda)
-
-(global-set-key (kbd "<f12>")     'org-agenda)
-(global-set-key (kbd "<f5>")      'bh/org-todo)
-(global-set-key (kbd "<S-f5>")    'bh/widen)
-(global-set-key (kbd "<f7>")      'bh/set-truncate-lines)
-(global-set-key (kbd "<f8>")      'org-cycle-agenda-files)
-
-(global-set-key (kbd "<f9> <f9>") 'bh/show-org-agenda)
-(global-set-key (kbd "<f9> b")    'bbdb)
-(global-set-key (kbd "<f9> c")    'calendar)
-(global-set-key (kbd "<f9> f")    'boxquote-insert-file)
-(global-set-key (kbd "<f9> h")    'bh/hide-other)
-(global-set-key (kbd "<f9> n")    'org-narrow-to-subtree)
-(global-set-key (kbd "<f9> w")    'widen)
-(global-set-key (kbd "<f9> u")    'bh/narrow-up-one-level)
-(global-set-key (kbd "<f9> I")    'bh/punch-in)
-(global-set-key (kbd "<f9> O")    'bh/punch-out)
-(global-set-key (kbd "<f9> H")    'jj/punch-in-hw)
-(global-set-key (kbd "<f9> W")    'jj/punch-out-hw)
-(global-set-key (kbd "<f9> o")    'bh/make-org-scratch)
-(global-set-key (kbd "<f9> p")    'bh/phone-call)
-(global-set-key (kbd "<f9> r")    'boxquote-region)
-(global-set-key (kbd "<f9> s")    'bh/switch-to-scratch)
-(global-set-key (kbd "<f9> t")    'bh/insert-inactive-timestamp)
-(global-set-key (kbd "<f9> T")    'tabify)
-(global-set-key (kbd "<f9> U")    'untabify)
-(global-set-key (kbd "<f9> v")    'visible-mode)
-(global-set-key (kbd "<f9> SPC")  'bh/clock-in-last-task)
-(global-set-key (kbd "C-<f9>")    'previous-buffer)
-(global-set-key (kbd "C-<f10>")   'next-buffer)
-(global-set-key (kbd "M-<f9>")    'org-toggle-inline-images)
-(global-set-key (kbd "C-x n r")   'narrow-to-region)
-(global-set-key (kbd "<f11>")     'org-clock-goto)
-(global-set-key (kbd "C-<f11>")   'org-clock-in)
-(global-set-key (kbd "C-M-r")     'org-capture)
-(global-set-key (kbd "C-c r")     'org-capture)
-(global-set-key (kbd "C-S-<f12>") 'bh/save-then-publish)
-
-(define-key org-mode-map [(control k)] 'jj-org-kill-line)
+** icicles
+[[http://article.gmane.org/gmane.emacs.orgmode/4574/match%3Dicicles]["In case you never heard of it, Icicles is to ‘TAB’ completion what
+‘TAB’ completion is to typing things manually every time.”]]
+#+BEGIN_SRC emacs-lisp :tangle yes
+(use-package icicles
+  :load-path "elisp/icicle/"
+  :init
+  (icy-mode 1))
+#+END_SRC
+** icomplete
+Incremental mini-buffer completion preview: Type in the minibuffer,
+list of matching commands is echoed
+#+BEGIN_SRC emacs-lisp :tangle yes
+(icomplete-mode 99)
 #+END_SRC
+** iedit
+[2014-05-26 Mon 22:49]
+#+BEGIN_SRC emacs-lisp :tangle yes
+(use-package iedit
+  :ensure iedit
+  :commands (iedit-mode)
+  :defer t
+  :bind (("C-;" . iedit-mode)
+         ("C-," . iedit-mode-toggle-on-function))
+  )
 
-*** Tasks, States, Todo fun
+#+END_SRC
+** info stuff
+[2014-05-20 Tue 23:35]
+#+BEGIN_SRC emacs-lisp :tangle yes
+(use-package info
+  :bind ("C-h C-i" . info-lookup-symbol)
+  :commands info-lookup-symbol
+  :config
+  (progn
+    ;; (defadvice info-setup (after load-info+ activate)
+    ;;   (use-package info+))
 
-First we define the global todo keywords.
-#+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
-(setq org-todo-keywords
-      (quote ((sequence "TODO(t)" "NEXT(n)" "|" "DONE(d@/!)")
-              (sequence "WAITING(w@/!)" "HOLD(h@/!)" "DELEGATED(g@/!)" "|" "CANCELLED(c@/!)" "PHONE"))))
+    (defadvice Info-exit (after remove-info-window activate)
+      "When info mode is quit, remove the window."
+      (if (> (length (window-list)) 1)
+          (delete-window)))))
 
-(setq org-todo-keyword-faces
-      (quote (("TODO" :foreground "red" :weight bold)
-              ("NEXT" :foreground "light blue" :weight bold)
-              ("DONE" :foreground "forest green" :weight bold)
-              ("WAITING" :foreground "orange" :weight bold)
-              ("HOLD" :foreground "orange" :weight bold)
-              ("DELEGATED" :foreground "yellow" :weight bold)
-              ("CANCELLED" :foreground "dark green" :weight bold)
-              ("PHONE" :foreground "dark green" :weight bold))))
+(use-package info-look
+  :commands info-lookup-add-help)
 #+END_SRC
+** linum (line number)
+Various modes should have line numbers in front of each line.
 
-**** Fast Todo Selection
-Fast todo selection allows changing from any task todo state to any
-other state directly by selecting the appropriate key from the fast
-todo selection key menu.
-#+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
-(setq org-use-fast-todo-selection t)
+But then there are some where it would just be deadly - like org-mode,
+gnus, so we have a list of modes where we don't want to see it.
+#+BEGIN_SRC emacs-lisp :tangle yes
+(use-package linum
+  :diminish linum-mode
+  :config
+  (progn
+    (setq linum-format "%3d ")
+    (setq linum-mode-inhibit-modes-list '(org-mode
+                                          eshell-mode
+                                          shell-mode
+                                          gnus-group-mode
+                                          gnus-summary-mode
+                                          gnus-article-mode))
+
+    (defadvice linum-on (around linum-on-inhibit-for-modes)
+      "Stop the load of linum-mode for some major modes."
+      (unless (member major-mode linum-mode-inhibit-modes-list)
+        ad-do-it))
+
+    (ad-activate 'linum-on)
+
+    (use-package linum-relative
+      :ensure linum-relative
+      :init
+      (progn
+        (setq linum-format 'dynamic)
+        )))
+  :init
+  (global-linum-mode 1))
 #+END_SRC
-Changing a task state is done with =C-c C-t KEY=
 
-where =KEY= is the appropriate fast todo state selection key as defined in =org-todo-keywords=.
+** lisp editing stuff
 
-The setting
-#+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
-(setq org-treat-S-cursor-todo-selection-as-state-change nil)
-#+END_SRC
-allows changing todo states with S-left and S-right skipping all of
-the normal processing when entering or leaving a todo state.  This
-cycles through the todo states but skips setting timestamps and
-entering notes which is very convenient when all you want to do is fix
-up the status of an entry.
+[2013-04-21 So 21:00]
+I'm not doing much of it, except for my emacs and gnus configs, but
+then I like it nice too...
+#+BEGIN_SRC emacs-lisp :tangle yes
+(bind-key "TAB" 'lisp-complete-symbol read-expression-map)
 
-**** Todo State Triggers
-I have a few triggers that automatically assign tags to tasks based on
-state changes.  If a task moves to =CANCELLED= state then it gets a
-=CANCELLED= tag.  Moving a =CANCELLED= task back to =TODO= removes the
-=CANCELLED= tag.  These are used for filtering tasks in agenda views
-which I'll talk about later.
+(defun remove-elc-on-save ()
+  "If you're saving an elisp file, likely the .elc is no longer valid."
+  (make-local-variable 'after-save-hook)
+  (add-hook 'after-save-hook
+            (lambda ()
+              (if (file-exists-p (concat buffer-file-name "c"))
+                  (delete-file (concat buffer-file-name "c"))))))
 
-The triggers break down to the following rules:
+(add-hook 'emacs-lisp-mode-hook 'turn-on-eldoc-mode)
+(add-hook 'emacs-lisp-mode-hook 'remove-elc-on-save)
 
-- Moving a task to =CANCELLED= adds a =CANCELLED= tag
-- Moving a task to =WAITING= adds a =WAITING= tag
-- Moving a task to =HOLD= adds a =WAITING= tag
-- Moving a task to a done state removes a =WAITING= tag
-- Moving a task to =TODO= removes =WAITING= and =CANCELLED= tags
-- Moving a task to =NEXT= removes a =WAITING= tag
-- Moving a task to =DONE= removes =WAITING= and =CANCELLED= tags
+(use-package paredit
+  :ensure paredit
+  :diminish paredit-mode " π")
 
-The tags are used to filter tasks in the agenda views conveniently.
-#+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
-(setq org-todo-state-tags-triggers
-      (quote (("CANCELLED" ("CANCELLED" . t))
-              ("WAITING" ("WAITING" . t))
-              ("HOLD" ("WAITING" . t) ("HOLD" . t))
-              (done ("WAITING") ("HOLD"))
-              ("TODO" ("WAITING") ("CANCELLED") ("HOLD"))
-              ("NEXT" ("WAITING") ("CANCELLED") ("HOLD"))
-              ("DONE" ("WAITING") ("CANCELLED") ("HOLD")))))
-#+END_SRC
+(setq lisp-coding-hook 'lisp-coding-defaults)
+(setq interactive-lisp-coding-hook 'interactive-lisp-coding-defaults)
 
-*** Capturing new tasks
-Org capture replaces the old remember mode.
-#+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
-(setq org-directory "~/org")
-(setq org-default-notes-file "~/org/refile.org")
+(setq prelude-emacs-lisp-mode-hook 'prelude-emacs-lisp-mode-defaults)
+(add-hook 'emacs-lisp-mode-hook (lambda ()
+                                  (run-hooks 'prelude-emacs-lisp-mode-hook)))
 
-;; Capture templates for: TODO tasks, Notes, appointments, phone calls, and org-protocol
-;; see http://orgmode.org/manual/Template-elements.html
-(setq org-capture-templates
-      (quote (("t" "todo" entry (file "~/org/refile.org")
-               "* TODO %?\nAdded: %U\n"
-               :clock-in t :clock-resume t)
-              ("l" "linktodo" entry (file "~/org/refile.org")
-               "* TODO %?\nAdded: %U\n%a\n"
-               :clock-in t :clock-resume t)
-              ("r" "respond" entry (file "~/org/refile.org")
-               "* TODO Respond to %:from on %:subject\nSCHEDULED: %t\nAdded: %U\n%a\n"
-               :clock-in t :clock-resume t :immediate-finish t)
-              ("n" "note" entry (file "~/org/refile.org")
-               "* %? :NOTE:\nAdded: %U\n%a\n"
-               :clock-in t :clock-resume t)
-              ("d" "Delegated" entry (file "~/org/refile.org")
-               "* DELEGATED %?\nAdded: %U\n%a\n"
-               :clock-in t :clock-resume t)
-              ("j" "Journal" entry (file+datetree "~/org/diary.org")
-               "* %?\nAdded: %U\n"
-               :clock-in t :clock-resume t)
-              ("w" "org-protocol" entry (file "~/org/refile.org")
-               "* TODO Review %c\nAdded: %U\n"
-               :immediate-finish t)
-              ("p" "Phone call" entry (file "~/org/refile.org")
-               "* PHONE %? :PHONE:\nAdded: %U"
-               :clock-in t :clock-resume t)
-              ("x" "Bookmark link" entry (file "~/org/refile.org")
-               "* Bookmark: %c\n%i\nAdded: %U\n"
-               :immediate-finish t)
-              ("h" "Habit" entry (file "~/org/refile.org")
-               "* NEXT %?\n:PROPERTIES:\n:STYLE: habit\n:REPEAT_TO_STATE: NEXT\n:END:\nAdded: %U\nSCHEDULED: %(format-time-string \"<%Y-%m-%d %a .+1d/3d>\")\n")
-              )))
+(bind-key "M-." 'find-function-at-point emacs-lisp-mode-map)
+
+(after "elisp-slime-nav"
+  '(diminish 'elisp-slime-nav-mode))
+(after "rainbow-mode"
+  '(diminish 'rainbow-mode))
+(after "eldoc"
+  '(diminish 'eldoc-mode))
 #+END_SRC
+** magit
+[2013-04-21 So 20:48]
+magit is a mode for interacting with git.
+#+BEGIN_SRC emacs-lisp :tangle yes
+(use-package magit
+  :ensure magit
+  :commands  (magit-log magit-run-gitk magit-run-git-gui magit-status
+              magit-git-repo-p magit-list-repos)
+  :defer t
+  :bind (("C-x g" . magit-status)
+         ("C-x G" . magit-status-with-prefix))
+  :init
+  (progn
+    (setq magit-commit-signoff t
+          magit-repo-dirs '("~/git"
+                            "/develop/vcs/"
+                            "/develop/Debian/"
+                            )
+          magit-repo-dirs-depth 4
+          magit-log-auto-more t)
+
+    (use-package magit-blame
+      :commands magit-blame-mode
+      :defer t)
+
+    (use-package magit-svn
+      :ensure magit-svn
+      :commands (magit-svn-mode
+                 turn-on-magit-svn)
+      :defer t)
+
+    (add-hook 'magit-mode-hook 'hl-line-mode)
+    (defun magit-status-with-prefix ()
+      (interactive)
+      (let ((current-prefix-arg '(4)))
+        (call-interactively 'magit-status)))
+    )
+  :config
+  (progn
+    (setenv "GIT_PAGER" "")
+
+    (unbind-key "M-h" magit-mode-map)
+    (unbind-key "M-s" magit-mode-map)
+
+    (use-package magit-find-file
+      :ensure magit-find-file
+      :commands (magit-find-file-completing-read)
+      :defer t
+      :init
+      (progn
+        (bind-key "C-x C-f" 'magit-find-file-completing-read magit-mode-map)))
 
-Capture mode now handles automatically clocking in and out of a
-capture task.  This all works out of the box now without special hooks.
-When I start a capture mode task the task is clocked in as specified
-by =:clock-in t= and when the task is filed with =C-c C-c= the clock
-resumes on the original clocking task.
+    (add-hook 'magit-log-edit-mode-hook
+              #'(lambda ()
+                  (set-fill-column 72)
+                  (flyspell-mode)))
 
-The quick clocking in and out of capture mode tasks (often it takes
-less than a minute to capture some new task details) can leave
-empty clock drawers in my tasks which aren't really useful.
-The following prevents this.
-#+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
-(add-hook 'org-clock-out-hook 'bh/remove-empty-drawer-on-clock-out 'append)
-#+END_SRC
+    (defadvice magit-status (around magit-fullscreen activate)
+      (window-configuration-to-register :magit-fullscreen)
+      ad-do-it
+      (delete-other-windows))
 
-*** Refiling
-All my newly captured entries end up in =refile.org= and want to be
-moved over to the right place. The following is the setup for it.
-#+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
-; 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 org-completion-use-iswitchb nil)
-:; Use IDO for both buffer and file completion and ido-everywhere to 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)
+    (defun magit-quit-session ()
+      "Restores the previous window configuration and kills the magit buffer"
+      (interactive)
+      (kill-buffer)
+      (jump-to-register :magit-fullscreen))
 
-;;;; Refile settings
-(setq org-refile-target-verify-function 'bh/verify-refile-target)
+    (bind-key "q" 'magit-quit-session magit-status-mode-map)
+    ))
+#+END_SRC
+** markdown-mode
+[2014-05-20 Tue 23:04]
+#+BEGIN_SRC emacs-lisp :tangle yes
+(use-package markdown-mode
+  :mode (("\\.md\\'" . markdown-mode)
+         ("\\.mdwn\\'" . markdown-mode))
+  :defer t)
+#+END_SRC
+** message
+#+BEGIN_SRC emacs-lisp :tangle yes
+(use-package message
+  :idle
+  (progn
+    (setq message-kill-buffer-on-exit t)))
 #+END_SRC
+** mingus
+[[https://github.com/pft/mingus][Mingus]] is a nice interface to mpd, the Music Player Daemon.
 
-*** Custom agenda
-Agenda view is the central place for org-mode interaction...
-#+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
-;; Do not dim blocked tasks
-(setq org-agenda-dim-blocked-tasks nil)
-;; Compact the block agenda view
-(setq org-agenda-compact-blocks t)
+I want to access it from anywhere using =F6=.
+#+BEGIN_SRC emacs-lisp :tangle yes
+(use-package mingus-stays-home
+  :bind ( "<f6>" . mingus)
+  :defer t
+  :config
+  (progn
+    (setq mingus-dired-add-keys t)
+    (setq mingus-mode-always-modeline nil)
+    (setq mingus-mode-line-show-elapsed-percentage nil)
+    (setq mingus-mode-line-show-volume nil)
+    (setq mingus-mpd-config-file "/etc/mpd.conf")
+    (setq mingus-mpd-playlist-dir "/var/lib/mpd/playlists")
+    (setq mingus-mpd-root "/share/music/")))
+#+END_SRC
 
-;; Custom agenda command definitions
-(setq org-agenda-custom-commands
-      (quote (("N" "Notes" tags "NOTE"
-               ((org-agenda-overriding-header "Notes")
-                (org-tags-match-list-sublevels t)))
-              ("h" "Habits" tags-todo "STYLE=\"habit\""
-               ((org-agenda-overriding-header "Habits")
-                (org-agenda-sorting-strategy
-                 '(todo-state-down effort-up category-keep))))
-              (" " "Agenda"
-               ((agenda "" nil)
-                (tags "REFILE"
-                      ((org-agenda-overriding-header "Tasks to Refile")
-                       (org-tags-match-list-sublevels nil)))
-                (tags-todo "-HOLD-CANCELLED/!"
-                           ((org-agenda-overriding-header "Projects")
-                            (org-agenda-skip-function 'bh/skip-non-projects)
-                            (org-agenda-sorting-strategy
-                             '(category-keep))))
-                (tags-todo "-CANCELLED/!"
-                           ((org-agenda-overriding-header "Stuck Projects")
-                            (org-agenda-skip-function 'bh/skip-non-stuck-projects)))
-                (tags-todo "-WAITING-CANCELLED/!NEXT"
-                           ((org-agenda-overriding-header "Next Tasks")
-                            (org-agenda-skip-function 'bh/skip-projects-and-habits-and-single-tasks)
-                            (org-agenda-todo-ignore-scheduled t)
-                            (org-agenda-todo-ignore-deadlines t)
-                            (org-agenda-todo-ignore-with-date t)
-                            (org-tags-match-list-sublevels t)
-                            (org-agenda-sorting-strategy
-                             '(todo-state-down effort-up category-keep))))
-                (tags-todo "-REFILE-CANCELLED/!-HOLD-WAITING"
-                           ((org-agenda-overriding-header "Tasks")
-                            (org-agenda-skip-function 'bh/skip-project-tasks-maybe)
-                            (org-agenda-todo-ignore-scheduled t)
-                            (org-agenda-todo-ignore-deadlines t)
-                            (org-agenda-todo-ignore-with-date t)
-                            (org-agenda-sorting-strategy
-                             '(category-keep))))
-                (tags-todo "-CANCELLED+WAITING/!"
-                           ((org-agenda-overriding-header "Waiting and Postponed Tasks")
-                            (org-agenda-skip-function 'bh/skip-stuck-projects)
-                            (org-tags-match-list-sublevels nil)
-                            (org-agenda-todo-ignore-scheduled 'future)
-                            (org-agenda-todo-ignore-deadlines 'future)))
-                (tags "-REFILE/"
-                      ((org-agenda-overriding-header "Tasks to Archive")
-                       (org-agenda-skip-function 'bh/skip-non-archivable-tasks)
-                       (org-tags-match-list-sublevels nil))))
-               nil)
-              ("r" "Tasks to Refile" tags "REFILE"
-               ((org-agenda-overriding-header "Tasks to Refile")
-                (org-tags-match-list-sublevels nil)))
-              ("#" "Stuck Projects" tags-todo "-CANCELLED/!"
-               ((org-agenda-overriding-header "Stuck Projects")
-                (org-agenda-skip-function 'bh/skip-non-stuck-projects)))
-              ("n" "Next Tasks" tags-todo "-WAITING-CANCELLED/!NEXT"
-               ((org-agenda-overriding-header "Next Tasks")
-                (org-agenda-skip-function 'bh/skip-projects-and-habits-and-single-tasks)
-                (org-agenda-todo-ignore-scheduled t)
-                (org-agenda-todo-ignore-deadlines t)
-                (org-agenda-todo-ignore-with-date t)
-                (org-tags-match-list-sublevels t)
-                (org-agenda-sorting-strategy
-                 '(todo-state-down effort-up category-keep))))
-              ("R" "Tasks" tags-todo "-REFILE-CANCELLED/!-HOLD-WAITING"
-               ((org-agenda-overriding-header "Tasks")
-                (org-agenda-skip-function 'bh/skip-project-tasks-maybe)
-                (org-agenda-sorting-strategy
-                 '(category-keep))))
-              ("p" "Projects" tags-todo "-HOLD-CANCELLED/!"
-               ((org-agenda-overriding-header "Projects")
-                (org-agenda-skip-function 'bh/skip-non-projects)
-                (org-agenda-sorting-strategy
-                 '(category-keep))))
-              ("w" "Waiting Tasks" tags-todo "-CANCELLED+WAITING/!"
-               ((org-agenda-overriding-header "Waiting and Postponed tasks"))
-               (org-tags-match-list-sublevels nil))
-              ("A" "Tasks to Archive" tags "-REFILE/"
-               ((org-agenda-overriding-header "Tasks to Archive")
-                (org-agenda-skip-function 'bh/skip-non-archivable-tasks)
-                (org-tags-match-list-sublevels nil))))))
+** miniedit
+Edit minibuffer in a full (text-mode) buffer by pressing *M-C-e*.
+#+BEGIN_SRC emacs-lisp :tangle yes
+(use-package miniedit
+  :ensure miniedit
+  :commands miniedit
+  :config
+  (progn
+    (bind-key "M-C-e" 'miniedit minibuffer-local-map)
+    (bind-key "M-C-e" 'miniedit minibuffer-local-ns-map)
+    (bind-key "M-C-e" 'miniedit minibuffer-local-completion-map)
+    (bind-key "M-C-e" 'miniedit minibuffer-local-must-match-map)
+  ))
+#+END_SRC
 
-; Overwrite the current window with the agenda
-(setq org-agenda-window-setup 'current-window)
 
+** mmm-mode
+[2013-05-21 Tue 23:39]
+MMM Mode is a minor mode for Emacs that allows Multiple Major Modes to
+coexist in one buffer.
+#+BEGIN_SRC emacs-lisp :tangle no
+(use-package mmm-auto
+  :ensure mmm-mode
+  :init
+  (progn
+    (setq mmm-global-mode 'buffers-with-submode-classes)
+    (setq mmm-submode-decoration-level 2)
+    (eval-after-load 'mmm-vars
+      '(progn
+         (mmm-add-group
+          'html-css
+          '((css-cdata
+             :submode css-mode
+             :face mmm-code-submode-face
+             :front "<style[^>]*>[ \t\n]*\\(//\\)?<!\\[CDATA\\[[ \t]*\n?"
+             :back "[ \t]*\\(//\\)?]]>[ \t\n]*</style>"
+             :insert ((?j js-tag nil @ "<style type=\"text/css\">"
+                          @ "\n" _ "\n" @ "</script>" @)))
+            (css
+             :submode css-mode
+             :face mmm-code-submode-face
+             :front "<style[^>]*>[ \t]*\n?"
+             :back "[ \t]*</style>"
+             :insert ((?j js-tag nil @ "<style type=\"text/css\">"
+                          @ "\n" _ "\n" @ "</style>" @)))
+            (css-inline
+             :submode css-mode
+             :face mmm-code-submode-face
+             :front "style=\""
+             :back "\"")))
+         (dolist (mode (list 'html-mode 'nxml-mode))
+           (mmm-add-mode-ext-class mode "\\.r?html\\(\\.erb\\)?\\'" 'html-css))
+         (mmm-add-mode-ext-class 'html-mode "\\.php\\'" 'html-php)
+         ))))
 #+END_SRC
 
-*** Time
-#+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
-;;
-;; Resume clocking task when emacs is restarted
-(org-clock-persistence-insinuate)
-;;
-;; Show lot sof clocking history so it's easy to pick items off the C-F11 list
-(setq org-clock-history-length 36)
-;; Resume clocking task on clock-in if the clock is open
-(setq org-clock-in-resume t)
-;; Change tasks to NEXT when clocking in
-(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)
-;; 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 (quote ("DONE" "WAITING" "DELEGATED" "CANCELLED")))
-;; 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)
-
-; use discrete minute intervals (no rounding) increments
-(setq org-time-stamp-rounding-minutes (quote (1 1)))
+** mo-git-blame
+This is [[https://github.com/mbunkus/mo-git-blame][mo-git-blame -- An interactive, iterative 'git blame' mode for
+Emacs]].
+#+BEGIN_SRC emacs-lisp :tangle yes
+(use-package mo-git-blame
+  :ensure mo-git-blame
+  :commands (mo-git-blame-current
+             mo-git-blame-file)
+  :config
+  (progn
+    (setq mo-git-blame-blame-window-width 25)))
+#+END_SRC
 
-(add-hook 'org-clock-out-hook 'bh/clock-out-maybe 'append)
+** multiple cursors
+[2013-04-08 Mon 23:57]
+Use multiple cursors mode. See [[http://emacsrocks.com/e13.html][Emacs Rocks! multiple cursors]] and
+[[https://github.com/emacsmirror/multiple-cursors][emacsmirror/multiple-cursors · GitHub]]
+#+BEGIN_SRC emacs-lisp :tangle yes
+(use-package multiple-cursors
+  :ensure multiple-cursors
+  :defer t
+  :commands (mc/remove-fake-cursors
+             mc/create-fake-cursor-at-point
+             mc/pop-state-from-overlay
+             mc/maybe-multiple-cursors-mode)
+  :defines (multiple-cursors-mode
+            mc--read-char
+            mc--read-quoted-char
+            rectangular-region-mode)
+  :bind (("C-S-c C-S-c" . mc/edit-lines)
+         ("C->"     . mc/mark-next-like-this)
+         ("C-<"     . mc/mark-previous-like-this)
+         ("C-c C-<" . mc/mark-all-like-this)
+         ("C-c i"   . mc/insert-numbers))
+  :config
+  (progn
+    (bind-key "a" 'mc/mark-all-like-this region-bindings-mode-map)
+    (bind-key "p" 'mc/mark-previous-like-this region-bindings-mode-map)
+    (bind-key "n" 'mc/mark-next-like-this region-bindings-mode-map)
+    (bind-key "l" 'mc/edit-lines region-bindings-mode-map)
+    (bind-key "m" 'mc/mark-more-like-this-extended region-bindings-mode-map)
+    (setq mc/list-file (expand-file-name "mc-cache.el" jj-cache-dir))))
+#+END_SRC
+** neotree
+[2014-08-27 Wed 17:15]
+A emacs tree plugin
+#+BEGIN_SRC emacs-lisp :tangle yes
+(use-package neotree
+  :ensure neotree
+  :defer t
+  :bind (("<f8>" . neotree-toggle))
+  :commands (neotree-find
+             neotree-toggle
+             neotree)
+  :idle
+  (progn
+    (setq neo-smart-open t))
+  :config
+  (progn
+    (bind-key "^" 'neotree-select-up-node neotree-mode-map)))
+#+END_SRC
+** nxml
+[2013-05-22 Wed 22:02]
+nxml-mode is a major mode for editing XML.
+#+BEGIN_SRC emacs-lisp :tangle yes
+(add-auto-mode
+ 'nxml-mode
+ (concat "\\."
+         (regexp-opt
+          '("xml" "xsd" "sch" "rng" "xslt" "svg" "rss"
+            "gpx" "tcx"))
+         "\\'"))
+(setq magic-mode-alist (cons '("<\\?xml " . nxml-mode) magic-mode-alist))
+(fset 'xml-mode 'nxml-mode)
+(setq nxml-slash-auto-complete-flag t)
 
-(setq bh/keep-clock-running nil)
+;; See: http://sinewalker.wordpress.com/2008/06/26/pretty-printing-xml-with-emacs-nxml-mode/
+(defun pp-xml-region (begin end)
+  "Pretty format XML markup in region. The function inserts
+linebreaks to separate tags that have nothing but whitespace
+between them.  It then indents the markup by using nxml's
+indentation rules."
+  (interactive "r")
+  (save-excursion
+      (nxml-mode)
+      (goto-char begin)
+      (while (search-forward-regexp "\>[ \\t]*\<" nil t)
+        (backward-char) (insert "\n"))
+      (indent-region begin end)))
 
-(setq org-agenda-clock-consistency-checks
-      (quote (:max-duration "4:00"
-              :min-duration 0
-              :max-gap 0
-              :gap-ok-around ("4:00"))))
+;;----------------------------------------------------------------------------
+;; Integration with tidy for html + xml
+;;----------------------------------------------------------------------------
+;; tidy is autoloaded
+(eval-after-load 'tidy
+  '(progn
+     (add-hook 'nxml-mode-hook (lambda () (tidy-build-menu nxml-mode-map)))
+     (add-hook 'html-mode-hook (lambda () (tidy-build-menu html-mode-map)))
+     ))
 
 #+END_SRC
+** org                                                                :FIXME:
+*** General settings
+[2013-04-28 So 17:06]
 
-**** Setting a default clock task
-Per default the =** Organization= task in my tasks.org file receives
-misc clock time. This is the task I clock in on when I punch in at the
-start of my work day with =F9-I=.  Punching-in anywhere clocks in this
-Organization task as the default task.
+I use org-mode a lot and, having my config for this based on [[*Bernt%20Hansen][the config of Bernt Hansen]],
+it is quite extensive. Nevertheless, it starts out small, loading it.
+#+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
+(require 'org)
+#+END_SRC
 
-If I want to change the default clocking task I just visit the
-new task in any org buffer and clock it in with =C-u C-u C-c C-x
-C-i=.  Now this new task that collects miscellaneous clock
-minutes when the clock would normally stop.
+My browsers (Conkeror, Iceweasel) can store links in org-mode. For
+that we need org-protocol.
+#+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
+(require 'org-protocol)
+#+END_SRC
 
-You can quickly clock in the default clocking task with =C-u C-c
-C-x C-i d=.  Another option is to repeatedly clock out so the
-clock moves up the project tree until you clock out the
-top-level task and the clock moves to the default task.
+*** Agenda
 
-**** Reporting
+My current =org-agenda-files= variable only includes a set of
+directories.
 #+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
-;; Agenda clock report parameters
-(setq org-agenda-clockreport-parameter-plist
-      (quote (:link t :maxlevel 5 :fileskip0 t :compact t :narrow 80)))
-
-;; Agenda log mode items to display (closed and state changes by default)
-(setq org-agenda-log-mode-items (quote (closed state)))
-#+END_SRC
-**** Task estimates, column view
-Setup column view globally with the following headlines
-#+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
-; Set default column view headings: Task Effort Clock_Summary
-(setq org-columns-default-format "%80ITEM(Task) %10Effort(Effort){:} %10CLOCKSUM")
-#+END_SRC
-Setup the estimate for effort values.
-#+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
-; global Effort estimate values
-; global STYLE property values for completion
-(setq org-global-properties (quote (("Effort_ALL" . "0:15 0:30 0:45 1:00 2:00 3:00 4:00 5:00 6:00 0:00")
-                                    ("STYLE_ALL" . "habit"))))
+(setq org-agenda-files (quote ("~/org/"
+                               "~/org/debian"
+                               "~/org/debconf"
+                               "~/org/spi"
+                               "~/org/nsb"
+                               )))
+(setq org-default-notes-file "~/org/notes.org")
 #+END_SRC
+=org-mode= manages the =org-agenda-files= variable automatically using
+=C-c [= and =C-c ]= to add and remove files respectively.  However,
+this replaces my directory list with a list of explicit filenames
+instead and is not what I want.  If this occurs then adding a new org
+file to any of the above directories will not contribute to my agenda
+and I will probably miss something important.
+
+I have disabled the =C-c [= and =C-c ]= keys in =org-mode-hook= to
+prevent messing up my list of directories in the =org-agenda-files=
+variable.  I just add and remove directories manually here.  Changing
+the list of directories in =org-agenda-files= happens very rarely
+since new files in existing directories are automatically picked up.
 
-*** Tags
-Tags are mostly used for filtering inside the agenda.
 #+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
-; Tags with fast selection keys
-(setq org-tag-alist (quote ((:startgroup)
-                            ("@errand" . ?e)
-                            ("@office" . ?o)
-                            ("@home" . ?H)
-                            (:endgroup)
-                            ("PHONE" . ?p)
-                            ("WAITING" . ?w)
-                            ("HOLD" . ?h)
-                            ("PERSONAL" . ?P)
-                            ("WORK" . ?W)
-                            ("ORG" . ?O)
-                            ("PRIVATE" . ?N)
-                            ("crypt" . ?E)
-                            ("MARK" . ?M)
-                            ("NOTE" . ?n)
-                            ("CANCELLED" . ?c)
-                            ("FLAGGED" . ??))))
+;; Keep tasks with dates on the global todo lists
+(setq org-agenda-todo-ignore-with-date nil)
 
-; Allow setting single tags without the menu
-(setq org-fast-tag-selection-single-key (quote expert))
+;; Keep tasks with deadlines on the global todo lists
+(setq org-agenda-todo-ignore-deadlines nil)
 
-; For tag searches ignore tasks with scheduled and deadline dates
-(setq org-agenda-tags-todo-honor-ignore-options t)
-#+END_SRC
+;; Keep tasks with scheduled dates on the global todo lists
+(setq org-agenda-todo-ignore-scheduled nil)
 
-*** Archiving
-#+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
-(setq org-archive-mark-done nil)
-(setq org-archive-location "%s_archive::* Archived Tasks")
-#+END_SRC
+;; Keep tasks with timestamps on the global todo lists
+(setq org-agenda-todo-ignore-timestamp nil)
 
-*** org-babel
-#+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
-(setq org-ditaa-jar-path "~/java/ditaa0_6b.jar")
-(setq org-plantuml-jar-path "~/java/plantuml.jar")
+;; Remove completed deadline tasks from the agenda view
+(setq org-agenda-skip-deadline-if-done t)
 
-(add-hook 'org-babel-after-execute-hook 'bh/display-inline-images 'append)
+;; Remove completed scheduled tasks from the agenda view
+(setq org-agenda-skip-scheduled-if-done t)
 
-; Make babel results blocks lowercase
-(setq org-babel-results-keyword "results")
+;; Remove completed items from search results
+(setq org-agenda-skip-timestamp-if-done t)
 
-(org-babel-do-load-languages
- (quote org-babel-load-languages)
- (quote ((emacs-lisp . t)
-         (awk . t)
-         (css . t)
-         (makefile . t)
-         (perl . t)
-         (ruby . t)
-         (dot . t)
-         (ditaa . t)
-         (R . t)
-         (python . t)
-         (ruby . t)
-         (gnuplot . t)
-         (clojure . t)
-         (sh . t)
-         (ledger . t)
-         (org . t)
-         (plantuml . t)
-         (latex . t))))
+;; Include agenda archive files when searching for things
+(setq org-agenda-text-search-extra-files (quote (agenda-archives)))
 
-; Do not prompt to confirm evaluation
-; This may be dangerous - make sure you understand the consequences
-; of setting this -- see the docstring for details
-(setq org-confirm-babel-evaluate nil)
+;; Show all future entries for repeating tasks
+(setq org-agenda-repeating-timestamp-show-all t)
 
-; Use fundamental mode when editing plantuml blocks with C-c '
-(add-to-list 'org-src-lang-modes (quote ("plantuml" . fundamental)))
-#+END_SRC
+;; Show all agenda dates - even if they are empty
+(setq org-agenda-show-all-dates t)
 
-#+BEGIN_SRC emacs-lisp :tangle yes
-;; Don't have images visible on startup, breaks on console
-(setq org-startup-with-inline-images nil)
-#+END_SRC
+;; Sorting order for tasks on the agenda
+(setq org-agenda-sorting-strategy
+      (quote ((agenda habit-down time-up user-defined-up priority-down effort-up category-keep)
+              (todo category-up priority-down effort-up)
+              (tags category-up priority-down effort-up)
+              (search category-up))))
 
-#+BEGIN_SRC emacs-lisp :tangle yes
-(add-to-list 'org-structure-template-alist
-             '("n" "#+BEGIN_COMMENT\n?\n#+END_COMMENT"
-               "<comment>\n?\n</comment>"))
-#+END_SRC
-**** ditaa, graphviz, etc
-Those are all nice tools. Look at
-http://doc.norang.ca/org-mode.html#playingwithditaa for a nice intro
-to them.
+;; Start the weekly agenda on Monday
+(setq org-agenda-start-on-weekday 1)
 
-*** Publishing and exporting
+;; Enable display of the time grid so we can see the marker for the current time
+(setq org-agenda-time-grid (quote ((daily today remove-match)
+                                   #("----------------" 0 16 (org-heading t))
+                                   (0800 1000 1200 1400 1500 1700 1900 2100))))
 
+;; Display tags farther right
+(setq org-agenda-tags-column -102)
 
-Org-mode can export to a variety of publishing formats including (but not limited to)
+; position the habit graph on the agenda to the right of the default
+(setq org-habit-graph-column 50)
 
-- ASCII
-  (plain text - but not the original org-mode file)
-- HTML
-- LaTeX
-- Docbook
-  which enables getting to lots of other formats like ODF, XML, etc
-- PDF
-  via LaTeX or Docbook
-- iCal
+; turn habits back on
+(run-at-time "06:00" 86400 '(lambda () (setq org-habit-show-habits t)))
 
-A new exporter created by Nicolas Goaziou was introduced in org 8.0.
+;;
+;; Agenda sorting functions
+;;
+(setq org-agenda-cmp-user-defined 'bh/agenda-sort)
 
-#+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
-;; Explicitly load required exporters
-(require 'ox-html)
-(require 'ox-latex)
-(require 'ox-ascii)
-;; FIXME, check the following two
-;(require 'ox-icalendar)
-;(require 'ox-odt)
 
-; experimenting with docbook exports - not finished
-(setq org-export-docbook-xsl-fo-proc-command "fop %s %s")
-(setq org-export-docbook-xslt-proc-command "xsltproc --output %s /usr/share/xml/docbook/stylesheet/nwalsh/fo/docbook.xsl %s")
+(setq org-deadline-warning-days 30)
 
-;; define categories that should be excluded
-(setq org-export-exclude-category (list "google" "google"))
-(setq org-icalendar-use-scheduled '(todo-start event-if-todo))
+;; Always hilight the current agenda line
+(add-hook 'org-agenda-mode-hook
+          '(lambda () (hl-line-mode 1))
+          'append)
+#+END_SRC
 
-; define how the date strings look
-(setq org-export-date-timestamp-format "%Y-%m-%d")
-; Inline images in HTML instead of producting links to the image
-(setq org-html-inline-images t)
-; Do not use sub or superscripts - I currently don't need this functionality in my documents
-(setq org-export-with-sub-superscripts nil)
+#+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
+(setq org-agenda-persistent-filter t)
+(add-hook 'org-agenda-mode-hook
+          '(lambda () (org-defkey org-agenda-mode-map "W" 'bh/widen))
+          'append)
 
-(setq org-html-head-extra (concat
-                           "<link rel=\"stylesheet\" href=\"http://ganneff.de/stylesheet.css\" type=\"text/css\" />\n"
-                           ))
-(setq org-html-head-include-default-style nil)
-; Do not generate internal css formatting for HTML exports
-(setq org-export-htmlize-output-type (quote css))
-; Export with LaTeX fragments
-(setq org-export-with-LaTeX-fragments t)
-; Increase default number of headings to export
-(setq org-export-headline-levels 6)
+(add-hook 'org-agenda-mode-hook
+          '(lambda () (org-defkey org-agenda-mode-map "F" 'bh/restrict-to-file-or-follow))
+          'append)
 
+(add-hook 'org-agenda-mode-hook
+          '(lambda () (org-defkey org-agenda-mode-map "N" 'bh/narrow-to-subtree))
+          'append)
 
-(setq org-publish-project-alist
-      '(
-        ("config-notes"
-         :base-directory "~/.emacs.d/"
-         :base-extension "org"
-         :exclude "elisp"
-         :publishing-directory "/develop/www/emacs"
-         :recursive t
-         :publishing-function org-html-publish-to-html
-         :headline-levels 4             ; Just the default for this project.
-         :auto-preamble t
-         :auto-sitemap t
-         :makeindex t
-         )
-        ("config-static"
-         :base-directory "~/.emacs.d/"
-         :base-extension "css\\|js\\|png\\|jpg\\|gif\\|pdf\\|mp3\\|ogg\\|swf"
-         :publishing-directory "/develop/www/emacs"
-         :exclude "elisp\\|elpa\\|elpa.off\\|auto-save-list\\|cache\\|eshell\\|image-dired\\|themes\\|url"
-         :recursive t
-         :publishing-function org-publish-attachment
-         )
-        ("inherit-org-info-js"
-         :base-directory "/develop/vcs/org-info-js/"
-         :recursive t
-         :base-extension "js"
-         :publishing-directory "/develop/www/"
-         :publishing-function org-publish-attachment
-         )
-        ("config" :components ("inherit-org-info-js" "config-notes" "config-static")
-         )
-        )
-      )
+(add-hook 'org-agenda-mode-hook
+          '(lambda () (org-defkey org-agenda-mode-map "U" 'bh/narrow-up-one-level))
+          'append)
 
-(setq org-export-with-timestamps nil)
-#+END_SRC
+(add-hook 'org-agenda-mode-hook
+          '(lambda () (org-defkey org-agenda-mode-map "P" 'bh/narrow-to-project))
+          'append)
 
-**** Latex export
+; Rebuild the reminders everytime the agenda is displayed
+(add-hook 'org-finalize-agenda-hook 'bh/org-agenda-to-appt 'append)
 
-#+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
-(setq org-latex-to-pdf-process
-      '("xelatex -interaction nonstopmode %f"
-        "xelatex -interaction nonstopmode %f")) ;; for multiple passes
-(setq org-export-latex-listings 'minted)
-(setq org-latex-listings t)
-
-;; Originally taken from Bruno Tavernier: http://thread.gmane.org/gmane.emacs.orgmode/31150/focus=31432
-;; but adapted to use latexmk 4.20 or higher.
-(defun my-auto-tex-cmd ()
-  "When exporting from .org with latex, automatically run latex,
-     pdflatex, or xelatex as appropriate, using latexmk."
-  (let ((texcmd)))
-  ;; default command: oldstyle latex via dvi
-  (setq texcmd "latexmk -dvi -pdfps -quiet %f")
-  ;; pdflatex -> .pdf
-  (if (string-match "LATEX_CMD: pdflatex" (buffer-string))
-      (setq texcmd "latexmk -pdf -quiet %f"))
-  ;; xelatex -> .pdf
-  (if (string-match "LATEX_CMD: xelatex" (buffer-string))
-      (setq texcmd "latexmk -pdflatex='xelatex -shell-escape' -pdf -quiet %f"))
-  ;; LaTeX compilation command
-  (setq org-latex-to-pdf-process (list texcmd)))
-
-(add-hook 'org-export-latex-after-initial-vars-hook 'my-auto-tex-cmd)
-
-;; Specify default packages to be included in every tex file, whether pdflatex or xelatex
-(setq org-export-latex-packages-alist
-      '(("" "graphicx" t)
-        ("" "longtable" nil)
-        ("" "float" nil)
-        ("" "minted" nil)
-        ))
+;(if (file-exists-p "~/org/refile.org")
+;    (add-hook 'after-init-hook 'bh/org-agenda-to-appt))
 
-(defun my-auto-tex-parameters ()
-      "Automatically select the tex packages to include."
-      ;; default packages for ordinary latex or pdflatex export
-      (setq org-export-latex-default-packages-alist
-            '(("AUTO" "inputenc" t)
-              ("T1"   "fontenc"   t)
-              (""     "fixltx2e"  nil)
-              (""     "wrapfig"   nil)
-              (""     "soul"      t)
-              (""     "textcomp"  t)
-              (""     "marvosym"  t)
-              (""     "wasysym"   t)
-              (""     "latexsym"  t)
-              (""     "amssymb"   t)
-              (""     "hyperref"  nil)))
+; Activate appointments so we get notifications
+(appt-activate t)
 
-      ;; Packages to include when xelatex is used
-      (if (string-match "LATEX_CMD: xelatex" (buffer-string))
-          (setq org-export-latex-default-packages-alist
-                '(("" "fontspec" t)
-                  ("" "xunicode" t)
-                  ("" "url" t)
-                  ("" "rotating" t)
-                  ("german" "babel" t)
-                  ("babel" "csquotes" t)
-                  ("" "soul" t)
-                  ("xetex" "hyperref" nil)
-                  )))
+(setq org-agenda-log-mode-items (quote (closed clock state)))
+(if (> emacs-major-version 23)
+    (setq org-agenda-span 3)
+  (setq org-agenda-ndays 3))
 
-      (if (string-match "#+LATEX_CMD: xelatex" (buffer-string))
-          (setq org-export-latex-classes
-                (cons '("scrartcl"
-                        "\\documentclass[11pt,DIV=13,oneside]{scrartcl}"
-                        ("\\section{%s}" . "\\section*{%s}")
-                        ("\\subsection{%s}" . "\\subsection*{%s}")
-                        ("\\subsubsection{%s}" . "\\subsubsection*{%s}")
-                        ("\\paragraph{%s}" . "\\paragraph*{%s}")
-                        ("\\subparagraph{%s}" . "\\subparagraph*{%s}"))
-                      org-export-latex-classes))))
+(setq org-agenda-show-all-dates t)
+(setq org-agenda-start-on-weekday nil)
+(setq org-deadline-warning-days 14)
 
-(add-hook 'org-export-latex-after-initial-vars-hook 'my-auto-tex-parameters)
 #+END_SRC
+*** Global keybindings.
+Start off by defining a series of keybindings.
 
-*** Prevent editing invisible text
-The following setting prevents accidentally editing hidden text when
-the point is inside a folded region.  This can happen if you are in
-the body of a heading and globally fold the org-file with =S-TAB=
-
-I find invisible edits (and undo's) hard to deal with so now I can't
-edit invisible text.  =C-c C-r= (org-reveal) will display where the
-point is if it is buried in invisible text to allow editing again.
-
+Well, first we remove =C-c [= and =C-c ]=, as all agenda directories are
+setup manually, not by org-mode. Also turn off =C-c ;=, which
+comments headlines - a function never used.
 #+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
-(setq org-catch-invisible-edits 'error)
+(add-hook 'org-mode-hook
+          (lambda ()
+            (org-defkey org-mode-map "\C-c["    'undefined)
+            (org-defkey org-mode-map "\C-c]"    'undefined)
+            (org-defkey org-mode-map "\C-c;"    'undefined))
+          'append)
 #+END_SRC
 
-*** Whatever
+And now a largish set of keybindings...
 #+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
-;; disable the default org-mode stuck projects agenda view
-(setq org-stuck-projects (quote ("" nil nil "")))
-
-; force showing the next headline.
-(setq org-show-entry-below (quote ((default))))
-
-(setq org-show-following-heading t)
-(setq org-show-hierarchy-above t)
-(setq org-show-siblings (quote ((default))))
-
-(setq org-special-ctrl-a/e t)
-(setq org-special-ctrl-k t)
-(setq org-yank-adjusted-subtrees t)
+(bind-key "C-c l" 'org-store-link)
+(bind-key "C-c a" 'org-agenda)
+;(bind-key "C-c b" 'org-iswitchb)
+(define-key mode-specific-map [?a] 'org-agenda)
 
-(setq org-table-export-default-format "orgtbl-to-csv")
+(bind-key "<f12>"     'org-agenda)
+(bind-key "<f5>"      'bh/org-todo)
+(bind-key "<S-f5>"    'bh/widen)
+(bind-key "<f7>"      'bh/set-truncate-lines)
+;(bind-key "<f8>"      'org-cycle-agenda-files)
+
+(bind-key "<f9> <f9>" 'bh/show-org-agenda)
+(bind-key "<f9> b"    'bbdb)
+(bind-key "<f9> c"    'calendar)
+(bind-key "<f9> f"    'boxquote-insert-file)
+(bind-key "<f9> h"    'bh/hide-other)
+(bind-key "<f9> n"    'org-narrow-to-subtree)
+(bind-key "<f9> w"    'widen)
+(bind-key "<f9> u"    'bh/narrow-up-one-level)
+(bind-key "<f9> I"    'bh/punch-in)
+(bind-key "<f9> O"    'bh/punch-out)
+(bind-key "<f9> H"    'jj/punch-in-hw)
+(bind-key "<f9> W"    'jj/punch-out-hw)
+(bind-key "<f9> o"    'bh/make-org-scratch)
+(bind-key "<f9> p"    'bh/phone-call)
+(bind-key "<f9> r"    'boxquote-region)
+(bind-key "<f9> s"    'bh/switch-to-scratch)
+(bind-key "<f9> t"    'bh/insert-inactive-timestamp)
+(bind-key "<f9> T"    'tabify)
+(bind-key "<f9> U"    'untabify)
+(bind-key "<f9> v"    'visible-mode)
+(bind-key "<f9> SPC"  'bh/clock-in-last-task)
+(bind-key "C-<f9>"    'previous-buffer)
+(bind-key "C-<f10>"   'next-buffer)
+(bind-key "M-<f9>"    'org-toggle-inline-images)
+;(bind-key "C-x n r"   'narrow-to-region)
+(bind-key "<f11>"     'org-clock-goto)
+(bind-key "C-<f11>"   'org-clock-in)
+(bind-key "C-M-r"     'org-capture)
+(bind-key "C-c r"     'org-capture)
+(bind-key "C-S-<f12>" 'bh/save-then-publish)
+;(bind-key "C-k" 'jj-org-kill-line org-mode-map)
 
 #+END_SRC
 
-The following setting adds alphabetical lists like
-  ,a. item one
-  ,b. item two
+*** Tasks, States, Todo fun
 
+First we define the global todo keywords.
 #+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
-(if (> emacs-major-version 23)
-    (setq org-list-allow-alphabetical t)
-  (setq org-alphabetical-lists t))
+(setq org-todo-keywords
+      (quote ((sequence "TODO(t)" "NEXT(n)" "|" "DONE(d@/!)")
+              (sequence "WAITING(w@/!)" "HOLD(h@/!)" "DELEGATED(g@/!)" "|" "CANCELLED(c@/!)" "PHONE"))))
+
+(setq org-todo-keyword-faces
+      (quote (("TODO" :foreground "red" :weight bold)
+              ("NEXT" :foreground "light blue" :weight bold)
+              ("DONE" :foreground "forest green" :weight bold)
+              ("WAITING" :foreground "orange" :weight bold)
+              ("HOLD" :foreground "orange" :weight bold)
+              ("DELEGATED" :foreground "yellow" :weight bold)
+              ("CANCELLED" :foreground "dark green" :weight bold)
+              ("PHONE" :foreground "dark green" :weight bold))))
 #+END_SRC
 
+**** Fast Todo Selection
+Fast todo selection allows changing from any task todo state to any
+other state directly by selecting the appropriate key from the fast
+todo selection key menu.
 #+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
-(setq org-remove-highlights-with-change nil)
-
-(setq org-list-demote-modify-bullet (quote (("+" . "-")
-    ("*" . "-")
-    ("1." . "-")
-    ("1)" . "-"))))
+(setq org-use-fast-todo-selection t)
+#+END_SRC
+Changing a task state is done with =C-c C-t KEY=
 
+where =KEY= is the appropriate fast todo state selection key as defined in =org-todo-keywords=.
 
+The setting
+#+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
+(setq org-treat-S-cursor-todo-selection-as-state-change nil)
+#+END_SRC
+allows changing todo states with S-left and S-right skipping all of
+the normal processing when entering or leaving a todo state.  This
+cycles through the todo states but skips setting timestamps and
+entering notes which is very convenient when all you want to do is fix
+up the status of an entry.
 
-(add-hook 'org-insert-heading-hook 'bh/insert-heading-inactive-timestamp 'append)
+**** Todo State Triggers
+I have a few triggers that automatically assign tags to tasks based on
+state changes.  If a task moves to =CANCELLED= state then it gets a
+=CANCELLED= tag.  Moving a =CANCELLED= task back to =TODO= removes the
+=CANCELLED= tag.  These are used for filtering tasks in agenda views
+which I'll talk about later.
 
+The triggers break down to the following rules:
 
-; If we leave Emacs running overnight - reset the appointments one minute after midnight
-(run-at-time "24:01" nil 'bh/org-agenda-to-appt)
+- Moving a task to =CANCELLED= adds a =CANCELLED= tag
+- Moving a task to =WAITING= adds a =WAITING= tag
+- Moving a task to =HOLD= adds a =WAITING= tag
+- Moving a task to a done state removes a =WAITING= tag
+- Moving a task to =TODO= removes =WAITING= and =CANCELLED= tags
+- Moving a task to =NEXT= removes a =WAITING= tag
+- Moving a task to =DONE= removes =WAITING= and =CANCELLED= tags
 
+The tags are used to filter tasks in the agenda views conveniently.
+#+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
+(setq org-todo-state-tags-triggers
+      (quote (("CANCELLED" ("CANCELLED" . t))
+              ("WAITING" ("WAITING" . t))
+              ("HOLD" ("WAITING" . t) ("HOLD" . t))
+              (done ("WAITING") ("HOLD"))
+              ("TODO" ("WAITING") ("CANCELLED") ("HOLD"))
+              ("NEXT" ("WAITING") ("CANCELLED") ("HOLD"))
+              ("DONE" ("WAITING") ("CANCELLED") ("HOLD")))))
 #+END_SRC
 
-
+*** Capturing new tasks
+Org capture replaces the old remember mode.
 #+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
-;; Enable abbrev-mode
-(add-hook 'org-mode-hook (lambda () (abbrev-mode 1)))
-(setq org-startup-indented t)
-(setq org-startup-folded t)
-(setq org-cycle-separator-lines 0)
+(setq org-directory "~/org")
+(setq org-default-notes-file "~/org/refile.org")
+
+;; Capture templates for: TODO tasks, Notes, appointments, phone calls, and org-protocol
+;; see http://orgmode.org/manual/Template-elements.html
+(setq org-capture-templates
+      (quote (("t" "todo" entry (file "~/org/refile.org")
+               "* TODO %?\nAdded: %U\n"
+               :clock-in t :clock-resume t)
+              ("l" "linktodo" entry (file "~/org/refile.org")
+               "* TODO %?\nAdded: %U\n%a\n"
+               :clock-in t :clock-resume t)
+              ("r" "respond" entry (file "~/org/refile.org")
+               "* TODO Respond to %:from on %:subject\nSCHEDULED: %t\nAdded: %U\n%a\n"
+               :clock-in t :clock-resume t :immediate-finish t)
+              ("n" "note" entry (file "~/org/refile.org")
+               "* %? :NOTE:\nAdded: %U\n%a\n"
+               :clock-in t :clock-resume t)
+              ("d" "Delegated" entry (file "~/org/refile.org")
+               "* DELEGATED %?\nAdded: %U\n%a\n"
+               :clock-in t :clock-resume t)
+              ("j" "Journal" entry (file+datetree "~/org/diary.org")
+               "* %?\nAdded: %U\n"
+               :clock-in t :clock-resume t)
+              ("w" "org-protocol" entry (file "~/org/refile.org")
+               "* TODO Review %c\nAdded: %U\n"
+               :immediate-finish t)
+              ("p" "Phone call" entry (file "~/org/refile.org")
+               "* PHONE %? :PHONE:\nAdded: %U"
+               :clock-in t :clock-resume t)
+              ("x" "Bookmark link" entry (file "~/org/refile.org")
+               "* Bookmark: %c\n%i\nAdded: %U\n"
+               :immediate-finish t)
+              ("h" "Habit" entry (file "~/org/refile.org")
+               "* NEXT %?\n:PROPERTIES:\n:STYLE: habit\n:REPEAT_TO_STATE: NEXT\n:END:\nAdded: %U\nSCHEDULED: %(format-time-string \"<%Y-%m-%d %a .+1d/3d>\")\n")
+              )))
 #+END_SRC
 
-I find extra blank lines in lists and headings a bit of a nuisance.
-To get a body after a list you need to include a blank line between
-the list entry and the body -- and indent the body appropriately.
-Most of my lists have no body detail so I like the look of collapsed
-lists with no blank lines better.
+Capture mode now handles automatically clocking in and out of a
+capture task.  This all works out of the box now without special hooks.
+When I start a capture mode task the task is clocked in as specified
+by =:clock-in t= and when the task is filed with =C-c C-c= the clock
+resumes on the original clocking task.
 
-The following setting prevents creating blank lines before headings
-but allows list items to adapt to existing blank lines around the items:
+The quick clocking in and out of capture mode tasks (often it takes
+less than a minute to capture some new task details) can leave
+empty clock drawers in my tasks which aren't really useful.
+The following prevents this.
 #+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
-(setq org-blank-before-new-entry (quote ((heading)
-                                         (plain-list-item . auto))))
+(add-hook 'org-clock-out-hook 'bh/remove-empty-drawer-on-clock-out 'append)
 #+END_SRC
 
-#+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
-(setq org-reverse-note-order nil)
-(setq org-default-notes-file "~/notes.org")
+*** Refiling
+All my newly captured entries end up in =refile.org= and want to be
+moved over to the right place. The following is the setup for it.
+#+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
+; 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 org-completion-use-iswitchb nil)
+:; Use IDO for both buffer and file completion and ido-everywhere to 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)
+
+;;;; Refile settings
+(setq org-refile-target-verify-function 'bh/verify-refile-target)
 #+END_SRC
 
-Enforce task blocking. Tasks can't go done when there is any subtask
-still open. Unless they have a property of =NOBLOCKING: t=
+*** Custom agenda
+Agenda view is the central place for org-mode interaction...
 #+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
-(setq org-enforce-todo-checkbox-dependencies t)
-(setq org-enforce-todo-dependencies t)
+;; Do not dim blocked tasks
+(setq org-agenda-dim-blocked-tasks nil)
+;; Compact the block agenda view
+(setq org-agenda-compact-blocks t)
+
+;; Custom agenda command definitions
+(setq org-agenda-custom-commands
+      (quote (("N" "Notes" tags "NOTE"
+               ((org-agenda-overriding-header "Notes")
+                (org-tags-match-list-sublevels t)))
+              ("h" "Habits" tags-todo "STYLE=\"habit\""
+               ((org-agenda-overriding-header "Habits")
+                (org-agenda-sorting-strategy
+                 '(todo-state-down effort-up category-keep))))
+              (" " "Agenda"
+               ((agenda "" nil)
+                (tags "REFILE"
+                      ((org-agenda-overriding-header "Tasks to Refile")
+                       (org-tags-match-list-sublevels nil)))
+                (tags-todo "-HOLD-CANCELLED/!"
+                           ((org-agenda-overriding-header "Projects")
+                            (org-agenda-skip-function 'bh/skip-non-projects)
+                            (org-agenda-sorting-strategy
+                             '(category-keep))))
+                (tags-todo "-CANCELLED/!"
+                           ((org-agenda-overriding-header "Stuck Projects")
+                            (org-agenda-skip-function 'bh/skip-non-stuck-projects)))
+                (tags-todo "-WAITING-CANCELLED/!NEXT"
+                           ((org-agenda-overriding-header "Next Tasks")
+                            (org-agenda-skip-function 'bh/skip-projects-and-habits-and-single-tasks)
+                            (org-agenda-todo-ignore-scheduled t)
+                            (org-agenda-todo-ignore-deadlines t)
+                            (org-agenda-todo-ignore-with-date t)
+                            (org-tags-match-list-sublevels t)
+                            (org-agenda-sorting-strategy
+                             '(todo-state-down effort-up category-keep))))
+                (tags-todo "-REFILE-CANCELLED/!-HOLD-WAITING"
+                           ((org-agenda-overriding-header "Tasks")
+                            (org-agenda-skip-function 'bh/skip-project-tasks-maybe)
+                            (org-agenda-todo-ignore-scheduled t)
+                            (org-agenda-todo-ignore-deadlines t)
+                            (org-agenda-todo-ignore-with-date t)
+                            (org-agenda-sorting-strategy
+                             '(category-keep))))
+                (tags-todo "-CANCELLED+WAITING/!"
+                           ((org-agenda-overriding-header "Waiting and Postponed Tasks")
+                            (org-agenda-skip-function 'bh/skip-stuck-projects)
+                            (org-tags-match-list-sublevels nil)
+                            (org-agenda-todo-ignore-scheduled 'future)
+                            (org-agenda-todo-ignore-deadlines 'future)))
+                (tags "-REFILE/"
+                      ((org-agenda-overriding-header "Tasks to Archive")
+                       (org-agenda-skip-function 'bh/skip-non-archivable-tasks)
+                       (org-tags-match-list-sublevels nil))))
+               nil)
+              ("r" "Tasks to Refile" tags "REFILE"
+               ((org-agenda-overriding-header "Tasks to Refile")
+                (org-tags-match-list-sublevels nil)))
+              ("#" "Stuck Projects" tags-todo "-CANCELLED/!"
+               ((org-agenda-overriding-header "Stuck Projects")
+                (org-agenda-skip-function 'bh/skip-non-stuck-projects)))
+              ("n" "Next Tasks" tags-todo "-WAITING-CANCELLED/!NEXT"
+               ((org-agenda-overriding-header "Next Tasks")
+                (org-agenda-skip-function 'bh/skip-projects-and-habits-and-single-tasks)
+                (org-agenda-todo-ignore-scheduled t)
+                (org-agenda-todo-ignore-deadlines t)
+                (org-agenda-todo-ignore-with-date t)
+                (org-tags-match-list-sublevels t)
+                (org-agenda-sorting-strategy
+                 '(todo-state-down effort-up category-keep))))
+              ("R" "Tasks" tags-todo "-REFILE-CANCELLED/!-HOLD-WAITING"
+               ((org-agenda-overriding-header "Tasks")
+                (org-agenda-skip-function 'bh/skip-project-tasks-maybe)
+                (org-agenda-sorting-strategy
+                 '(category-keep))))
+              ("p" "Projects" tags-todo "-HOLD-CANCELLED/!"
+               ((org-agenda-overriding-header "Projects")
+                (org-agenda-skip-function 'bh/skip-non-projects)
+                (org-agenda-sorting-strategy
+                 '(category-keep))))
+              ("w" "Waiting Tasks" tags-todo "-CANCELLED+WAITING/!"
+               ((org-agenda-overriding-header "Waiting and Postponed tasks"))
+               (org-tags-match-list-sublevels nil))
+              ("A" "Tasks to Archive" tags "-REFILE/"
+               ((org-agenda-overriding-header "Tasks to Archive")
+                (org-agenda-skip-function 'bh/skip-non-archivable-tasks)
+                (org-tags-match-list-sublevels nil))))))
+
+; Overwrite the current window with the agenda
+(setq org-agenda-window-setup 'current-window)
+
 #+END_SRC
 
+*** Time
 #+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
-(setq org-fast-tag-selection-single-key (quote expert))
-(setq org-footnote-auto-adjust t)
-(setq org-hide-block-startup t)
-(setq org-icalendar-alarm-time 15)
-(setq org-icalendar-combined-description "Ganneffs Org-mode calendar entries")
-(setq org-icalendar-combined-name "\"Ganneffs OrgMode\"")
-(setq org-icalendar-honor-noexport-tag t)
-(setq org-icalendar-include-bbdb-anniversaries nil)
-(setq org-icalendar-include-body 200)
-(setq org-icalendar-include-todo nil)
-(setq org-icalendar-store-UID t)
-(setq org-icalendar-timezone "Europe/Berlin")
-(setq org-insert-mode-line-in-empty-file t)
-(setq org-log-done (quote note))
-(setq org-log-into-drawer t)
-(setq org-log-state-notes-insert-after-drawers nil)
-(setq org-log-reschedule (quote time))
-(setq org-log-states-order-reversed t)
-(setq org-mobile-agendas (quote all))
-(setq org-mobile-directory "/scpx:joerg@garibaldi.ganneff.de:/srv/www2.ganneff.de/htdocs/org/")
-(setq org-mobile-inbox-for-pull "~/org/refile.org")
-(setq org-remember-store-without-prompt t)
-(setq org-return-follows-link t)
-(setq org-reverse-note-order t)
+;;
+;; Resume clocking task when emacs is restarted
+(org-clock-persistence-insinuate)
+;;
+;; Show lot sof clocking history so it's easy to pick items off the C-F11 list
+(setq org-clock-history-length 36)
+;; Resume clocking task on clock-in if the clock is open
+(setq org-clock-in-resume t)
+;; Change tasks to NEXT when clocking in
+(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)
+;; 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 (quote ("DONE" "WAITING" "DELEGATED" "CANCELLED")))
+;; 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)
 
-; regularly save our org-mode buffers
-(run-at-time "00:59" 3600 'org-save-all-org-buffers)
+; use discrete minute intervals (no rounding) increments
+(setq org-time-stamp-rounding-minutes (quote (1 1)))
 
-(setq org-log-done t)
+(add-hook 'org-clock-out-hook 'bh/clock-out-maybe 'append)
 
-(setq org-enable-priority-commands t)
-(setq org-default-priority ?E)
-(setq org-lowest-priority ?E)
+(setq bh/keep-clock-running nil)
 
+(setq org-agenda-clock-consistency-checks
+      (quote (:max-duration "4:00"
+              :min-duration 0
+              :max-gap 0
+              :gap-ok-around ("4:00"))))
 
 #+END_SRC
 
-Speed commands enable single-letter commands in Org-mode files when
-the point is at the beginning of a headline, or at the beginning of a
-code block.
+**** Setting a default clock task
+Per default the =** Organization= task in my tasks.org file receives
+misc clock time. This is the task I clock in on when I punch in at the
+start of my work day with =F9-I=.  Punching-in anywhere clocks in this
+Organization task as the default task.
 
-See the `=org-speed-commands-default=' variable for a list of the keys
-and commands enabled at the beginning of headlines.  All code blocks
-are available at the beginning of a code block, the following key
-sequence =C-c C-v h= (bound to `=org-babel-describe-bindings=') will
-display a list of the code blocks commands and their related keys.
+If I want to change the default clocking task I just visit the
+new task in any org buffer and clock it in with =C-u C-u C-c C-x
+C-i=.  Now this new task that collects miscellaneous clock
+minutes when the clock would normally stop.
+
+You can quickly clock in the default clocking task with =C-u C-c
+C-x C-i d=.  Another option is to repeatedly clock out so the
+clock moves up the project tree until you clock out the
+top-level task and the clock moves to the default task.
 
+**** Reporting
 #+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
-(setq org-use-speed-commands t)
-(setq org-speed-commands-user (quote (("0" . ignore)
-                                      ("1" . ignore)
-                                      ("2" . ignore)
-                                      ("3" . ignore)
-                                      ("4" . ignore)
-                                      ("5" . ignore)
-                                      ("6" . ignore)
-                                      ("7" . ignore)
-                                      ("8" . ignore)
-                                      ("9" . ignore)
+;; Agenda clock report parameters
+(setq org-agenda-clockreport-parameter-plist
+      (quote (:link t :maxlevel 5 :fileskip0 t :compact t :narrow 80)))
 
-                                      ("a" . ignore)
-                                      ("d" . ignore)
-                                      ("h" . bh/hide-other)
-                                      ("i" progn
-                                       (forward-char 1)
-                                       (call-interactively 'org-insert-heading-respect-content))
-                                      ("k" . org-kill-note-or-show-branches)
-                                      ("l" . ignore)
-                                      ("m" . ignore)
-                                      ("q" . bh/show-org-agenda)
-                                      ("r" . ignore)
-                                      ("s" . org-save-all-org-buffers)
-                                      ("w" . org-refile)
-                                      ("x" . ignore)
-                                      ("y" . ignore)
-                                      ("z" . org-add-note)
+;; Agenda log mode items to display (closed and state changes by default)
+(setq org-agenda-log-mode-items (quote (closed state)))
+#+END_SRC
+**** Task estimates, column view
+Setup column view globally with the following headlines
+#+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
+; Set default column view headings: Task Effort Clock_Summary
+(setq org-columns-default-format "%80ITEM(Task) %10Effort(Effort){:} %10CLOCKSUM")
+#+END_SRC
+Setup the estimate for effort values.
+#+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
+; global Effort estimate values
+; global STYLE property values for completion
+(setq org-global-properties (quote (("Effort_ALL" . "0:15 0:30 0:45 1:00 2:00 3:00 4:00 5:00 6:00 0:00")
+                                    ("STYLE_ALL" . "habit"))))
+#+END_SRC
 
-                                      ("A" . ignore)
-                                      ("B" . ignore)
-                                      ("E" . ignore)
-                                      ("F" . bh/restrict-to-file-or-follow)
-                                      ("G" . ignore)
-                                      ("H" . ignore)
-                                      ("J" . org-clock-goto)
-                                      ("K" . ignore)
-                                      ("L" . ignore)
-                                      ("M" . ignore)
-                                      ("N" . bh/narrow-to-org-subtree)
-                                      ("P" . bh/narrow-to-org-project)
-                                      ("Q" . ignore)
-                                      ("R" . ignore)
-                                      ("S" . ignore)
-                                      ("T" . bh/org-todo)
-                                      ("U" . bh/narrow-up-one-org-level)
-                                      ("V" . ignore)
-                                      ("W" . bh/widen)
-                                      ("X" . ignore)
-                                      ("Y" . ignore)
-                                      ("Z" . ignore))))
+*** Tags
+Tags are mostly used for filtering inside the agenda.
+#+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
+; Tags with fast selection keys
+(setq org-tag-alist (quote ((:startgroup)
+                            ("@errand" . ?e)
+                            ("@office" . ?o)
+                            ("@home" . ?H)
+                            (:endgroup)
+                            ("PHONE" . ?p)
+                            ("WAITING" . ?w)
+                            ("HOLD" . ?h)
+                            ("PERSONAL" . ?P)
+                            ("WORK" . ?W)
+                            ("ORG" . ?O)
+                            ("PRIVATE" . ?N)
+                            ("crypt" . ?E)
+                            ("MARK" . ?M)
+                            ("NOTE" . ?n)
+                            ("CANCELLED" . ?c)
+                            ("FLAGGED" . ??))))
 
-(add-hook 'org-agenda-mode-hook
-          (lambda ()
-            (define-key org-agenda-mode-map "q" 'bury-buffer))
-          'append)
+; Allow setting single tags without the menu
+(setq org-fast-tag-selection-single-key (quote expert))
 
-(defvar bh/current-view-project nil)
-(add-hook 'org-agenda-mode-hook
-          '(lambda () (org-defkey org-agenda-mode-map "V" 'bh/view-next-project))
-          'append)
+; For tag searches ignore tasks with scheduled and deadline dates
+(setq org-agenda-tags-todo-honor-ignore-options t)
 #+END_SRC
 
-The following displays the contents of code blocks in Org-mode files
-using the major-mode of the code.  It also changes the behavior of
-=TAB= to as if it were used in the appropriate major mode.  This means
-that reading and editing code form inside of your Org-mode files is
-much more like reading and editing of code using its major mode.
-
+*** Archiving
 #+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
-(setq org-src-fontify-natively t)
-(setq org-src-tab-acts-natively t)
+(setq org-archive-mark-done nil)
+(setq org-archive-location "%s_archive::* Archived Tasks")
 #+END_SRC
 
+*** org-babel
 #+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
-(setq org-src-preserve-indentation nil)
-(setq org-edit-src-content-indentation 0)
-#+END_SRC
+(setq org-ditaa-jar-path "~/java/ditaa0_6b.jar")
+(setq org-plantuml-jar-path "~/java/plantuml.jar")
 
+(add-hook 'org-babel-after-execute-hook 'bh/display-inline-images 'append)
 
-#+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
-(setq org-attach-directory "~/org/data/")
-#+END_SRC
-#+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
-(setq org-agenda-sticky t)
-#+END_SRC
+; Make babel results blocks lowercase
+(setq org-babel-results-keyword "results")
 
-**** Checklist handling
-[2013-05-11 Sat 22:15]
+(org-babel-do-load-languages
+ (quote org-babel-load-languages)
+ (quote ((emacs-lisp . t)
+         (awk . t)
+         (css . t)
+         (makefile . t)
+         (perl . t)
+         (ruby . t)
+         (dot . t)
+         (ditaa . t)
+         (R . t)
+         (python . t)
+         (ruby . t)
+         (gnuplot . t)
+         (clojure . t)
+         (sh . t)
+         (ledger . t)
+         (org . t)
+         (plantuml . t)
+         (latex . t))))
 
-#+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
-(require 'org-checklist)
-#+END_SRC
+; Do not prompt to confirm evaluation
+; This may be dangerous - make sure you understand the consequences
+; of setting this -- see the docstring for details
+(setq org-confirm-babel-evaluate nil)
 
-** transient mark
-For some reason I prefer this mode more than the way without. I want to
-see the marked region.
-#+BEGIN_SRC emacs-lisp :tangle yes
-(transient-mark-mode 1)
+; Use fundamental mode when editing plantuml blocks with C-c '
+(add-to-list 'org-src-lang-modes (quote ("plantuml" . fundamental)))
 #+END_SRC
-** cua
-I know that this lets it look "more like windows", but I don't much care
-about its paste/copy/cut keybindings, the really nice part is the great
-support for rectangular regions, which I started to use a lot since I
-know this mode. The normal keybindings for those are just to useless.
+
 #+BEGIN_SRC emacs-lisp :tangle yes
-(cua-mode t)
-(setq cua-enable-cua-keys (quote shift))
+;; Don't have images visible on startup, breaks on console
+(setq org-startup-with-inline-images nil)
 #+END_SRC
 
-Luckily cua-mode easily supports this, with the following line I just
-get the CUA selection and rectangle stuff, not the keybindings. Yes,
-even though the above =cua-enable-cua-keys= setting would only enable
-them if the selection is done when the region was marked with a shifted
-movement keys.
 #+BEGIN_SRC emacs-lisp :tangle yes
-(cua-selection-mode t)
+(add-to-list 'org-structure-template-alist
+             '("n" "#+BEGIN_COMMENT\n?\n#+END_COMMENT"
+               "<comment>\n?\n</comment>"))
 #+END_SRC
+**** ditaa, graphviz, etc
+Those are all nice tools. Look at
+http://doc.norang.ca/org-mode.html#playingwithditaa for a nice intro
+to them.
 
-** mo-git-blame
-This is [[https://github.com/mbunkus/mo-git-blame][mo-git-blame -- An interactive, iterative 'git blame' mode for
-Emacs]].
+*** Publishing and exporting
 
-#+BEGIN_SRC emacs-lisp :tangle yes
-(autoload 'mo-git-blame-file "mo-git-blame" nil t)
-(autoload 'mo-git-blame-current "mo-git-blame" nil t)
-#+END_SRC
 
-** mingus
-[[https://github.com/pft/mingus][Mingus]] is a nice interface to mpd, the Music Player Daemon.
+Org-mode can export to a variety of publishing formats including (but not limited to)
 
-I want to access it from anywhere using =F6=.
-#+BEGIN_SRC emacs-lisp :tangle yes
-(autoload 'mingus "mingus-stays-home" nil t)
-(global-set-key (kbd "<f6>") 'mingus)
-(after 'mingus
- (setq mingus-dired-add-keys t)
- (setq mingus-mode-always-modeline nil)
- (setq mingus-mode-line-show-elapsed-percentage nil)
- (setq mingus-mode-line-show-volume nil)
- (setq mingus-mpd-config-file "/etc/mpd.conf")
- (setq mingus-mpd-playlist-dir "/var/lib/mpd/playlists")
- (setq mingus-mpd-root "/share/music/"))
+- ASCII
+  (plain text - but not the original org-mode file)
+- HTML
+- LaTeX
+- Docbook
+  which enables getting to lots of other formats like ODF, XML, etc
+- PDF
+  via LaTeX or Docbook
+- iCal
+
+A new exporter created by Nicolas Goaziou was introduced in org 8.0.
+
+#+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
+;; Explicitly load required exporters
+(require 'ox-html)
+(require 'ox-latex)
+(require 'ox-ascii)
+;; FIXME, check the following two
+;(require 'ox-icalendar)
+;(require 'ox-odt)
+
+; experimenting with docbook exports - not finished
+(setq org-export-docbook-xsl-fo-proc-command "fop %s %s")
+(setq org-export-docbook-xslt-proc-command "xsltproc --output %s /usr/share/xml/docbook/stylesheet/nwalsh/fo/docbook.xsl %s")
+
+;; define categories that should be excluded
+(setq org-export-exclude-category (list "google" "google"))
+(setq org-icalendar-use-scheduled '(todo-start event-if-todo))
+
+; define how the date strings look
+(setq org-export-date-timestamp-format "%Y-%m-%d")
+; Inline images in HTML instead of producting links to the image
+(setq org-html-inline-images t)
+; Do not use sub or superscripts - I currently don't need this functionality in my documents
+(setq org-export-with-sub-superscripts nil)
+
+(setq org-html-head-extra (concat
+                           "<link rel=\"stylesheet\" href=\"http://ganneff.de/stylesheet.css\" type=\"text/css\" />\n"
+                           ))
+(setq org-html-head-include-default-style nil)
+; Do not generate internal css formatting for HTML exports
+(setq org-export-htmlize-output-type (quote css))
+; Export with LaTeX fragments
+(setq org-export-with-LaTeX-fragments t)
+; Increase default number of headings to export
+(setq org-export-headline-levels 6)
+
+
+(setq org-publish-project-alist
+      '(
+        ("config-notes"
+         :base-directory "~/.emacs.d/"
+         :base-extension "org"
+         :exclude "elisp"
+         :publishing-directory "/develop/www/emacs"
+         :recursive t
+         :publishing-function org-html-publish-to-html
+         :headline-levels 4             ; Just the default for this project.
+         :auto-preamble t
+         :auto-sitemap t
+         :makeindex t
+         )
+        ("config-static"
+         :base-directory "~/.emacs.d/"
+         :base-extension "css\\|js\\|png\\|jpg\\|gif\\|pdf\\|mp3\\|ogg\\|swf"
+         :publishing-directory "/develop/www/emacs"
+         :exclude "elisp\\|elpa\\|elpa.off\\|auto-save-list\\|cache\\|eshell\\|image-dired\\|themes\\|url"
+         :recursive t
+         :publishing-function org-publish-attachment
+         )
+        ("inherit-org-info-js"
+         :base-directory "/develop/vcs/org-info-js/"
+         :recursive t
+         :base-extension "js"
+         :publishing-directory "/develop/www/"
+         :publishing-function org-publish-attachment
+         )
+        ("config" :components ("inherit-org-info-js" "config-notes" "config-static")
+         )
+        )
+      )
+
+(setq org-export-with-timestamps nil)
 #+END_SRC
 
-** sessions
-[2013-05-22 Wed 22:40]
-Save and restore the desktop
-#+BEGIN_SRC emacs-lisp :tangle yes
-(setq desktop-path (list jj-cache-dir))
-(desktop-save-mode 1)
-(defadvice desktop-read (around trace-desktop-errors activate)
-  (let ((debug-on-error t))
-    ad-do-it))
+**** Latex export
+
+#+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
+(setq org-latex-to-pdf-process
+      '("xelatex -interaction nonstopmode %f"
+        "xelatex -interaction nonstopmode %f")) ;; for multiple passes
+(setq org-export-latex-listings 'minted)
+(setq org-latex-listings t)
+
+;; Originally taken from Bruno Tavernier: http://thread.gmane.org/gmane.emacs.orgmode/31150/focus=31432
+;; but adapted to use latexmk 4.20 or higher.
+(defun my-auto-tex-cmd ()
+  "When exporting from .org with latex, automatically run latex,
+     pdflatex, or xelatex as appropriate, using latexmk."
+  (let ((texcmd)))
+  ;; default command: oldstyle latex via dvi
+  (setq texcmd "latexmk -dvi -pdfps -quiet %f")
+  ;; pdflatex -> .pdf
+  (if (string-match "LATEX_CMD: pdflatex" (buffer-string))
+      (setq texcmd "latexmk -pdf -quiet %f"))
+  ;; xelatex -> .pdf
+  (if (string-match "LATEX_CMD: xelatex" (buffer-string))
+      (setq texcmd "latexmk -pdflatex='xelatex -shell-escape' -pdf -quiet %f"))
+  ;; LaTeX compilation command
+  (setq org-latex-to-pdf-process (list texcmd)))
+
+(add-hook 'org-export-latex-after-initial-vars-hook 'my-auto-tex-cmd)
+
+;; Specify default packages to be included in every tex file, whether pdflatex or xelatex
+(setq org-export-latex-packages-alist
+      '(("" "graphicx" t)
+        ("" "longtable" nil)
+        ("" "float" nil)
+        ("" "minted" nil)
+        ))
+
+(defun my-auto-tex-parameters ()
+      "Automatically select the tex packages to include."
+      ;; default packages for ordinary latex or pdflatex export
+      (setq org-export-latex-default-packages-alist
+            '(("AUTO" "inputenc" t)
+              ("T1"   "fontenc"   t)
+              (""     "fixltx2e"  nil)
+              (""     "wrapfig"   nil)
+              (""     "soul"      t)
+              (""     "textcomp"  t)
+              (""     "marvosym"  t)
+              (""     "wasysym"   t)
+              (""     "latexsym"  t)
+              (""     "amssymb"   t)
+              (""     "hyperref"  nil)))
 
+      ;; Packages to include when xelatex is used
+      (if (string-match "LATEX_CMD: xelatex" (buffer-string))
+          (setq org-export-latex-default-packages-alist
+                '(("" "fontspec" t)
+                  ("" "xunicode" t)
+                  ("" "url" t)
+                  ("" "rotating" t)
+                  ("german" "babel" t)
+                  ("babel" "csquotes" t)
+                  ("" "soul" t)
+                  ("xetex" "hyperref" nil)
+                  )))
 
-;;----------------------------------------------------------------------------
-;; Restore histories and registers after saving
-;;----------------------------------------------------------------------------
-(require 'session)
-
-(setq session-save-file (expand-file-name "session" jj-cache-dir))
-(add-hook 'after-init-hook 'session-initialize)
-
-;; save a bunch of variables to the desktop file
-;; for lists specify the len of the maximal saved data also
-(setq desktop-globals-to-save
-      (append '((extended-command-history . 30)
-                (file-name-history        . 100)
-                (grep-history             . 30)
-                (compile-history          . 30)
-                (minibuffer-history       . 50)
-                (query-replace-history    . 60)
-                (read-expression-history  . 60)
-                (regexp-history           . 60)
-                (regexp-search-ring       . 20)
-                (search-ring              . 20)
-                (comint-input-ring        . 50)
-                (shell-command-history    . 50)
-                kill-ring
-                desktop-missing-file-warning
-                tags-file-name
-                register-alist)))
+      (if (string-match "#+LATEX_CMD: xelatex" (buffer-string))
+          (setq org-export-latex-classes
+                (cons '("scrartcl"
+                        "\\documentclass[11pt,DIV=13,oneside]{scrartcl}"
+                        ("\\section{%s}" . "\\section*{%s}")
+                        ("\\subsection{%s}" . "\\subsection*{%s}")
+                        ("\\subsubsection{%s}" . "\\subsubsection*{%s}")
+                        ("\\paragraph{%s}" . "\\paragraph*{%s}")
+                        ("\\subparagraph{%s}" . "\\subparagraph*{%s}"))
+                      org-export-latex-classes))))
 
-#+END_SRC
-*** savehist
-[2013-04-21 So 20:25]
-Save a bit of history
-#+BEGIN_SRC emacs-lisp tangle no
-(require 'savehist)
-(setq savehist-additional-variables
- '(search ring regexp-search-ring kill-ring compile-history))
- ;; save every minute
-(setq savehist-autosave-interval 60)
-(setq savehist-file (expand-file-name "savehist" jj-cache-dir))
-(savehist-mode +1)
+(add-hook 'org-export-latex-after-initial-vars-hook 'my-auto-tex-parameters)
 #+END_SRC
 
-*** saveplace
-Store at which point I have been in files.
-#+BEGIN_SRC emacs-lisp :tangle yes
-(setq-default save-place t)
-(require 'saveplace)
-(setq save-place-file (expand-file-name "saved-places" jj-cache-dir))
-#+END_SRC
-** easypg
-EasyPG is a GnuPG interface for Emacs.
-#+BEGIN_SRC emacs-lisp :tangle yes
-(require 'epa-file)
-(epa-file-enable)
-#+END_SRC
+*** Prevent editing invisible text
+The following setting prevents accidentally editing hidden text when
+the point is inside a folded region.  This can happen if you are in
+the body of a heading and globally fold the org-file with =S-TAB=
 
-I took the following from [[http://www.emacswiki.org/emacs/EasyPG][EmacsWiki: Easy PG]]
-#+BEGIN_SRC emacs-lisp :tangle yes
-(defadvice epg--start (around advice-epg-disable-agent disable)
-  "Don't allow epg--start to use gpg-agent in plain text
-    terminals."
-  (if (display-graphic-p)
-      ad-do-it
-    (let ((agent (getenv "GPG_AGENT_INFO")))
-      (setenv "GPG_AGENT_INFO" nil) ; give us a usable text password prompt
-      ad-do-it
-      (setenv "GPG_AGENT_INFO" agent))))
-(ad-enable-advice 'epg--start 'around 'advice-epg-disable-agent)
-(ad-activate 'epg--start)
-#+END_SRC
-** message
-#+BEGIN_SRC emacs-lisp :tangle yes
-(require 'message)
-(setq message-kill-buffer-on-exit t)
-#+END_SRC
-** gnus
-Most of my gnus config is in an own file, [[file:gnus.org][gnus.org]], here I only have
-what I want every emacs to know.
-#+BEGIN_SRC emacs-lisp :tangle yes
-;;*** Keyboardmacros
-(global-unset-key "\M-n")
-(global-set-key "\M-n" 'gnus) ; Start gnus with M-n
-(after 'gnus
-  (jj-init-theme)
-)
-#+END_SRC
+I find invisible edits (and undo's) hard to deal with so now I can't
+edit invisible text.  =C-c C-r= (org-reveal) will display where the
+point is if it is buried in invisible text to allow editing again.
 
-** url
-url contains code to parse and handle URLs - who would have thought? I
-set it to send Accept-language header and tell it to not send email,
-operating system or location info.
-#+BEGIN_SRC emacs-lisp :tangle yes
-(setq url-mime-language-string "de,en")
-(setq url-privacy-level (quote (email os lastloc)))
-#+END_SRC
-** hippie-exp
-Crazy way of completion. It looks at the word before point and then
-tries to expand it in various ways.
-#+BEGIN_SRC emacs-lisp :tangle yes
-(require 'hippie-exp)
-(setq hippie-expand-try-functions-list '(try-expand-dabbrev
-                                         try-expand-dabbrev-all-buffers
-                                         try-expand-dabbrev-from-kill
-                                         try-complete-file-name-partially
-                                         try-complete-file-name
-                                         try-expand-all-abbrevs try-expand-list
-                                         try-expand-line
-                                         try-complete-lisp-symbol-partially
-                                         try-complete-lisp-symbol))
-(global-set-key (kbd "M-/") 'hippie-expand)
-#+END_SRC
-** yasnippet
-[2013-04-27 Sa 23:16]
-Yasnippet is a template system. Type an abbreviation, expand it into
-whatever the snippet holds.
-#+BEGIN_SRC emacs-lisp :tangle yes
-(setq yas-snippet-dirs (expand-file-name "yasnippet/snippets" jj-elisp-dir))
-(require 'yasnippet)
-(yas-global-mode 1)
-
-;; Integrate hippie-expand with ya-snippet
-(add-to-list 'hippie-expand-try-functions-list
-             'yas-hippie-try-expand)
-#+END_SRC
-** elpa
-The Emacs Lisp Package Archive (may) contain(s) some things I
-want. Even though I usually only use it to get the package, then when I
-like it move it into my own space. My elpa subdir stays empty.
-#+BEGIN_SRC emacs-lisp :tangle yes
-  (when (> emacs-major-version 23)
-    (require 'package)
-    (setq package-user-dir (expand-file-name "elpa" jj-cache-dir))
-    (package-initialize)
-    (add-to-list 'package-archives '("marmalade" . "http://marmalade-repo.org/packages/"))
-    (add-to-list 'package-archives '("melpa" . "http://melpa.milkbox.net/packages/"))
-    (add-to-list 'package-archives '("elpy" . "http://jorgenschaefer.github.io/packages/"))
-    )
-#+END_SRC
-** multiple cursors
-[2013-04-08 Mon 23:57]
-Use multiple cursors mode. See [[http://emacsrocks.com/e13.html][Emacs Rocks! multiple cursors]] and
-[[https://github.com/emacsmirror/multiple-cursors][emacsmirror/multiple-cursors · GitHub]]
-#+BEGIN_SRC emacs-lisp :tangle yes
-(safe-load (concat jj-elisp-dir "/multiple-cursors/multiple-cursors-autoloads.el"))
-(define-key region-bindings-mode-map "a" 'mc/mark-all-like-this)
-(define-key region-bindings-mode-map "p" 'mc/mark-previous-like-this)
-(define-key region-bindings-mode-map "n" 'mc/mark-next-like-this)
-(define-key region-bindings-mode-map "l" 'mc/edit-lines)
-(define-key region-bindings-mode-map "m" 'mc/mark-more-like-this-extended)
-(setq mc/list-file (expand-file-name "mc-cache.el" jj-cache-dir))
-#+END_SRC
-** rainbow-delimiters
-[2013-04-09 Di 23:38]
-[[http://www.emacswiki.org/emacs/RainbowDelimiters][EmacsWiki: Rainbow Delimiters]] is a “rainbow parentheses”-like mode
-which highlights parens, brackets, and braces according to their
-depth. Each successive level is highlighted a different color. This
-makes it easy to spot matching delimiters, orient yourself in the code,
-and tell which statements are at the same depth.
-#+BEGIN_SRC emacs-lisp :tangle yes
-(when (require 'rainbow-delimiters nil 'noerror)
-  (global-rainbow-delimiters-mode))
-#+END_SRC
-** undo-tree
-[2013-04-21 So 11:07]
-Emacs undo is pretty powerful - but can also be confusing. There are
-tons of modes available to change it, even downgrade it to the very
-crappy ways one usually knows from other systems which lose
-information. undo-tree is different - it helps keeping you sane while
-keeping the full power of emacs undo/redo.
-#+BEGIN_SRC emacs-lisp :tangle yes
-(require 'undo-tree)
-(global-undo-tree-mode)
-(diminish 'undo-tree-mode)
+#+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
+(setq org-catch-invisible-edits 'error)
 #+END_SRC
 
-Additionally I would like to keep the region active should I undo
-while I have one.
+*** Whatever
+#+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
+;; disable the default org-mode stuck projects agenda view
+(setq org-stuck-projects (quote ("" nil nil "")))
 
-#+BEGIN_SRC emacs-lisp :tangle yes
-;; Keep region when undoing in region
-(defadvice undo-tree-undo (around keep-region activate)
-  (if (use-region-p)
-      (let ((m (set-marker (make-marker) (mark)))
-            (p (set-marker (make-marker) (point))))
-        ad-do-it
-        (goto-char p)
-        (set-mark m)
-        (set-marker p nil)
-        (set-marker m nil))
-    ad-do-it))
-#+END_SRC
-** windmove
-[2013-04-21 So 20:27]
-Use hyper + arrow keys to switch between visible buffers
-#+BEGIN_SRC emacs-lisp :tangle yes
-(require 'windmove)
-(windmove-default-keybindings 'hyper)
-(setq windmove-wrap-around t)
-#+END_SRC
-** volatile highlights
-[2013-04-21 So 20:31]
-VolatileHighlights highlights changes to the buffer caused by commands
-such as ‘undo’, ‘yank’/’yank-pop’, etc. The highlight disappears at the
-next command. The highlighting gives useful visual feedback for what
-your operation actually changed in the buffer.
-#+BEGIN_SRC emacs-lisp :tangle yes
-(require 'volatile-highlights)
-(volatile-highlights-mode t)
-(diminish 'volatile-highlights-mode)
-#+END_SRC
-** ediff
-[2013-04-21 So 20:36]
-ediff - don't start another frame
-#+BEGIN_SRC elisp
-(require 'ediff)
-(setq ediff-window-setup-function 'ediff-setup-windows-plain)
-#+END_SRC
-** re-builder
-Saner regex syntax
-#+BEGIN_SRC emacs-lisp :tangle yes
-(require 're-builder)
-(setq reb-re-syntax 'string)
-#+END_SRC
-** magit
-[2013-04-21 So 20:48]
-magit is a mode for interacting with git.
-#+BEGIN_SRC emacs-lisp :tangle yes
-;(require 'magitload)
-(safe-load (concat jj-elisp-dir "/magit/magit-autoloads.el"))
-;(require 'magit-svn)
-(global-set-key (kbd "C-x g") 'magit-status)
-(setq magit-commit-signoff t)
-#+END_SRC
+; force showing the next headline.
+(setq org-show-entry-below (quote ((default))))
 
-** lisp editing stuff
-[2013-04-21 So 21:00]
-I'm not doing much of it, except for my emacs and gnus configs, but
-then I like it nice too...
-#+BEGIN_SRC emacs-lisp :tangle yes
-(define-key read-expression-map (kbd "TAB") 'lisp-complete-symbol)
-(require 'paredit)
+(setq org-show-following-heading t)
+(setq org-show-hierarchy-above t)
+(setq org-show-siblings (quote ((default))))
 
-(setq lisp-coding-hook 'lisp-coding-defaults)
-  (setq interactive-lisp-coding-hook 'interactive-lisp-coding-defaults)
+(setq org-special-ctrl-a/e t)
+(setq org-special-ctrl-k t)
+(setq org-yank-adjusted-subtrees t)
 
-(after "paredit"
-  '(diminish 'paredit-mode " π"))
+(setq org-table-export-default-format "orgtbl-to-csv")
 
-(setq prelude-emacs-lisp-mode-hook 'prelude-emacs-lisp-mode-defaults)
-(add-hook 'emacs-lisp-mode-hook (lambda ()
-                                  (run-hooks 'prelude-emacs-lisp-mode-hook)))
+#+END_SRC
 
-(define-key emacs-lisp-mode-map (kbd "M-.") 'find-function-at-point)
+The following setting adds alphabetical lists like
+  ,a. item one
+  ,b. item two
 
-(after "elisp-slime-nav"
-  '(diminish 'elisp-slime-nav-mode))
-(after "rainbow-mode"
-  '(diminish 'rainbow-mode))
-(after "eldoc"
-  '(diminish 'eldoc-mode))
+#+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
+(if (> emacs-major-version 23)
+    (setq org-list-allow-alphabetical t)
+  (setq org-alphabetical-lists t))
 #+END_SRC
 
-** writegood
-This highlights some /weaselwords/, a mode to /aid in finding common
-writing problems/...
-[2013-04-27 Sa 23:29]
-#+BEGIN_SRC emacs-lisp :tangle yes
-(require 'writegood-mode)
-(global-set-key "\C-cg" 'writegood-mode)
-#+END_SRC
-** auto-complete mode
-[2013-04-27 Sa 16:33]
-And aren't we all lazy? I definitely am, and I like my emacs doing as
-much possible work for me as it can.
-So here, auto-complete-mode, which lets emacs do this, based on what I
-already had typed.
-#+BEGIN_SRC emacs-lisp :tangle yes
-(require 'auto-complete)
-(setq ac-comphist-file (expand-file-name "ac-comphist.dat" jj-cache-dir))
-(global-auto-complete-mode t)
+#+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
+(setq org-remove-highlights-with-change nil)
+
+(setq org-list-demote-modify-bullet (quote (("+" . "-")
+    ("*" . "-")
+    ("1." . "-")
+    ("1)" . "-"))))
 
-(setq ac-expand-on-auto-complete nil)
-(setq ac-dwim t)
-(setq ac-auto-start t)
 
-;;----------------------------------------------------------------------------
-;; Use Emacs' built-in TAB completion hooks to trigger AC (Emacs >= 23.2)
-;;----------------------------------------------------------------------------
-(setq tab-always-indent 'complete)  ;; use 't when auto-complete is disabled
-(add-to-list 'completion-styles 'initials t)
-
-;; hook AC into completion-at-point
-(defun sanityinc/auto-complete-at-point ()
-  (when (and (not (minibufferp)) 
-             (fboundp 'auto-complete-mode)
-             auto-complete-mode)
-    (auto-complete)))
-
-(defun set-auto-complete-as-completion-at-point-function ()
-  (add-to-list 'completion-at-point-functions 'sanityinc/auto-complete-at-point))
-
-(add-hook 'auto-complete-mode-hook 'set-auto-complete-as-completion-at-point-function)
-
-;(require 'ac-dabbrev)
-(set-default 'ac-sources
-             '(ac-source-imenu
-               ac-source-dictionary
-               ac-source-words-in-buffer
-               ac-source-words-in-same-mode-buffers
-               ac-source-words-in-all-buffer))
-;               ac-source-dabbrev))
-
-(dolist (mode '(magit-log-edit-mode log-edit-mode org-mode text-mode haml-mode
-                sass-mode yaml-mode csv-mode espresso-mode haskell-mode
-                html-mode nxml-mode sh-mode smarty-mode clojure-mode
-                lisp-mode textile-mode markdown-mode tuareg-mode python-mode
-                js3-mode css-mode less-css-mode sql-mode ielm-mode))
-  (add-to-list 'ac-modes mode))
-
-;; Exclude very large buffers from dabbrev
-(defun sanityinc/dabbrev-friend-buffer (other-buffer)
-  (< (buffer-size other-buffer) (* 1 1024 1024)))
-
-(setq dabbrev-friend-buffer-function 'sanityinc/dabbrev-friend-buffer)
-
-
-;; custom keybindings to use tab, enter and up and down arrows
-(define-key ac-complete-mode-map "\t" 'ac-expand)
-(define-key ac-complete-mode-map "\r" 'ac-complete)
-(define-key ac-complete-mode-map "\M-n" 'ac-next)
-(define-key ac-complete-mode-map "\M-p" 'ac-previous)
-(define-key ac-mode-map (kbd "M-TAB") 'auto-complete)
-
-(setq auto-completion-syntax-alist (quote (global accept . word))) ;; Use space and punctuation to accept the current the most likely completion.
-(setq auto-completion-min-chars (quote (global . 3))) ;; Avoid completion for short trivial words.
-(setq completion-use-dynamic t)
-
-(add-hook 'latex-mode-hook 'auto-complete-mode)
-(add-hook 'LaTeX-mode-hook 'auto-complete-mode)
-(add-hook 'prog-mode-hook 'auto-complete-mode)
-(add-hook 'org-mode-hook 'auto-complete-mode)
-#+END_SRC
-** yaml-mode
-[2013-04-28 So 01:13]
-YAML is a nice format for data, which is both, human and machine
-readable/editable without getting a big headache.
-#+BEGIN_SRC emacs-lisp :tangle yes
-(require 'yaml-mode)
-(add-auto-mode 'yaml-mode "\\.yml$")
-(add-auto-mode 'yaml-mode "\\.yaml$")
-(add-hook 'yaml-mode-hook
- '(lambda ()
-    (define-key yaml-mode-map "\C-m" 'newline-and-indent)))
-#+END_SRC
 
-** flycheck
-[2013-04-28 So 22:21]
-Flycheck is a on-the-fly syntax checking tool, supposedly better than Flymake.
-As the one time I tried Flymake i wasn't happy, thats easy to
-understand for me.
-#+BEGIN_SRC emacs-lisp :tangle yes
-(when (> emacs-major-version 23)
-  (require 'flycheck)
-  (add-hook 'after-init-hook #'global-flycheck-mode))
-#+END_SRC
-** crontab-mode
-[2013-05-21 Tue 23:18]
-#+BEGIN_SRC emacs-lisp :tangle yes
-(require 'crontab-mode)
-(add-auto-mode 'crontab-mode "\\.?cron\\(tab\\)?\\'")
-#+END_SRC
+(add-hook 'org-insert-heading-hook 'bh/insert-heading-inactive-timestamp 'append)
 
-** nxml
-[2013-05-22 Wed 22:02]
-nxml-mode is a major mode for editing XML.
-#+BEGIN_SRC emacs-lisp :tangle yes
-(add-auto-mode
- 'nxml-mode
- (concat "\\."
-         (regexp-opt
-          '("xml" "xsd" "sch" "rng" "xslt" "svg" "rss"
-            "gpx" "tcx"))
-         "\\'"))
-(setq magic-mode-alist (cons '("<\\?xml " . nxml-mode) magic-mode-alist))
-(fset 'xml-mode 'nxml-mode)
-(setq nxml-slash-auto-complete-flag t)
 
-;; See: http://sinewalker.wordpress.com/2008/06/26/pretty-printing-xml-with-emacs-nxml-mode/
-(defun pp-xml-region (begin end)
-  "Pretty format XML markup in region. The function inserts
-linebreaks to separate tags that have nothing but whitespace
-between them.  It then indents the markup by using nxml's
-indentation rules."
-  (interactive "r")
-  (save-excursion
-      (nxml-mode)
-      (goto-char begin)
-      (while (search-forward-regexp "\>[ \\t]*\<" nil t)
-        (backward-char) (insert "\n"))
-      (indent-region begin end)))
+; If we leave Emacs running overnight - reset the appointments one minute after midnight
+(run-at-time "24:01" nil 'bh/org-agenda-to-appt)
+
+#+END_SRC
 
-;;----------------------------------------------------------------------------
-;; Integration with tidy for html + xml
-;;----------------------------------------------------------------------------
-;; tidy is autoloaded
-(eval-after-load 'tidy
-  '(progn
-     (add-hook 'nxml-mode-hook (lambda () (tidy-build-menu nxml-mode-map)))
-     (add-hook 'html-mode-hook (lambda () (tidy-build-menu html-mode-map)))
-     ))
 
+#+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
+;; Enable abbrev-mode
+(add-hook 'org-mode-hook (lambda () (abbrev-mode 1)))
+(setq org-startup-indented t)
+(setq org-startup-folded t)
+(setq org-cycle-separator-lines 0)
 #+END_SRC
-** ruby
-[2013-05-22 Wed 22:33]
-Programming in ruby...
 
-*** Auto-modes
-#+BEGIN_SRC emacs-lisp :tangle yes
-(add-auto-mode 'ruby-mode
-               "Rakefile\\'" "\\.rake\\'" "\.rxml\\'"
-               "\\.rjs\\'" ".irbrc\\'" "\.builder\\'" "\\.ru\\'"
-               "\\.gemspec\\'" "Gemfile\\'" "Kirkfile\\'")
+I find extra blank lines in lists and headings a bit of a nuisance.
+To get a body after a list you need to include a blank line between
+the list entry and the body -- and indent the body appropriately.
+Most of my lists have no body detail so I like the look of collapsed
+lists with no blank lines better.
+
+The following setting prevents creating blank lines before headings
+but allows list items to adapt to existing blank lines around the items:
+#+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
+(setq org-blank-before-new-entry (quote ((heading)
+                                         (plain-list-item . auto))))
 #+END_SRC
 
-*** Config
-#+BEGIN_SRC emacs-lisp :tangle yes
-(after 'ruby-mode
-       (message "ruby has been loaded")
-       (define-key ruby-mode-map (kbd "RET") 'reindent-then-newline-and-indent)
-       (define-key ruby-mode-map (kbd "TAB") 'indent-for-tab-command)
-
-       (require 'ruby-hash-syntax)
-       (require 'inf-ruby)
-       (setq ruby-use-encoding-map nil)
-       ;; Stupidly the non-bundled ruby-mode isn't a derived mode of
-       ;; prog-mode: we run the latter's hooks anyway in that case.
-       (add-hook 'ruby-mode-hook
-                 (lambda ()
-                   (unless (derived-mode-p 'prog-mode)
-                     (run-hooks 'prog-mode-hook))))
+#+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
+(setq org-reverse-note-order nil)
+(setq org-default-notes-file "~/notes.org")
+#+END_SRC
 
-       )
+Enforce task blocking. Tasks can't go done when there is any subtask
+still open. Unless they have a property of =NOBLOCKING: t=
+#+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
+(setq org-enforce-todo-checkbox-dependencies t)
+(setq org-enforce-todo-dependencies t)
 #+END_SRC
-** emms
-EMMS is the Emacs Multimedia System.
-#+BEGIN_SRC emacs-lisp :tangle no
-(require 'emms-source-file)
-(require 'emms-source-playlist)
-(require 'emms-info)
-(require 'emms-cache)
-(require 'emms-playlist-mode)
-(require 'emms-playing-time)
-(require 'emms-player-mpd)
-(require 'emms-playlist-sort)
-(require 'emms-mark)
-(require 'emms-browser)
-(require 'emms-lyrics)
-(require 'emms-last-played)
-(require 'emms-score)
-(require 'emms-tag-editor)
-(require 'emms-history)
-(require 'emms-i18n)
 
-(setq emms-playlist-default-major-mode 'emms-playlist-mode)
-(add-to-list 'emms-track-initialize-functions 'emms-info-initialize-track)
-(emms-playing-time 1)
-(emms-lyrics 1)
-(add-hook 'emms-player-started-hook 'emms-last-played-update-current)
-;(add-hook 'emms-player-started-hook 'emms-player-mpd-sync-from-emms)
-(emms-score 1)
-(when (fboundp 'emms-cache) ; work around compiler warning
-  (emms-cache 1))
-(setq emms-score-default-score 3)
+#+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
+(setq org-fast-tag-selection-single-key (quote expert))
+(setq org-footnote-auto-adjust t)
+(setq org-hide-block-startup t)
+(setq org-icalendar-alarm-time 15)
+(setq org-icalendar-combined-description "Ganneffs Org-mode calendar entries")
+(setq org-icalendar-combined-name "\"Ganneffs OrgMode\"")
+(setq org-icalendar-honor-noexport-tag t)
+(setq org-icalendar-include-bbdb-anniversaries nil)
+(setq org-icalendar-include-body 200)
+(setq org-icalendar-include-todo nil)
+(setq org-icalendar-store-UID t)
+(setq org-icalendar-timezone "Europe/Berlin")
+(setq org-insert-mode-line-in-empty-file t)
+(setq org-log-done (quote note))
+(setq org-log-into-drawer t)
+(setq org-log-state-notes-insert-after-drawers nil)
+(setq org-log-reschedule (quote time))
+(setq org-log-states-order-reversed t)
+(setq org-mobile-agendas (quote all))
+(setq org-mobile-directory "/scpx:joerg@garibaldi.ganneff.de:/srv/www2.ganneff.de/htdocs/org/")
+(setq org-mobile-inbox-for-pull "~/org/refile.org")
+(setq org-remember-store-without-prompt t)
+(setq org-return-follows-link t)
+(setq org-reverse-note-order t)
 
-(defun emms-mpd-init ()
-  "Connect Emms to mpd."
-  (interactive)
-  (emms-player-mpd-connect))
+; regularly save our org-mode buffers
+(run-at-time "00:59" 3600 'org-save-all-org-buffers)
 
-;; players
-(require 'emms-player-mpd)
-(setq emms-player-mpd-server-name "localhost")
-(setq emms-player-mpd-server-port "6600")
-(add-to-list 'emms-info-functions 'emms-info-mpd)
-(add-to-list 'emms-player-list 'emms-player-mpd)
-(setq emms-volume-change-function 'emms-volume-mpd-change)
-(setq emms-player-mpd-sync-playlist t)
+(setq org-log-done t)
 
-(setq emms-source-file-default-directory "/var/lib/mpd/music")
-(setq emms-player-mpd-music-directory "/var/lib/mpd/music")
-(setq emms-info-auto-update t)
-(setq emms-lyrics-scroll-p t)
-(setq emms-lyrics-display-on-minibuffer t)
-(setq emms-lyrics-display-on-modeline nil)
-(setq emms-lyrics-dir "~/.emacs.d/var/lyrics")
+(setq org-enable-priority-commands t)
+(setq org-default-priority ?E)
+(setq org-lowest-priority ?E)
 
-(setq emms-last-played-format-alist
-      '(((emms-last-played-seconds-today) . "%H:%M")
-        (604800                           . "%a %H:%M") ; this week
-        ((emms-last-played-seconds-month) . "%d.%m.%Y")
-        ((emms-last-played-seconds-year)  . "%d.%m.%Y")
-        (t                                . "Never played")))
 
-;; Playlist format
-(defun my-describe (track)
-  (let* ((empty "...")
-         (name (emms-track-name track))
-         (type (emms-track-type track))
-         (short-name (file-name-nondirectory name))
-         (play-count (or (emms-track-get track 'play-count) 0))
-         (last-played (or (emms-track-get track 'last-played) '(0 0 0)))
-         (artist (or (emms-track-get track 'info-artist) empty))
-         (year (emms-track-get track 'info-year))
-         (playing-time (or (emms-track-get track 'info-playing-time) 0))
-         (min (/ playing-time 60))
-         (sec (% playing-time 60))
-         (album (or (emms-track-get track 'info-album) empty))
-         (tracknumber (emms-track-get track 'info-tracknumber))
-         (short-name (file-name-sans-extension
-                      (file-name-nondirectory name)))
-         (title (or (emms-track-get track 'info-title) short-name))
-         (rating (emms-score-get-score name))
-         (rate-char ?☭)
-         )
-    (format "%12s %20s (%.4s) [%-20s] - %2s. %-30s | %2d %s"
-            (emms-last-played-format-date last-played)
-            artist
-            year
-            album
-            (if (and tracknumber ; tracknumber
-                     (not (zerop (string-to-number tracknumber))))
-                (format "%02d" (string-to-number tracknumber))
-              "")
-            title
-            play-count
-            (make-string rating rate-char)))
-)
+#+END_SRC
 
-(setq emms-track-description-function 'my-describe)
+Speed commands enable single-letter commands in Org-mode files when
+the point is at the beginning of a headline, or at the beginning of a
+code block.
 
-;; (global-set-key (kbd "C-<f9> t") 'emms-play-directory-tree)
-;; (global-set-key (kbd "H-<f9> e") 'emms-play-file)
-(global-set-key (kbd "H-<f9> <f9>") 'emms-mpd-init)
-(global-set-key (kbd "H-<f9> d") 'emms-play-dired)
-(global-set-key (kbd "H-<f9> x") 'emms-start)
-(global-set-key (kbd "H-<f9> v") 'emms-stop)
-(global-set-key (kbd "H-<f9> n") 'emms-next)
-(global-set-key (kbd "H-<f9> p") 'emms-previous)
-(global-set-key (kbd "H-<f9> o") 'emms-show)
-(global-set-key (kbd "H-<f9> h") 'emms-shuffle)
-(global-set-key (kbd "H-<f9> SPC") 'emms-pause)
-(global-set-key (kbd "H-<f9> a") 'emms-add-directory-tree)
-(global-set-key (kbd "H-<f9> b") 'emms-smart-browse)
-(global-set-key (kbd "H-<f9> l") 'emms-playlist-mode-go)
+See the `=org-speed-commands-default=' variable for a list of the keys
+and commands enabled at the beginning of headlines.  All code blocks
+are available at the beginning of a code block, the following key
+sequence =C-c C-v h= (bound to `=org-babel-describe-bindings=') will
+display a list of the code blocks commands and their related keys.
 
-(global-set-key (kbd "H-<f9> r") 'emms-toggle-repeat-track)
-(global-set-key (kbd "H-<f9> R") 'emms-toggle-repeat-playlist)
-(global-set-key (kbd "H-<f9> m") 'emms-lyrics-toggle-display-on-minibuffer)
-(global-set-key (kbd "H-<f9> M") 'emms-lyrics-toggle-display-on-modeline)
+#+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
+(setq org-use-speed-commands nil)
+(setq org-speed-commands-user (quote (("0" . ignore)
+                                      ("1" . ignore)
+                                      ("2" . ignore)
+                                      ("3" . ignore)
+                                      ("4" . ignore)
+                                      ("5" . ignore)
+                                      ("6" . ignore)
+                                      ("7" . ignore)
+                                      ("8" . ignore)
+                                      ("9" . ignore)
 
-(global-set-key (kbd "H-<f9> <left>") (lambda () (interactive) (emms-seek -10)))
-(global-set-key (kbd "H-<f9> <right>") (lambda () (interactive) (emms-seek +10)))
-(global-set-key (kbd "H-<f9> <down>") (lambda () (interactive) (emms-seek -60)))
-(global-set-key (kbd "H-<f9> <up>") (lambda () (interactive) (emms-seek +60)))
+                                      ("a" . ignore)
+                                      ("d" . ignore)
+                                      ("h" . bh/hide-other)
+                                      ("i" progn
+                                       (forward-char 1)
+                                       (call-interactively 'org-insert-heading-respect-content))
+                                      ("k" . org-kill-note-or-show-branches)
+                                      ("l" . ignore)
+                                      ("m" . ignore)
+                                      ("q" . bh/show-org-agenda)
+                                      ("r" . ignore)
+                                      ("s" . org-save-all-org-buffers)
+                                      ("w" . org-refile)
+                                      ("x" . ignore)
+                                      ("y" . ignore)
+                                      ("z" . org-add-note)
+
+                                      ("A" . ignore)
+                                      ("B" . ignore)
+                                      ("E" . ignore)
+                                      ("F" . bh/restrict-to-file-or-follow)
+                                      ("G" . ignore)
+                                      ("H" . ignore)
+                                      ("J" . org-clock-goto)
+                                      ("K" . ignore)
+                                      ("L" . ignore)
+                                      ("M" . ignore)
+                                      ("N" . bh/narrow-to-org-subtree)
+                                      ("P" . bh/narrow-to-org-project)
+                                      ("Q" . ignore)
+                                      ("R" . ignore)
+                                      ("S" . ignore)
+                                      ("T" . bh/org-todo)
+                                      ("U" . bh/narrow-up-one-org-level)
+                                      ("V" . ignore)
+                                      ("W" . bh/widen)
+                                      ("X" . ignore)
+                                      ("Y" . ignore)
+                                      ("Z" . ignore))))
+
+(add-hook 'org-agenda-mode-hook
+          (lambda ()
+            (define-key org-agenda-mode-map "q" 'bury-buffer))
+          'append)
+
+(defvar bh/current-view-project nil)
+(add-hook 'org-agenda-mode-hook
+          '(lambda () (org-defkey org-agenda-mode-map "V" 'bh/view-next-project))
+          'append)
+#+END_SRC
+
+
+The following displays the contents of code blocks in Org-mode files
+using the major-mode of the code.  It also changes the behavior of
+=TAB= to as if it were used in the appropriate major mode.  This means
+that reading and editing code form inside of your Org-mode files is
+much more like reading and editing of code using its major mode.
 
-(global-set-key (kbd "H-<f9> s u") 'emms-score-up-playing)
-(global-set-key (kbd "H-<f9> s d") 'emms-score-down-playing)
-(global-set-key (kbd "H-<f9> s o") 'emms-score-show-playing)
-(global-set-key (kbd "H-<f9> s s") 'emms-score-set-playing)
+#+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
+(setq org-src-fontify-natively t)
+(setq org-src-tab-acts-natively t)
+#+END_SRC
 
-(define-key emms-playlist-mode-map "u" 'emms-score-up-playing)
-(define-key emms-playlist-mode-map "d" 'emms-score-down-playing)
-(define-key emms-playlist-mode-map "o" 'emms-score-show-playing)
-(define-key emms-playlist-mode-map "s" 'emms-score-set-playing)
-(define-key emms-playlist-mode-map "r" 'emms-mpd-init)
-(define-key emms-playlist-mode-map "N"  'emms-playlist-new)
+#+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
+(setq org-src-preserve-indentation nil)
+(setq org-edit-src-content-indentation 0)
+#+END_SRC
 
-(define-key emms-playlist-mode-map "x" 'emms-start)
-(define-key emms-playlist-mode-map "v" 'emms-stop)
-(define-key emms-playlist-mode-map "n" 'emms-next)
-(define-key emms-playlist-mode-map "p" 'emms-previous)
 
-(setq emms-playlist-buffer-name "*EMMS Playlist*"
-      emms-playlist-mode-open-playlists t)
+#+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
+(setq org-attach-directory "~/org/data/")
+#+END_SRC
+#+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
+(setq org-agenda-sticky t)
+#+END_SRC
 
-;; Faces
-(if (window-system)
-    ((lambda ()
-       (set-face-attribute
-        'emms-browser-artist-face nil
-        :family "Arno Pro")
-       )
-))
+**** Checklist handling
+[2013-05-11 Sat 22:15]
 
-(setq emms-player-mpd-supported-regexp
-      (or (emms-player-mpd-get-supported-regexp)
-          (concat "\\`http://\\|"
-                  (emms-player-simple-regexp
-                   "m3u" "ogg" "flac" "mp3" "wav" "mod" "au" "aiff"))))
-(emms-player-set emms-player-mpd 'regex emms-player-mpd-supported-regexp)
-      
+#+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
+(require 'org-checklist)
 #+END_SRC
-** yafolding
-Yet another folding extension for the Emacs editor. Unlike many
-others, this one works by just using the existing indentation of the
-file, so basically works in every halfway structured file.
+
+** perl / cperl
+I like /cperl-mode/ a bit more than the default /perl-mode/, so set it
+up here to be used.
 #+BEGIN_SRC emacs-lisp :tangle yes
-(define-key global-map (kbd "C-#") 'yafolding)
-;;(define-key global-map (kbd "C-c C-f") 'yafolding-toggle-all)
-(define-key global-map (kbd "C-c C-f") 'yafolding-toggle-all-by-current-level)
+(use-package cperl-mode
+  :commands cperl-mode
+  :idle
+  (progn
+    (defalias 'perl-mode 'cperl-mode)
+    (add-auto-mode 'cperl-mode "\\.\\([pP][Llm]\\|al\\)\\'")
+    (add-auto-mode 'pod-mode   "\\.pod$")
+    (add-auto-mode 'tt-mode    "\\.tt$")
+    (add-to-list 'interpreter-mode-alist '("perl" . cperl-mode))
+    (add-to-list 'interpreter-mode-alist '("perl5" . cperl-mode))
+    (add-to-list 'interpreter-mode-alist '("miniperl" . cperl-mode))
+    )
+  :config
+  (progn
+    (setq cperl-invalid-face nil
+          cperl-close-paren-offset -4
+          cperl-continued-statement-offset 0
+          cperl-indent-level 4
+          cperl-indent-parens-as-block t
+          cperl-hairy t
+          cperl-electric-keywords t
+          cperl-electric-lbrace-space t
+          cperl-electric-parens nil
+          cperl-highlight-variables-indiscriminately t
+          cperl-imenu-addback t
+          cperl-invalid-face (quote underline)
+          cperl-lazy-help-time 5
+          cperl-scan-files-regexp "\\.\\([pP][Llm]\\|xs\\|cgi\\)$"
+          cperl-syntaxify-by-font-lock t
+          cperl-use-syntax-table-text-property-for-tags t)
+
+    ;; And have cperl mode give ElDoc a useful string
+    (defun my-cperl-eldoc-documentation-function ()
+      "Return meaningful doc string for `eldoc-mode'."
+      (car
+       (let ((cperl-message-on-help-error nil))
+         (cperl-get-help))))
+    (add-hook 'cperl-mode-hook
+              (lambda ()
+                (set (make-local-variable 'eldoc-documentation-function)
+                     'my-cperl-eldoc-documentation-function)
+                (eldoc-mode))))
+  )
 #+END_SRC
-** icomplete
-Incremental mini-buffer completion preview: Type in the minibuffer,
-list of matching commands is echoed
-#+BEGIN_SRC emacs-lisp :tangle yes
-(icomplete-mode 99)
+** puppet
+[2014-05-22 Thu 00:05]
+#+BEGIN_SRC emacs-lisp :tangle yes
+(use-package puppet-mode
+  :mode ("\\.pp\\'" . puppet-mode)
+  :commands puppet-mode
+  :idle
+  (progn
+    (defun my-puppet-mode-hook ()
+      (setq require-final-newline nil))
+    (add-hook 'puppet-mode-hook 'my-puppet-mode-hook))
+  :config
+  (progn
+    (use-package puppet-ext
+      :init
+      (progn
+        (bind-key "C-x ?" 'puppet-set-anchor puppet-mode-map)
+        (bind-key "C-c C-r" 'puppet-create-require puppet-mode-map)))))
 #+END_SRC
 
 ** python
 Use elpy for the emacs python fun, but dont let it initialize all the
 various variables. Elpy author may like them, but I'm not him...
 #+BEGIN_SRC emacs-lisp :tangle yes
-(safe-load (concat jj-elisp-dir "/elpy/elpy-autoloads.el"))
-(defalias 'elpy-initialize-variables 'jj-init-elpy)
-(defun jj-init-elpy ()
-  "Initialize elpy in a way i like"
-  ;; Local variables in `python-mode'. This is not removed when Elpy
-  ;; is disabled, which can cause some confusion.
-  (add-hook 'python-mode-hook 'elpy-initialize-local-variables)
-
-  ;; `flymake-no-changes-timeout': The original value of 0.5 is too
-  ;; short for Python code, as that will result in the current line to
-  ;; be highlighted most of the time, and that's annoying. This value
-  ;; might be on the long side, but at least it does not, in general,
-  ;; interfere with normal interaction.
-  (setq flymake-no-changes-timeout 60)
-
-  ;; `flymake-start-syntax-check-on-newline': This should be nil for
-  ;; Python, as;; most lines with a colon at the end will mean the next
-  ;; line is always highlighted as error, which is not helpful and
-  ;; mostly annoying.
-  (setq flymake-start-syntax-check-on-newline nil)
-
-  ;; `ac-auto-show-menu': Short timeout because the menu is great.
-  (setq ac-auto-show-menu 0.4)
-
-  ;; `ac-quick-help-delay': I'd like to show the menu right with the
-  ;; completions, but this value should be greater than
-  ;; `ac-auto-show-menu' to show help for the first entry as well.
-  (setq ac-quick-help-delay 0.5)
-
-  ;; `yas-trigger-key': TAB, as is the default, conflicts with the
-  ;; autocompletion. We also need to tell yasnippet about the new
-  ;; binding. This is a bad interface to set the trigger key. Stop
-  ;; doing this.
-  (let ((old (when (boundp 'yas-trigger-key)
-               yas-trigger-key)))
-    (setq yas-trigger-key "C-c C-i")
-    (when (fboundp 'yas--trigger-key-reload)
-      (yas--trigger-key-reload old)))
-  
-  ;; yas-snippet-dirs can be a string for a single directory. Make
-  ;; sure it's a list in that case so we can add our own entry.
-  (when (not (listp yas-snippet-dirs))
-    (setq yas-snippet-dirs (list yas-snippet-dirs)))
-  (add-to-list 'yas-snippet-dirs
-               (concat (file-name-directory (locate-library "elpy"))
-                       "snippets/")
-               t)
-
-  ;; Now load yasnippets.
-  (yas-reload-all))
-(elpy-enable)
-(elpy-use-ipython)
+(use-package elpy
+  :defer t
+  :mode ("\.py" . python-mode)
+  :init
+  (progn
+    (safe-load (concat jj-elisp-dir "/elpy/elpy-autoloads.el"))
+    )
+  :config
+  (progn
+
+    (use-package nose
+      :ensure nose
+      :commands (nosetests-all nosetests-module nosetests-one
+                               nosetests-failed nosetests-pdb-all
+                               nosetests-pdb-module nosetests-pdb-one)
+      )
+
+    (use-package pyvenv
+      :ensure pyvenv
+      :commands (pyvenv-activate pyvenv-deactivate pyvenv-mode pyvenv-restart-python)
+      )
+
+    (use-package idomenu
+      :ensure idomenu
+      :commands (idomenu)
+      :defer t)
+
+    (use-package highlight-indentation
+      :ensure t
+      :commands (highlight-indentation-mode))
+
+    (use-package find-file-in-project
+      :ensure t
+      :commands (find-file-in-project ffip-project-files ffip ))
+
+    (use-package fuzzy
+      :ensure t)
+
+    ;; Local variables in `python-mode'. This is not removed when Elpy
+    ;; is disabled, which can cause some confusion.
+    (add-hook 'python-mode-hook 'elpy-initialize-local-variables)
+
+    (defun my-python-mode-hook ()
+      (setq require-final-newline nil)
+      (setq mode-require-final-newline))
+    (add-hook 'python-mode-hook 'my-python-mode-hook)
+
+    ;; Flymake support using flake8, including warning faces.
+    (when (and (executable-find "flake8")
+               (not (executable-find python-check-command)))
+      (setq python-check-command "flake8"))
+
+    ;; `flymake-no-changes-timeout': The original value of 0.5 is too
+    ;; short for Python code, as that will result in the current line to
+    ;; be highlighted most of the time, and that's annoying. This value
+    ;; might be on the long side, but at least it does not, in general,
+    ;; interfere with normal interaction.
+    (setq flymake-no-changes-timeout 60)
+
+    ;; `flymake-start-syntax-check-on-newline': This should be nil for
+    ;; Python, as;; most lines with a colon at the end will mean the next
+    ;; line is always highlighted as error, which is not helpful and
+    ;; mostly annoying.
+    (setq flymake-start-syntax-check-on-newline nil)
+
+    ;; `ac-auto-show-menu': Short timeout because the menu is great.
+    (setq ac-auto-show-menu 0.4)
+
+    ;; `ac-quick-help-delay': I'd like to show the menu right with the
+    ;; completions, but this value should be greater than
+    ;; `ac-auto-show-menu' to show help for the first entry as well.
+    (setq ac-quick-help-delay 0.5)
+
+    ;; `yas-trigger-key': TAB, as is the default, conflicts with the
+    ;; autocompletion. We also need to tell yasnippet about the new
+    ;; binding. This is a bad interface to set the trigger key. Stop
+    ;; doing this.
+    (let ((old (when (boundp 'yas-trigger-key)
+                 yas-trigger-key)))
+      (setq yas-trigger-key "C-c C-i")
+      (when (fboundp 'yas--trigger-key-reload)
+        (yas--trigger-key-reload old)))
+
+    ;; yas-snippet-dirs can be a string for a single directory. Make
+    ;; sure it's a list in that case so we can add our own entry.
+    (when (not (listp yas-snippet-dirs))
+      (setq yas-snippet-dirs (list yas-snippet-dirs)))
+    (add-to-list 'yas-snippet-dirs
+                 (concat (file-name-directory (locate-library "elpy"))
+                         "snippets/")
+                 t)
+
+    ;; Now load yasnippets.
+    (yas-reload-all)
+    (elpy-enable t)
+    (elpy-use-ipython)))
+
 #+END_SRC
 
 Below is old setup
@@ -3068,7 +4048,532 @@ the preferred method python evaluation.
 (setq python-shell-completion-string-code
    "';'.join(get_ipython().Completer.all_completions('''%s'''))\n")
 #+END_SRC
+** rainbow-delimiters
+[2013-04-09 Di 23:38]
+[[http://www.emacswiki.org/emacs/RainbowDelimiters][EmacsWiki: Rainbow Delimiters]] is a “rainbow parentheses”-like mode
+which highlights parens, brackets, and braces according to their
+depth. Each successive level is highlighted a different color. This
+makes it easy to spot matching delimiters, orient yourself in the code,
+and tell which statements are at the same depth.
+#+BEGIN_SRC emacs-lisp :tangle yes
+(use-package rainbow-delimiters
+  :ensure rainbow-delimiters
+  :commands rainbow-delimiters-mode
+  :init
+  (add-hook 'prog-mode-hook #'rainbow-delimiters-mode))
+#+END_SRC
+** rainbow-mode
+#+BEGIN_SRC emacs-lisp :tangle yes
+(use-package rainbow-mode
+  :ensure rainbow-mode
+  :defer t
+  :diminish rainbow-mode)
+#+END_SRC
+
+** re-builder
+Saner regex syntax
+#+BEGIN_SRC emacs-lisp :tangle yes
+(use-package re-builder
+  :commands re-builder
+  :defer t
+  :config
+  (setq reb-re-syntax 'string))
+#+END_SRC
+** recentf
+[2014-05-19 Mo 22:56]
+Recentf is a minor mode that builds a list of recently opened
+files. This list is is automatically saved across Emacs sessions.
+#+BEGIN_SRC emacs-lisp :tangle yes
+(use-package recentf
+  :if (not noninteractive)
+  :bind ("C-x C-r" . recentf-open-files)
+  :init
+  (progn
+    (recentf-mode 1)
+    (setq recentf-max-menu-items 25)
+    (setq recentf-save-file (expand-file-name ".recentf" jj-cache-dir))
+
+    (defun recentf-add-dired-directory ()
+      (if (and dired-directory
+               (file-directory-p dired-directory)
+               (not (string= "/" dired-directory)))
+          (let ((last-idx (1- (length dired-directory))))
+            (recentf-add-file
+             (if (= ?/ (aref dired-directory last-idx))
+                 (substring dired-directory 0 last-idx)
+               dired-directory)))))
+
+    (add-hook 'dired-mode-hook 'recentf-add-dired-directory)))
+#+END_SRC
+** Region bindings mode
+[2013-05-01 Wed 22:51]
+This mode allows to have keybindings that are only alive when the
+region is active. Helpful for things that only do any useful action
+then, like for example the [[*multiple%20cursors][multiple cursors]] mode I load later.
+#+BEGIN_SRC emacs-lisp :tangle yes
+(use-package region-bindings-mode
+  :ensure region-bindings-mode
+  :init
+  (region-bindings-mode-enable))
+#+END_SRC
+** ruby
+[2013-05-22 Wed 22:33]
+Programming in ruby...
+
+*** Auto-modes
+#+BEGIN_SRC emacs-lisp :tangle yes
+(add-auto-mode 'ruby-mode
+               "Rakefile\\'" "\\.rake\\'" "\.rxml\\'"
+               "\\.rjs\\'" ".irbrc\\'" "\.builder\\'" "\\.ru\\'"
+               "\\.gemspec\\'" "Gemfile\\'" "Kirkfile\\'")
+#+END_SRC
+
+*** Config
+#+BEGIN_SRC emacs-lisp :tangle yes
+(use-package ruby-mode
+  :mode ("\\.rb\\'" . ruby-mode)
+  :interpreter ("ruby" . ruby-mode)
+  :defer t
+  :config
+  (progn
+    (use-package yari
+      :init
+      (progn
+        (defvar yari-helm-source-ri-pages
+          '((name . "RI documentation")
+            (candidates . (lambda () (yari-ruby-obarray)))
+            (action  ("Show with Yari" . yari))
+            (candidate-number-limit . 300)
+            (requires-pattern . 2)
+            "Source for completing RI documentation."))
+
+        (defun helm-yari (&optional rehash)
+          (interactive (list current-prefix-arg))
+          (when current-prefix-arg (yari-ruby-obarray rehash))
+          (helm 'yari-helm-source-ri-pages (yari-symbol-at-point)))))
+
+    (defun my-ruby-smart-return ()
+      (interactive)
+      (when (memq (char-after) '(?\| ?\" ?\'))
+        (forward-char))
+      (call-interactively 'newline-and-indent))
+
+    (use-package ruby-hash-syntax
+      :ensure ruby-hash-syntax)
+
+    (use-package inf-ruby
+      :ensure inf-ruby
+      :commands inf-ruby-minor-mode
+      :init
+      (progn
+        (add-hook 'ruby-mode-hook 'inf-ruby-minor-mode)
+        (bind-key "<return>" 'my-ruby-smart-return ruby-mode-map)
+        ;(bind-key "<tab>" 'indent-for-tab-command ruby-mode-map)
+
+
+        (set (make-local-variable 'yas-fallback-behavior)
+             '(apply ruby-indent-command . nil))
+        (bind-key "<tab>" 'yas-expand-from-trigger-key ruby-mode-map)))
+
+    ;; Stupidly the non-bundled ruby-mode isn't a derived mode of
+    ;; prog-mode: we run the latter's hooks anyway in that case.
+    (add-hook 'ruby-mode-hook
+              (lambda ()
+                (unless (derived-mode-p 'prog-mode)
+                  (run-hooks 'prog-mode-hook))))
+  ))
+#+END_SRC
+** sessions                                                          :FIXME:
+[2013-05-22 Wed 22:40]
+Save and restore the desktop
+#+BEGIN_SRC emacs-lisp :tangle yes
+(setq desktop-path (list jj-cache-dir))
+(desktop-save-mode 1)
+(defadvice desktop-read (around trace-desktop-errors activate)
+  (let ((debug-on-error t))
+    ad-do-it))
+
+;;----------------------------------------------------------------------------
+;; Restore histories and registers after saving
+;;----------------------------------------------------------------------------
+(use-package session
+  :if (not noninteractive)
+  :load-path "site-lisp/session/lisp/"
+  :init
+  (progn
+    (setq session-save-file (expand-file-name "session" jj-cache-dir))
+    (setq desktop-globals-to-save
+          (append '((extended-command-history . 30)
+                    (file-name-history        . 100)
+                    (grep-history             . 30)
+                    (compile-history          . 30)
+                    (minibuffer-history       . 50)
+                    (query-replace-history    . 60)
+                    (read-expression-history  . 60)
+                    (regexp-history           . 60)
+                    (regexp-search-ring       . 20)
+                    (search-ring              . 20)
+                    (comint-input-ring        . 50)
+                    (shell-command-history    . 50)
+                    kill-ring
+                    desktop-missing-file-warning
+                    tags-file-name
+                    register-alist)))
+
+    (session-initialize)
+
+    (defun remove-session-use-package-from-settings ()
+      (when (string= (file-name-nondirectory (buffer-file-name)) "settings.el")
+        (save-excursion
+          (goto-char (point-min))
+          (when (re-search-forward "^ '(session-use-package " nil t)
+            (delete-region (line-beginning-position)
+                           (1+ (line-end-position)))))))
+
+    (add-hook 'before-save-hook 'remove-session-use-package-from-settings)
+
+    ;; expanded folded secitons as required
+    (defun le::maybe-reveal ()
+      (when (and (or (memq major-mode  '(org-mode outline-mode))
+                     (and (boundp 'outline-minor-mode)
+                          outline-minor-mode))
+                 (outline-invisible-p))
+        (if (eq major-mode 'org-mode)
+            (org-reveal)
+          (show-subtree))))
+
+    (add-hook 'session-after-jump-to-last-change-hook
+              'le::maybe-reveal)
+
+    (defun save-information ()
+      (with-temp-message "Saving Emacs information..."
+        (recentf-cleanup)
+
+        (loop for func in kill-emacs-hook
+              unless (memq func '(exit-gnus-on-exit server-force-stop))
+              do (funcall func))
+
+        (unless (or noninteractive
+                    (eq 'listen (process-status server-process)))
+          (server-start))))
+
+    (run-with-idle-timer 300 t 'save-information)
+
+    (if window-system
+        (add-hook 'after-init-hook 'session-initialize t))))
+
+#+END_SRC
+*** savehist
+[2013-04-21 So 20:25]
+Save a bit of history
+#+BEGIN_SRC emacs-lisp tangle no
+(require 'savehist)
+(setq savehist-additional-variables
+ '(search ring regexp-search-ring kill-ring compile-history))
+ ;; save every minute
+(setq savehist-autosave-interval 60)
+(setq savehist-file (expand-file-name "savehist" jj-cache-dir))
+(savehist-mode +1)
+#+END_SRC
+
+*** saveplace
+Store at which point I have been in files.
+#+BEGIN_SRC emacs-lisp :tangle yes
+(setq-default save-place t)
+(require 'saveplace)
+(setq save-place-file (expand-file-name "saved-places" jj-cache-dir))
+#+END_SRC
+** simple-httpd
+[2014-06-10 Tue 22:05]
+#+BEGIN_SRC emacs-lisp :tangle yes
+(use-package simple-httpd
+  :ensure simple-httpd
+  :commands (httpd-start httpd-stop)
+  :config
+  (progn
+    (setq httpd-root "/srv/www")
+    )
+)
+#+END_SRC
+** sh
+Settings for shell scripts
+#+BEGIN_SRC emacs-lisp :tangle yes
+(use-package sh-script
+  :defer t
+  :config
+  (progn
+    (defvar sh-script-initialized nil)
+    (defun initialize-sh-script ()
+      (unless sh-script-initialized
+        (setq sh-script-initialized t)
+        (setq sh-indent-comment t)
+        (info-lookup-add-help :mode 'shell-script-mode
+                              :regexp ".*"
+                              :doc-spec
+                              '(("(bash)Index")))))
+
+    (add-hook 'shell-mode-hook 'initialize-sh-script)))
+#+END_SRC
+** sh-toggle
+#+BEGIN_SRC emacs-lisp :tangle yes
+(use-package sh-toggle
+  :bind ("C-. C-z" . shell-toggle))
+#+END_SRC
+** smartscan
+[2015-02-24 Tue 23:35]
+Make =M-n= and =M-p= go forward/backword to the symbol at point.
+#+BEGIN_SRC emacs-lisp :tangle yes
+(use-package smartscan
+  :ensure smartscan
+  :defer t
+  :idle (global-smartscan-mode t))
+#+END_SRC
+** timestamp
+By default, Emacs can update the time stamp for the following two
+formats if one exists in the first 8 lines of the file.
+- Time-stamp: <>
+- Time-stamp: " "
+#+BEGIN_SRC emacs-lisp :tangle yes
+(use-package time-stamp
+  :commands time-stamp
+  :idle
+  (progn
+    (add-hook 'write-file-hooks 'time-stamp)
+    (setq time-stamp-active t))
+  :config
+  (progn
+    (setq time-stamp-format "%02H:%02M:%02S (%z) - %02d.%02m.%:y from %u (%U) on %s")
+    (setq time-stamp-old-format-warn nil)
+    (setq time-stamp-time-zone nil)))
+#+END_SRC
+
+** tiny-tools
+We configure only a bit of the tiny-tools to load when I should need
+them. I don't need much actually, but these things are nice to have.
+
+#+BEGIN_SRC emacs-lisp :tangle yes
+(autoload 'turn-on-tinyperl-mode "tinyperl" "" t)
+(add-hook 'perl-mode-hook  'turn-on-tinyperl-mode)
+(add-hook 'cperl-mode-hook 'turn-on-tinyperl-mode)
+
+(autoload 'tinycomment-indent-for-comment      "tinycomment" "" t)
+(autoload 'tinyeat-forward-preserve            "tinyeat" "" t)
+(autoload 'tinyeat-backward-preserve           "tinyeat" "" t)
+(autoload 'tinyeat-kill-line-backward          "tinyeat" "" t)
+#+END_SRC
+*** Keyboard changes for tiny-tools
+#+BEGIN_SRC emacs-lisp :tangle yes
+(bind-key "\M-;"          'tinycomment-indent-for-comment)
+(bind-key "ESC C-k"       'tinyeat-kill-line-backward)
+(bind-key "ESC d"         'tinyeat-forward-preserve)
+(bind-key "<M-backspace>" 'tinyeat-backward-preserve)
+(bind-key "<S-backspace>" 'tinyeat-delete-whole-word)
+#+END_SRC
+** tramp
+Transparent Remote (file) Access, Multiple Protocol, remote file editing.
+#+BEGIN_SRC emacs-lisp :tangle yes
+(use-package tramp
+  :defer t
+  :config
+  (progn
+    (setq tramp-persistency-file-name (expand-file-name "tramp" jj-cache-dir))
+    (setq shell-prompt-pattern "^[^a-zA-Z].*[#$%>] *")
+    (add-to-list 'tramp-default-method-alist '("\\`localhost\\'" "\\`root\\'" "su"))
+    (setq tramp-debug-buffer nil)
+    (setq tramp-default-method "sshx")
+    (tramp-set-completion-function "ssh"
+                                   '((tramp-parse-sconfig "/etc/ssh_config")
+                                     (tramp-parse-sconfig "~/.ssh/config")))
+    (setq tramp-verbose 5)
+    ))
+#+END_SRC
+
+** transient mark
+For some reason I prefer this mode more than the way without. I want to
+see the marked region.
+#+BEGIN_SRC emacs-lisp :tangle yes
+(transient-mark-mode 1)
+(make-variable-buffer-local 'transient-mark-mode)
+(put 'transient-mark-mode 'permanent-local t)
+(setq-default transient-mark-mode t)
+#+END_SRC
+** undo-tree
+[2013-04-21 So 11:07]
+Emacs undo is pretty powerful - but can also be confusing. There are
+tons of modes available to change it, even downgrade it to the very
+crappy ways one usually knows from other systems which lose
+information. undo-tree is different - it helps keeping you sane while
+keeping the full power of emacs undo/redo.
+#+BEGIN_SRC emacs-lisp :tangle yes
+(use-package undo-tree
+  :ensure undo-tree
+  :diminish undo-tree-mode
+  :init
+  (progn
+    (global-undo-tree-mode)
+    (setq undo-tree-visualizer-timestamps t)
+    (setq undo-tree-visualizer-diff t)
+    ;; Keep region when undoing in region
+    (defadvice undo-tree-undo (around keep-region activate)
+      (if (use-region-p)
+          (let ((m (set-marker (make-marker) (mark)))
+                (p (set-marker (make-marker) (point))))
+            ad-do-it
+            (goto-char p)
+            (set-mark m)
+            (set-marker p nil)
+            (set-marker m nil))
+        ad-do-it))))
+#+END_SRC
+** uniquify
+Always have unique buffernames. See [[http://www.gnu.org/software/emacs/manual/html_node/emacs/Uniquify.html][Uniquify - GNU Emacs Manual]]
+#+BEGIN_SRC emacs-lisp :tangle yes
+(use-package uniquify
+  :init
+  (progn
+    (setq uniquify-buffer-name-style 'post-forward)
+    (setq uniquify-after-kill-buffer-p t)
+    (setq uniquify-ignore-buffers-re "^\\*")))
+#+END_SRC
+
+** url
+url contains code to parse and handle URLs - who would have thought? I
+set it to send Accept-language header and tell it to not send email,
+operating system or location info.
+#+BEGIN_SRC emacs-lisp :tangle yes
+(setq url-mime-language-string "de,en")
+(setq url-privacy-level (quote (email os lastloc)))
+#+END_SRC
+** visual-regexp
+[2014-06-01 Sun 21:38]
+visual-regexp for Emacs is like replace-regexp, but with live visual
+feedback directly in the buffer
+#+BEGIN_SRC emacs-lisp :tangle yes
+(use-package visual-regexp
+  :ensure visual-regexp
+  :bind (("C-M-%" . vr/replace)
+         ("M-%" . vr/query-replace)
+         ("C-c m" . vr/mc-mark))
+  :defer t)
+#+END_SRC
+** volatile highlights
+[2013-04-21 So 20:31]
+VolatileHighlights highlights changes to the buffer caused by commands
+such as ‘undo’, ‘yank’/’yank-pop’, etc. The highlight disappears at the
+next command. The highlighting gives useful visual feedback for what
+your operation actually changed in the buffer.
+#+BEGIN_SRC emacs-lisp :tangle yes
+(use-package volatile-highlights
+  :ensure volatile-highlights
+  :idle
+  (volatile-highlights-mode t)
+  :diminish volatile-highlights-mode)
+#+END_SRC
+** winner mode - undo and redo window configuration
+[2015-02-24 Tue 23:11]
+=winner-mode= lets you use =C-c <left>= and =C-c <right>= to switch between
+window configurations. This is handy when something has popped up a
+buffer that you want to look at briefly before returning to whatever
+you were working on. When you're done, press =C-c <left>=.
+#+BEGIN_SRC emacs-lisp :tangle yes
+(use-package winner
+  :ensure t
+  :defer t
+  :idle (winner-mode 1))
+#+END_SRC
+** writegood
+This highlights some /weaselwords/, a mode to /aid in finding common
+writing problems/...
+[2013-04-27 Sa 23:29]
+#+BEGIN_SRC emacs-lisp :tangle no
+(use-package writegood-mode
+  :ensure writegood-mode
+  :defer t
+  :init
+  (bind-key "C-c g" 'writegood-mode))
+#+END_SRC
+** web-mode
+[2014-06-01 Sun 22:48]
+#+BEGIN_SRC emacs-lisp :tangle yes
+(use-package web-mode
+  :ensure web-mode
+  :defer t
+  :mode (("\\.phtml\\'" . web-mode)
+         ("\\.tpl\\.php\\'" . web-mode)
+         ("\\.jsp\\'" . web-mode)
+         ("\\.as[cp]x\\'" . web-mode)
+         ("\\.erb\\'" . web-mode)
+         ("\\.mustache\\'" . web-mode)
+         ("\\.html\\'" . web-mode)
+         ("\\.css\\'" . web-mode)
+         ("\\.djhtml\\'" . web-mode))
+  :init
+  (progn
+    (add-hook 'web-mode-hook
+              (lambda ()
+                (setq web-mode-markup-indent-offset 2)
+                (setq web-mode-css-indent-offset 2)
+                (setq web-mode-code-indent-offset 2)
+                (setq web-mode-enable-css-colorization t)
+                (setq web-mode-enable-comment-keywords t)
+                (setq web-mode-enable-current-element-highlight t))))
+  :config
+  (progn
+    (setq web-mode-enable-current-element-highlight t)
+    (setq web-mode-ac-sources-alist
+          '(("css" . (ac-source-css-property))
+            ("html" . (ac-source-words-in-buffer ac-source-abbrev))))
+    (use-package impatient-mode
+      :ensure impatient-mode
+      :defer t
+      :commands impatient-mode))
+  )
+
+#+END_SRC
+** yafolding
+Yet another folding extension for the Emacs editor. Unlike many
+others, this one works by just using the existing indentation of the
+file, so basically works in every halfway structured file.
+#+BEGIN_SRC emacs-lisp :tangle yes
+(use-package yafolding
+  :bind (("C-#" . yafolding)
+         ("C-c C-f" . yafolding-toggle-all-by-current-level))
+  :commands (yafolding yafolding-toggle-all-by-current-level)
+  )
+#+END_SRC
+** yaml-mode
+[2013-04-28 So 01:13]
+YAML is a nice format for data, which is both, human and machine
+readable/editable without getting a big headache.
+#+BEGIN_SRC emacs-lisp :tangle yes
+(use-package yaml-mode
+  :ensure yaml-mode
+  :mode ("\\.ya?ml\\'" . yaml-mode)
+  :config
+    (bind-key "C-m" 'newline-and-indent yaml-mode-map ))
+#+END_SRC
 
+** yasnippet
+[2013-04-27 Sa 23:16]
+Yasnippet is a template system. Type an abbreviation, expand it into
+whatever the snippet holds.
+#+BEGIN_SRC emacs-lisp :tangle yes
+(setq yas-snippet-dirs (expand-file-name "yasnippet/snippets" jj-elisp-dir))
+(use-package yasnippet
+  :ensure yasnippet
+  :defer t
+  :diminish yas-minor-mode
+  :commands yas-global-mode
+  :idle
+  (progn
+    ;; Integrate hippie-expand with ya-snippet
+    (add-to-list 'hippie-expand-try-functions-list
+                 'yas-hippie-try-expand)
+    (yas-global-mode 1)
+    (setq yas-expand-only-for-last-commands '(self-insert-command))
+    (bind-key "\t" 'hippie-expand yas-minor-mode-map)
+    ))
+#+END_SRC
 * Thats it
 And thats it for this file, control passes "back" to [[file:../initjj.org][initjj.org/el]]
 which then may load more files.