updates
[emacs.git] / .emacs.d / config / emacs.org
index 4d9392f..61d5706 100644 (file)
@@ -79,63 +79,58 @@ https://github.com/jwiegley/use-package
 *** 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))
-    (package-initialize)
-    (add-to-list 'package-archives '("marmalade"    . "http://marmalade-repo.org/packages/"))
-    (add-to-list 'package-archives '("melpa-stable" . "http://melpa-stable.milkbox.net/packages/"))
-    (add-to-list 'package-archives '("melpa"        . "http://melpa.milkbox.net/packages/"))
-    (add-to-list 'package-archives '("elpy"         . "http://jorgenschaefer.github.io/packages/"))
-    (add-to-list 'package-archives '("gnu"          . "http://elpa.gnu.org/packages/"))
-    )
+(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 no
-(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/"))
+(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
@@ -155,8 +150,10 @@ Usually I want the lines to break at 72 characters.
 #+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
@@ -254,7 +251,7 @@ shell. Consistent look is great.
 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
@@ -271,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 -
@@ -315,12 +311,14 @@ 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)
 
@@ -358,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'.
 
@@ -410,7 +409,7 @@ Shell. zsh in my case.
 
 *** Emacs shell
 Basic settings for emacs integrated shell
-#+BEGIN_SRC emacs-lisp :tangle yes
+#+BEGIN_SRC emacs-lisp :tangle no
 (use-package eshell
   :defer t
   :init
@@ -424,29 +423,29 @@ Basic settings for emacs integrated shell
             (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)
-
-    (setq eshell-cmpl-cycle-completions nil
-          eshell-save-history-on-exit t
-          eshell-cmpl-dir-ignore "\\`\\(\\.\\.?\\|CVS\\|\\.svn\\|\\.git\\)/\\'")
     )
   :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")
-    (add-to-list 'eshell-visual-commands "ssh")
-    (add-to-list 'eshell-visual-commands "tail")
+    (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
@@ -457,7 +456,34 @@ Basic settings for emacs integrated shell
               '(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
@@ -512,30 +538,23 @@ 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
-(unless
-    (use-package mic-paren
-      :init
-      (paren-activate))
-
-  (use-package paren
-    :init
-    (progn
-      (show-paren-mode +1)
-      (setq show-paren-style 'parenthesis)
-      )
-    )
-  )
+(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
+(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
@@ -554,13 +573,11 @@ 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
@@ -568,12 +585,36 @@ Disable /suspend_frame/ function, I dislike it.
 (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
 'kill-whole-line' (see [[id:0a1560d9-7e55-47ab-be52-b3a8b8eea4aa][the kill-whole-line part in "General stuff"]]) is
 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)
@@ -581,14 +622,13 @@ me. Lazyness++.
   (kill-line)
   (back-to-indentation))
 
-(unbind-key "C-z")
 (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")
@@ -648,10 +688,18 @@ AKA transpose lines.
 
 "Pull" lines up, join them
 #+BEGIN_SRC emacs-lisp :tangle yes
-(bind-key "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.
@@ -759,6 +807,36 @@ buffers path.
 #+BEGIN_SRC emacs-lisp :tangle yes
 (bind-key "H-t" 'jj-open-shell)
 #+END_SRC
+
+Align code
+#+BEGIN_SRC emacs-lisp :tangle yes
+(bind-key "H-a" 'align-code)
+#+END_SRC
+
+Insert date
+#+BEGIN_SRC emacs-lisp :tangle yes
+(bind-key "C-c d" 'insert-date)
+#+END_SRC
+
+Another key for indenting
+#+BEGIN_SRC emacs-lisp :tangle yes
+(bind-key "H-i" 'indent-region)
+#+END_SRC
+
+Clean all whitespace stuff
+#+BEGIN_SRC emacs-lisp :tangle yes
+(bind-key "H-w" 'whitespace-cleanup)
+#+END_SRC
+
+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
@@ -768,39 +846,64 @@ disabling that.
 (unbind-key "<kp-insert>")
 #+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).
+*** Easily navigate sillyCased words
 #+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)
-
-(setq backup-by-copying-when-linked t) ;; Copy linked files, don't rename.
-(setq backup-by-copying t)
-(setq make-backup-files t)
-
-(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"))))))))
+(global-subword-mode 1)
 #+END_SRC
-
-Weeks start on Monday, not sunday.
+*** 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
@@ -854,6 +957,7 @@ From https://raw.github.com/qdot/conf_emacs/master/emacs_conf.org
 
 #+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/...
@@ -918,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
@@ -938,160 +1041,466 @@ The source of this is:
 
 
 * Extra modes and their configuration
+** 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
+(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
 (use-package ace-jump-mode
   :ensure ace-jump-mode
-  :command ace-jump-mode
+  :commands ace-jump-mode
   :bind ("H-SPC" . ace-jump-mode))
 #+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)
+** 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
-** diff-mode
+** 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 diff-mode
-  :commands diff-mode
-  :mode ("COMMIT_EDITMSG$" . diff-mode)
+(use-package anzu
+  :ensure anzu
+  :diminish anzu-mode
+  :defer t
+  :idle
+  (progn
+    (global-anzu-mode 1))
   :config
-  (use-package diff-mode-))
+  (progn
+    (setq anzu-search-threshold 1000)
+    (set-face-attribute 'anzu-mode-line nil :foreground "yellow" :weight 'bold)))
 #+END_SRC
-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.
-
-** 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.
+** ascii
+[2014-05-21 Wed 00:33]
 #+BEGIN_SRC emacs-lisp :tangle yes
-(use-package region-bindings-mode
-  :ensure region-bindings-mode
+(use-package ascii
+  :commands (ascii-on ascii-toggle ascii-display)
+  :bind (("C-c e A" . ascii-toggle))
   :init
-  (region-bindings-mode-enable))
+  (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
-** tramp
-Transparent Remote (file) Access, Multiple Protocol, remote file editing.
+** auctex
 #+BEGIN_SRC emacs-lisp :tangle yes
-(use-package tramp
-  :defer t
+(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
+** 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
+(use-package auto-complete-config
+  :ensure auto-complete
+  :idle
+  (ac-config-default)
   :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
+    ;; 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)))
 
-** 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.
+    (use-package pos-tip
+      :ensure t)
 
-#+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)
+    ;; 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)))
 
-(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
+
+** 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
-(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)
+(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
 
-** 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.
+** 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
-(use-package dired
-  :defer t
+(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
-    (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 ()
+    (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)
-      (setq mark-files-cache (make-hash-table :test #'equal))
-      (dired-mark-sexp '(mark-similar-versions name))))
+      (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
-    (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))
-
-    (defun dired-package-initialize ()
-      (unless (featurep 'runner)
-        (use-package dired-x)
-        (use-package runner
-          :ensure runner)
-
-        (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)))
-
-        (use-package gnus-dired
-          :init
-          (progn
-            (require 'gnus-dired)
-            (add-hook 'dired-mode-hook 'turn-on-gnus-dired-mode)
-            (bind-key "a" 'gnus-dired-attach dired-mode-map)))
+    ; 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))))
 
-        (bind-key "M-!" 'async-shell-command dired-mode-map)
-        (unbind-key "M-s f" dired-mode-map)
+#+END_SRC
 
-        (defadvice dired-omit-startup (after diminish-dired-omit activate)
-          "Make sure to remove \"Omit\" from the modeline."
-          (diminish 'dired-omit-mode) dired-mode-map)
+** crontab-mode
+[2013-05-21 Tue 23:18]
+#+BEGIN_SRC emacs-lisp :tangle yes
+(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
+
+** 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))
+#+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)
+#+END_SRC
+
+** Debian related
+#+BEGIN_SRC emacs-lisp :tangle yes
+(require 'dpkg-dev-el-loaddefs nil 'noerror)
+(require 'debian-el-loaddefs nil 'noerror)
+
+(setq debian-changelog-full-name "Joerg Jaspert")
+(setq debian-changelog-mailing-address "joerg@debian.org")
+#+END_SRC
+
+** 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
+
+
+** 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)))
+
+    (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 ()
@@ -1141,2030 +1550,2571 @@ dired-single to the rescue.
       (interactive
        (list (read-directory-name "First directory: "
                                   (expand-file-name "~")
-                                  nil nil "dl/")
+                                  nil nil "/Downloads/")
              (read-directory-name "Second directory: "
                                   (expand-file-name "~")
-                                  nil nil "Archives/")))
+                                  nil nil "/")))
       (dired first-dir)
       (dired-other-window second-dir))
-    (bind-key "C-c J" 'dired-double-jump)))
+    (bind-key "C-c J" 'dired-double-jump)
 
-#+END_SRC
+    (defun dired-back-to-top ()
+      (interactive)
+      (goto-char (point-min))
+      (dired-next-line 4))
 
-** filladapt
-[2013-05-02 Thu 00:04]
-#+BEGIN_SRC emacs-lisp :tangle yes
-(use-package filladapt
-  :diminish filladapt-mode
-  :init
-  (setq-default filladapt-mode t))
-#+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
-(use-package icicles
-  :load-path "elisp/icicle/"
-  :init
-  (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
-(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
+    (define-key dired-mode-map
+      (vector 'remap 'beginning-of-buffer) 'dired-back-to-top)
 
-** 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
-(use-package abbrev
-  :commands abbrev-mode
-  :diminish abbrev-mode
-  :init
-  (hook-into-modes #'abbrev-mode '(text-mode-hook))
+    (defun dired-jump-to-bottom ()
+      (interactive)
+      (goto-char (point-max))
+      (dired-next-line -1))
 
-  :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))
+    (define-key dired-mode-map
+      (vector 'remap 'end-of-buffer) 'dired-jump-to-bottom)))
 
-    (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
-
-** font-lock
-Obviously emacs can do syntax hilighting. For more things than you ever
-heard about.
-And I want to have it everywhere.
+** 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 font-lock
-  :init
-  (progn
-    (global-font-lock-mode 1)
-    (setq font-lock-maximum-decoration t)))
+(use-package discover-my-major
+  :ensure discover-my-major
+  :commands discover-my-major
+  :bind ("C-h C-m" . discover-my-major))
 #+END_SRC
-** miniedit
-Edit minibuffer in a full (text-mode) buffer by pressing *M-C-e*.
+** 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 miniedit
-  :ensure miniedit
+(use-package epa-file
   :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)
-  ))
+    (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
-
-** 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: " "
+** ediff
+[2013-04-21 So 20:36]
+ediff - don't start another frame
 #+BEGIN_SRC emacs-lisp :tangle yes
-(use-package time-stamp
-  :commands time-stamp
-  :init
-  (progn
-    (add-hook 'write-file-hooks 'time-stamp)
-    (setq time-stamp-active t))
-  :config
+(use-package ediff
+  :pre-init
   (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)))
+    (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)
 
-** 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
-(use-package perl-mode
-  :commands cperl-mode
-  :init
-  (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)
+(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)
 
-    ;; 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
-** 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)
-  
-  :config
-  (progn
-    ;; (defadvice info-setup (after load-info+ activate)
-    ;;   (use-package info+))
+(defun emms-mpd-init ()
+  "Connect Emms to mpd."
+  (interactive)
+  (emms-player-mpd-connect))
 
-    (defadvice Info-exit (after remove-info-window activate)
-      "When info mode is quit, remove the window."
-      (if (> (length (window-list)) 1)
-          (delete-window)))))
+;; 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)
 
-(use-package info-look
-  :commands info-lookup-add-help)
-#+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")))))
+(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")
 
-    (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
-** 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
-(use-package autorevert
-  :commands auto-revert-mode
-  :diminish auto-revert-mode
-  :init
-  (progn
-    (setq global-auto-revert-mode t)
-    (global-auto-revert-mode)))
-#+END_SRC
+(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")))
 
-** linum (line number)
-Various modes should have line numbers in front of each line.
+;; 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)))
+)
 
-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))
+(setq emms-track-description-function 'my-describe)
 
-    (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))
+;; (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)
 
-    (ad-activate 'linum-on))
-  :init
-  (global-linum-mode 1))
-#+END_SRC
+(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)
 
-** css
-#+BEGIN_SRC emacs-lisp :tangle yes
-(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
+(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)))
 
-** 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 yes
-(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
+(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)
 
-** html-helper
-Instead of default /html-mode/ I use /html-helper-mode/.
-#+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)
-#+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)
 
-** auctex
-#+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)
-#+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)
 
-** Debian related
-#+BEGIN_SRC emacs-lisp :tangle yes
-(require 'dpkg-dev-el-loaddefs nil 'noerror)
-(require 'debian-el-loaddefs nil 'noerror)
+(setq emms-playlist-buffer-name "*EMMS Playlist*"
+      emms-playlist-mode-open-playlists t)
 
-(setq debian-changelog-full-name "Joerg Jaspert")
-(setq debian-changelog-mailing-address "joerg@debian.org")
-#+END_SRC
+;; Faces
+(if (window-system)
+    ((lambda ()
+       (set-face-attribute
+        'emms-browser-artist-face nil
+        :family "Arno Pro")
+       )
+))
 
-** org                                                                :FIXME:
-*** General settings
-[2013-04-28 So 17:06]
+(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)
 
-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)
+** 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
 
-*** Agenda
-
-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")
+** 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
-=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)
-
-;; Keep tasks with timestamps on the global todo lists
-(setq org-agenda-todo-ignore-timestamp nil)
-
-;; Remove completed deadline tasks from the agenda view
-(setq org-agenda-skip-deadline-if-done t)
-
-;; Remove completed scheduled tasks from the agenda view
-(setq org-agenda-skip-scheduled-if-done t)
-
-;; Remove completed items from search results
-(setq org-agenda-skip-timestamp-if-done t)
-
-;; Include agenda archive files when searching for things
-(setq org-agenda-text-search-extra-files (quote (agenda-archives)))
-
-;; Show all future entries for repeating tasks
-(setq org-agenda-repeating-timestamp-show-all t)
-
-;; Show all agenda dates - even if they are empty
-(setq org-agenda-show-all-dates t)
-
-;; 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))))
-
-;; Start the weekly agenda on Monday
-(setq org-agenda-start-on-weekday 1)
-
-;; 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)
-
-; position the habit graph on the agenda to the right of the default
-(setq org-habit-graph-column 50)
-
-; turn habits back on
-(run-at-time "06:00" 86400 '(lambda () (setq org-habit-show-habits t)))
-
-;;
-;; Agenda sorting functions
-;;
-(setq org-agenda-cmp-user-defined 'bh/agenda-sort)
-
-
-(setq org-deadline-warning-days 30)
-
-;; Always hilight the current agenda line
-(add-hook 'org-agenda-mode-hook
-          '(lambda () (hl-line-mode 1))
-          'append)
+** 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
 
-#+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)
-
-(add-hook 'org-agenda-mode-hook
-          '(lambda () (org-defkey org-agenda-mode-map "U" 'bh/narrow-up-one-level))
-          'append)
-
-(add-hook 'org-agenda-mode-hook
-          '(lambda () (org-defkey org-agenda-mode-map "P" 'bh/narrow-to-project))
-          'append)
-
-; Rebuild the reminders everytime the agenda is displayed
-(add-hook 'org-finalize-agenda-hook 'bh/org-agenda-to-appt 'append)
-
-;(if (file-exists-p "~/org/refile.org")
-;    (add-hook 'after-init-hook 'bh/org-agenda-to-appt))
-
-; Activate appointments so we get notifications
-(appt-activate t)
-
-(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))
-
-(setq org-agenda-show-all-dates t)
-(setq org-agenda-start-on-weekday nil)
-(setq org-deadline-warning-days 14)
-
+** 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
-*** Global keybindings.
-Start off by defining a series of keybindings.
+** 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)
+        ))))
 
-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
+** 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.
 
-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)
+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)))
 
-(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)
 #+END_SRC
 
-*** Tasks, States, Todo fun
+** 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)))
 
-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"))))
+(use-package hilit-chg
+  :bind ("M-o C" . highlight-changes-mode))
 
-(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-use-fast-todo-selection t)
+** 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
-Changing a task state is done with =C-c C-t KEY=
+** 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)
+    ))
 
-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.
+** 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))))
 
-**** 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 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")))
 
-The triggers break down to the following rules:
+  ;; 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)
 
-- 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
+))
+#+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
+(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))
+  )
 
-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
+** 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+))
 
-*** 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")
+    (defadvice Info-exit (after remove-info-window activate)
+      "When info mode is quit, remove the window."
+      (if (> (length (window-list)) 1)
+          (delete-window)))))
 
-;; 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")
-              )))
+(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.
+
+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))
 
-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.
+    (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))
 
-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)
+    (ad-activate 'linum-on)
+
+    (use-package linum-relative
+      :ensure linum-relative
+      :init
+      (progn
+        (setq linum-format 'dynamic)
+        )))
+  :init
+  (global-linum-mode 1))
 #+END_SRC
 
-*** 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))))
+** lisp editing stuff
 
-; Use full outline paths for refile targets - we file directly with IDO
-(setq org-refile-use-outline-path t)
+[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)
 
-; Targets complete directly with IDO
-(setq org-outline-path-complete-in-steps nil)
+(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"))))))
 
-; Allow refile to create parent tasks with confirmation
-(setq org-refile-allow-creating-parent-nodes (quote confirm))
+(add-hook 'emacs-lisp-mode-hook 'turn-on-eldoc-mode)
+(add-hook 'emacs-lisp-mode-hook 'remove-elc-on-save)
 
-; 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)
+(use-package paredit
+  :ensure paredit
+  :diminish paredit-mode " π")
 
-;;;; Refile settings
-(setq org-refile-target-verify-function 'bh/verify-refile-target)
+(setq lisp-coding-hook 'lisp-coding-defaults)
+(setq interactive-lisp-coding-hook 'interactive-lisp-coding-defaults)
+
+(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)))
+
+(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)
 
-*** 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)
+    (use-package magit-blame
+      :commands magit-blame-mode
+      :defer 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))))))
+    (use-package magit-svn
+      :ensure magit-svn
+      :commands (magit-svn-mode
+                 turn-on-magit-svn)
+      :defer t)
 
-; Overwrite the current window with the agenda
-(setq org-agenda-window-setup 'current-window)
+    (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" "")
 
-#+END_SRC
+    (unbind-key "M-h" magit-mode-map)
+    (unbind-key "M-s" magit-mode-map)
 
-*** 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-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)))
+
+    (add-hook 'magit-log-edit-mode-hook
+              #'(lambda ()
+                  (set-fill-column 72)
+                  (flyspell-mode)))
+
+    (defadvice magit-status (around magit-fullscreen activate)
+      (window-configuration-to-register :magit-fullscreen)
+      ad-do-it
+      (delete-other-windows))
+
+    (defun magit-quit-session ()
+      "Restores the previous window configuration and kills the magit buffer"
+      (interactive)
+      (kill-buffer)
+      (jump-to-register :magit-fullscreen))
+
+    (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.
 
-; use discrete minute intervals (no rounding) increments
-(setq org-time-stamp-rounding-minutes (quote (1 1)))
+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
 
-(add-hook 'org-clock-out-hook 'bh/clock-out-maybe 'append)
+** 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
 
-(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"))))
+** 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
 
+** 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
 
-**** 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.
+** 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)
 
-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.
+;; 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)))
 
-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.
+;;----------------------------------------------------------------------------
+;; 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)))
+     ))
 
-**** Reporting
-#+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)))
+#+END_SRC
+** org                                                                :FIXME:
+*** General settings
+[2013-04-28 So 17:06]
 
-;; Agenda log mode items to display (closed and state changes by default)
-(setq org-agenda-log-mode-items (quote (closed state)))
+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
-**** Task estimates, column view
-Setup column view globally with the following headlines
+
+My browsers (Conkeror, Iceweasel) can store links in org-mode. For
+that we need org-protocol.
 #+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")
+(require 'org-protocol)
 #+END_SRC
-Setup the estimate for effort values.
+
+*** Agenda
+
+My current =org-agenda-files= variable only includes a set of
+directories.
 #+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)
+
+;; 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)
+
+;; Keep tasks with timestamps on the global todo lists
+(setq org-agenda-todo-ignore-timestamp nil)
+
+;; Remove completed deadline tasks from the agenda view
+(setq org-agenda-skip-deadline-if-done t)
+
+;; Remove completed scheduled tasks from the agenda view
+(setq org-agenda-skip-scheduled-if-done t)
+
+;; Remove completed items from search results
+(setq org-agenda-skip-timestamp-if-done t)
+
+;; Include agenda archive files when searching for things
+(setq org-agenda-text-search-extra-files (quote (agenda-archives)))
+
+;; Show all future entries for repeating tasks
+(setq org-agenda-repeating-timestamp-show-all t)
 
-; Allow setting single tags without the menu
-(setq org-fast-tag-selection-single-key (quote expert))
+;; Show all agenda dates - even if they are empty
+(setq org-agenda-show-all-dates t)
 
-; For tag searches ignore tasks with scheduled and deadline dates
-(setq org-agenda-tags-todo-honor-ignore-options t)
-#+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))))
 
-*** 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
+;; Start the weekly agenda on Monday
+(setq org-agenda-start-on-weekday 1)
 
-*** 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")
+;; 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))))
 
-(add-hook 'org-babel-after-execute-hook 'bh/display-inline-images 'append)
+;; Display tags farther right
+(setq org-agenda-tags-column -102)
 
-; Make babel results blocks lowercase
-(setq org-babel-results-keyword "results")
+; position the habit graph on the agenda to the right of the default
+(setq org-habit-graph-column 50)
 
-(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))))
+; turn habits back on
+(run-at-time "06:00" 86400 '(lambda () (setq org-habit-show-habits t)))
 
-; 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)
+;;
+;; Agenda sorting functions
+;;
+(setq org-agenda-cmp-user-defined 'bh/agenda-sort)
 
-; Use fundamental mode when editing plantuml blocks with C-c '
-(add-to-list 'org-src-lang-modes (quote ("plantuml" . fundamental)))
-#+END_SRC
 
-#+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
+(setq org-deadline-warning-days 30)
 
-#+BEGIN_SRC emacs-lisp :tangle yes
-(add-to-list 'org-structure-template-alist
-             '("n" "#+BEGIN_COMMENT\n?\n#+END_COMMENT"
-               "<comment>\n?\n</comment>"))
+;; Always hilight the current agenda line
+(add-hook 'org-agenda-mode-hook
+          '(lambda () (hl-line-mode 1))
+          'append)
 #+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.
 
-*** Publishing and exporting
+#+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)
 
-Org-mode can export to a variety of publishing formats including (but not limited to)
+(add-hook 'org-agenda-mode-hook
+          '(lambda () (org-defkey org-agenda-mode-map "N" 'bh/narrow-to-subtree))
+          'append)
 
-- 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
+(add-hook 'org-agenda-mode-hook
+          '(lambda () (org-defkey org-agenda-mode-map "U" 'bh/narrow-up-one-level))
+          'append)
 
-A new exporter created by Nicolas Goaziou was introduced in org 8.0.
+(add-hook 'org-agenda-mode-hook
+          '(lambda () (org-defkey org-agenda-mode-map "P" 'bh/narrow-to-project))
+          'append)
 
-#+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)
+; Rebuild the reminders everytime the agenda is displayed
+(add-hook 'org-finalize-agenda-hook 'bh/org-agenda-to-appt 'append)
 
-; 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")
+;(if (file-exists-p "~/org/refile.org")
+;    (add-hook 'after-init-hook 'bh/org-agenda-to-appt))
 
-;; define categories that should be excluded
-(setq org-export-exclude-category (list "google" "google"))
-(setq org-icalendar-use-scheduled '(todo-start event-if-todo))
+; Activate appointments so we get notifications
+(appt-activate t)
 
-; 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-agenda-log-mode-items (quote (closed clock state)))
+(if (> emacs-major-version 23)
+    (setq org-agenda-span 3)
+  (setq org-agenda-ndays 3))
 
-(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-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.
 
-(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")
-         )
-        )
-      )
+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
+(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)
+
+(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)
 
-(setq org-export-with-timestamps nil)
 #+END_SRC
 
-**** Latex export
+*** Tasks, States, Todo fun
 
+First we define the global todo keywords.
 #+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)
+(setq org-todo-keywords
+      (quote ((sequence "TODO(t)" "NEXT(n)" "|" "DONE(d@/!)")
+              (sequence "WAITING(w@/!)" "HOLD(h@/!)" "DELEGATED(g@/!)" "|" "CANCELLED(c@/!)" "PHONE"))))
 
-;; 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)))
+(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-use-fast-todo-selection t)
+#+END_SRC
+Changing a task state is done with =C-c C-t KEY=
 
-(add-hook 'org-export-latex-after-initial-vars-hook 'my-auto-tex-cmd)
+where =KEY= is the appropriate fast todo state selection key as defined in =org-todo-keywords=.
 
-;; 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)
-        ))
+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.
 
-(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)))
+**** 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.
 
-      ;; 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)
-                  )))
+The triggers break down to the following rules:
 
-      (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))))
+- 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
 
-(add-hook 'org-export-latex-after-initial-vars-hook 'my-auto-tex-parameters)
+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
 
-*** 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=
+*** 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")
 
-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.
+;; 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
+
+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 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-catch-invisible-edits 'error)
+(add-hook 'org-clock-out-hook 'bh/remove-empty-drawer-on-clock-out 'append)
 #+END_SRC
 
-*** Whatever
+*** 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
-;; disable the default org-mode stuck projects agenda view
-(setq org-stuck-projects (quote ("" nil nil "")))
+; 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))))
 
-; force showing the next headline.
-(setq org-show-entry-below (quote ((default))))
+; Use full outline paths for refile targets - we file directly with IDO
+(setq org-refile-use-outline-path t)
 
-(setq org-show-following-heading t)
-(setq org-show-hierarchy-above t)
-(setq org-show-siblings (quote ((default))))
+; Targets complete directly with IDO
+(setq org-outline-path-complete-in-steps nil)
 
-(setq org-special-ctrl-a/e t)
-(setq org-special-ctrl-k t)
-(setq org-yank-adjusted-subtrees t)
+; Allow refile to create parent tasks with confirmation
+(setq org-refile-allow-creating-parent-nodes (quote confirm))
 
-(setq org-table-export-default-format "orgtbl-to-csv")
+; 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
 
-The following setting adds alphabetical lists like
-  ,a. item one
-  ,b. item two
+*** 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)
+
+;; 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)
 
-#+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
 
+*** Time
 #+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
-(setq org-remove-highlights-with-change nil)
-
-(setq org-list-demote-modify-bullet (quote (("+" . "-")
-    ("*" . "-")
-    ("1." . "-")
-    ("1)" . "-"))))
-
+;;
+;; 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)))
 
-(add-hook 'org-insert-heading-hook 'bh/insert-heading-inactive-timestamp 'append)
+(add-hook 'org-clock-out-hook 'bh/clock-out-maybe 'append)
 
+(setq bh/keep-clock-running nil)
 
-; If we leave Emacs running overnight - reset the appointments one minute after midnight
-(run-at-time "24:01" nil 'bh/org-agenda-to-appt)
+(setq org-agenda-clock-consistency-checks
+      (quote (:max-duration "4:00"
+              :min-duration 0
+              :max-gap 0
+              :gap-ok-around ("4:00"))))
 
 #+END_SRC
 
+**** 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.
 
-#+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
+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.
 
-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.
+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.
 
-The following setting prevents creating blank lines before headings
-but allows list items to adapt to existing blank lines around the items:
+**** Reporting
 #+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
-(setq org-blank-before-new-entry (quote ((heading)
-                                         (plain-list-item . auto))))
-#+END_SRC
+;; 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
-(setq org-reverse-note-order nil)
-(setq org-default-notes-file "~/notes.org")
+; Set default column view headings: Task Effort Clock_Summary
+(setq org-columns-default-format "%80ITEM(Task) %10Effort(Effort){:} %10CLOCKSUM")
 #+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=
+Setup the estimate for effort values.
 #+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
-(setq org-enforce-todo-checkbox-dependencies t)
-(setq org-enforce-todo-dependencies t)
+; 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
 
+*** Tags
+Tags are mostly used for filtering inside the agenda.
 #+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)
-
-; regularly save our org-mode buffers
-(run-at-time "00:59" 3600 'org-save-all-org-buffers)
-
-(setq org-log-done t)
-
-(setq org-enable-priority-commands t)
-(setq org-default-priority ?E)
-(setq org-lowest-priority ?E)
+; 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" . ??))))
 
+; Allow setting single tags without the menu
+(setq org-fast-tag-selection-single-key (quote expert))
 
+; For tag searches ignore tasks with scheduled and deadline dates
+(setq org-agenda-tags-todo-honor-ignore-options t)
 #+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.
-
-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.
+*** 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
 
+*** org-babel
 #+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)
+(setq org-ditaa-jar-path "~/java/ditaa0_6b.jar")
+(setq org-plantuml-jar-path "~/java/plantuml.jar")
 
-                                      ("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)
+(add-hook 'org-babel-after-execute-hook 'bh/display-inline-images 'append)
 
-                                      ("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))))
+; Make babel results blocks lowercase
+(setq org-babel-results-keyword "results")
+
+(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))))
 
-(add-hook 'org-agenda-mode-hook
-          (lambda ()
-            (define-key org-agenda-mode-map "q" 'bury-buffer))
-          'append)
+; 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)
 
-(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)
+; Use fundamental mode when editing plantuml blocks with C-c '
+(add-to-list 'org-src-lang-modes (quote ("plantuml" . fundamental)))
 #+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.
-
-#+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
-(setq org-src-fontify-natively t)
-(setq org-src-tab-acts-natively 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
 
-#+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
-(setq org-src-preserve-indentation nil)
-(setq org-edit-src-content-indentation 0)
+#+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.
 
+*** Publishing and exporting
 
-#+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
 
-**** Checklist handling
-[2013-05-11 Sat 22:15]
+Org-mode can export to a variety of publishing formats including (but not limited to)
+
+- 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
-(require 'org-checklist)
-#+END_SRC
+;; Explicitly load required exporters
+(require 'ox-html)
+(require 'ox-latex)
+(require 'ox-ascii)
+;; FIXME, check the following two
+;(require 'ox-icalendar)
+;(require 'ox-odt)
 
-** 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)
-#+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))
-#+END_SRC
+; 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")
 
-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)
-#+END_SRC
+;; define categories that should be excluded
+(setq org-export-exclude-category (list "google" "google"))
+(setq org-icalendar-use-scheduled '(todo-start event-if-todo))
 
-** mo-git-blame
-This is [[https://github.com/mbunkus/mo-git-blame][mo-git-blame -- An interactive, iterative 'git blame' mode for
-Emacs]].
+; 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
-(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
+(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)
 
-** mingus
-[[https://github.com/pft/mingus][Mingus]] is a nice interface to mpd, the Music Player Daemon.
 
-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/")))
+(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
 
-** 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)))))
+**** Latex export
 
-    (add-hook 'dired-mode-hook 'recentf-add-dired-directory)))
-#+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))
+#+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)))
 
-;;----------------------------------------------------------------------------
-;; 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)))
+      ;; 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)
+                  )))
 
-    (session-initialize)
+      (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))))
 
-    (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 'org-export-latex-after-initial-vars-hook 'my-auto-tex-parameters)
+#+END_SRC
 
-    (add-hook 'before-save-hook 'remove-session-use-package-from-settings)
+*** 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=
 
-    ;; 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))))
+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.
 
-    (add-hook 'session-after-jump-to-last-change-hook
-              'le::maybe-reveal)
+#+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
+(setq org-catch-invisible-edits 'error)
+#+END_SRC
 
-    (defun save-information ()
-      (with-temp-message "Saving Emacs information..."
-        (recentf-cleanup)
+*** 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 "")))
 
-        (loop for func in kill-emacs-hook
-              unless (memq func '(exit-gnus-on-exit server-force-stop))
-              do (funcall func))
+; force showing the next headline.
+(setq org-show-entry-below (quote ((default))))
 
-        (unless (or noninteractive
-                    running-alternate-emacs
-                    (eq 'listen (process-status server-process)))
-          (server-start))))
+(setq org-show-following-heading t)
+(setq org-show-hierarchy-above t)
+(setq org-show-siblings (quote ((default))))
 
-    (run-with-idle-timer 300 t 'save-information)
+(setq org-special-ctrl-a/e t)
+(setq org-special-ctrl-k t)
+(setq org-yank-adjusted-subtrees t)
 
-    (if window-system
-        (add-hook 'after-init-hook 'session-initialize t))))
+(setq org-table-export-default-format "orgtbl-to-csv")
 
 #+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
+The following setting adds alphabetical lists like
+  ,a. item one
+  ,b. item two
 
-** easypg
-EasyPG is a GnuPG interface for Emacs.
-#+BEGIN_SRC emacs-lisp :tangle yes
-(require 'epa-file)
-(epa-file-enable)
+#+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
 
-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
-(bind-key* "\M-n" 'gnus) ; Start gnus with M-n
-(after 'gnus
-  (jj-init-theme)
-)
-#+END_SRC
+#+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
+(setq org-remove-highlights-with-change nil)
 
-** 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
-(use-package hippie-exp
-  :defer t
-  :bind ("M-/" . hippie-expand)
-  :init
-  (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
-** 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
-  :init
-  (progn
-    (yas-global-mode 1)
-    ;; Integrate hippie-expand with ya-snippet
-    (add-to-list 'hippie-expand-try-functions-list
-                 'yas-hippie-try-expand)
-    ))
-#+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
-(use-package multiple-cursors
-  :ensure multiple-cursors
-  :defer t
-  :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))
-  :init
-  (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
-** rainbow-mode
-#+BEGIN_SRC emacs-lisp :tangle yes
-(use-package rainbow-mode
-  :ensure rainbow-mode
-  :diminish rainbow-mode)
-#+END_SRC
+(setq org-list-demote-modify-bullet (quote (("+" . "-")
+    ("*" . "-")
+    ("1." . "-")
+    ("1)" . "-"))))
 
-** 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
-  :init
-  (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
-(use-package undo-tree
-  :ensure undo-tree
-  :init
-  (global-undo-tree-mode)
-  :diminish undo-tree-mode)
-#+END_SRC
 
-Additionally I would like to keep the region active should I undo
-while I have one.
 
-#+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
-(use-package windmove
-  :init
-  (progn
-    (windmove-default-keybindings 'hyper)
-    (setq windmove-wrap-around t)))
+(add-hook 'org-insert-heading-hook 'bh/insert-heading-inactive-timestamp 'append)
+
+
+; 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
-** 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
-  :init
-  (volatile-highlights-mode t)
-  :diminish volatile-highlights-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)
 #+END_SRC
-** ediff
-[2013-04-21 So 20:36]
-ediff - don't start another frame
-#+BEGIN_SRC elisp
-(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
+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.
 
-  :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)))
+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
-** re-builder
-Saner regex syntax
-#+BEGIN_SRC emacs-lisp :tangle yes
-(use-package re-builder
-  :command re-builder
-  :defer t
-  :config
-  (setq reb-re-syntax 'string))
+
+#+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
+(setq org-reverse-note-order nil)
+(setq org-default-notes-file "~/notes.org")
 #+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/"
-                            )
-          magit-repo-dirs-depth 4
-          magit-log-auto-more t)
-    (use-package magit-blame
-      :commands magit-blame-mode)
 
-    (use-package magit-filenotify
-      :ensure magit-filenotify)
+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
 
-    (use-package magit-svn
-      :ensure magit-svn
-      :commands (magit-svn-mode
-                 turn-on-magit-svn))
+#+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)
 
-    (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" "")
+; regularly save our org-mode buffers
+(run-at-time "00:59" 3600 'org-save-all-org-buffers)
 
-    (unbind-key "M-h" magit-mode-map)
-    (unbind-key "M-s" magit-mode-map)
+(setq org-log-done t)
+
+(setq org-enable-priority-commands t)
+(setq org-default-priority ?E)
+(setq org-lowest-priority ?E)
 
-    (add-hook 'magit-log-edit-mode-hook
-              #'(lambda ()
-                  (set-fill-column 72)
-                  (flyspell-mode)))
-    ))
-#+END_SRC
 
-** 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 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))
+
+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.
+
+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.
+
+#+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)
+
+                                      ("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
 
-** 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
-(bind-key "TAB" 'lisp-complete-symbol read-expression-map)
 
-(use-package paredit
-  :ensure paredit
-  :diminish paredit-mode " π")
+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.
+
+#+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
+(setq org-src-fontify-natively t)
+(setq org-src-tab-acts-natively t)
+#+END_SRC
+
+#+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
+(setq org-src-preserve-indentation nil)
+(setq org-edit-src-content-indentation 0)
+#+END_SRC
 
-(setq lisp-coding-hook 'lisp-coding-defaults)
-(setq interactive-lisp-coding-hook 'interactive-lisp-coding-defaults)
 
-(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)))
+#+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
 
-(bind-key "M-." 'find-function-at-point emacs-lisp-mode-map)
+**** Checklist handling
+[2013-05-11 Sat 22:15]
 
-(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
+(require 'org-checklist)
 #+END_SRC
 
-** writegood
-This highlights some /weaselwords/, a mode to /aid in finding common
-writing problems/...
-[2013-04-27 Sa 23:29]
+** 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
-(use-package writegood-mode
-  :ensure writegood-mode
-  :defer t
-  :init
-  (bind-key "C-c g" 'writegood-mode))
+(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
-** 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.
+** puppet
+[2014-05-22 Thu 00:05]
 #+BEGIN_SRC emacs-lisp :tangle yes
-(use-package auto-complete
-  :ensure auto-complete
+(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
+(use-package elpy
+  :defer t
+  :mode ("\.py" . python-mode)
   :init
   (progn
-    (global-auto-complete-mode t)
+    (safe-load (concat jj-elisp-dir "/elpy/elpy-autoloads.el"))
     )
   :config
   (progn
-    (setq ac-comphist-file (expand-file-name "ac-comphist.dat" jj-cache-dir))
-
-    (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)))
+    (use-package nose
+      :ensure nose
+      :commands (nosetests-all nosetests-module nosetests-one
+                               nosetests-failed nosetests-pdb-all
+                               nosetests-pdb-module nosetests-pdb-one)
+      )
 
-    (setq dabbrev-friend-buffer-function 'sanityinc/dabbrev-friend-buffer)
+    (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)))
 
-;; 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 "M-TAB" 'auto-complete ac-mode-map)
+#+END_SRC
 
-(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)
+Below is old setup
+#+BEGIN_SRC emacs-lisp :tangle no
+(autoload 'python-mode "python-mode" "Python Mode." t)
+(add-auto-mode 'python-mode "\\.py\\'")
+(add-auto-mode 'python-mode "\\.py$")
+(add-auto-mode 'python-mode "SConstruct\\'")
+(add-auto-mode 'python-mode "SConscript\\'")
+(add-to-list 'interpreter-mode-alist '("python" . python-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)))
+(after 'python-mode
+  (set-variable 'py-indent-offset 4)
+  (set-variable 'py-smart-indentation nil)
+  (set-variable 'indent-tabs-mode nil)
+  (define-key python-mode-map "\C-m" 'newline-and-indent)
+  (turn-on-eldoc-mode)
+  (defun python-auto-fill-comments-only ()
+    (auto-fill-mode 1)
+    (set (make-local-variable 'fill-nobreak-predicate)
+         (lambda ()
+           (not (python-in-string/comment)))))
+  (add-hook 'python-mode-hook
+            (lambda ()
+              (python-auto-fill-comments-only)))
+   ;; pymacs
+  (autoload 'pymacs-apply "pymacs")
+  (autoload 'pymacs-call "pymacs")
+  (autoload 'pymacs-eval "pymacs" nil t)
+  (autoload 'pymacs-exec "pymacs" nil t)
+  (autoload 'pymacs-load "pymacs" nil t))
 #+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
+If an =ipython= executable is on the path, then assume that IPython is
+the preferred method python evaluation.
+#+BEGIN_SRC emacs-lisp :tangle no
+(when (executable-find "ipython")
+  (require 'ipython)
+  (setq org-babel-python-mode 'python-mode))
 
-  :mode ("\\.ya?ml\\'" . yaml-mode)
-  :config
-    (bind-key "C-m" 'newline-and-indent yaml-mode-map ))
+(setq python-shell-interpreter "ipython")
+(setq python-shell-interpreter-args "")
+(setq python-shell-prompt-regexp "In \\[[0-9]+\\]: ")
+(setq python-shell-prompt-output-regexp "Out\\[[0-9]+\\]: ")
+(setq python-shell-completion-setup-code
+   "from IPython.core.completerlib import module_completion")
+(setq python-shell-completion-module-string-code
+   "';'.join(module_completion('''%s'''))\n")
+(setq python-shell-completion-string-code
+   "';'.join(get_ipython().Completer.all_completions('''%s'''))\n")
 #+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.
+** 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 flycheck
-  :ensure flycheck
+(use-package rainbow-delimiters
+  :ensure rainbow-delimiters
+  :commands rainbow-delimiters-mode
   :init
-  (add-hook 'after-init-hook #'global-flycheck-mode))
+  (add-hook 'prog-mode-hook #'rainbow-delimiters-mode))
 #+END_SRC
-** crontab-mode
-[2013-05-21 Tue 23:18]
+** rainbow-mode
 #+BEGIN_SRC emacs-lisp :tangle yes
-(use-package crontab-mode
-  :ensure crontab-mode
-  :commands crontab-mode
-  :mode ("\\.?cron\\(tab\\)?\\'" . crontab-mode))
+(use-package rainbow-mode
+  :ensure rainbow-mode
+  :defer t
+  :diminish rainbow-mode)
 #+END_SRC
 
-** nxml
-[2013-05-22 Wed 22:02]
-nxml-mode is a major mode for editing XML.
+** re-builder
+Saner regex syntax
 #+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)))
+(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))
 
-;;----------------------------------------------------------------------------
-;; 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)))
-     ))
+    (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]
@@ -3211,19 +4161,19 @@ Programming in ruby...
     (use-package ruby-hash-syntax
       :ensure ruby-hash-syntax)
 
-    (defun my-ruby-mode-hook ()
-      (require 'inf-ruby)
-      (inf-ruby-keys)
-
-      (bind-key "<return>" 'my-ruby-smart-return ruby-mode-map)
-      ;(bind-key "<tab>" 'indent-for-tab-command ruby-mode-map)
+    (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))
 
-    (add-hook 'ruby-mode-hook 'my-ruby-mode-hook)
+        (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.
@@ -3233,289 +4183,397 @@ Programming in ruby...
                   (run-hooks 'prog-mode-hook))))
   ))
 #+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)
+** 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))
 
-(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)
+;;----------------------------------------------------------------------------
+;; 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)))
 
-(defun emms-mpd-init ()
-  "Connect Emms to mpd."
-  (interactive)
-  (emms-player-mpd-connect))
+    (session-initialize)
 
-;; 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)
+    (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)))))))
 
-(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")
+    (add-hook 'before-save-hook 'remove-session-use-package-from-settings)
 
-(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")))
+    ;; 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))))
 
-;; 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)))
-)
+    (add-hook 'session-after-jump-to-last-change-hook
+              'le::maybe-reveal)
 
-(setq emms-track-description-function 'my-describe)
+    (defun save-information ()
+      (with-temp-message "Saving Emacs information..."
+        (recentf-cleanup)
 
-;; (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)
+        (loop for func in kill-emacs-hook
+              unless (memq func '(exit-gnus-on-exit server-force-stop))
+              do (funcall func))
 
-(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)
+        (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")))))
 
-(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)))
+    (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
 
-(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)
+** 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.
 
-(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
+(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)
 
-(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)
+(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
 
-(setq emms-playlist-buffer-name "*EMMS Playlist*"
-      emms-playlist-mode-open-playlists t)
+** 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
 
-;; Faces
-(if (window-system)
-    ((lambda ()
-       (set-face-attribute
-        'emms-browser-artist-face nil
-        :family "Arno Pro")
-       )
-))
+** 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))
+  )
 
-(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)
-      
 #+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
-(bind-key "C-#" 'yafolding)
-;;(define-key global-map (kbd "C-c C-f") 'yafolding-toggle-all)
-(bind-key "C-c C-f" 'yafolding-toggle-all-by-current-level)
+(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
-** icomplete
-Incremental mini-buffer completion preview: Type in the minibuffer,
-list of matching commands is echoed
+** 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
-(icomplete-mode 99)
+(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
 
-** 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...
+** 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
-(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)
-#+END_SRC
-
-Below is old setup
-#+BEGIN_SRC emacs-lisp :tangle no
-(autoload 'python-mode "python-mode" "Python Mode." t)
-(add-auto-mode 'python-mode "\\.py\\'")
-(add-auto-mode 'python-mode "\\.py$")
-(add-auto-mode 'python-mode "SConstruct\\'")
-(add-auto-mode 'python-mode "SConscript\\'")
-(add-to-list 'interpreter-mode-alist '("python" . python-mode))
-
-(after 'python-mode
-  (set-variable 'py-indent-offset 4)
-  (set-variable 'py-smart-indentation nil)
-  (set-variable 'indent-tabs-mode nil)
-  (define-key python-mode-map "\C-m" 'newline-and-indent)
-  (turn-on-eldoc-mode)
-  (defun python-auto-fill-comments-only ()
-    (auto-fill-mode 1)
-    (set (make-local-variable 'fill-nobreak-predicate)
-         (lambda ()
-           (not (python-in-string/comment)))))
-  (add-hook 'python-mode-hook
-            (lambda ()
-              (python-auto-fill-comments-only)))
-   ;; pymacs
-  (autoload 'pymacs-apply "pymacs")
-  (autoload 'pymacs-call "pymacs")
-  (autoload 'pymacs-eval "pymacs" nil t)
-  (autoload 'pymacs-exec "pymacs" nil t)
-  (autoload 'pymacs-load "pymacs" nil t))
-#+END_SRC
-
-If an =ipython= executable is on the path, then assume that IPython is
-the preferred method python evaluation.
-#+BEGIN_SRC emacs-lisp :tangle no
-(when (executable-find "ipython")
-  (require 'ipython)
-  (setq org-babel-python-mode 'python-mode))
-
-(setq python-shell-interpreter "ipython")
-(setq python-shell-interpreter-args "")
-(setq python-shell-prompt-regexp "In \\[[0-9]+\\]: ")
-(setq python-shell-prompt-output-regexp "Out\\[[0-9]+\\]: ")
-(setq python-shell-completion-setup-code
-   "from IPython.core.completerlib import module_completion")
-(setq python-shell-completion-module-string-code
-   "';'.join(module_completion('''%s'''))\n")
-(setq python-shell-completion-string-code
-   "';'.join(get_ipython().Completer.all_completions('''%s'''))\n")
+(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.