Changes
[emacs.git] / .emacs.d / config / emacs.org
index 3b85459..3b88516 100644 (file)
@@ -15,7 +15,7 @@ them first.
 *** safe-load
 safe-load does not break emacs initialization, should a file be
 unreadable while emacs boots up.
-#+BEGIN_SRC emacs-lisp :tangle yes
+#+BEGIN_SRC emacs-lisp
 (defvar safe-load-error-list ""
         "*List of files that reported errors when loaded via safe-load")
 
@@ -41,36 +41,21 @@ unreadable while emacs boots up.
 I have some stuff put away in my local dir. I don't want to load it all
 at startup time, so it is using the autoload feature. For that to work
 load the loaddefs, so autoload knows where to grab stuff
-#+BEGIN_SRC emacs-lisp :tangle yes
+#+BEGIN_SRC emacs-lisp
 (safe-load (concat jj-elisp-dir "/tiny/loaddefs.el"))
 (safe-load (concat jj-elisp-local-dir "/loaddefs.el"))
 #+END_SRC
-*** Keep *scratch* around
-Always ensure to have a scratch buffer around.
-#+BEGIN_SRC emacs-lisp :tangle yes
-(with-current-buffer (get-buffer-create "*scratch*")
-    (lisp-interaction-mode)
-    (make-local-variable 'kill-buffer-query-functions)
-    (add-hook 'kill-buffer-query-functions 'kill-scratch-buffer))
-#+END_SRC
 *** add-auto-mode
 Handier way to add modes to auto-mode-alist
-#+BEGIN_SRC emacs-lisp :tangle yes
+#+BEGIN_SRC emacs-lisp
 (defun add-auto-mode (mode &rest patterns)
   "Add entries to `auto-mode-alist' to use `MODE' for all given file `PATTERNS'."
   (dolist (pattern patterns)
     (add-to-list 'auto-mode-alist (cons pattern mode))))
 #+END_SRC
-*** config helpers use-package/bind-key
-Helpers for the config
-https://github.com/jwiegley/use-package
-#+BEGIN_SRC emacs-lisp :tangle yes
-(require 'use-package)
-(require 'bind-key)
-#+END_SRC
 *** hook-into-modes
 [2014-05-20 Tue 22:36]
-#+BEGIN_SRC emacs-lisp :tangle yes
+#+BEGIN_SRC emacs-lisp
 (defmacro hook-into-modes (func modes)
   `(dolist (mode-hook ,modes)
      (add-hook mode-hook ,func)))
@@ -78,19 +63,47 @@ https://github.com/jwiegley/use-package
 
 *** elpa
 The Emacs Lisp Package Archive contains things I want.
-#+BEGIN_SRC emacs-lisp :tangle yes
+#+BEGIN_SRC emacs-lisp
 (when (> emacs-major-version 23)
   (require 'package)
   (setq package-user-dir (expand-file-name "elpa" jj-elisp-dir))
-  (dolist (source '(("melpa" . "http://melpa.milkbox.net/packages/")
-                    ("melpa-stable" . "http://melpa-stable.milkbox.net/packages/")
+  (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://tromey.com/elpa/")))
+                    ("elpa" . "http://elpa.gnu.org/packages/")
+))
     (add-to-list 'package-archives source t))
-  (package-initialize))
-#+END_SRC
+  (package-initialize)
 
+#+END_SRC
+And Paradox is a nicer interface for it
+#+BEGIN_SRC emacs-lisp
+(use-package paradox
+  :ensure t
+  :commands (paradox-list-packages paradox-install paradox-upgrade-packages)
+  :config
+  (progn
+    ;(paradox-enable)
+    (setq paradox-github-token t)
+    ))
+#+END_SRC
+*** config helpers use-package/bind-key
+Helpers for the config
+https://github.com/jwiegley/use-package
+#+BEGIN_SRC emacs-lisp
+(unless (package-installed-p 'use-package)
+  (package-refresh-contents)
+  (package-install 'use-package)))
+(require 'use-package)
+(require 'bind-key)
+#+END_SRC
+*** Schema validation for the config
+[2016-10-30 Sun 17:15]
+#+BEGIN_SRC emacs-lisp
+(use-package validate
+  :ensure t)
+#+END_SRC
 ** Path settings
 *** Load path
 We need to define the load-path. As I have lots of things I add
@@ -98,9 +111,7 @@ 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.
 
-Additionally I also ensure that files in there are recompiled, when
-neccessary.
-#+BEGIN_SRC emacs-lisp :tangle yes
+#+BEGIN_SRC emacs-lisp
 (dolist
     (project (directory-files jj-elisp-dir t "\\w+"))
   (when (file-directory-p project)
@@ -114,21 +125,21 @@ neccessary.
 
 *** 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-default-directory-list
-      (cons "~/emacs/info" Info-default-directory-list))
+#+BEGIN_SRC emacs-lisp :tangle yes
+(validate-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/")))
+(validate-setq Info-default-directory-list
+               (cons jj-info-dir Info-default-directory-list))
 #+END_SRC
 
 ** Interface related
@@ -137,55 +148,59 @@ Help emacs to find the info files
 :ID: 0a1560d9-7e55-47ab-be52-b3a8b8eea4aa
 :END:
 I dislike the startup message
-#+BEGIN_SRC emacs-lisp :tangle yes
-(setq inhibit-splash-screen t)
-(setq inhibit-startup-message t)
+#+BEGIN_SRC emacs-lisp
+(validate-setq inhibit-splash-screen t)
+(validate-setq inhibit-startup-message t)
 #+END_SRC
 
 Usually I want the lines to break at 72 characters.
-#+BEGIN_SRC emacs-lisp :tangle yes
-(setq fill-column 72)
+#+BEGIN_SRC emacs-lisp
+(validate-setq fill-column 72)
 #+END_SRC
 
 And it is nice to have a final newline in files.
 (Now off, ethan-wspace is doing it better).
-#+BEGIN_SRC emacs-lisp :tangle yes
-(setq require-final-newline nil)
-(setq mode-require-final-newline nil)
+#+BEGIN_SRC emacs-lisp
+(validate-setq require-final-newline nil)
+(validate-setq mode-require-final-newline nil)
 #+END_SRC
 
 After I typed 300 characters or took a break for more than a minute it
 would be nice of emacs to save whatever I am on in one of its auto-save
 backups. See [[info:emacs#Auto%20Save%20Control][info:emacs#Auto Save Control]] for more details.
-#+BEGIN_SRC emacs-lisp :tangle yes
-(setq auto-save-interval 300)
-(setq auto-save-timeout   60)
+#+BEGIN_SRC emacs-lisp
+(validate-setq auto-save-interval 300)
+(validate-setq auto-save-timeout   60)
 #+END_SRC
 
 Set my full name and my default mail address - for whatever wants to use
 it later. Also, I am using gnus.
-#+BEGIN_SRC emacs-lisp :tangle yes
-(setq user-full-name "Joerg Jaspert")
-(setq user-mail-address "joerg@ganneff.de")
-(setq mail-user-agent (quote gnus-user-agent))
+#+BEGIN_SRC emacs-lisp
+(validate-setq user-full-name "Joerg Jaspert")
+(validate-setq user-mail-address "joerg@ganneff.de")
+(validate-setq mail-user-agent (quote gnus-user-agent))
 #+END_SRC
 
 My default mail server. Well, simply a localhost, I have a forwarder that
 puts mail off the right way, no need for emacs to have any further
 knowledge here.
-#+BEGIN_SRC emacs-lisp :tangle yes
-(setq smtpmail-default-smtp-server "localhost")
-(setq smtpmail-smtp-server "localhost")
+#+BEGIN_SRC emacs-lisp
+(use-package smtpmail
+  :ensure t
+  :config
+  (progn
+    (validate-setq smtpmail-default-smtp-server "localhost")
+    (validate-setq smtpmail-smtp-server "localhost")))
 #+END_SRC
 
 Enable automatic handling of compressed files.
-#+BEGIN_SRC emacs-lisp :tangle yes
+#+BEGIN_SRC emacs-lisp
 (auto-compression-mode 1)
 #+END_SRC
 
 Emacs forbids a certain set of commands, as they can be very confusing
 for new users. Enable them.
-#+BEGIN_SRC emacs-lisp :tangle yes
+#+BEGIN_SRC emacs-lisp
 (put 'narrow-to-region 'disabled nil)
 (put 'narrow-to-page   'disabled nil)
 (put 'narrow-to-defun  'disabled nil)
@@ -193,16 +208,21 @@ for new users. Enable them.
 (put 'downcase-region  'disabled nil)
 #+END_SRC
 
+Recenter in a different order - first go to top, then middle, then
+bottom
+#+BEGIN_SRC emacs-lisp
+(validate-setq recenter-positions '(top middle bottom))
+#+END_SRC
 *** Look / Theme
 I've tried various different fonts and while I like the Terminus font
 most for my shells, in Emacs Inconsolata clearly wins.
-#+BEGIN_SRC emacs-lisp :tangle yes
+#+BEGIN_SRC emacs-lisp
 (set-frame-font "Inconsolata-14")
 #+END_SRC
 
 I always use dark backgrounds, so tell Emacs about it. No need to
 guess around.
-#+BEGIN_SRC emacs-lisp :tangle yes
+#+BEGIN_SRC emacs-lisp
 (setq-default frame-background-mode jj-color-style)
 #+END_SRC
 
@@ -229,42 +249,73 @@ shell. Consistent look is great.
   (color-theme-solarized-dark)
 )
 #+END_SRC
-#+BEGIN_SRC emacs-lisp :tangle yes
-(use-package solarized
-  :load-path "elisp/emacs-color-theme-solarized"
+#+BEGIN_SRC emacs-lisp
+(use-package color-theme-solarized
+  :ensure solarized-theme
   :init
   (progn
     (defun jj-init-theme ()
       (interactive)
+
       (if (eq jj-color-style 'dark )(load-theme 'solarized-dark t)
         (load-theme 'solarized-light t))
       (set-face-attribute 'org-date nil :underline nil)
       (message "Initializing theme solarized-dark")
       )
+
+      ;; ;; make the fringe stand out from the background
+      (setq solarized-distinct-fringe-background t)
+
+      ;; ;; Don't change the font for some headings and titles
+      ;; (validate-setq solarized-use-variable-pitch nil)
+
+      ;; ;; make the modeline high contrast
+      ;; (validate-setq solarized-high-contrast-mode-line t)
+
+      ;; ;; Use less bolding
+      ;; (validate-setq solarized-use-less-bold t)
+
+      ;; ;; Use more italics
+      ;; (validate-setq solarized-use-more-italic t)
+
+      ;; ;; Use less colors for indicators such as git:gutter, flycheck and similar
+      ;; (validate-setq solarized-emphasize-indicators nil)
+
+      ;; ;; Don't change size of org-mode headlines (but keep other size-changes)
+      ;; (validate-setq solarized-scale-org-headlines nil)
+
+      ;; ;; Avoid all font-size changes
+      ;; (validate-setq solarized-height-minus-1 1)
+      ;; (validate-setq solarized-height-plus-1 1)
+      ;; (validate-setq solarized-height-plus-2 1)
+      ;; (validate-setq solarized-height-plus-3 1)
+      ;; (validate-setq solarized-height-plus-4 1)
+      (setq x-underline-at-descent-line t)
+
     (add-to-list 'custom-theme-load-path jj-theme-dir)
     (add-hook 'after-init-hook 'jj-init-theme)
     (jj-init-theme)))
 #+END_SRC
 
 Make the fringe (gutter) smaller, the argument is a width in pixels (the default is 8)
-#+BEGIN_SRC emacs-lisp :tangle yes
+#+BEGIN_SRC emacs-lisp
 (if (fboundp 'fringe-mode)
     (fringe-mode 8))
 #+END_SRC
 
 A bit more spacing between buffer lines
-#+BEGIN_SRC emacs-lisp :tangle yes
+#+BEGIN_SRC emacs-lisp
 (setq-default line-spacing 0.1)
 #+END_SRC
 *** Cursor changes
 [2013-04-21 So 20:54]
 I do not want my cursor to blink.
-#+BEGIN_SRC emacs-lisp :tangle yes
+#+BEGIN_SRC emacs-lisp
 (blink-cursor-mode -1)
 #+END_SRC
 *** Menu, Tool and Scrollbar
 I don't want to see the menu-bar, tool-bar or scrollbar.
-#+BEGIN_SRC emacs-lisp :tangle yes
+#+BEGIN_SRC emacs-lisp
 (when window-system
   (dolist (mode '(menu-bar-mode tool-bar-mode scroll-bar-mode))
   (when (fboundp mode) (funcall mode -1))))
@@ -280,52 +331,65 @@ menu/tool/scrollbar settings. Sucks.
 For them to work even then, we have to do two things.
 1. We have to set the frame alist. We simple set both,
    =initial-frame-alist= and =default-frame-alist= to the same value here.
-   #+BEGIN_SRC emacs-lisp :tangle yes
-  (setq initial-frame-alist '(
-                              (horizontal-scroll-bars . nil)
-                              (vertical-scroll-bars . nil)
-                              (menu-bar-lines . 0)
-                              ))
-  (setq default-frame-alist (copy-alist initial-frame-alist))
+   #+BEGIN_SRC emacs-lisp
+   (setq initial-frame-alist '(
+                               (horizontal-scroll-bars . nil)
+                               (vertical-scroll-bars . nil)
+                               (menu-bar-lines . 0)
+                               (tool-bar-lines . 0)
+                               ))
+   (setq default-frame-alist (copy-alist initial-frame-alist))
 #+END_SRC
-2. We have to disable the toolbar using the customize interface, so you
-   can find that in the [[id:0102208d-fdf6-4928-9e40-7e341bd3aa3a][Customized variables]] section.
 
 *** Hilight current line in buffer
 As it says, it does a hilight of the current line.
-#+BEGIN_SRC emacs-lisp :tangle yes
+#+BEGIN_SRC emacs-lisp
 (global-hl-line-mode +1)
 #+END_SRC
 *** Allow recursive minibuffers
 This allows (additional) minibuffer commands while in the minibuffer.
-#+BEGIN_SRC emacs-lisp :tangle yes
-(setq enable-recursive-minibuffers 't)
+#+BEGIN_SRC emacs-lisp
+(validate-setq enable-recursive-minibuffers 't)
 #+END_SRC
+*** No GC during minibuffer action
+[2016-02-15 Mon 22:09]
+See [[https://bling.github.io/blog/2016/01/18/why-are-you-changing-gc-cons-threshold/][Why are you changing gc cons threshold?]] for more details.
+#+BEGIN_SRC emacs-lisp
+(defun my-minibuffer-setup-hook ()
+  (validate-setq gc-cons-threshold most-positive-fixnum))
 
+(defun my-minibuffer-exit-hook ()
+  (validate-setq gc-cons-threshold (* 100 1024 1024)))
+
+(add-hook 'minibuffer-setup-hook #'my-minibuffer-setup-hook)
+(add-hook 'minibuffer-exit-hook #'my-minibuffer-exit-hook)
+#+END_SRC
 *** Modeline related changes
 I want to see line and column numbers, so turn them on.
 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
+#+BEGIN_SRC emacs-lisp
 (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)
+(validate-setq display-time-day-and-date nil)
+(validate-setq display-time-default-load-average nil)
+(validate-setq display-time-24hr-format t)
+(validate-setq display-time-mail-string "")
+(validate-setq display-time-default-load-average nil)
+(validate-setq display-time-interval 15)
+(validate-setq modelinepos-column-limit 72)
 
 (use-package modeline-posn
-  :ensure modeline-posn
+  :ensure t
   :config
   (progn
     (set-face-foreground 'modelinepos-column-warning "grey20")
     (set-face-background 'modelinepos-column-warning "red")
-    (setq modelinepos-column-limit 72))
+    (validate-setq modelinepos-column-limit 72))
   )
 #+END_SRC
 
@@ -336,7 +400,7 @@ see. So lets hide those. There are two ways, one of them uses diminish
 to get entirely rid of some modes, the other is a function taken from
 "Mastering Emacs" which replaces the modes text with an own (set of)
 character(s).
-#+BEGIN_SRC emacs-lisp :tangle yes
+#+BEGIN_SRC emacs-lisp
   (require 'diminish)
   (diminish 'auto-fill-function)
   (defvar mode-line-cleaner-alist
@@ -370,7 +434,7 @@ character(s).
   ☃⌕☥
   ")
 
-  (add-hook 'after-change-major-mode-hook 'clean-mode-line)
+;  (add-hook 'after-change-major-mode-hook 'clean-mode-line)
 
 #+END_SRC
 Unfortunately icicles breaks this with the way it adds/removes itself,
@@ -382,1381 +446,1890 @@ be org-mode - it is just so much better to use. And does sensible things
 with many README files out there, and various other "crap" you get to
 read in emacs.
 #+BEGIN_SRC emacs-lisp :tangle yes
-(setq major-mode 'org-mode)
-(setq initial-major-mode 'org-mode)
+(setq-default major-mode 'org-mode)
+#+END_SRC
+#+BEGIN_SRC emacs-lisp :tangle no
+(validate-setq initial-major-mode 'org-mode)
 #+END_SRC
 
 *** Shell
 [2013-04-23 Tue 16:43]
 Shell. zsh in my case.
-#+BEGIN_SRC emacs-lisp :tangle yes
-(setq shell-file-name "zsh")
-(setq shell-command-switch "-c")
-(setq explicit-shell-file-name shell-file-name)
-(setenv "SHELL" shell-file-name)
-(setq explicit-sh-args '("-login" "-i"))
-(add-hook 'shell-mode-hook 'ansi-color-for-comint-mode-on)
-(setq comint-scroll-to-bottom-on-input t)  ; always insert at the bottom
-(setq comint-scroll-to-bottom-on-output t) ; always add output at the bottom
-(setq comint-scroll-show-maximum-output t) ; scroll to show max possible output
-(setq comint-completion-autolist t)        ; show completion list when ambiguous
-(setq comint-input-ignoredups t)           ; no duplicates in command history
-(setq comint-completion-addsuffix t)       ; insert space/slash after file completion
-#+END_SRC
-
-*** Emacs shell
-Basic settings for emacs integrated shell
-#+BEGIN_SRC emacs-lisp :tangle yes
-(use-package eshell
-  :defer t
-  :init
-  (progn
-    (defun eshell-initialize ()
-      (defun eshell-spawn-external-command (beg end)
-        "Parse and expand any history references in current input."
-        (save-excursion
-          (goto-char end)
-          (when (looking-back "&!" beg)
-            (delete-region (match-beginning 0) (match-end 0))
-            (goto-char beg)
-            (insert "spawn "))))
-      (add-hook 'eshell-expand-input-functions 'eshell-spawn-external-command)
-      (eval-after-load "em-unix"
-        '(progn
-           (unintern 'eshell/su)
-           (unintern 'eshell/sudo))))
-    (add-hook 'eshell-first-time-mode-hook 'eshell-initialize)
-
-    )
-  :config
-  (progn
-    (require 'em-cmpl)
-    (require 'em-prompt)
-    (require 'em-term)
-    (use-package f
-      :ensure f)
-    (setq eshell-cmpl-cycle-completions nil
-          eshell-save-history-on-exit t
-          eshell-cmpl-dir-ignore "\\`\\(\\.\\.?\\|CVS\\|\\.svn\\|\\.git\\)/\\'")
-    (setenv "PAGER" "cat")
-    (setq eshell-visual-commands
-          '("less" "tmux" "htop" "top" "bash" "zsh" "tail"))
-    (setq eshell-visual-subcommands
-          '(("git" "log" "l" "diff" "show")))
-
-    (add-to-list 'eshell-command-completions-alist
-                 '("gunzip" "gz\\'"))
-    (add-to-list 'eshell-command-completions-alist
-                 '("tar" "\\(\\.tar|\\.tgz\\|\\.tar\\.gz\\)\\'"))
-
-    ;(set-face-attribute 'eshell-prompt nil :foreground "turquoise1")
-    (add-hook 'eshell-mode-hook ;; for some reason this needs to be a hook
-              '(lambda () (define-key eshell-mode-map "\C-a" 'eshell-bol)))
-    (add-hook 'eshell-preoutput-filter-functions
-              'ansi-color-filter-apply)
-    ;; Prompt with a bit of help from http://www.emacswiki.org/emacs/EshellPrompt
+#+BEGIN_SRC emacs-lisp
+  (use-package shell
+    :commands (shell)
+    :defer t
+    :config
+    (progn
+       (validate-setq shell-file-name "zsh")
+       (validate-setq shell-command-switch "-c")
+       (validate-setq explicit-shell-file-name shell-file-name)
+       (setenv "SHELL" shell-file-name)
+       (setq explicit-sh-args '("-login" "-i"))
+       (add-hook 'shell-mode-hook 'ansi-color-for-comint-mode-on)
+       (validate-setq comint-scroll-to-bottom-on-input t)  ; always insert at the bottom
+       (validate-setq comint-scroll-to-bottom-on-output t) ; always add output at the bottom
+       (validate-setq comint-scroll-show-maximum-output t) ; scroll to show max possible output
+       (validate-setq comint-completion-autolist t)        ; show completion list when ambiguous
+       (validate-setq comint-input-ignoredups t)           ; no duplicates in command history
+       (validate-setq comint-completion-addsuffix t)       ; insert space/slash after file completion
+       (validate-setq comint-buffer-maximum-size 20000)    ; max lenght of the buffer in lines
+       (validate-setq comint-prompt-read-only nil)         ; if this is t, it breaks shell-command
+       ))
+#+END_SRC
+*** Keyboard related changes
+**** Cycle Spacing
+This lets M-SPC cycle through spacing, that is
+1. replace all spaces with a single space
+2. remove all spaces
+3. restore the original spacing
+#+BEGIN_SRC emacs-lisp :tangle yes
+(bind-key "M-SPC" 'cycle-spacing)
+#+END_SRC
+**** Toggle/Cycle letter case
+[2015-05-22 Fri 22:42]
+
+This is from [[http://ergoemacs.org/emacs/modernization_upcase-word.html][Emacs: Toggle/Cycle Letter Case]]
+
+Emacs has several user level commands for changing letter case. They
+are: upcase-word 【Alt+u】, downcase-word 【Alt+l】, capitalize-word
+【Alt+c】.
+
+There are also “region” versions for each: upcase-region 【Ctrl+x
+Ctrl+u】, downcase-region 【Ctrl+x Ctrl+l】, capitalize-region, and
+also upcase-initials-region. (Note: for elisp programing, there are
+also these functions: upcase, capitalize, downcase, upcase-initials.)
+
+One problem with these commands is that you need to move your cursor
+to the beginning of the word first. For example, if you have the text
+“THat”, and your cursor is on the “a”, and you call downcase-word, but
+it doesn't do anything because it only start at the cursor point to
+end of word. It would be nice if it'll just automatically perform the
+operation on the whole word.
+
+Another problem is that it does not consider the final result. For
+example, if you have “oncE upon a time …”, and you select the whole
+sentence and call upcase-initials-region, it becomes “OncE Upon A Time
+…”. Note the capital E is not automatically lowered. For elisp
+programing, the orthogonal precision is nice, but as user commands, it
+is better to change the whole sentence.
+
+Also, these commands have a “-word” and “-region” variants, great for
+precision in elisp programing but not smart as user commands. It would
+be nice if emacs automatically choose the right command depending
+whether there is text selection.
+#+BEGIN_SRC emacs-lisp :tangle yes
+(bind-key "M-c" 'toggle-letter-case)
+#+END_SRC
+**** Faster pop-to-mark command
+[2015-12-22 Di 14:56]
+From [[http://endlessparentheses.com/faster-pop-to-mark-command.html?source=rss][Endless Parentheses]], a nice way to pop back in the marks.
+#+BEGIN_SRC emacs-lisp :tangle yes
+;; When popping the mark, continue popping until the cursor
+;; actually moves
+(defadvice pop-to-mark-command (around ensure-new-position activate)
+  (let ((p (point)))
+    (dotimes (i 10)
+      (when (= p (point)) ad-do-it))))
+(validate-setq set-mark-command-repeat-pop t)
+#+END_SRC
+**** Don't kill-buffer, kill-this-buffer instead
+From [[http://pragmaticemacs.com/emacs/dont-kill-buffer-kill-this-buffer-instead/][Pragmatic Emacs]]: By default C-x k runs the command kill-buffer
+which prompts you for which buffer you want to kill, defaulting to the
+current active buffer. I don’t know about you, but I rarely want to
+kill a different buffer than the one I am looking at, so I rebind C-x
+k to kill-this-buffer which just kills the current buffer without
+prompting (unless there are unsaved changes).
+#+BEGIN_SRC emacs-lisp :tangle yes
+(global-set-key (kbd "C-x k") 'kill-this-buffer)
+#+END_SRC
+**** Bind sort-lines
+[2016-10-25 Di 13:38]
+Its really helpful, but doesn't seem to have a default keybinding, so
+make up our own.
+#+BEGIN_SRC emacs-lisp
+(bind-key "C-c C-s" 'sort-lines)
+#+END_SRC
+*** Don't query to kill processes at exit
+[2016-10-03 Mo 14:05]
+The variable at t (its default) lets emacs query before killing
+processes when exiting.
+#+BEGIN_SRC emacs-lisp :tangle yes
+  ;;(validate-setq confirm-kill-processes nil)
+  (validate-setq kill-buffer-query-functions
+                 (delq 'process-kill-buffer-query-function kill-buffer-query-functions))
+#+END_SRC
+** Miscellaneous stuff
+Searches and matches should ignore case.
+#+BEGIN_SRC emacs-lisp
+(setq-default case-fold-search t)
+#+END_SRC
 
-    (defmacro with-face (str &rest properties)
-      `(propertize ,str 'face (list ,@properties)))
+Which buffers to get rid off at midnight.
+#+BEGIN_SRC emacs-lisp
+  (use-package midnight
+    :ensure t
+    :config
+    (progn
+      (validate-setq clean-buffer-list-kill-buffer-names (quote ("*Help*" "*Apropos*"
+                                                                 "*Man " "*Buffer List*"
+                                                                 "*Compile-Log*"
+                                                                 "*info*" "*vc*"
+                                                                 "*vc-diff*" "*diff*"
+                                                                 "*Customize"
+                                                                 "*tramp/" "*debug "
+                                                                 "*magit" "*Calendar")))
+      (midnight-delay-set 'midnight-delay 16200)
+      ))
+#+END_SRC
 
-    (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))))
+Don't display a cursor in non-selected windows.
+#+BEGIN_SRC emacs-lisp
+(setq-default cursor-in-non-selected-windows nil)
+#+END_SRC
 
-    (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"))
-         " ")))
+What should be displayed in the mode-line for files with those types
+of line endings.
+#+BEGIN_SRC emacs-lisp
+(validate-setq eol-mnemonic-dos "(DOS)")
+(validate-setq eol-mnemonic-mac "(Mac)")
+#+END_SRC
 
-    (setq eshell-prompt-function 'eshell/my-prompt)
-    (setq eshell-highlight-prompt nil)
-    (setq eshell-prompt-regexp "^[^#$\n]+[#$] ")))
+#+BEGIN_SRC emacs-lisp
+(validate-setq max-lisp-eval-depth 1000)
+(validate-setq max-specpdl-size 3000)
 #+END_SRC
 
-*** Isearch related
-Incremental search is great, but annoyingly you need to type whatever
-you want. If you want to search for just the next (or previous)
-occurence of what is at your cursor position use the following.
-*C-x* will insert the current word while *M-up* and *M-down* will just
-jump to the next/previous occurence of it.
-#+BEGIN_SRC emacs-lisp :tangle yes
-(bind-key "C-x" 'sacha/isearch-yank-current-word isearch-mode-map)
-(bind-key* "<M-up>" 'sacha/search-word-backward)
-(bind-key* "<M-down>" 'sacha/search-word-forward)
+Unfill paragraph
+From https://raw.github.com/qdot/conf_emacs/master/emacs_conf.org
+#+BEGIN_SRC emacs-lisp
+(defun unfill-paragraph ()
+  "Takes a multi-line paragraph and makes it into a single line of text."
+  (interactive)
+  (let ((fill-column (point-max)))
+    (fill-paragraph nil)))
+(bind-key "H-u" 'unfill-paragraph)
 #+END_SRC
 
-*** Frame configuration
-I want to see the buffername and its size, not the host I am on in my
-frame title.
-#+BEGIN_SRC emacs-lisp :tangle yes
-(setq frame-title-format "%b (%i)")
+#+BEGIN_SRC emacs-lisp
+(setq-default indicate-empty-lines t)
+(validate-setq sentence-end-double-space nil)
 #+END_SRC
 
-*** Protect some buffers
-I don't want some buffers to be killed, **scratch** for example.
-In the past I had a long function that just recreated them, but the
-=keep-buffers= package is easier.
-#+BEGIN_SRC emacs-lisp :tangle yes
-(use-package keep-buffers
-  :init
-  (progn
-    (keep-buffers-mode 1)
-    (push '("\\`*scratch" . erase) keep-buffers-protected-alist)
-    (push '("\\`*Org Agenda" . nil) keep-buffers-protected-alist)
-    (push '("\\`*Group" . nil) keep-buffers-protected-alist)
-    ))
+Hilight annotations in comments, like FIXME/TODO/...
+#+BEGIN_SRC emacs-lisp :tangle no
+(add-hook 'prog-mode-hook 'font-lock-comment-annotations)
 #+END_SRC
 
-*** yes-or-no-p
-Emas usually wants you to type /yes/ or /no/ fully. What a mess, I am
-lazy.
+Wait a bit longer before considering emacs idle
 #+BEGIN_SRC emacs-lisp :tangle yes
-(defalias 'yes-or-no-p 'y-or-n-p)
+(validate-setq idle-update-delay 2)
 #+END_SRC
 
-*** Language/i18n stuff
-In this day and age, UTF-8 is the way to go.
+Make gnutls a bit safer, the default is an absurdly low 256
 #+BEGIN_SRC emacs-lisp :tangle yes
-(set-language-environment 'utf-8)
-(set-default-coding-systems 'utf-8)
-(set-terminal-coding-system 'utf-8)
-(set-keyboard-coding-system 'utf-8)
-(set-clipboard-coding-system 'utf-8)
-(prefer-coding-system 'utf-8)
-(set-charset-priority 'unicode)
-(setq default-process-coding-system '(utf-8-unix . utf-8-unix))
+(validate-setq gnutls-min-prime-bits 4096)
 #+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.
+Emacs defaults to using --insecure - and supporting ssl3. No thanks.
 #+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)
-      )
-    )
-  )
-#+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.
-(Update 30.05.2014: Not used ever, deactivated)
-#+BEGIN_SRC emacs-lisp :tangle no
-(bind-key "C-c k" 'prelude-kill-other-buffers)
+(setq tls-program
+      ;; Defaults:
+      ;; '("gnutls-cli --insecure -p %p %h"
+      ;;   "gnutls-cli --insecure -p %p %h --protocols ssl3"
+      ;;   "openssl s_client -connect %h:%p -no_ssl2 -ign_eof")
+      '("gnutls-cli -p %p %h"
+        "openssl s_client -connect %h:%p -no_ssl2 -no_ssl3 -ign_eof"))
 #+END_SRC
-*** Scrolling
-Default scrolling behaviour in emacs is a bit annoying, who wants to
-jump half-windows?
+Resolve symlinks without asking
 #+BEGIN_SRC emacs-lisp :tangle yes
-(setq scroll-margin 0)
-(setq scroll-conservatively 100000)
-(setq scroll-up-aggressively 0.0)
-(setq scroll-down-aggressively 0.0)
-(setq scroll-preserve-screen-position t)
+(setq-default find-file-visit-truename t)
 #+END_SRC
-
-*** Copy/Paste with X
-[2013-04-09 Di 23:31]
-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-default bidi-display-reordering nil)
 #+END_SRC
 
-*** Global keyboard changes not directly related to a mode
-Disable /suspend_frame/ function, I dislike it.
-#+BEGIN_SRC emacs-lisp :tangle yes
-(unbind-key "C-z")
-(unbind-key "C-x C-z")
+*** Browser
+#+BEGIN_SRC emacs-lisp
+  (use-package browse-url
+    :ensure t
+    :commands (browse-url)
+    :config
+    (progn
+      (validate-setq browse-url-browser-function (quote browse-url-generic))
+      (validate-setq browse-url-generic-program "/usr/bin/x-www-browser")))
 #+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
-(defun kill-entire-line ()
-  "Kill this entire line (including newline), regardless of where point is within the line."
-  (interactive)
-  (beginning-of-line)
-  (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)
+*** When saving a script - make it executable
+#+BEGIN_SRC emacs-lisp
+(add-hook 'after-save-hook 'executable-make-buffer-file-executable-if-script-p)
 #+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
-(defun jj-org-kill-line (&optional arg)
-  "Kill the entire line, regardless of where point is within the line, org-mode-version"
-  (interactive "P")
-  (beginning-of-line)
-  (org-kill-line arg)
-  (back-to-indentation)
-  )
-#+END_SRC
-
-I really hate tabs, so I don't want any indentation to try using them.
-And in case a project really needs them, I can change it just for that
-file/project, but luckily none of those I work in is as broken.
-#+BEGIN_SRC emacs-lisp :tangle yes
-(setq-default indent-tabs-mode nil)
+*** Emacs Server
+#+BEGIN_SRC emacs-lisp
+(use-package server
+  :init
+  (progn
+    (add-hook 'after-init-hook 'server-start)))
 #+END_SRC
-
-Make the % key jump to the matching {}[]() if on another, like vi, see [[id:b6e6cf73-9802-4a7b-bd65-fdb6f9745319][the function]]
-#+BEGIN_SRC emacs-lisp :tangle yes
-(bind-key* "M-5" 'match-paren)
+**** Edit-server for chromium extension "Edit with emacs"
+[2015-10-15 Thu 22:32]
+#+BEGIN_SRC emacs-lisp
+(use-package edit-server
+  :config
+  (progn
+    (validate-setq edit-server-new-frame nil)
+    (edit-server-start)))
 #+END_SRC
+** Customized variables
+[2013-05-02 Thu 22:14]
+The following contains a set of variables i may reasonably want to
+change on other systems - which don't affect the init file loading
+process. So I *can* use the customization interface for it...
+#+BEGIN_SRC emacs-lisp
+(defgroup ganneff nil
+  "Modify ganneffs settings"
+  :group 'environment)
 
-Instead of the default "mark-defun" I want a more readline-like setting.
-#+BEGIN_SRC emacs-lisp :tangle yes
-(bind-key "C-M-h" 'backward-kill-word)
-#+END_SRC
+(defgroup ganneff-org-mode nil
+  "Ganneffs org-mode settings"
+  :tag "Ganneffs org-mode settings"
+  :group 'ganneff
+  :link '(custom-group-link "ganneff"))
 
-Align whatever with a regexp.
-#+BEGIN_SRC emacs-lisp :tangle yes
-(bind-key "C-x \\" 'align-regexp)
-#+END_SRC
+(defcustom bh/organization-task-id "d0db0d3c-f22e-42ff-a654-69524ff7cc91"
+  "ID of the organization task."
+  :tag "Organization Task ID"
+  :type 'string
+  :group 'ganneff-org-mode)
 
-Font size changes
-#+BEGIN_SRC emacs-lisp :tangle yes
-(bind-key "C-+" 'text-scale-increase)
-(bind-key "C--" 'text-scale-decrease)
+(defcustom org-my-archive-expiry-days 2
+  "The number of days after which a completed task should be auto-archived.
+This can be 0 for immediate, or a floating point value."
+  :tag "Archive expiry days"
+  :type 'float
+  :group 'ganneff-org-mode)
 #+END_SRC
 
-Regexes are too useful, so use the regex search by default.
-#+begin_src emacs-lisp
-(bind-key "C-s"   'isearch-forward-regexp)
-(bind-key "C-r"   'isearch-backward-regexp)
-(bind-key "C-M-s" 'isearch-forward)
-(bind-key "C-M-r" 'isearch-backward)
-#+end_src
-
-Rgrep is infinitely useful in multi-file projects.
-#+begin_src emacs-lisp
-(bind-key "C-x C-g" 'rgrep)
-#+end_src
 
-Easy way to move a line up - or down. Simpler than dealing with C-x C-t
-AKA transpose lines.
-#+BEGIN_SRC emacs-lisp :tangle yes
-(bind-key "<M-S-up>"  'move-line-up)
-(bind-key "<M-S-down>" 'move-line-down)
+** Compatibility
+[2013-05-21 Tue 23:22]
+Restore removed var alias, used by ruby-electric-brace and others
+#+BEGIN_SRC emacs-lisp
+(unless (boundp 'last-command-char)
+  (defvaralias 'last-command-char 'last-command-event))
 #+END_SRC
+* Customized variables
+:PROPERTIES:
+:ID: 0102208d-fdf6-4928-9e40-7e341bd3aa3a
+:END:
+Of course I want to be able to use the customize interface, and some
+things can only be set via it (or so they say). I usually prefer to put
+things I keep for a long while into statements somewhere else, not just
+custom-set here, but we need it anyways.
 
-"Pull" lines up, join them
-#+BEGIN_SRC emacs-lisp :tangle yes
-(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)
+#+BEGIN_SRC emacs-lisp
+(validate-setq custom-file jj-custom-file)
+(safe-load custom-file)
 #+END_SRC
 
-When I press Enter I almost always want to go to the right indentation on the next line.
-#+BEGIN_SRC emacs-lisp :tangle yes
-(bind-key "RET" 'newline-and-indent)
-#+END_SRC
+The source of this is:
+#+INCLUDE: "~/.emacs.d/config/customized.el" src emacs-lisp
+* 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
+(use-package abbrev
+  :commands abbrev-mode
+  :diminish abbrev-mode
+  :config
+  (progn
+    (validate-setq save-abbrevs 'silently)
+    (validate-setq abbrev-file-name (expand-file-name "abbrev_defs" jj-cache-dir))
+    (if (file-exists-p abbrev-file-name)
+        (quietly-read-abbrev-file))
 
-Easier undo, and i don't need suspend-frame
-#+BEGIN_SRC emacs-lisp :tangle yes
-(bind-key "C-z" 'undo)
+    (hook-into-modes #'abbrev-mode '(text-mode-hook))
+    (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
-
-Window switching, go backwards. (C-x o goes to the next window)
-#+BEGIN_SRC emacs-lisp :tangle yes
-(bind-key "C-x O" (lambda ()
-                    (interactive)
-                    (other-window -1)))
+** autocorrect
+[2016-02-15 Mon 22:19]
+See [[http://endlessparentheses.com/ispell-and-abbrev-the-perfect-auto-correct.html][Ispell and Abbrev, the Perfect Auto-Correct]].
+#+BEGIN_SRC emacs-lisp
+(define-key ctl-x-map "\C-i"
+  #'endless/ispell-word-then-abbrev)
+
+(defun endless/ispell-word-then-abbrev (p)
+  "Call `ispell-word', then create an abbrev for it.
+With prefix P, create local abbrev. Otherwise it will
+be global.
+If there's nothing wrong with the word at point, keep
+looking for a typo until the beginning of buffer. You can
+skip typos you don't want to fix with `SPC', and you can
+abort completely with `C-g'."
+  (interactive "P")
+  (let (bef aft)
+    (save-excursion
+      (while (if (validate-setq bef (thing-at-point 'word))
+                 ;; Word was corrected or used quit.
+                 (if (ispell-word nil 'quiet)
+                     nil ; End the loop.
+                   ;; Also end if we reach `bob'.
+                   (not (bobp)))
+               ;; If there's no word at point, keep looking
+               ;; until `bob'.
+               (not (bobp)))
+        (backward-word))
+      (validate-setq aft (thing-at-point 'word)))
+    (if (and aft bef (not (equal aft bef)))
+        (let ((aft (downcase aft))
+              (bef (downcase bef)))
+          (define-abbrev
+            (if p local-abbrev-table global-abbrev-table)
+            bef aft)
+          (message "\"%s\" now expands to \"%s\" %sally"
+                   bef aft (if p "loc" "glob")))
+      (user-error "No typo at or before point"))))
+
+(validate-setq save-abbrevs 'silently)
+(setq-default abbrev-mode t)
+#+END_SRC
+** avy-mode
+[2013-04-28 So 11:26]
+avy is a GNU Emacs package for jumping to visible text using a char-based decision tree.
+#+BEGIN_SRC emacs-lisp
+(use-package avy
+  :ensure avy
+  :commands (avy-goto-char avy-goto-char-2 avy-goto-line avy-goto-word-1 avy-goto-word-0 avy-isearch avy-goto-subword-0 avy-goto-subword-1 avy-copy-line avy-copy-region avy-move-line)
+  :bind (("H-SPC" . avy-goto-char-2)
+         ("M-g g" . avy-goto-line)
+         )
+  :config
+  (progn
+    (bind-key "C-y" 'avy-isearch isearch-mode-map)
+    (validate-setq avy-all-windows 'all-frames)
+    (validate-setq avi-keys '(?a ?s ?d ?e ?f ?h ?j ?k ?l ?n ?m ?v ?r ?u) )
+    )
+)
 #+END_SRC
-
-Edit file as root
-#+BEGIN_SRC emacs-lisp :tangle yes
-(bind-key "C-x C-r" 'prelude-sudo-edit)
+** ace-window
+[2013-04-21 So 20:27]
+Use H-w to switch windows
+#+BEGIN_SRC emacs-lisp
+(use-package ace-window
+  :ensure ace-window
+  :commands ace-window
+  :bind ("H-w" . ace-window)
+  :config
+  (progn
+    (validate-setq aw-keys '(?a ?s ?d ?f ?j ?k ?l))
+    ))
 #+END_SRC
-
-M-space is bound to just-one-space, which is great for programming. What
-it does is remove all spaces around the cursor, except for one. But to
-be really useful, it also should include newlines. It doesn’t do this by
-default. Rather, you have to call it with a negative argument. Sure
-not, bad Emacs.
-#+BEGIN_SRC emacs-lisp :tangle yes
-(bind-key "M-SPC" 'just-one-space-with-newline)
+** 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
+(use-package aggressive-indent
+  :ensure aggressive-indent
+  :commands (aggressive-indent-mode global-aggressive-indent-mode)
+  :config
+  (progn
+    (global-aggressive-indent-mode 0)
+    (validate-setq aggressive-indent-comments-too 0)
+    (add-to-list 'aggressive-indent-excluded-modes 'html-mode)
+    ))
 #+END_SRC
-
-Count which commands I use how often.
-#+BEGIN_SRC emacs-lisp :tangle yes
-(use-package keyfreq
-  :ensure keyfreq
+** 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
+(use-package anzu
+  :ensure anzu
+  :diminish anzu-mode
+  :defer t
+  :config
+  (progn
+    (validate-setq anzu-search-threshold 1000)
+    (global-anzu-mode 1)
+    (set-face-attribute 'anzu-mode-line nil :foreground "yellow" :weight 'bold)))
+#+END_SRC
+** ascii
+[2014-05-21 Wed 00:33]
+#+BEGIN_SRC emacs-lisp
+(use-package ascii
+  :ensure t
+  :commands (ascii-on ascii-toggle ascii-display)
+  :bind (("C-c e A" . ascii-toggle))
   :init
   (progn
-    (setq keyfreq-file (expand-file-name "keyfreq" jj-cache-dir))
-    (setq keyfreq-file-lock (expand-file-name "keyfreq.lock" jj-cache-dir))
-    (keyfreq-mode 1)
-    (keyfreq-autosave-mode 1)))
+    (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
+** auctex
+#+BEGIN_SRC emacs-lisp :tangle no
+(validate-setq auto-mode-alist (cons '("\\.tex\\'" . latex-mode) auto-mode-alist))
+(validate-setq TeX-auto-save t)
+(validate-setq TeX-parse-self t)
+(validate-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
+(use-package auto-complete-config
+  :ensure auto-complete
+  :config
+  (progn
+    (ac-config-default)
+    ;; 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)))
 
-Duplicate current line
-#+BEGIN_SRC emacs-lisp :tangle yes
-(defun duplicate-line ()
-  "Insert a copy of the current line after the current line."
-  (interactive)
-  (save-excursion
-    (let ((line-text (buffer-substring-no-properties
-                      (line-beginning-position)
-                      (line-end-position))))
-      (move-end-of-line 1)
-      (newline)
-      (insert line-text))))
+    (use-package pos-tip
+      :ensure t)
 
-(bind-key "C-c p" 'duplicate-line)
-#+END_SRC
+    ;; 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)
 
-Smarter move to the beginning of the line. That is, it first moves to
-the beginning of the line - and on second keypress it goes to the
-first character on line.
-#+BEGIN_SRC emacs-lisp :tangle yes
-(defun smarter-move-beginning-of-line (arg)
-  "Move point back to indentation of beginning of line.
+    (validate-setq ac-comphist-file (expand-file-name "ac-comphist.dat" jj-cache-dir))
+    (validate-setq ac-use-comphist t)
+    (validate-setq ac-expand-on-auto-complete nil)
+    (validate-setq ac-dwim t)
+    (validate-setq ac-auto-start 3)
+    (validate-setq ac-delay 0.3)
+    (validate-setq ac-menu-height 15)
+    (validate-setq ac-quick-help-delay 0.5)
+    (validate-setq ac-use-fuzzy t)
 
-Move point to the first non-whitespace character on this line.
-If point is already there, move to the beginning of the line.
-Effectively toggle between the first non-whitespace character and
-the beginning of the line.
+    (ac-flyspell-workaround)
 
-If ARG is not nil or 1, move forward ARG - 1 lines first.  If
-point reaches the beginning or end of the buffer, stop there."
-  (interactive "^p")
-  (setq arg (or arg 1))
+    ;; use 't when auto-complete is disabled
+    (validate-setq tab-always-indent 'complete)
+    (add-to-list 'completion-styles 'initials t)
 
-  ;; Move lines first
-  (when (/= arg 1)
-    (let ((line-move-visual nil))
-      (forward-line (1- arg))))
+     ;; 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)
 
-  (let ((orig-point (point)))
-    (back-to-indentation)
-    (when (= orig-point (point))
-      (move-beginning-of-line 1))))
+    (add-hook 'auto-complete-mode-hook 'set-auto-complete-as-completion-at-point-function)
 
-;; remap C-a to `smarter-move-beginning-of-line'
-(global-set-key [remap move-beginning-of-line]
-                'smarter-move-beginning-of-line)
+    ;; Exclude very large buffers from dabbrev
+    (setq dabbrev-friend-buffer-function 'sanityinc/dabbrev-friend-buffer)
 
-#+END_SRC
+    (use-package ac-dabbrev
+      :ensure t)
 
-Easily copy characters from the previous nonblank line, starting just
-above point. With a prefix argument, only copy ARG characters (never
-past EOL), no argument copies rest of line.
-#+BEGIN_SRC emacs-lisp :tangle yes
-(require 'misc)
-(bind-key "H-y" 'copy-from-above-command)
-#+END_SRC
+    (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))
 
-Open a new X Terminal pointing to the directory of the current
-buffers path.
-#+BEGIN_SRC emacs-lisp :tangle yes
-(bind-key "H-t" 'jj-open-shell)
-#+END_SRC
+    (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))
 
-Align code
-#+BEGIN_SRC emacs-lisp :tangle yes
-(bind-key "H-a" 'align-code)
-#+END_SRC
+    (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)))
 
-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)
+** 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
+(use-package autorevert
+  :commands auto-revert-mode
+  :diminish auto-revert-mode
+  :config
+  (progn
+    (validate-setq global-auto-revert-mode t)
+    (validate-setq global-auto-revert-non-file-buffers t)
+    (global-auto-revert-mode)))
 #+END_SRC
 
-Clean all whitespace stuff
-#+BEGIN_SRC emacs-lisp :tangle yes
-(bind-key "H-w" 'whitespace-cleanup)
-#+END_SRC
+** 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
+(use-package backups-mode
+  :load-path "elisp/backups-mode"
+  :disabled t
+  :bind   (("\C-cv" . save-version)
+           ("\C-cb" . list-backups)
+           ("\C-ck" . kill-buffer-prompt)
+           ("\C-cw" . backup-walker-start))
+  :init
+  (progn
+    (validate-setq backup-directory jj-backup-directory)
+;    (validate-setq tramp-backup-directory (concat jj-backup-directory "/tramp"))
+;    (if (not (file-exists-p tramp-backup-directory))
+;        (make-directory tramp-backup-directory))
+;    (validate-setq tramp-backup-directory-alist `((".*" . ,tramp-backup-directory)))
+    (validate-setq backup-directory-alist `(("." . ,jj-backup-directory)))
+    (validate-setq auto-save-list-file-prefix (concat jj-backup-directory ".auto-saves-"))
+    (validate-setq auto-save-file-name-transforms `((".*" ,jj-backup-directory t)))
+
+    (validate-setq version-control t)     ;; Use version numbers for backups
+    (validate-setq kept-new-versions 10)  ;; Number of newest versions to keep
+    (validate-setq kept-old-versions 2)   ;; Number of oldest versions to keep
+    (validate-setq delete-old-versions t) ;; Ask to delete excess backup versions?
+    (validate-setq backup-by-copying t)
+    (validate-setq backup-by-copying-when-linked t) ;; Copy linked files, don't rename.
+    (validate-setq make-backup-files t)
 
-Comment/Uncomment
-#+BEGIN_SRC emacs-lisp :tangle yes
-(bind-key "H-c" 'comment-dwim)
-#+END_SRC
+    (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)
 
-Show keystrokes in progress
-#+BEGIN_SRC emacs-lisp :tangle yes
-(setq echo-keystrokes 0.1)
-#+END_SRC
-**** Overwrite mode
-Usually you can press the *Ins*ert key, to get into overwrite mode. I
-don't like that, have broken much with it and so just forbid it by
-disabling that.
-#+BEGIN_SRC emacs-lisp :tangle yes
-(unbind-key "<insert>")
-(unbind-key "<kp-insert>")
-#+END_SRC
+    (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)
 
-*** Easily navigate sillyCased words
-#+BEGIN_SRC emacs-lisp :tangle yes
-(global-subword-mode 1)
-#+END_SRC
-*** Delete file of current buffer, then kill buffer
-[2014-06-14 Sat 23:03]
-#+BEGIN_SRC emacs-lisp :tangle yes
-(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)))))
+    (defun kill-buffer-prompt ()
+      "Allows one to kill a buffer without saving it.
+This is necessary since once you start backups-mode all file based buffers
+are saved automatically when they are killed"
+      (interactive)
+      (if (and (buffer-modified-p) (buffer-file-name) (file-exists-p (buffer-file-name)) (y-or-n-p "Save buffer?"))
+          (save-buffer)
+        (set-buffer-modified-p nil))
+      (kill-buffer))
 
-(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)))))))
+    (validate-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-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)
+** browse-kill-ring
+[2014-12-11 Thu 11:31]
+#+BEGIN_SRC emacs-lisp
+(use-package browse-kill-ring
+  :ensure t
+  :commands (browse-kill-ring browse-kill-ring-mode)
+  :bind ("M-y" . browse-kill-ring)
+  )
 #+END_SRC
-** Miscellaneous stuff
-
-Searches and matches should ignore case.
-#+BEGIN_SRC emacs-lisp :tangle yes
-(setq-default case-fold-search t)
+** calendar
+[2014-06-10 Tue 22:20]
+#+BEGIN_SRC emacs-lisp
+(use-package calendar
+  :commands (cal/insert)
+  :bind ("C-c c" . cal/insert)
+  :config
+  (progn
+    ; Weeks start on Monday, not sunday.
+    (validate-setq calendar-week-start-day 1)
+    (validate-setq calendar-date-style 'european)
+
+    ; 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)
+    (validate-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)
+    (validate-setq calendar-intermonth-header
+          (propertize "Wk"                  ; or e.g. "KW" in Germany
+                      'font-lock-face 'calendar-iso-week-header-face))))
+
+#+END_SRC
+** corral
+[2015-10-15 Thu 11:34]
+Corral is a lightweight package that lets you quickly wrap parentheses
+and other delimiters around text, intuitively surrounding what you
+want it to using just two commands.
+#+BEGIN_SRC emacs-lisp
+(use-package corral
+  :ensure corral
+  :config
+  (progn
+    ; Interpret # and * as part of the word
+    (validate-setq corral-syntax-entries '((?# "_")
+                                  (?* "_")
+                                  (?$ ".")
+                                  (?/ ".")))
+    (defhydra hydra-corral (:columns 4)
+      "Corral"
+      ("(" corral-parentheses-backward "Back")
+      (")" corral-parentheses-forward "Forward")
+      ("[" corral-brackets-backward "Back")
+      ("]" corral-brackets-forward "Forward")
+      ("{" corral-braces-backward "Back")
+      ("}" corral-braces-forward "Forward")
+      ("\"" corral-double-quotes-backward "Back")
+      ("2" corral-double-quotes-forward "Forward")
+      ("'" corral-single-quotes-backward "Back")
+      ("#" corral-single-quotes-forward "Forward")
+      ("." hydra-repeat "Repeat"))
+    (bind-key "C-c c" 'hydra-corral/body)
+    ))
 #+END_SRC
-
-Which buffers to get rid off at midnight.
-#+BEGIN_SRC emacs-lisp :tangle yes
-(setq clean-buffer-list-kill-buffer-names (quote ("*Help*" "*Apropos*"
-                                                  "*Man " "*Buffer List*"
-                                                  "*Compile-Log*"
-                                                  "*info*" "*vc*"
-                                                  "*vc-diff*" "*diff*"
-                                                  "*Customize"
-                                                  "*tramp/" "*debug "
-                                                  "*magit" "*Calendar")))
+** crontab-mode
+[2013-05-21 Tue 23:18]
+#+BEGIN_SRC emacs-lisp
+(use-package crontab-mode
+  :ensure crontab-mode
+  :commands crontab-mode
+  :mode ("\\.?cron\\(tab\\)?\\'" . crontab-mode))
 #+END_SRC
 
-Don't display a cursor in non-selected windows.
-#+BEGIN_SRC emacs-lisp :tangle yes
-(setq-default cursor-in-non-selected-windows nil)
+** 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
 
-What should be displayed in the mode-line for files with those types
-of line endings.
-#+BEGIN_SRC emacs-lisp :tangle yes
-(setq eol-mnemonic-dos "(DOS)")
-(setq eol-mnemonic-mac "(Mac)")
+** 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
+(cua-mode t)
+(validate-setq cua-enable-cua-keys (quote shift))
 #+END_SRC
 
-Much larger threshold for garbage collection prevents it to run too often.
-#+BEGIN_SRC emacs-lisp :tangle yes
-(setq gc-cons-threshold 48000000)
+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
+(cua-selection-mode t)
 #+END_SRC
 
-#+BEGIN_SRC emacs-lisp :tangle yes
-(setq max-lisp-eval-depth 1000)
-(setq max-specpdl-size 3000)
-#+END_SRC
+** Debian related
+#+BEGIN_SRC emacs-lisp
+  (require 'dpkg-dev-el-loaddefs nil 'noerror)
+  (require 'debian-el-loaddefs nil 'noerror)
 
-Unfill paragraph
-From https://raw.github.com/qdot/conf_emacs/master/emacs_conf.org
-#+BEGIN_SRC emacs-lisp :tangle yes
-(defun unfill-paragraph ()
-  "Takes a multi-line paragraph and makes it into a single line of text."
-  (interactive)
-  (let ((fill-column (point-max)))
-    (fill-paragraph nil)))
-(bind-key "H-u" 'unfill-paragraph)
+  (setq debian-changelog-full-name "Joerg Jaspert")
+  (setq debian-changelog-mailing-address "joerg@debian.org")
 #+END_SRC
 
-#+BEGIN_SRC emacs-lisp :tangle yes
-(setq-default indicate-empty-lines t)
-(setq sentence-end-double-space nil)
+** diff-mode
+#+BEGIN_SRC emacs-lisp
+(use-package diff-mode
+  :commands diff-mode
+  :mode (("\\.diff" . diff-mode)))
 #+END_SRC
 
-Hilight annotations in comments, like FIXME/TODO/...
-#+BEGIN_SRC emacs-lisp :tangle yes
-(add-hook 'prog-mode-hook 'font-lock-comment-annotations)
-#+END_SRC
+** dired & co
+#+BEGIN_SRC emacs-lisp
+(use-package dired
+  :commands (dired dired-other-window dired-other-frame dired-noselect
+                   dired-mode dired-jump)
+  :defines (dired-omit-regexp-orig)
+  :bind (:map dired-mode-map
+              ("F" . find-name-dired))
+  :init
+  (progn
+    (setq diredp-hide-details-initially-flag nil))
+  :config
+  (progn
+    (validate-setq dired-auto-revert-buffer (quote dired-directory-changed-p))
+    (validate-setq dired-dwim-target t)
+    (validate-setq dired-listing-switches "-alh")
+    (validate-setq dired-listing-switches "-alXh --group-directories-first")
+    (validate-setq dired-recursive-copies (quote top))
+    (validate-setq dired-recursive-deletes (quote top))
 
-*** Browser
-#+BEGIN_SRC emacs-lisp :tangle yes
-(setq browse-url-browser-function (quote browse-url-generic))
-(setq browse-url-generic-program "/usr/bin/x-www-browser")
-#+END_SRC
+    (use-package dired+
+      :ensure dired+)
 
-*** When saving a script - make it executable
-#+BEGIN_SRC emacs-lisp :tangle yes
-(add-hook 'after-save-hook 'executable-make-buffer-file-executable-if-script-p)
-#+END_SRC
+    (use-package dired-x
+      :config
+      (progn
+        (validate-setq dired-guess-shell-alist-user
+                       '(("\\.pdf\\'" "mupdf")
+                         ("\\.\\(?: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")))))
 
-*** Emacs Server
-#+BEGIN_SRC emacs-lisp :tangle yes
-(use-package server
-  :init
-  (progn
-    (add-hook 'after-init-hook 'server-start)))
-#+END_SRC
+    (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 )))
 
-** Customized variables
-[2013-05-02 Thu 22:14]
-The following contains a set of variables i may reasonably want to
-change on other systems - which don't affect the init file loading
-process. So I *can* use the customization interface for it...
-#+BEGIN_SRC emacs-lisp :tangle yes
-(defgroup ganneff nil
-  "Modify ganneffs settings"
-  :group 'environment)
+    (use-package wdired
+      :ensure wdired
+      :bind (:map dired-mode-map
+             ("r" . wdired-change-to-wdired-mode))
+      :config
+      (progn
+        (validate-setq wdired-allow-to-change-permissions t)
+        (bind-key "r" 'wdired-change-to-wdired-mode dired-mode-map)))
 
-(defgroup ganneff-org-mode nil
-  "Ganneffs org-mode settings"
-  :tag "Ganneffs org-mode settings"
-  :group 'ganneff
-  :link '(custom-group-link "ganneff"))
+    (use-package dired-narrow
+      :ensure t
+      :diminish dired-narrow-mode
+      :bind (:map dired-mode-map
+                  ("/" . dired-narrow)))
 
-(defcustom bh/organization-task-id "d0db0d3c-f22e-42ff-a654-69524ff7cc91"
-  "ID of the organization task."
-  :tag "Organization Task ID"
-  :type 'string
-  :group 'ganneff-org-mode)
+    (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)))
 
-(defcustom org-my-archive-expiry-days 2
-  "The number of days after which a completed task should be auto-archived.
-This can be 0 for immediate, or a floating point value."
-  :tag "Archive expiry days"
-  :type 'float
-  :group 'ganneff-org-mode)
-#+END_SRC
+    (use-package runner
+      :ensure runner)
 
+    (defvar mark-files-cache (make-hash-table :test #'equal))
 
-** Compatibility
-[2013-05-21 Tue 23:22]
-Restore removed var alias, used by ruby-electric-brace and others
-#+BEGIN_SRC emacs-lisp :tangle yes
-(unless (boundp 'last-command-char)
-  (defvaralias 'last-command-char 'last-command-event))
-#+END_SRC
-* Customized variables
-:PROPERTIES:
-:ID: 0102208d-fdf6-4928-9e40-7e341bd3aa3a
-:END:
-Of course I want to be able to use the customize interface, and some
-things can only be set via it (or so they say). I usually prefer to put
-things I keep for a long while into statements somewhere else, not just
-custom-set here, but we need it anyways.
+    (defun mark-similar-versions (name)
+      (let ((pat name))
+        (if (string-match "^\\(.+?\\)-[0-9._-]+$" pat)
+            (validate-setq pat (match-string 1 pat)))
+        (or (gethash pat mark-files-cache)
+            (ignore (puthash pat t mark-files-cache)))))
 
-#+BEGIN_SRC emacs-lisp :tangle yes
-(setq custom-file jj-custom-file)
-(safe-load custom-file)
-#+END_SRC
+    (defun dired-mark-similar-version ()
+      (interactive)
+      (validate-setq mark-files-cache (make-hash-table :test #'equal))
+      (dired-mark-sexp '(mark-similar-versions name)))
 
-The source of this is:
-#+INCLUDE: "~/.emacs.d/config/customized.el" src emacs-lisp
+    (defun dired-package-initialize ()
+      (unless (featurep '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)
 
-* 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))
+        ;; Omit files that Git would ignore
+        (defun dired-omit-regexp ()
+          (let ((file (expand-file-name ".git"))
+                parent-dir)
+            (while (and (not (file-exists-p file))
+                        (progn
+                          (validate-setq parent-dir
+                                         (file-name-directory
+                                          (directory-file-name
+                                           (file-name-directory file))))
+                          ;; Give up if we are already at the root dir.
+                          (not (string= (file-name-directory file)
+                                        parent-dir))))
+              ;; Move up to the parent dir and try again.
+              (validate-setq file (expand-file-name ".git" parent-dir)))
+            ;; If we found a change log in a parent, use that.
+            (if (file-exists-p file)
+                (let ((regexp (funcall dired-omit-regexp-orig))
+                      (omitted-files
+                       (shell-command-to-string "git clean -d -x -n")))
+                  (if (= 0 (length omitted-files))
+                      regexp
+                    (concat
+                     regexp
+                     (if (> (length regexp) 0)
+                         "\\|" "")
+                     "\\("
+                     (mapconcat
+                      #'(lambda (str)
+                          (concat
+                           "^"
+                           (regexp-quote
+                            (substring str 13
+                                       (if (= ?/ (aref str (1- (length str))))
+                                           (1- (length str))
+                                         nil)))
+                           "$"))
+                      (split-string omitted-files "\n" t)
+                      "\\|")
+                     "\\)")))
+              (funcall dired-omit-regexp-orig))))))
+
+    (add-hook 'dired-mode-hook 'dired-package-initialize)
+
+    (defun dired-double-jump (first-dir second-dir)
+      (interactive
+       (list (read-directory-name "First directory: "
+                                  (expand-file-name "~")
+                                  nil nil "/Downloads/")
+             (read-directory-name "Second directory: "
+                                  (expand-file-name "~")
+                                  nil nil "/")))
+      (dired first-dir)
+      (dired-other-window second-dir))
+    (bind-key "C-c J" 'dired-double-jump)
+
+    (defun dired-back-to-top ()
+      (interactive)
+      (goto-char (point-min))
+      (dired-next-line 4))
+
+    (define-key dired-mode-map
+      (vector 'remap 'beginning-of-buffer) 'dired-back-to-top)
+
+    (defun dired-jump-to-bottom ()
+      (interactive)
+      (goto-char (point-max))
+      (dired-next-line -1))
+
+    (define-key dired-mode-map
+      (vector 'remap 'end-of-buffer) 'dired-jump-to-bottom)))
 
-    (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
-  :commands ace-jump-mode
-  :bind ("H-SPC" . ace-jump-mode))
 #+END_SRC
-** 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))
+** 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
+(use-package discover-my-major
+  :ensure discover-my-major
+  :commands discover-my-major
+  :bind ("C-h C-m" . discover-my-major))
 #+END_SRC
-** anzu
-[2014-06-01 Sun 23:02]
-#+BEGIN_SRC emacs-lisp :tangle yes
-(use-package anzu
-  :ensure anzu
-  :diminish anzu-mode
-  :init
-  (progn
-    (global-anzu-mode 1))
+** easypg
+EasyPG is a GnuPG interface for Emacs.
+Bookmark: [[http://www.emacswiki.org/emacs/EasyPG][EmacsWiki: Easy PG]]
+#+BEGIN_SRC emacs-lisp
+(use-package epa-file
   :config
   (progn
-    (setq anzu-search-threshold 1000)
-    (set-face-attribute 'anzu-mode-line nil :foreground "yellow" :weight 'bold)))
+    (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
-** ascii
-[2014-05-21 Wed 00:33]
-#+BEGIN_SRC emacs-lisp :tangle yes
-(use-package ascii
-  :commands (ascii-on ascii-display ascii-toggle)
+** ediff
+[2013-04-21 So 20:36]
+ediff - don't start another frame
+#+BEGIN_SRC emacs-lisp
+(use-package ediff
   :init
   (progn
-    (defun ascii-toggle ()
-      (interactive)
-      (if ascii-display
-          (ascii-off)
-        (ascii-on)))
-
-    (bind-key "C-c e A" 'ascii-toggle)))
-#+END_SRC
-** 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)
+    (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
+            (validate-setq ediff-window-setup-function 'ediff-setup-windows-plain)
+            (validate-setq ediff-split-window-function 'split-window-horizontally)
+            )
+)
 #+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
-  :init
-  (progn
-    (use-package pos-tip
-      :ensure t)
-    (ac-config-default)
-    )
+** edit-server
+[2015-12-16 Wed 22:13]
+Allows chromium to "send" files (textbox inputs) to emacs to edit.
+#+BEGIN_SRC emacs-lisp
+(use-package edit-server
+  :ensure t
+  :if window-system
   :config
   (progn
-    ;; hook AC into completion-at-point
-    (defun sanityinc/auto-complete-at-point ()
-      (when (and (not (minibufferp))
-                 (fboundp 'auto-complete-mode)
-                 auto-complete-mode)
-        (auto-complete)))
-    (defun set-auto-complete-as-completion-at-point-function ()
-      (add-to-list 'completion-at-point-functions 'sanityinc/auto-complete-at-point))
-    ;; Exclude very large buffers from dabbrev
-    (defun sanityinc/dabbrev-friend-buffer (other-buffer)
-      (< (buffer-size other-buffer) (* 1 1024 1024)))
+    (validate-setq edit-server-new-frame t)
+    (edit-server-start)))
+#+END_SRC
+** emms
 
-    ;; 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)
+EMMS is the Emacs Multimedia System.
+#+BEGIN_SRC emacs-lisp :tangle no
+(require 'emms-source-file)
+(require 'emms-source-playlist)
+(require 'emms-info)
+(require 'emms-cache)
+(require 'emms-playlist-mode)
+(require 'emms-playing-time)
+(require 'emms-player-mpd)
+(require 'emms-playlist-sort)
+(require 'emms-mark)
+(require 'emms-browser)
+(require 'emms-lyrics)
+(require 'emms-last-played)
+(require 'emms-score)
+(require 'emms-tag-editor)
+(require 'emms-history)
+(require 'emms-i18n)
 
-    (setq 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)
+(validate-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))
+(validate-setq emms-score-default-score 3)
 
-    (ac-flyspell-workaround)
+(defun emms-mpd-init ()
+  "Connect Emms to mpd."
+  (interactive)
+  (emms-player-mpd-connect))
 
-    ;; use 't when auto-complete is disabled
-    (setq tab-always-indent 'complete)
-    (add-to-list 'completion-styles 'initials t)
+;; players
+(require 'emms-player-mpd)
+(validate-setq emms-player-mpd-server-name "localhost")
+(validate-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)
+(validate-setq emms-volume-change-function 'emms-volume-mpd-change)
+(validate-setq emms-player-mpd-sync-playlist t)
+
+(validate-setq emms-source-file-default-directory "/var/lib/mpd/music")
+(validate-setq emms-player-mpd-music-directory "/var/lib/mpd/music")
+(validate-setq emms-info-auto-update t)
+(validate-setq emms-lyrics-scroll-p t)
+(validate-setq emms-lyrics-display-on-minibuffer t)
+(validate-setq emms-lyrics-display-on-modeline nil)
+(validate-setq emms-lyrics-dir "~/.emacs.d/var/lyrics")
+
+(validate-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")))
 
-     ;; 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)
+;; 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 'auto-complete-mode-hook 'set-auto-complete-as-completion-at-point-function)
+(validate-setq emms-track-description-function 'my-describe)
 
-    ;; Exclude very large buffers from dabbrev
-    (setq dabbrev-friend-buffer-function 'sanityinc/dabbrev-friend-buffer)
+;; (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)
 
-    (use-package ac-dabbrev
-      :ensure t)
+(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)
 
-    (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))
+(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)))
 
-    (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))
+(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)
 
-    (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)))
+(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)
 
-#+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)
 
-** 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)
-    (setq global-auto-revert-non-file-buffers t)
-    (global-auto-revert-mode)))
-#+END_SRC
+(validate-setq emms-playlist-buffer-name "*EMMS Playlist*"
+      emms-playlist-mode-open-playlists t)
 
-** 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 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))
+;; Faces
+(if (window-system)
+    ((lambda ()
+       (set-face-attribute
+        'emms-browser-artist-face nil
+        :family "Arno Pro")
+       )
+))
+
+(validate-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
+** Emacs shell
+Basic settings for emacs integrated shell
+#+BEGIN_SRC emacs-lisp :tangle no
+(use-package eshell
+  :defer t
+  :commands eshell
   :init
   (progn
-    (setq backup-directory jj-backup-directory)
-    ;(setq tramp-backup-directory (concat jj-backup-directory "/tramp"))
-    ;(if (not (file-exists-p tramp-backup-directory))
-    ;    (make-directory tramp-backup-directory))
-    ;(setq tramp-backup-directory-alist `((".*" . ,tramp-backup-directory)))
-    (setq backup-directory-alist `(("." . ,jj-backup-directory)))
-    (setq auto-save-list-file-prefix (concat jj-backup-directory ".auto-saves-"))
-    (setq auto-save-file-name-transforms `((".*" ,jj-backup-directory t)))
-
-    (setq version-control t)     ;; Use version numbers for backups
-    (setq kept-new-versions 10)  ;; Number of newest versions to keep
-    (setq kept-old-versions 2)   ;; Number of oldest versions to keep
-    (setq delete-old-versions t) ;; Ask to delete excess backup versions?
-    (setq backup-by-copying t)
-    (setq backup-by-copying-when-linked t) ;; Copy linked files, don't rename.
-    (setq make-backup-files t)
+    (defun eshell-initialize ()
+      (defun eshell-spawn-external-command (beg end)
+        "Parse and expand any history references in current input."
+        (save-excursion
+          (goto-char end)
+          (when (looking-back "&!" beg)
+            (delete-region (match-beginning 0) (match-end 0))
+            (goto-char beg)
+            (insert "spawn "))))
+      (add-hook 'eshell-expand-input-functions 'eshell-spawn-external-command)
+      (eval-after-load "em-unix"
+        '(progn
+           (unintern 'eshell/su)
+           (unintern 'eshell/sudo))))
+    (add-hook 'eshell-first-time-mode-hook 'eshell-initialize)
+    )
+  :config
+  (progn
+    (defalias 'emacs 'find-file)
+    (defalias 'ec 'find-file)
+    (defalias 'e 'find-file)
 
-    (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)
+    (use-package f
+      :ensure f)
+    (use-package 'em-cmpl)
+    (use-package 'em-prompt)
+    (use-package 'em-term)
 
-    (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)
+    (validate-setq eshell-cmpl-cycle-completions nil
+          eshell-save-history-on-exit t
+          eshell-buffer-maximum-lines 20000
+          eshell-history-size 350
+          eshell-buffer-shorthand t
+          eshell-highlight-prompt t
+          eshell-plain-echo-behavior t
+          eshell-cmpl-dir-ignore "\\`\\(\\.\\.?\\|CVS\\|\\.svn\\|\\.git\\)/\\'")
 
-    (defun kill-buffer-prompt ()
-      "Allows one to kill a buffer without saving it.
-This is necessary since once you start backups-mode all file based buffers
-are saved automatically when they are killed"
-      (interactive)
-      (if (and (buffer-modified-p) (buffer-file-name) (file-exists-p (buffer-file-name)) (y-or-n-p "Save buffer?"))
-          (save-buffer)
-        (set-buffer-modified-p nil))
-      (kill-buffer))
+    (setenv "PAGER" "cat")
+    (validate-setq eshell-visual-commands
+          '("less" "tmux" "htop" "top" "bash" "zsh" "tail"))
+    (validate-setq eshell-visual-subcommands
+          '(("git" "log" "l" "diff" "show")))
 
-    (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"))))))))))
+    (add-to-list 'eshell-command-completions-alist
+                 '("gunzip" "gz\\'"))
+    (add-to-list 'eshell-command-completions-alist
+                 '("tar" "\\(\\.tar|\\.tgz\\|\\.tar\\.gz\\)\\'"))
 
-#+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))
-#+END_SRC
+    (when (not (functionp 'eshell/rgrep))
+      (defun eshell/rgrep (&rest args)
+        "Use Emacs grep facility instead of calling external grep."
+        (eshell-grep "rgrep" args t)))
 
-Weeks start on Monday, not sunday.
-#+BEGIN_SRC emacs-lisp :tangle yes
-(setq calendar-week-start-day 1)
-#+END_SRC
+    ;(set-face-attribute 'eshell-prompt nil :foreground "turquoise1")
+    (add-hook 'eshell-mode-hook ;; for some reason this needs to be a hook
+              '(lambda () (define-key eshell-mode-map "\C-a" 'eshell-bol)))
+    (add-hook 'eshell-preoutput-filter-functions
+              'ansi-color-filter-apply)
+    ;; Prompt with a bit of help from http://www.emacswiki.org/emacs/EshellPrompt
 
-Display ISO week numbers in Calendar Mode
-#+BEGIN_SRC emacs-lisp :tangle yes
-(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))
-#+END_SRC
+    (defmacro with-face (str &rest properties)
+      `(propertize ,str 'face (list ,@properties)))
 
-** 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
+    (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))))
 
-** 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
+    (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"))
+         " ")))
+
+    (use-package eshell-prompt-extras
+      :ensure t
+      :init
       (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
+        (validate-setq eshell-highlight-prompt nil
+              ;; epe-git-dirty-char "Ϟ"
+              epe-git-dirty-char "*"
+              eshell-prompt-function 'epe-theme-dakrone)))
 
-** 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
+    (defun eshell/magit ()
+      "Function to open magit-status for the current directory"
+      (interactive)
+      (magit-status default-directory)
+      nil)
+
+    (validate-setq eshell-prompt-function 'eshell/my-prompt)
+    (validate-setq eshell-highlight-prompt nil)
+    (validate-setq eshell-prompt-regexp "^[^#$\n]+[#$] ")))
 
-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)
+*** Isearch related
+Incremental search is great, but annoyingly you need to type whatever
+you want. If you want to search for just the next (or previous)
+occurence of what is at your cursor position use the following.
+*C-x* will insert the current word while *M-up* and *M-down* will just
+jump to the next/previous occurence of it.
+#+BEGIN_SRC emacs-lisp
+(bind-key "C-x" 'sacha/isearch-yank-current-word isearch-mode-map)
+(bind-key* "<M-up>" 'sacha/search-word-backward)
+(bind-key* "<M-down>" 'sacha/search-word-forward)
+#+END_SRC
 
-(setq debian-changelog-full-name "Joerg Jaspert")
-(setq debian-changelog-mailing-address "joerg@debian.org")
+*** Frame configuration
+I want to see the buffername and its size, not the host I am on in my
+frame title.
+#+BEGIN_SRC emacs-lisp
+(validate-setq frame-title-format "%b (%i)")
 #+END_SRC
 
-** diff-mode
-#+BEGIN_SRC emacs-lisp :tangle yes
-(use-package diff-mode
-  :commands diff-mode
-  :mode (("\\.diff" . diff-mode))
+*** Protect some buffers
+I don't want some buffers to be killed, **scratch** for example.
+In the past I had a long function that just recreated them, but the
+=keep-buffers= package is easier.
+#+BEGIN_SRC emacs-lisp
+(use-package keep-buffers
   :config
-  (use-package diff-mode-))
+  (progn
+    (keep-buffers-mode 1)
+    (push '("\\`*scratch" . erase) keep-buffers-protected-alist)
+    (push '("\\`*Org Agenda" . nil) keep-buffers-protected-alist)
+    ))
 #+END_SRC
 
+*** yes-or-no-p
+Emas usually wants you to type /yes/ or /no/ fully. What a mess, I am
+lazy.
+#+BEGIN_SRC emacs-lisp
+(defalias 'yes-or-no-p 'y-or-n-p)
+#+END_SRC
 
-** dired & co
-I like dired and work a lot with it, but it tends to leave lots of
-windows around.
-dired-single to the rescue.
-#+BEGIN_SRC emacs-lisp :tangle yes
-(use-package dired
-  :commands (dired dired-other-window dired-other-frame dired-noselect
-                   dired-mode dired-jump)
-  :init
-  (progn)
+*** Language/i18n stuff
+In this day and age, UTF-8 is the way to go.
+#+BEGIN_SRC emacs-lisp
+(set-language-environment 'utf-8)
+(set-default-coding-systems 'utf-8)
+(set-terminal-coding-system 'utf-8)
+(set-keyboard-coding-system 'utf-8)
+(set-clipboard-coding-system 'utf-8)
+(prefer-coding-system 'utf-8)
+(set-charset-priority 'unicode)
+(validate-setq default-process-coding-system '(utf-8-unix . utf-8-unix))
+(when (display-graphic-p)
+  (validate-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
+(use-package mic-paren
   :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))
+  (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.
+(Update 30.05.2014: Not used ever, deactivated)
+#+BEGIN_SRC emacs-lisp :tangle no
+(bind-key "C-c k" 'prelude-kill-other-buffers)
+#+END_SRC
+*** Scrolling
+Default scrolling behaviour in emacs is a bit annoying, who wants to
+jump half-windows?
+#+BEGIN_SRC emacs-lisp
+(validate-setq scroll-margin 3)
+(validate-setq scroll-conservatively 100000)
+(validate-setq scroll-up-aggressively 0.0)
+(validate-setq scroll-down-aggressively 0.0)
+(validate-setq scroll-preserve-screen-position 'always)
+#+END_SRC
 
-    (defvar mark-files-cache (make-hash-table :test #'equal))
+*** Copy/Paste with X
+[2013-04-09 Di 23:31]
+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
+(validate-setq select-enable-primary t)
+(validate-setq select-enable-clipboard nil)
+(validate-setq interprogram-paste-function 'x-cut-buffer-or-selection-value)
+(validate-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
+(unbind-key "C-z")
+(unbind-key "C-x C-z")
+#+END_SRC
 
-    (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)))))
+http://endlessparentheses.com/kill-entire-line-with-prefix-argument.html?source=rss
+#+BEGIN_SRC emacs-lisp
+(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
 
-    (defun dired-mark-similar-version ()
-      (interactive)
-      (setq mark-files-cache (make-hash-table :test #'equal))
-      (dired-mark-sexp '(mark-similar-versions name)))
+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 no
+(defun kill-entire-line ()
+  "Kill this entire line (including newline), regardless of where point is within the line."
+  (interactive)
+  (beginning-of-line)
+  (kill-line)
+  (back-to-indentation))
 
-    (use-package dired+
-      :ensure dired+
-      :init
-      :pre-load (setq diredp-hide-details-initially-flag nil))
+(bind-key* "C-k" 'kill-entire-line)
+(global-set-key [remap kill-whole-line] 'kill-entire-line)
+#+END_SRC
 
-    (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 )))
+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 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")
+  (beginning-of-line)
+  (org-kill-line arg)
+  (back-to-indentation)
+  )
+#+END_SRC
 
-    (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)))
+I really hate tabs, so I don't want any indentation to try using them.
+And in case a project really needs them, I can change it just for that
+file/project, but luckily none of those I work in is as broken.
+#+BEGIN_SRC emacs-lisp
+(setq-default indent-tabs-mode nil)
+#+END_SRC
 
-    (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)))
+Make the % key jump to the matching {}[]() if on another, like vi, see [[id:b6e6cf73-9802-4a7b-bd65-fdb6f9745319][the function]]
+#+BEGIN_SRC emacs-lisp
+(bind-key* "M-5" 'match-paren)
+#+END_SRC
 
-    (defun dired-package-initialize ()
-      (unless (featurep 'runner)
-        (use-package dired-x)
-        (use-package runner
-          :ensure runner)
+Instead of the default "mark-defun" I want a more readline-like setting.
+#+BEGIN_SRC emacs-lisp
+(bind-key "C-M-h" 'backward-kill-word)
+#+END_SRC
 
-        (bind-key "M-!" 'async-shell-command dired-mode-map)
-        (unbind-key "M-s f" dired-mode-map)
+Align whatever with a regexp.
+#+BEGIN_SRC emacs-lisp
+(bind-key "C-x \\" 'align-regexp)
+#+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)
+Font size changes
+#+BEGIN_SRC emacs-lisp
+(bind-key "C-+" 'text-scale-increase)
+(bind-key "C--" 'text-scale-decrease)
+#+END_SRC
 
-        ;; Omit files that Git would ignore
-        (defun dired-omit-regexp ()
-          (let ((file (expand-file-name ".git"))
-                parent-dir)
-            (while (and (not (file-exists-p file))
-                        (progn
-                          (setq parent-dir
-                                (file-name-directory
-                                 (directory-file-name
-                                  (file-name-directory file))))
-                          ;; Give up if we are already at the root dir.
-                          (not (string= (file-name-directory file)
-                                        parent-dir))))
-              ;; Move up to the parent dir and try again.
-              (setq file (expand-file-name ".git" parent-dir)))
-            ;; If we found a change log in a parent, use that.
-            (if (file-exists-p file)
-                (let ((regexp (funcall dired-omit-regexp-orig))
-                      (omitted-files
-                       (shell-command-to-string "git clean -d -x -n")))
-                  (if (= 0 (length omitted-files))
-                      regexp
-                    (concat
-                     regexp
-                     (if (> (length regexp) 0)
-                         "\\|" "")
-                     "\\("
-                     (mapconcat
-                      #'(lambda (str)
-                          (concat
-                           "^"
-                           (regexp-quote
-                            (substring str 13
-                                       (if (= ?/ (aref str (1- (length str))))
-                                           (1- (length str))
-                                         nil)))
-                           "$"))
-                      (split-string omitted-files "\n" t)
-                      "\\|")
-                     "\\)")))
-              (funcall dired-omit-regexp-orig))))))
+Regexes are too useful, so use the regex search by default.
+Disabled, see ivy-mode.
+#+begin_src emacs-lisp :tangle no
+(bind-key "C-s"   'isearch-forward-regexp)
+(bind-key "C-r"   'isearch-backward-regexp)
+(bind-key "C-M-s" 'isearch-forward)
+(bind-key "C-M-r" 'isearch-backward)
+#+end_src
 
-    (add-hook 'dired-mode-hook 'dired-package-initialize)
+Rgrep is infinitely useful in multi-file projects.
+#+begin_src emacs-lisp
+(bind-key "C-x C-g" 'rgrep)
+#+end_src
 
-    (defun dired-double-jump (first-dir second-dir)
-      (interactive
-       (list (read-directory-name "First directory: "
-                                  (expand-file-name "~")
-                                  nil nil "/Downloads/")
-             (read-directory-name "Second directory: "
-                                  (expand-file-name "~")
-                                  nil nil "/")))
-      (dired first-dir)
-      (dired-other-window second-dir))
-    (bind-key "C-c J" 'dired-double-jump)
+Easy way to move a line up - or down. Simpler than dealing with C-x C-t
+AKA transpose lines.
+#+BEGIN_SRC emacs-lisp
+(bind-key "<M-S-up>"  'move-line-up)
+(bind-key "<M-S-down>" 'move-line-down)
+#+END_SRC
 
-    (defun dired-back-to-top ()
-      (interactive)
-      (beginning-of-buffer)
-      (dired-next-line 4))
+"Pull" lines up, join them
+#+BEGIN_SRC emacs-lisp
+(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
 
-    (define-key dired-mode-map
-      (vector 'remap 'beginning-of-buffer) 'dired-back-to-top)
+When I press Enter I almost always want to go to the right indentation on the next line.
+#+BEGIN_SRC emacs-lisp
+(bind-key "RET" 'newline-and-indent)
+#+END_SRC
 
-    (defun dired-jump-to-bottom ()
-      (interactive)
-      (end-of-buffer)
-      (dired-next-line -1))
+Easier undo, and i don't need suspend-frame
+#+BEGIN_SRC emacs-lisp
+(bind-key "C-z" 'undo)
+#+END_SRC
 
-    (define-key dired-mode-map
-      (vector 'remap 'end-of-buffer) 'dired-jump-to-bottom)))
+Window switching, go backwards. (C-x o goes to the next window)
+#+BEGIN_SRC emacs-lisp
+(bind-key "C-x O" (lambda ()
+                    (interactive)
+                    (other-window -1)))
+#+END_SRC
 
+Edit file as root
+#+BEGIN_SRC emacs-lisp
+(bind-key "C-x C-r" 'prelude-sudo-edit)
 #+END_SRC
-** discover-my-major
-[2014-06-01 Sun 23:32]
-Discover key bindings and their meaning for the current Emacs major mode.
-#+BEGIN_SRC emacs-lisp :tangle yes
-(use-package discover-my-major
-  :ensure discover-my-major
-  :bind ("C-h C-m" . discover-my-major))
+
+M-space is bound to just-one-space, which is great for programming. What
+it does is remove all spaces around the cursor, except for one. But to
+be really useful, it also should include newlines. It doesn’t do this by
+default. Rather, you have to call it with a negative argument. Sure
+not, bad Emacs.
+#+BEGIN_SRC emacs-lisp
+(bind-key "M-SPC" 'just-one-space-with-newline)
 #+END_SRC
-** easypg
-EasyPG is a GnuPG interface for Emacs.
-Bookmark: [[http://www.emacswiki.org/emacs/EasyPG][EmacsWiki: Easy PG]]
-#+BEGIN_SRC emacs-lisp :tangle yes
-(use-package epa-file
+
+Count which commands I use how often.
+#+BEGIN_SRC emacs-lisp
+(use-package keyfreq
+  :ensure keyfreq
   :config
   (progn
-    (epa-file-enable)
-    ;; I took the following from [[http://www.emacswiki.org/emacs/EasyPG][EmacsWiki: Easy PG]]
-    (defadvice epg--start (around advice-epg-disable-agent disable)
-      "Don't allow epg--start to use gpg-agent in plain text
-    terminals . "
-      (if (display-graphic-p)
-          ad-do-it
-        (let ((agent (getenv "GPG_AGENT_INFO")))
-          (setenv "GPG_AGENT_INFO" nil) ; give us a usable text password prompt
-          ad-do-it
-          (setenv "GPG_AGENT_INFO" agent))))
-    (ad-enable-advice 'epg--start 'around 'advice-epg-disable-agent)
-    (ad-activate 'epg--start)
-    ))
+    (validate-setq keyfreq-file (expand-file-name "keyfreq" jj-cache-dir))
+    (validate-setq keyfreq-file-lock (expand-file-name "keyfreq.lock" jj-cache-dir))
+    (keyfreq-mode 1)
+    (keyfreq-autosave-mode 1)))
 #+END_SRC
-** ediff
-[2013-04-21 So 20:36]
-ediff - don't start another frame
-#+BEGIN_SRC emacs-lisp :tangle yes
-(use-package ediff
-  :pre-init
-  (progn
-    (defvar ctl-period-equals-map)
-    (define-prefix-command 'ctl-period-equals-map)
-    (bind-key "C-. =" 'ctl-period-equals-map)
 
-    (bind-key "C-. = c" 'compare-windows)) ; not an ediff command, but it fits
+Duplicate current line
+#+BEGIN_SRC emacs-lisp
+(defun duplicate-line ()
+  "Insert a copy of the current line after the current line."
+  (interactive)
+  (save-excursion
+    (let ((line-text (buffer-substring-no-properties
+                      (line-beginning-position)
+                      (line-end-position))))
+      (move-end-of-line 1)
+      (newline)
+      (insert line-text))))
+
+(bind-key "C-c p" 'duplicate-line)
+#+END_SRC
+
+Smarter move to the beginning of the line. That is, it first moves to
+the beginning of the line - and on second keypress it goes to the
+first character on line.
+#+BEGIN_SRC emacs-lisp
+(defun smarter-move-beginning-of-line (arg)
+  "Move point back to indentation of beginning of line.
+
+Move point to the first non-whitespace character on this line.
+If point is already there, move to the beginning of the line.
+Effectively toggle between the first non-whitespace character and
+the beginning of the line.
 
-  :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)))
-#+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)
+If ARG is not nil or 1, move forward ARG - 1 lines first.  If
+point reaches the beginning or end of the buffer, stop there."
+  (interactive "^p")
+  (validate-setq arg (or arg 1))
 
-(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)
+  ;; Move lines first
+  (when (/= arg 1)
+    (let ((line-move-visual nil))
+      (forward-line (1- arg))))
 
-(defun emms-mpd-init ()
-  "Connect Emms to mpd."
-  (interactive)
-  (emms-player-mpd-connect))
+  (let ((orig-point (point)))
+    (back-to-indentation)
+    (when (= orig-point (point))
+      (move-beginning-of-line 1))))
 
-;; players
-(require 'emms-player-mpd)
-(setq emms-player-mpd-server-name "localhost")
-(setq emms-player-mpd-server-port "6600")
-(add-to-list 'emms-info-functions 'emms-info-mpd)
-(add-to-list 'emms-player-list 'emms-player-mpd)
-(setq emms-volume-change-function 'emms-volume-mpd-change)
-(setq emms-player-mpd-sync-playlist t)
-
-(setq emms-source-file-default-directory "/var/lib/mpd/music")
-(setq emms-player-mpd-music-directory "/var/lib/mpd/music")
-(setq emms-info-auto-update t)
-(setq emms-lyrics-scroll-p t)
-(setq emms-lyrics-display-on-minibuffer t)
-(setq emms-lyrics-display-on-modeline nil)
-(setq emms-lyrics-dir "~/.emacs.d/var/lyrics")
-
-(setq 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")))
+;; remap C-a to `smarter-move-beginning-of-line'
+(global-set-key [remap move-beginning-of-line]
+                'smarter-move-beginning-of-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)))
-)
+#+END_SRC
 
-(setq emms-track-description-function 'my-describe)
+Easily copy characters from the previous nonblank line, starting just
+above point. With a prefix argument, only copy ARG characters (never
+past EOL), no argument copies rest of line.
+#+BEGIN_SRC emacs-lisp
+(require 'misc)
+(bind-key "H-y" 'copy-from-above-command)
+#+END_SRC
 
-;; (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)
+Open a new X Terminal pointing to the directory of the current
+buffers path.
+#+BEGIN_SRC emacs-lisp
+(bind-key "H-t" 'jj-open-shell)
+#+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)
+Align code
+#+BEGIN_SRC emacs-lisp
+(bind-key "H-a" 'align-code)
+#+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)))
+Insert date
+#+BEGIN_SRC emacs-lisp
+(bind-key "C-c d" 'insert-date)
+#+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)
+Another key for indenting
+#+BEGIN_SRC emacs-lisp
+(bind-key "H-i" 'indent-region)
+#+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)
+Clean all whitespace stuff
+#+BEGIN_SRC emacs-lisp
+(bind-key "H-w" 'whitespace-cleanup)
+#+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)
+Comment/Uncomment
+#+BEGIN_SRC emacs-lisp
+(bind-key "H-c" 'comment-dwim)
+#+END_SRC
 
-(setq emms-playlist-buffer-name "*EMMS Playlist*"
-      emms-playlist-mode-open-playlists t)
+Show keystrokes in progress
+#+BEGIN_SRC emacs-lisp
+(validate-setq echo-keystrokes 0.1)
+#+END_SRC
+**** Overwrite mode
+Usually you can press the *Ins*ert key, to get into overwrite mode. I
+don't like that, have broken much with it and so just forbid it by
+disabling that.
+#+BEGIN_SRC emacs-lisp
+(unbind-key "<insert>")
+(unbind-key "<kp-insert>")
+#+END_SRC
 
-;; Faces
-(if (window-system)
-    ((lambda ()
-       (set-face-attribute
-        'emms-browser-artist-face nil
-        :family "Arno Pro")
-       )
-))
+*** Easily navigate sillyCased words
+#+BEGIN_SRC emacs-lisp
+(global-subword-mode 1)
+#+END_SRC
+*** Delete file of current buffer, then kill buffer
+[2014-06-14 Sat 23:03]
+#+BEGIN_SRC emacs-lisp
+(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)))))
 
-(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)
+(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
+(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
+(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
+(bind-key "M-s o" 'occur-dwim)
 #+END_SRC
+
 ** ethan-wspace
 [2014-06-01 Sun 15:00]
 Proper whitespace handling
-#+BEGIN_SRC emacs-lisp :tangle yes
+#+BEGIN_SRC emacs-lisp :tangle no
 (use-package ethan-wspace
   :ensure ethan-wspace
   :diminish (ethan-wspace-mode . "ew")
   :init
   (global-ethan-wspace-mode 1))
 #+END_SRC
+** Eww - Emacs browser
+[2016-10-03 Mo 21:30]
+#+BEGIN_SRC emacs-lisp :tangle yes
+;; Time-stamp: <2016-07-08 18:22:46 kmodi>
 
+;; Eww - Emacs browser (needs emacs 24.4 or higher)
+
+(use-package eww
+  :bind ( ("M-s M-w" . eww-search-words))
+  :config
+  (progn
+    ;; (validate-setq eww-search-prefix                 "https://duckduckgo.com/html/?q=")
+    (validate-setq eww-search-prefix                 "https://www.google.com/search?q=")
+    (validate-setq eww-download-directory            "~/Downloads")
+    ;; (validate-setq eww-form-checkbox-symbol          "[ ]")
+    (validate-setq eww-form-checkbox-symbol          "☐") ; Unicode hex 2610
+    ;; (validate-setq eww-form-checkbox-selected-symbol "[X]")
+    (validate-setq eww-form-checkbox-selected-symbol "☑") ; Unicode hex 2611
+    ;; Improve the contract of pages like Google results
+    ;; http://emacs.stackexchange.com/q/2955/115
+    (validate-setq shr-color-visible-luminance-min 80) ; default = 40
+
+    ;; Auto-rename new eww buffers
+    ;; http://ergoemacs.org/emacs/emacs_eww_web_browser.html
+    (defun xah-rename-eww-hook ()
+      "Rename eww browser's buffer so sites open in new page."
+      (rename-buffer "eww" t))
+    (add-hook 'eww-mode-hook #'xah-rename-eww-hook)
+
+    ;; If the current buffer is an eww buffer, "M-x eww" will always reuse the
+    ;; current buffer to load the new page. Below advice will make "C-u M-x eww"
+    ;; force a new eww buffer even when the current buffer is an eww buffer.
+    ;; The above `xah-rename-eww-hook' fix is still needed in order to create
+    ;; uniquely named eww buffers.
+    ;; http://emacs.stackexchange.com/a/24477/115
+    (defun modi/force-new-eww-buffer (orig-fun &rest args)
+      "When prefix argument is used, a new eww buffer will be created.
+This is regardless of whether the current buffer is an eww buffer. "
+      (if current-prefix-arg
+          (with-temp-buffer
+            (apply orig-fun args))
+        (apply orig-fun args)))
+    (advice-add 'eww :around #'modi/force-new-eww-buffer)
+
+    ;; Override the default definition of `eww-search-words'
+    (defun eww-search-words (&optional beg end)
+      "Search the web for the text between the point and marker.
+See the `eww-search-prefix' variable for the search engine used."
+      (interactive "r")
+      (if (use-region-p)
+          (eww (buffer-substring beg end))
+        (eww (modi/get-symbol-at-point))))
+
+    ;; eww-lnum
+    ;; https://github.com/m00natic/eww-lnum
+    (use-package eww-lnum
+      :ensure t
+      :bind (:map eww-mode-map
+             ("f" . eww-lnum-follow)
+             ("U" . eww-lnum-universal)))
+
+    ;; org-eww
+    ;; Copy text from html page for pasting in org mode file/buffer
+    ;; e.g. Copied HTML hyperlinks get converted to [[link][desc]] for org mode.
+    ;; http://emacs.stackexchange.com/a/8191/115
+    (use-package org-eww
+      :bind (:map eww-mode-map
+             ("o" . org-eww-copy-for-org-mode)))
+
+    ;; Auto-refreshing eww buffer whenever the html file it's showing changes
+    ;; http://emacs.stackexchange.com/a/2566/115
+    (defvar modi/eww--file-notify-descriptors-list ()
+      "List to store file-notify descriptor for all files that have an
+associated auto-reloading eww buffer.")
+
+    (defun modi/advice-eww-open-file-to-auto-reload (orig-fun &rest args)
+      "When `eww-open-file' is called with \\[universal-argument], open
+the file in eww and also add `file-notify' watch for it so that the eww
+buffer auto-reloads when the HTML file changes."
+      (prog1
+          (apply orig-fun args)
+        (when current-prefix-arg ; C-u M-x eww-open-file
+          (require 'filenotify)
+          (let ((file-name (car args)))
+            (file-notify-add-watch file-name
+                                   '(change attribute-change)
+                                   #'modi/file-notify-callback-eww-reload)
+            ;; Show the HTML file and its rendered form in eww side-by-side
+            (find-file-other-window file-name))
+          ;; Redefine the `q' binding in `eww-mode-map'
+          (bind-key "q" #'modi/eww-quit-and-update-fn-descriptors eww-mode-map))))
+    (advice-add 'eww-open-file :around #'modi/advice-eww-open-file-to-auto-reload)
+
+    (defun modi/file-notify-callback-eww-reload (event)
+      "On getting triggered, switch to the eww buffer, reload and switch
+back to the working buffer. Also save the `file-notify-descriptor' of the
+triggering event."
+      (let* ((working-buffer (buffer-name)))
+        (switch-to-buffer-other-window "eww")
+        (eww-reload)
+        (switch-to-buffer-other-window working-buffer))
+      ;; `(car event)' will return the event descriptor
+      (add-to-list 'modi/eww--file-notify-descriptors-list (car event)))
+
+    (defun modi/eww-quit-and-update-fn-descriptors ()
+      "When quitting `eww', first remove any saved file-notify descriptors
+specific to eww, while also updating `modi/eww--file-notify-descriptors-list'."
+      (interactive)
+      (dotimes (index (safe-length modi/eww--file-notify-descriptors-list))
+        (file-notify-rm-watch (pop modi/eww--file-notify-descriptors-list)))
+      (quit-window :kill))
+
+    (bind-keys
+     :map eww-mode-map
+      (":" . eww) ; Go to URL
+      ("h" . eww-list-histories)) ; View history
+
+    ;; Make the binding for `revert-buffer' do `eww-reload' in eww-mode
+    (define-key eww-mode-map [remap revert-buffer] #'eww-reload)
+    (bind-keys
+     :map eww-text-map ; For single line text fields
+      ("<backtab>"  . shr-previous-link) ; S-TAB Jump to previous link on the page
+      ("<C-return>" . eww-submit)) ; S-TAB Jump to previous link on the page
+    (bind-keys
+     :map eww-textarea-map ; For multi-line text boxes
+      ("<backtab>"  . shr-previous-link) ; S-TAB Jump to previous link on the page
+      ("<C-return>" . eww-submit)) ; S-TAB Jump to previous link on the page
+    (bind-keys
+     :map eww-checkbox-map
+      ("<down-mouse-1>" . eww-toggle-checkbox))
+    (bind-keys
+     :map shr-map
+      ("w" . modi/eww-copy-url-dwim))
+    (bind-keys
+     :map eww-link-keymap
+      ("w" . modi/eww-copy-url-dwim))))
+
+;; Default eww key bindings
+;; |-----------+---------------------------------------------------------------------|
+;; | Key       | Function                                                            |
+;; |-----------+---------------------------------------------------------------------|
+;; | &         | Browse the current URL with an external browser.                    |
+;; | -         | Begin a negative numeric argument for the next command.             |
+;; | 0 .. 9    | Part of the numeric argument for the next command.                  |
+;; | C         | Display a buffer listing the current URL cookies, if there are any. |
+;; | H         | List the eww-histories.                                             |
+;; | F         | Toggle font between variable-width and fixed-width.                 |
+;; | G         | Go to a URL                                                         |
+;; | R         | Readable mode                                                       |
+;; | S         | List eww buffers                                                    |
+;; | d         | Download URL under point to `eww-download-directory'.               |
+;; | g         | Reload the current page.                                            |
+;; | q         | Quit WINDOW and bury its buffer.                                    |
+;; | v         | `eww-view-source'                                                   |
+;; | w         | `eww-copy-page-url'                                                 |
+;; |-----------+---------------------------------------------------------------------|
+;; | b         | Add the current page to the bookmarks.                              |
+;; | B         | Display the bookmark list.                                          |
+;; | M-n       | Visit the next bookmark                                             |
+;; | M-p       | Visit the previous bookmark                                         |
+;; |-----------+---------------------------------------------------------------------|
+;; | t         | Go to the page marked `top'.                                        |
+;; | u         | Go to the page marked `up'.                                         |
+;; |-----------+---------------------------------------------------------------------|
+;; | n         | Go to the page marked `next'.                                       |
+;; | p         | Go to the page marked `previous'.                                   |
+;; |-----------+---------------------------------------------------------------------|
+;; | l         | Go to the previously displayed page.                                |
+;; | r         | Go to the next displayed page.                                      |
+;; |-----------+---------------------------------------------------------------------|
+;; | TAB       | Move point to next link on the page.                                |
+;; | S-TAB     | Move point to previous link on the page.                            |
+;; |-----------+---------------------------------------------------------------------|
+;; | SPC       | Scroll up                                                           |
+;; | DEL/Bkspc | Scroll down                                                         |
+;; | S-SPC     | Scroll down                                                         |
+;; |-----------+---------------------------------------------------------------------|
+#+END_SRC
 ** expand-region
 [2014-06-01 Sun 15:16]
-#+BEGIN_SRC emacs-lisp :tangle yes
+#+BEGIN_SRC emacs-lisp
 (use-package expand-region
   :ensure expand-region
-  :bind ("C-M-+" . er/expand-region))
+  :bind ("C-M-+" . er/expand-region)
+  :commands er/expand-region)
 #+END_SRC
 ** filladapt
 [2013-05-02 Thu 00:04]
 Filladapt by KyleJones enhances Emacs’ fill functions by guessing a
 fill prefix, such as a comment sequence in program code, and handling
 bullet points like “1.” or “*”.
-#+BEGIN_SRC emacs-lisp :tangle yes
+#+BEGIN_SRC emacs-lisp
 (use-package filladapt
+  :load-path ("elisp/local")
   :diminish filladapt-mode
-  :init
+  :config
   (setq-default filladapt-mode t))
 #+END_SRC
 ** flycheck
@@ -1764,55 +2337,65 @@ bullet points like “1.” or “*”.
 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
+#+BEGIN_SRC emacs-lisp
 (use-package flycheck
   :ensure flycheck
   :diminish flycheck-mode
   :bind (("M-n" . next-error)
          ("M-p" . previous-error))
-  :init
-  (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)
+    (validate-setq flycheck-highlighting-mode 'nil)
+    (validate-setq flycheck-flake8-maximum-line-length '150)
     (add-hook 'flycheck-mode-hook 'flycheck-color-mode-line-mode)
+    (validate-setq flycheck-sh-shellcheck-executable "/usr/bin/shellcheck -e 2086")
+    (add-hook 'find-file-hook
+          (lambda ()
+            (when (not (equal 'emacs-lisp-mode major-mode))
+              (flycheck-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
+#+BEGIN_SRC emacs-lisp
 (use-package font-lock
   :init
   (progn
     (global-font-lock-mode 1)
-    (setq font-lock-maximum-decoration t)))
+    (validate-setq font-lock-maximum-decoration t)
+    (validate-setq jit-lock-defer-time nil)
+    (validate-setq jit-lock-stealth-nice 0.1)
+    (validate-setq jit-lock-stealth-time 0.2)
+    (validate-setq jit-lock-stealth-verbose nil)))
+#+END_SRC
+** form-feed-mode
+[2015-08-31 Mon 11:27]
+Display nice lines instead of page breaks
+#+BEGIN_SRC emacs-lisp
+(use-package form-feed
+  :ensure 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
+#+BEGIN_SRC emacs-lisp :tangle no
+(use-package git-commit
+  :commands git-commit
   :mode ("COMMIT_EDITMSG" . git-commit-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
+#+BEGIN_SRC emacs-lisp :tangle no
+(use-package git-rebase
+  :commands git-rebase
   :mode ("git-rebase-todo" . git-rebase-mode))
 #+END_SRC
 ** git-gutter+
 [2014-05-21 Wed 22:56]
-#+BEGIN_SRC emacs-lisp :tangle yes
+#+BEGIN_SRC emacs-lisp
 (use-package git-gutter+
   :ensure git-gutter+
   :diminish git-gutter+-mode
@@ -1823,37 +2406,84 @@ And I want to have it everywhere.
          ("C-x s" . git-gutter+-stage-hunks)
          ("C-x c" . git-gutter+-commit)
          )
-  :init
-  (progn
-    (setq git-gutter+-disabled-modes '(org-mode))
-    (global-git-gutter+-mode 1))
   :config
   (progn
+    (validate-setq git-gutter+-disabled-modes '(org-mode))
+    (global-git-gutter+-mode 1)
     (use-package git-gutter-fringe+
       :ensure git-gutter-fringe+
       :config
       (progn
-        (setq git-gutter-fr+-side 'right-fringe)
+        (validate-setq git-gutter-fr+-side 'right-fringe)
         ;(git-gutter-fr+-minimal)
         ))))
 
 #+END_SRC
+** git-messenger
+[2015-02-22 Sun 14:00]
+Provides function that popup commit message at current line. This is
+useful when you want to know why this line was changed.
+#+BEGIN_SRC emacs-lisp
+(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-revision-mode)
+    (validate-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
+#+BEGIN_SRC emacs-lisp
 (use-package git-timemachine
-  :ensure 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
+#+BEGIN_SRC emacs-lisp
 (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
+(use-package golden-ratio
+  :ensure golden-ratio
+  :diminish golden-ratio-mode
+  :init
+  (progn
+    (golden-ratio-mode 1)
+    (validate-setq golden-ratio-exclude-buffer-names '("*LV*" "*guide-key*" "*Ediff Control Panel*"))
+    (validate-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
+(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
@@ -1861,27 +2491,28 @@ dynamically.
 
 For whatever reason I like this more than icicles <backtab> completion
 for this.
-#+BEGIN_SRC emacs-lisp :tangle yes
+#+BEGIN_SRC emacs-lisp
 (use-package guide-key
   :ensure guide-key
   :diminish guide-key-mode
-  :init
+  :config
   (progn
-    (setq guide-key/guide-key-sequence '("C-x" "C-c"))
+    (validate-setq guide-key/guide-key-sequence '("C-x" "C-c" "M-g" "M-s"))
     (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)))
+    (validate-setq guide-key/recursive-key-sequence-flag t)
+    (validate-setq guide-key/popup-window-position 'bottom)
+    (validate-setq guide-key/idle-delay 0.5)))
 
 #+END_SRC
 
 ** highlight mode
 [2014-05-21 Wed 23:51]
-#+BEGIN_SRC emacs-lisp :tangle yes
+#+BEGIN_SRC emacs-lisp
 (use-package hi-lock
   :bind (("M-o l" . highlight-lines-matching-regexp)
          ("M-o r" . highlight-regexp)
-         ("M-o w" . highlight-phrase)))
+         ("M-o w" . highlight-phrase)
+         ("M-o u" . unhighlight-regexp)))
 
 (use-package hilit-chg
   :bind ("M-o C" . highlight-changes-mode))
@@ -1890,12 +2521,13 @@ for this.
 ** 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
+#+BEGIN_SRC emacs-lisp
 (use-package hippie-exp
   :bind ("M-/" . hippie-expand)
+  :commands hippie-expand
   :config
   (progn
-    (setq hippie-expand-try-functions-list '(try-expand-dabbrev
+    (validate-setq hippie-expand-try-functions-list '(try-expand-dabbrev
                                              try-expand-dabbrev-all-buffers
                                              try-expand-dabbrev-from-kill
                                              try-complete-file-name-partially
@@ -1915,10 +2547,98 @@ Replaced by web-mode [[*web-mode][web-mode]]
 (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
+(use-package hydra
+  :ensure hydra
+  :init
+  (progn
+    (validate-setq hydra-is-helpful t)
+    (validate-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-gnus (:color red)
+      "gnus functions"
+      ("m" gnus-uu-mark-thread "mark thread")
+      ("d" gnus-summary-delete-article "delete article(s)")
+      ("r" gnus-summary-mark-as-read-forward "mark read")
+      ("n" gnus-summary-next-thread "next thread")
+      ("p" gnus-summary-prev-thread "previous thread")
+      ("g" gnus-summary-next-group "next group")
+      ("l" gnus-recenter "recenter")
+      ("x" gnus-summary-limit-to-unread "unread")
+      ("q" nil "quit"))
+    (bind-key "C-c h" 'hydra-gnus/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)
+    ))
+
 
+#+END_SRC
 ** ibuffer
 [2014-05-21 Wed 23:54]
-#+BEGIN_SRC emacs-lisp :tangle yes
+#+BEGIN_SRC emacs-lisp
 (use-package ibuffer
   :defer t
   :bind (("C-h h" . ibuffer)
@@ -1926,13 +2646,27 @@ Replaced by web-mode [[*web-mode][web-mode]]
          ("<XF86WebCam>" . ibuffer)
          )
   :commands (ibuffer)
-  :init
+  :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 " • ")
+    (validate-setq ibuffer-filter-group-name-face 'variable-pitch
+          ibuffer-use-header-line t)
+    (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 f
+      :ensure f)
+
     (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
@@ -1944,16 +2678,7 @@ Replaced by web-mode [[*web-mode][web-mode]]
         ad-do-it
         (ibuffer-update nil t)
         (unless (string= recent-buffer-name "*Ibuffer*")
-          (ibuffer-jump-to-buffer recent-buffer-name)))))
-  :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)
+          (ibuffer-jump-to-buffer recent-buffer-name))))
 
     (defun ibuffer-magit-status ()
       (interactive)
@@ -1973,7 +2698,7 @@ Replaced by web-mode [[*web-mode][web-mode]]
     (bind-key "i" 'ibuffer-magit-status ibuffer-mode-map)
     (bind-key "G" 'ibuffer-magit-status ibuffer-mode-map)
 
-    (setq ibuffer-directory-abbrev-alist
+    (validate-setq ibuffer-directory-abbrev-alist
           (-uniq
            (-flatten
             (--map
@@ -2005,7 +2730,10 @@ Replaced by web-mode [[*web-mode][web-mode]]
        (t
         (format "%8d" (buffer-size)))))
 
-    (use-package ibuf-ext)
+    (use-package ibuf-ext
+      :config
+      (validate-setq ibuffer-old-time 12))
+
     (define-ibuffer-filter filename2
         "Toggle current view to buffers with filename matching QUALIFIER."
       (:description "filename2"
@@ -2020,7 +2748,7 @@ Replaced by web-mode [[*web-mode][web-mode]]
     (defun ibuffer-magit-define-filter-groups ()
       (when (and (not ibuffer-magit-filter-groups)
                (boundp 'magit-repo-dirs))
-        (setq ibuffer-magit-filter-groups
+        (validate-setq ibuffer-magit-filter-groups
               (--map (list
                       (concat "git:: "
                               (file-name-nondirectory (directory-file-name it)))
@@ -2031,7 +2759,7 @@ Replaced by web-mode [[*web-mode][web-mode]]
       (interactive)
       ;; (ibuffer-projectile-define-filter-groups)
       ;; (ibuffer-magit-define-filter-groups)
-      (setq ibuffer-filter-groups
+      (validate-setq ibuffer-filter-groups
             (-concat
              ;; ibuffer-projectile-filter-groups
              ibuffer-magit-filter-groups
@@ -2045,6 +2773,9 @@ Replaced by web-mode [[*web-mode][web-mode]]
                    (name . "^\\*Ido Completions\\*$")
                    (name . "^\\*magit-\\(process\\)\\*$")
                    (name . "^ "))))
+             '(("Tramp"
+                (or
+                 (name . "^\\*\\(tramp/.*\\)\\*$"))))
              '(("EMACS"
                 (or
                  (name . "^\\*scratch")
@@ -2063,21 +2794,38 @@ Replaced by web-mode [[*web-mode][web-mode]]
             (let ((selected-buffer (ibuffer-current-buffer)))
               (if (not ibuffer-filter-groups)
                   (ibuffer-set-filter-groups-by-root)
-                (setq ibuffer-filter-groups nil))
+                (validate-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
+    (defun ibuffer-back-to-top ()
+      (interactive)
+      (beginning-of-buffer)
+      (next-line 3))
+
+    (defun ibuffer-jump-to-bottom ()
+      (interactive)
+      (end-of-buffer)
+      (beginning-of-line)
+      (next-line -2))
+
+    (define-key ibuffer-mode-map
+      (vector 'remap 'end-of-buffer) 'ibuffer-jump-to-bottom)
+    (define-key ibuffer-mode-map
+      (vector 'remap 'beginning-of-buffer) 'ibuffer-back-to-top)
+
+    (validate-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
+
+    (validate-setq ibuffer-formats '((mark vc-status-mini
                                   " "
                                   (git-status 8 8 :left)
                                   " "
@@ -2096,7 +2844,7 @@ Replaced by web-mode [[*web-mode][web-mode]]
                                   " " filename)
                             ))
 
-     (setq ibuffer-saved-filter-groups
+     (validate-setq ibuffer-saved-filter-groups
            (quote (("flat")
                    ("default"
                     ("dired"  (mode . dired-mode))
@@ -2113,6 +2861,7 @@ Replaced by web-mode [[*web-mode][web-mode]]
                               (name . "^\\*Backtrace\\*$")
                               (name . "^\\*Packages*\\*$")
                               (name . "^\\*Help*\\*$")
+                              (mode . grep-mode)
                               ))
                     ("gnus"  (or
                               (mode . message-mode)
@@ -2123,10 +2872,38 @@ Replaced by web-mode [[*web-mode][web-mode]]
                               (mode . gnus-article-mode)
                               (name . "^\\.bbdb$")
                               (name . "^\\.newsrc-dribble")))
+                    ("org agenda" (or
+                                   (mode . org-agenda-mode)
+                                   (name . "^*Org Agenda")))
                     ("org"   (or
                               (filename . ".*/org/.*")
-                              (mode . org-agenda-mode)
+                              ;(mode . org-agenda-mode)
                               (name . "^diary$")))
+                    ("scm" (or
+                            (mode . magit-status-mode)
+                            (mode . magit-log-mode)
+                            (mode . magit-diff-mode)
+                            (mode . magit-refs-mode)
+                            (mode . magit-revision-mode)
+                            (mode . vc-annotate-mode)))
+                    ("Tramp" (or
+                              (name . "^\\*\\(tramp/.*\\)\\*$")))
+                    ("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)))
                     ("other" (or
                               (mode . magit-log-edit-mode)
                               (name . "^\\*magit-\\(process\\|commit\\)\\*$"))))
@@ -2183,6 +2960,8 @@ Replaced by web-mode [[*web-mode][web-mode]]
                              (mode . help-mode)
                              (mode . Man-mode)
                              (name . "^\\*Personal Keybindings\\*$")))
+                    ("Tramp" (or
+                              (name . "^\\*\\(tramp/.*\\)\\*$")))
                     ;; -------------------------------------------------
                     ;; *buffer* buffers
                     ("MORE" (or (mode . magit-log-edit-mode)
@@ -2204,28 +2983,49 @@ Replaced by web-mode [[*web-mode][web-mode]]
   ;; 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)
+  (validate-setq ibuffer-expert t)
 
 ))
 #+END_SRC
+** ivy-mode, swiper
+[2015-10-16 Fri 16:28]
+#+BEGIN_SRC emacs-lisp
+(use-package swiper
+  :ensure swiper
+  :bind (("C-s" . swiper)
+         ("C-r" . swiper)
+         ("C-c C-r" . ivy-resume)
+         ("<f7>" . ivy-resume))
+  :config
+  (progn
+    ;(ivy-mode 1)
+    (validate-setq ivy-use-virtual-buffers t)
+    ;;advise swiper to recenter on exit
+    (defun bjm-swiper-recenter (&rest args)
+      "recenter display after swiper"
+      (recenter)
+      )
+    (advice-add 'swiper :after #'bjm-swiper-recenter)
+    ))
+#+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
+#+BEGIN_SRC emacs-lisp
 (use-package icicles
-  :load-path "elisp/icicle/"
-  :init
+  :ensure icicles
+  :config
   (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
+#+BEGIN_SRC emacs-lisp
 (icomplete-mode 99)
 #+END_SRC
 ** iedit
 [2014-05-26 Mon 22:49]
-#+BEGIN_SRC emacs-lisp :tangle yes
+#+BEGIN_SRC emacs-lisp
 (use-package iedit
   :ensure iedit
   :commands (iedit-mode)
@@ -2237,10 +3037,10 @@ list of matching commands is echoed
 #+END_SRC
 ** info stuff
 [2014-05-20 Tue 23:35]
-#+BEGIN_SRC emacs-lisp :tangle yes
+#+BEGIN_SRC emacs-lisp
 (use-package info
   :bind ("C-h C-i" . info-lookup-symbol)
-
+  :commands info-lookup-symbol
   :config
   (progn
     ;; (defadvice info-setup (after load-info+ activate)
@@ -2259,12 +3059,12 @@ 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
+#+BEGIN_SRC emacs-lisp
 (use-package linum
   :diminish linum-mode
   :config
   (progn
-    (setq linum-format "%3d ")
+    (validate-setq linum-format "%3d ")
     (setq linum-mode-inhibit-modes-list '(org-mode
                                           eshell-mode
                                           shell-mode
@@ -2278,20 +3078,30 @@ gnus, so we have a list of modes where we don't want to see it.
         ad-do-it))
 
     (ad-activate 'linum-on)
+
     (use-package linum-relative
       :ensure linum-relative
-      :bind ("C-c r" . linum-relative-toggle))
-    )
+      :init
+      (progn
+        (validate-setq linum-format 'dynamic)
+        )))
   :init
   (global-linum-mode 1))
+(use-package hlinum
+  :ensure t
+  :config
+  (progn
+    (hlinum-activate)))
 #+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
+#+BEGIN_SRC emacs-lisp
 (bind-key "TAB" 'lisp-complete-symbol read-expression-map)
+(bind-key "M-." 'find-function-at-point emacs-lisp-mode-map)
 
 (defun remove-elc-on-save ()
   "If you're saving an elisp file, likely the .elc is no longer valid."
@@ -2315,7 +3125,6 @@ then I like it nice too...
 (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))
@@ -2324,61 +3133,75 @@ then I like it nice too...
 (after "eldoc"
   '(diminish 'eldoc-mode))
 #+END_SRC
-
+** lua
+[2016-10-27 Thu 17:49]
+Lua editing
+#+BEGIN_SRC emacs-lisp
+(use-package lua-mode
+  :ensure t
+  :commands lua-mode
+  :mode ("\\.lua" . lua-mode))
+#+END_SRC
 ** magit
 [2013-04-21 So 20:48]
 magit is a mode for interacting with git.
-#+BEGIN_SRC emacs-lisp :tangle yes
+#+BEGIN_SRC emacs-lisp
 (use-package magit
   :ensure magit
   :commands  (magit-log magit-run-gitk magit-run-git-gui magit-status
-              magit-git-repo-p magit-list-repos)
+                        magit-git-repo-p magit-list-repos)
   :defer t
   :bind (("C-x g" . magit-status)
          ("C-x G" . magit-status-with-prefix))
-  :init
+  :config
   (progn
-    (setq magit-commit-signoff t
-          magit-repo-dirs '("~/git"
-                            "/develop/vcs/"
-                            "/develop/Debian/"
-                            )
-          magit-repo-dirs-depth 4
-          magit-log-auto-more t)
+    (setq magit-repository-directories '("~/git"
+                                                  "/develop/vcs/"
+                                                  "/develop/Debian/"
+                                                  "~/devel"
+                                                  ))
+    (validate-setq magit-repository-directories-depth 4)
+    (validate-setq magit-log-auto-more t)
+
     (use-package magit-blame
-      :commands magit-blame-mode)
+      :commands magit-blame-mode
+      :defer t)
 
-    (use-package magit-svn
-      :ensure magit-svn
-      :commands (magit-svn-mode
-                 turn-on-magit-svn))
+                                        ; (use-package magit-svn
+                                        ;   :ensure magit-svn
+                                        ;   :commands (magit-svn-mode
+                                        ;              turn-on-magit-svn)
+                                        ;   :defer t)
 
     (add-hook 'magit-mode-hook 'hl-line-mode)
     (defun magit-status-with-prefix ()
       (interactive)
       (let ((current-prefix-arg '(4)))
         (call-interactively 'magit-status)))
-    )
-  :config
-  (progn
     (setenv "GIT_PAGER" "")
 
     (unbind-key "M-h" magit-mode-map)
     (unbind-key "M-s" magit-mode-map)
-
-    (use-package magit-find-file
-      :ensure magit-find-file
-      :commands (magit-find-file-completing-read)
-      :defer t
-      :init
-      (progn
-        (bind-key "C-x C-f" 'magit-find-file-completing-read magit-mode-map)))
+    (add-to-list 'magit-no-confirm 'stage-all-changes)
+    (validate-setq magit-push-always-verify nil)
+    (validate-setq magit-last-seen-setup-instructions "2.1.0")
+                                        ; (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)))
 
+    (add-hook 'git-rebase-mode-hook
+              #'(lambda ()
+                  (smartscan-mode 0))
+              )
     (defadvice magit-status (around magit-fullscreen activate)
       (window-configuration-to-register :magit-fullscreen)
       ad-do-it
@@ -2391,45 +3214,61 @@ magit is a mode for interacting with git.
       (jump-to-register :magit-fullscreen))
 
     (bind-key "q" 'magit-quit-session magit-status-mode-map)
+
+    (defun magit-rebase-unpushed (commit &optional args)
+      "Start an interactive rebase sequence over all unpushed commits."
+      (interactive (list (magit-get-tracked-branch)
+                         (magit-rebase-arguments)))
+      (if (validate-setq commit (magit-rebase-interactive-assert commit))
+          (magit-run-git-sequencer "rebase" "-i" commit args)
+        (magit-log-select
+         `(lambda (commit)
+            (magit-rebase-interactive (concat commit "^") (list ,@args))))))
+
+    (magit-define-popup-action 'magit-rebase-popup ?l "Rebase unpushed" 'magit-rebase-unpushed)
     ))
 #+END_SRC
 ** markdown-mode
 [2014-05-20 Tue 23:04]
-#+BEGIN_SRC emacs-lisp :tangle yes
+#+BEGIN_SRC emacs-lisp
 (use-package markdown-mode
+  :ensure t
   :mode (("\\.md\\'" . markdown-mode)
          ("\\.mdwn\\'" . markdown-mode))
   :defer t)
 #+END_SRC
 ** message
-#+BEGIN_SRC emacs-lisp :tangle yes
-(require 'message)
-(setq message-kill-buffer-on-exit t)
+#+BEGIN_SRC emacs-lisp
+(use-package message
+  :config
+  (progn
+    (validate-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.
 
 I want to access it from anywhere using =F6=.
-#+BEGIN_SRC emacs-lisp :tangle yes
+#+BEGIN_SRC emacs-lisp :tangle no
 (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/")))
+    (validate-setq mingus-dired-add-keys t)
+    (validate-setq mingus-mode-always-modeline nil)
+    (validate-setq mingus-mode-line-show-elapsed-percentage nil)
+    (validate-setq mingus-mode-line-show-volume nil)
+    (validate-setq mingus-mpd-config-file "/etc/mpd.conf")
+    (validate-setq mingus-mpd-playlist-dir "/var/lib/mpd/playlists")
+    (validate-setq mingus-mpd-root "/share/music/")))
 #+END_SRC
 
 ** miniedit
 Edit minibuffer in a full (text-mode) buffer by pressing *M-C-e*.
-#+BEGIN_SRC emacs-lisp :tangle yes
+#+BEGIN_SRC emacs-lisp
 (use-package miniedit
   :ensure miniedit
+  :commands miniedit
   :config
   (progn
     (bind-key "M-C-e" 'miniedit minibuffer-local-map)
@@ -2439,18 +3278,17 @@ Edit minibuffer in a full (text-mode) buffer by pressing *M-C-e*.
   ))
 #+END_SRC
 
-
 ** mmm-mode
 [2013-05-21 Tue 23:39]
 MMM Mode is a minor mode for Emacs that allows Multiple Major Modes to
 coexist in one buffer.
-#+BEGIN_SRC emacs-lisp :tangle yes
+#+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)
+    (validate-setq mmm-global-mode 'buffers-with-submode-classes)
+    (validate-setq mmm-submode-decoration-level 2)
     (eval-after-load 'mmm-vars
       '(progn
          (mmm-add-group
@@ -2483,22 +3321,21 @@ coexist in one buffer.
 ** 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
+#+BEGIN_SRC emacs-lisp
 (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)))
+    (validate-setq mo-git-blame-blame-window-width 25)))
 #+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
+#+BEGIN_SRC emacs-lisp :tangle no
 (use-package multiple-cursors
   :ensure multiple-cursors
   :defer t
@@ -2506,6 +3343,10 @@ Use multiple cursors mode. See [[http://emacsrocks.com/e13.html][Emacs Rocks! mu
              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)
@@ -2518,12 +3359,12 @@ Use multiple cursors mode. See [[http://emacsrocks.com/e13.html][Emacs Rocks! mu
     (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))))
+    (validate-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
+#+BEGIN_SRC emacs-lisp
 (use-package neotree
   :ensure neotree
   :defer t
@@ -2531,63 +3372,87 @@ A emacs tree plugin
   :commands (neotree-find
              neotree-toggle
              neotree)
-  :init
+  :config
+  (progn
+    (bind-key "^" 'neotree-select-up-node neotree-mode-map)
+    (validate-setq neo-smart-open t)))
+
+#+END_SRC
+** notmuch
+[2016-10-24 Mon 18:18]
+Nice email search
+#+BEGIN_SRC emacs-lisp
+(use-package notmuch
+  :ensure t
+  :defer t
+  :commands (notmuch)
+  :config
   (progn
-    (setq neo-smart-open t)))
+    (validate-setq notmuch-search-oldest-first nil)))
 #+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)
-
-;; 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)))
-
-;;----------------------------------------------------------------------------
-;; Integration with tidy for html + xml
-;;----------------------------------------------------------------------------
-;; tidy is autoloaded
-(eval-after-load 'tidy
-  '(progn
-     (add-hook 'nxml-mode-hook (lambda () (tidy-build-menu nxml-mode-map)))
-     (add-hook 'html-mode-hook (lambda () (tidy-build-menu html-mode-map)))
-     ))
+#+BEGIN_SRC emacs-lisp
+  (use-package nxml-mode
+    :mode (("web.config$" . xml-mode)
+           ("\\.xml" . xml-mode)
+           ("\\.xsd" . xml-mode)
+           ("\\.sch" . xml-mode)
+           ("\\.rng" . xml-mode)
+           ("\\.xslt" . xml-mode)
+           ("\\.svg" . xml-mode)
+           ("\\.rss" . xml-mode)
+           ("\\.gpx" . xml-mode)
+           ("\\.tcx" . xml-mode))
+    :defer t
+    :config
+    (progn
+      (setq nxml-child-indent 4)
+      (setq nxml-slash-auto-complete-flag t)
+      (add-hook 'nxml-mode-hook (lambda () (emmet-mode t)))
+
+      (fset 'xml-mode 'nxml-mode)
+      (validate-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)))
+
+      ;;----------------------------------------------------------------------------
+      ;; Integration with tidy for html + xml
+      ;;----------------------------------------------------------------------------
+      ;; tidy is autoloaded
+      (eval-after-load 'tidy
+        '(progn
+           (add-hook 'nxml-mode-hook (lambda () (tidy-build-menu nxml-mode-map)))
+           (add-hook 'html-mode-hook (lambda () (tidy-build-menu html-mode-map)))
+           ))))
 
 #+END_SRC
-** org                                                                :FIXME:
+** org                                                               :FIXME:
 *** General settings
 [2013-04-28 So 17:06]
 
 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
+#+BEGIN_SRC emacs-lisp
 (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
+#+BEGIN_SRC emacs-lisp
 (require 'org-protocol)
 #+END_SRC
 
@@ -2595,11 +3460,8 @@ that we need org-protocol.
 
 My current =org-agenda-files= variable only includes a set of
 directories.
-#+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
+#+BEGIN_SRC emacs-lisp
 (setq org-agenda-files (quote ("~/org/"
-                               "~/org/debian"
-                               "~/org/debconf"
-                               "~/org/spi"
                                "~/org/nsb"
                                )))
 (setq org-default-notes-file "~/org/notes.org")
@@ -2617,7 +3479,7 @@ 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
+#+BEGIN_SRC emacs-lisp
 ;; Keep tasks with dates on the global todo lists
 (setq org-agenda-todo-ignore-with-date nil)
 
@@ -2686,7 +3548,7 @@ since new files in existing directories are automatically picked up.
           'append)
 #+END_SRC
 
-#+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
+#+BEGIN_SRC emacs-lisp
 (setq org-agenda-persistent-filter t)
 (add-hook 'org-agenda-mode-hook
           '(lambda () (org-defkey org-agenda-mode-map "W" 'bh/widen))
@@ -2733,7 +3595,7 @@ Start off by defining a series of keybindings.
 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
+#+BEGIN_SRC emacs-lisp
 (add-hook 'org-mode-hook
           (lambda ()
             (org-defkey org-mode-map "\C-c["    'undefined)
@@ -2743,7 +3605,7 @@ comments headlines - a function never used.
 #+END_SRC
 
 And now a largish set of keybindings...
-#+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
+#+BEGIN_SRC emacs-lisp
 (bind-key "C-c l" 'org-store-link)
 (bind-key "C-c a" 'org-agenda)
 ;(bind-key "C-c b" 'org-iswitchb)
@@ -2752,7 +3614,7 @@ And now a largish set of keybindings...
 (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 "<f7>"      'bh/set-truncate-lines)
 ;(bind-key "<f8>"      'org-cycle-agenda-files)
 
 (bind-key "<f9> <f9>" 'bh/show-org-agenda)
@@ -2785,14 +3647,14 @@ And now a largish set of keybindings...
 (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)
+;(bind-key "C-k" 'jj-org-kill-line org-mode-map)
 
 #+END_SRC
 
 *** Tasks, States, Todo fun
 
 First we define the global todo keywords.
-#+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
+#+BEGIN_SRC emacs-lisp
 (setq org-todo-keywords
       (quote ((sequence "TODO(t)" "NEXT(n)" "|" "DONE(d@/!)")
               (sequence "WAITING(w@/!)" "HOLD(h@/!)" "DELEGATED(g@/!)" "|" "CANCELLED(c@/!)" "PHONE"))))
@@ -2812,7 +3674,7 @@ First we define the global todo keywords.
 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
+#+BEGIN_SRC emacs-lisp
 (setq org-use-fast-todo-selection t)
 #+END_SRC
 Changing a task state is done with =C-c C-t KEY=
@@ -2820,7 +3682,7 @@ Changing a task state is done with =C-c C-t KEY=
 where =KEY= is the appropriate fast todo state selection key as defined in =org-todo-keywords=.
 
 The setting
-#+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
+#+BEGIN_SRC emacs-lisp
 (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
@@ -2847,7 +3709,7 @@ The triggers break down to the following rules:
 - Moving a task to =DONE= removes =WAITING= and =CANCELLED= tags
 
 The tags are used to filter tasks in the agenda views conveniently.
-#+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
+#+BEGIN_SRC emacs-lisp
 (setq org-todo-state-tags-triggers
       (quote (("CANCELLED" ("CANCELLED" . t))
               ("WAITING" ("WAITING" . t))
@@ -2860,7 +3722,7 @@ The tags are used to filter tasks in the agenda views conveniently.
 
 *** Capturing new tasks
 Org capture replaces the old remember mode.
-#+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
+#+BEGIN_SRC emacs-lisp
 (setq org-directory "~/org")
 (setq org-default-notes-file "~/org/refile.org")
 
@@ -2909,14 +3771,14 @@ 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
+#+BEGIN_SRC emacs-lisp :tangle no
 (add-hook 'org-clock-out-hook 'bh/remove-empty-drawer-on-clock-out 'append)
 #+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
+#+BEGIN_SRC emacs-lisp
 ; 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))))
@@ -2947,7 +3809,7 @@ moved over to the right place. The following is the setup for it.
 
 *** Custom agenda
 Agenda view is the central place for org-mode interaction...
-#+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
+#+BEGIN_SRC emacs-lisp
 ;; Do not dim blocked tasks
 (setq org-agenda-dim-blocked-tasks nil)
 ;; Compact the block agenda view
@@ -3042,7 +3904,7 @@ Agenda view is the central place for org-mode interaction...
 #+END_SRC
 
 *** Time
-#+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
+#+BEGIN_SRC emacs-lisp
 ;;
 ;; Resume clocking task when emacs is restarted
 (org-clock-persistence-insinuate)
@@ -3102,7 +3964,7 @@ clock moves up the project tree until you clock out the
 top-level task and the clock moves to the default task.
 
 **** Reporting
-#+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
+#+BEGIN_SRC emacs-lisp
 ;; Agenda clock report parameters
 (setq org-agenda-clockreport-parameter-plist
       (quote (:link t :maxlevel 5 :fileskip0 t :compact t :narrow 80)))
@@ -3112,12 +3974,12 @@ top-level task and the clock moves to the default task.
 #+END_SRC
 **** Task estimates, column view
 Setup column view globally with the following headlines
-#+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
+#+BEGIN_SRC emacs-lisp
 ; Set default column view headings: Task Effort Clock_Summary
 (setq org-columns-default-format "%80ITEM(Task) %10Effort(Effort){:} %10CLOCKSUM")
 #+END_SRC
 Setup the estimate for effort values.
-#+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
+#+BEGIN_SRC emacs-lisp
 ; 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")
@@ -3126,7 +3988,7 @@ Setup the estimate for effort values.
 
 *** Tags
 Tags are mostly used for filtering inside the agenda.
-#+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
+#+BEGIN_SRC emacs-lisp
 ; Tags with fast selection keys
 (setq org-tag-alist (quote ((:startgroup)
                             ("@errand" . ?e)
@@ -3154,13 +4016,13 @@ Tags are mostly used for filtering inside the agenda.
 #+END_SRC
 
 *** Archiving
-#+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
+#+BEGIN_SRC emacs-lisp
 (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
+#+BEGIN_SRC emacs-lisp
 (setq org-ditaa-jar-path "~/java/ditaa0_6b.jar")
 (setq org-plantuml-jar-path "~/java/plantuml.jar")
 
@@ -3199,12 +4061,12 @@ Tags are mostly used for filtering inside the agenda.
 (add-to-list 'org-src-lang-modes (quote ("plantuml" . fundamental)))
 #+END_SRC
 
-#+BEGIN_SRC emacs-lisp :tangle yes
+#+BEGIN_SRC emacs-lisp
 ;; 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
+#+BEGIN_SRC emacs-lisp
 (add-to-list 'org-structure-template-alist
              '("n" "#+BEGIN_COMMENT\n?\n#+END_COMMENT"
                "<comment>\n?\n</comment>"))
@@ -3231,11 +4093,12 @@ Org-mode can export to a variety of publishing formats including (but not limite
 
 A new exporter created by Nicolas Goaziou was introduced in org 8.0.
 
-#+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
+#+BEGIN_SRC emacs-lisp
 ;; Explicitly load required exporters
 (require 'ox-html)
 (require 'ox-latex)
 (require 'ox-ascii)
+;(require 'ox-reveal)
 ;; FIXME, check the following two
 ;(require 'ox-icalendar)
 ;(require 'ox-odt)
@@ -3244,6 +4107,8 @@ A new exporter created by Nicolas Goaziou was introduced in org 8.0.
 (setq org-export-docbook-xsl-fo-proc-command "fop %s %s")
 (setq org-export-docbook-xslt-proc-command "xsltproc --output %s /usr/share/xml/docbook/stylesheet/nwalsh/fo/docbook.xsl %s")
 
+(setq org-reveal-root "file:///home/joerg/devel/ganeticon2015/reveal.js/reveal.js")
+
 ;; define categories that should be excluded
 (setq org-export-exclude-category (list "google" "google"))
 (setq org-icalendar-use-scheduled '(todo-start event-if-todo))
@@ -3256,7 +4121,7 @@ A new exporter created by Nicolas Goaziou was introduced in org 8.0.
 (setq org-export-with-sub-superscripts nil)
 
 (setq org-html-head-extra (concat
-                           "<link rel=\"stylesheet\" href=\"http://ganneff.de/stylesheet.css\" type=\"text/css\" />\n"
+                           "<link rel=\"stylesheet\" href=\"https://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
@@ -3306,7 +4171,7 @@ A new exporter created by Nicolas Goaziou was introduced in org 8.0.
 
 **** Latex export
 
-#+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
+#+BEGIN_SRC emacs-lisp
 (setq org-latex-to-pdf-process
       '("xelatex -interaction nonstopmode %f"
         "xelatex -interaction nonstopmode %f")) ;; for multiple passes
@@ -3392,12 +4257,12 @@ 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.
 
-#+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
+#+BEGIN_SRC emacs-lisp
 (setq org-catch-invisible-edits 'error)
 #+END_SRC
 
 *** Whatever
-#+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
+#+BEGIN_SRC emacs-lisp
 ;; disable the default org-mode stuck projects agenda view
 (setq org-stuck-projects (quote ("" nil nil "")))
 
@@ -3420,13 +4285,13 @@ The following setting adds alphabetical lists like
   ,a. item one
   ,b. item two
 
-#+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
+#+BEGIN_SRC emacs-lisp
 (if (> emacs-major-version 23)
     (setq org-list-allow-alphabetical t)
   (setq org-alphabetical-lists t))
 #+END_SRC
 
-#+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
+#+BEGIN_SRC emacs-lisp
 (setq org-remove-highlights-with-change nil)
 
 (setq org-list-demote-modify-bullet (quote (("+" . "-")
@@ -3445,7 +4310,7 @@ The following setting adds alphabetical lists like
 #+END_SRC
 
 
-#+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
+#+BEGIN_SRC emacs-lisp
 ;; Enable abbrev-mode
 (add-hook 'org-mode-hook (lambda () (abbrev-mode 1)))
 (setq org-startup-indented t)
@@ -3461,24 +4326,24 @@ lists with no blank lines better.
 
 The following setting prevents creating blank lines before headings
 but allows list items to adapt to existing blank lines around the items:
-#+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
+#+BEGIN_SRC emacs-lisp
 (setq org-blank-before-new-entry (quote ((heading)
                                          (plain-list-item . auto))))
 #+END_SRC
 
-#+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
+#+BEGIN_SRC emacs-lisp
 (setq org-reverse-note-order nil)
 (setq org-default-notes-file "~/notes.org")
 #+END_SRC
 
 Enforce task blocking. Tasks can't go done when there is any subtask
 still open. Unless they have a property of =NOBLOCKING: t=
-#+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
+#+BEGIN_SRC emacs-lisp
 (setq org-enforce-todo-checkbox-dependencies t)
 (setq org-enforce-todo-dependencies t)
 #+END_SRC
 
-#+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
+#+BEGIN_SRC emacs-lisp
 (setq org-fast-tag-selection-single-key (quote expert))
 (setq org-footnote-auto-adjust t)
 (setq org-hide-block-startup t)
@@ -3526,8 +4391,8 @@ 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 t)
+#+BEGIN_SRC emacs-lisp
+(setq org-use-speed-commands nil)
 (setq org-speed-commands-user (quote (("0" . ignore)
                                       ("1" . ignore)
                                       ("2" . ignore)
@@ -3590,44 +4455,44 @@ display a list of the code blocks commands and their related keys.
           'append)
 #+END_SRC
 
+
 The following displays the contents of code blocks in Org-mode files
 using the major-mode of the code.  It also changes the behavior of
 =TAB= to as if it were used in the appropriate major mode.  This means
 that reading and editing code form inside of your Org-mode files is
 much more like reading and editing of code using its major mode.
 
-#+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
+#+BEGIN_SRC emacs-lisp
 (setq org-src-fontify-natively t)
 (setq org-src-tab-acts-natively t)
 #+END_SRC
 
-#+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
+#+BEGIN_SRC emacs-lisp
 (setq org-src-preserve-indentation nil)
 (setq org-edit-src-content-indentation 0)
 #+END_SRC
 
 
-#+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
+#+BEGIN_SRC emacs-lisp
 (setq org-attach-directory "~/org/data/")
 #+END_SRC
-#+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
+#+BEGIN_SRC emacs-lisp
 (setq org-agenda-sticky t)
 #+END_SRC
 
 **** Checklist handling
 [2013-05-11 Sat 22:15]
 
-#+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
+#+BEGIN_SRC emacs-lisp
 (require 'org-checklist)
 #+END_SRC
-
 ** 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
+#+BEGIN_SRC emacs-lisp
 (use-package cperl-mode
   :commands cperl-mode
-  :init
+  :config
   (progn
     (defalias 'perl-mode 'cperl-mode)
     (add-auto-mode 'cperl-mode "\\.\\([pP][Llm]\\|al\\)\\'")
@@ -3636,11 +4501,8 @@ up here to be used.
     (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
+    (setq cperl-invalid-face nil)
+    (validate-setq cperl-close-paren-offset -4
           cperl-continued-statement-offset 0
           cperl-indent-level 4
           cperl-indent-parens-as-block t
@@ -3669,26 +4531,40 @@ up here to be used.
                 (eldoc-mode))))
   )
 #+END_SRC
+** proced
+[2016-11-01 Tue 17:57]
+#+BEGIN_SRC emacs-lisp
+(setq-default proced-auto-update-flag t)
+(setq-default proced-auto-update-interval 5)
+#+END_SRC
+
 ** puppet
 [2014-05-22 Thu 00:05]
-#+BEGIN_SRC emacs-lisp :tangle yes
+#+BEGIN_SRC emacs-lisp
 (use-package puppet-mode
+  :ensure t
   :mode ("\\.pp\\'" . puppet-mode)
+  :bind (:map puppet-mode-map
+              ("C-c C-a" . puppet-align-block)
+              ("C-c '" . puppet-toggle-string-quotes)
+              ("C-c <delete>" . puppet-clear-string)
+              ("C-c C-j" . imenu)
+              ("C-c M-a" . puppet-set-anchor)
+              ("C-c C-r" . puppet-create-require)
+              )
+  :commands puppet-mode
   :config
-  (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)
     (defun my-puppet-mode-hook ()
-      (setq require-final-newline nil))
-    (add-hook 'puppet-mode-hook 'my-puppet-mode-hook))))
+      (validate-setq require-final-newline nil))
+    (add-hook 'puppet-mode-hook 'my-puppet-mode-hook)
+    (use-package puppet-ext)))
 #+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
+#+BEGIN_SRC emacs-lisp :tangle no
 (use-package elpy
   :defer t
   :mode ("\.py" . python-mode)
@@ -3732,35 +4608,35 @@ various variables. Elpy author may like them, but I'm not him...
     (add-hook 'python-mode-hook 'elpy-initialize-local-variables)
 
     (defun my-python-mode-hook ()
-      (setq require-final-newline nil)
-      (setq mode-require-final-newline))
+      (validate-setq require-final-newline nil)
+      (validate-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"))
+      (validate-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)
+    (validate-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)
+    (validate-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)
+    (validate-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)
+    (validate-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
@@ -3768,14 +4644,14 @@ various variables. Elpy author may like them, but I'm not him...
     ;; doing this.
     (let ((old (when (boundp 'yas-trigger-key)
                  yas-trigger-key)))
-      (setq yas-trigger-key "C-c C-i")
+      (validate-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)))
+      (validate-setq yas-snippet-dirs (list yas-snippet-dirs)))
     (add-to-list 'yas-snippet-dirs
                  (concat (file-name-directory (locate-library "elpy"))
                          "snippets/")
@@ -3824,17 +4700,17 @@ the preferred method python evaluation.
 #+BEGIN_SRC emacs-lisp :tangle no
 (when (executable-find "ipython")
   (require 'ipython)
-  (setq org-babel-python-mode 'python-mode))
+  (validate-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
+(validate-setq python-shell-interpreter "ipython")
+(validate-setq python-shell-interpreter-args "")
+(validate-setq python-shell-prompt-regexp "In \\[[0-9]+\\]: ")
+(validate-setq python-shell-prompt-output-regexp "Out\\[[0-9]+\\]: ")
+(validate-setq python-shell-completion-setup-code
    "from IPython.core.completerlib import module_completion")
-(setq python-shell-completion-module-string-code
+(validate-setq python-shell-completion-module-string-code
    "';'.join(module_completion('''%s'''))\n")
-(setq python-shell-completion-string-code
+(validate-setq python-shell-completion-string-code
    "';'.join(get_ipython().Completer.all_completions('''%s'''))\n")
 #+END_SRC
 ** rainbow-delimiters
@@ -3844,41 +4720,44 @@ 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
+#+BEGIN_SRC emacs-lisp
 (use-package rainbow-delimiters
   :ensure rainbow-delimiters
+  :commands rainbow-delimiters-mode
   :init
-  (global-rainbow-delimiters-mode))
+  (add-hook 'prog-mode-hook #'rainbow-delimiters-mode))
 #+END_SRC
 ** rainbow-mode
-#+BEGIN_SRC emacs-lisp :tangle yes
+#+BEGIN_SRC emacs-lisp
 (use-package rainbow-mode
   :ensure rainbow-mode
+  :defer t
   :diminish rainbow-mode)
 #+END_SRC
 
 ** re-builder
 Saner regex syntax
-#+BEGIN_SRC emacs-lisp :tangle yes
+#+BEGIN_SRC emacs-lisp
 (use-package re-builder
-  :command re-builder
+  :commands re-builder
   :defer t
   :config
-  (setq reb-re-syntax 'string))
+  (validate-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
+#+BEGIN_SRC emacs-lisp
 (use-package recentf
   :if (not noninteractive)
   :bind ("C-x C-r" . recentf-open-files)
+  :defer t
   :init
   (progn
     (recentf-mode 1)
-    (setq recentf-max-menu-items 25)
-    (setq recentf-save-file (expand-file-name ".recentf" jj-cache-dir))
+    (validate-setq recentf-max-menu-items 25)
+    (validate-setq recentf-save-file (expand-file-name ".recentf" jj-cache-dir))
 
     (defun recentf-add-dired-directory ()
       (if (and dired-directory
@@ -3897,10 +4776,10 @@ files. This list is is automatically saved across Emacs sessions.
 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
+#+BEGIN_SRC emacs-lisp :tangle no
 (use-package region-bindings-mode
   :ensure region-bindings-mode
-  :init
+  :config
   (region-bindings-mode-enable))
 #+END_SRC
 ** ruby
@@ -3908,7 +4787,7 @@ then, like for example the [[*multiple%20cursors][multiple cursors]] mode I load
 Programming in ruby...
 
 *** Auto-modes
-#+BEGIN_SRC emacs-lisp :tangle yes
+#+BEGIN_SRC emacs-lisp
 (add-auto-mode 'ruby-mode
                "Rakefile\\'" "\\.rake\\'" "\.rxml\\'"
                "\\.rjs\\'" ".irbrc\\'" "\.builder\\'" "\\.ru\\'"
@@ -3916,7 +4795,7 @@ Programming in ruby...
 #+END_SRC
 
 *** Config
-#+BEGIN_SRC emacs-lisp :tangle yes
+#+BEGIN_SRC emacs-lisp
 (use-package ruby-mode
   :mode ("\\.rb\\'" . ruby-mode)
   :interpreter ("ruby" . ruby-mode)
@@ -3924,6 +4803,7 @@ Programming in ruby...
   :config
   (progn
     (use-package yari
+      :ensure t
       :init
       (progn
         (defvar yari-helm-source-ri-pages
@@ -3958,9 +4838,10 @@ Programming in ruby...
         ;(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)))
+        ;; (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.
@@ -3973,18 +4854,22 @@ Programming in ruby...
 ** 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
+(use-package desktop
+  :init
+  (setq desktop-path (list jj-cache-dir))
+  :config
+  (progn
+    (desktop-save-mode 1)
+    (defadvice desktop-read (around trace-desktop-errors activate)
+      (let ((debug-on-error t))
+        ad-do-it))))
 
 ;;----------------------------------------------------------------------------
 ;; Restore histories and registers after saving
 ;;----------------------------------------------------------------------------
 (use-package session
-  :if (not noninteractive)
+  :ensure t
   :load-path "site-lisp/session/lisp/"
   :init
   (progn
@@ -4007,8 +4892,9 @@ Save and restore the desktop
                     tags-file-name
                     register-alist)))
 
-    (session-initialize)
-
+    (session-initialize))
+  :config
+  (progn
     (defun remove-session-use-package-from-settings ()
       (when (string= (file-name-nondirectory (buffer-file-name)) "settings.el")
         (save-excursion
@@ -4048,43 +4934,51 @@ Save and restore the desktop
 
     (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)
+#+BEGIN_SRC emacs-lisp
+(use-package savehist
+  :init
+  (progn
+    (setq savehist-file (expand-file-name "savehist" jj-cache-dir))
+    (setq history-length 1000))
+  :config
+  (progn
+    (setq savehist-additional-variables
+          '(search ring regexp-search-ring kill-ring compile-history))
+    ;; save every minute
+    (validate-setq savehist-autosave-interval 60)
+    (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))
+#+BEGIN_SRC emacs-lisp
+(use-package saveplace
+  :ensure t
+  :defer t
+  :config
+  (progn
+    (setq save-place-file (expand-file-name "saved-places" jj-cache-dir)
+    (save-place-mode))))
 #+END_SRC
 ** simple-httpd
 [2014-06-10 Tue 22:05]
-#+BEGIN_SRC emacs-lisp :tangle yes
+#+BEGIN_SRC emacs-lisp
 (use-package simple-httpd
   :ensure simple-httpd
   :commands (httpd-start httpd-stop)
   :config
   (progn
-    (setq httpd-root "/srv/www")
+    (validate-setq httpd-root "/srv/www")
     )
 )
 #+END_SRC
 ** sh
 Settings for shell scripts
-#+BEGIN_SRC emacs-lisp :tangle yes
+#+BEGIN_SRC emacs-lisp
 (use-package sh-script
   :defer t
   :config
@@ -4092,8 +4986,8 @@ Settings for shell scripts
     (defvar sh-script-initialized nil)
     (defun initialize-sh-script ()
       (unless sh-script-initialized
-        (setq sh-script-initialized t)
-        (setq sh-indent-comment t)
+        (validate-setq sh-script-initialized t)
+        (validate-setq sh-indent-comment t)
         (info-lookup-add-help :mode 'shell-script-mode
                               :regexp ".*"
                               :doc-spec
@@ -4102,34 +4996,56 @@ Settings for shell scripts
     (add-hook 'shell-mode-hook 'initialize-sh-script)))
 #+END_SRC
 ** sh-toggle
-#+BEGIN_SRC emacs-lisp :tangle yes
+#+BEGIN_SRC emacs-lisp
 (use-package sh-toggle
   :bind ("C-. C-z" . shell-toggle))
 #+END_SRC
+** shrink-whitespace
+[2016-11-01 Tue 17:53] Usually M-SPC is bound to just-one-space, but
+shrink-whitespace is actually a better alternative because it can
+shrink space between lines.
+
+Thanks to
+http://pragmaticemacs.com/emacs/delete-blank-lines-and-shrink-whitespace/
+for the link to this package.
+
+#+BEGIN_SRC emacs-lisp
+(use-package shrink-whitespace
+  :ensure t
+  :bind ("M-SPC" . shrink-whitespace))
+#+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
+(use-package smartscan
+  :ensure smartscan
+  :defer t
+  :config (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
+#+BEGIN_SRC emacs-lisp
 (use-package time-stamp
   :commands time-stamp
-  :init
-  (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)))
+    (add-hook 'write-file-hooks 'time-stamp)
+    (validate-setq time-stamp-active t)
+    (validate-setq time-stamp-format "%02H:%02M:%02S (%z) - %02d.%02m.%:y from %u (%U) on %s")
+    (validate-setq time-stamp-old-format-warn nil)
+    (validate-setq time-stamp-time-zone nil)))
 #+END_SRC
 
 ** tiny-tools
 We configure only a bit of the tiny-tools to load when I should need
 them. I don't need much actually, but these things are nice to have.
 
-#+BEGIN_SRC emacs-lisp :tangle yes
+#+BEGIN_SRC emacs-lisp
 (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)
@@ -4140,7 +5056,7 @@ them. I don't need much actually, but these things are nice to have.
 (autoload 'tinyeat-kill-line-backward          "tinyeat" "" t)
 #+END_SRC
 *** Keyboard changes for tiny-tools
-#+BEGIN_SRC emacs-lisp :tangle yes
+#+BEGIN_SRC emacs-lisp
 (bind-key "\M-;"          'tinycomment-indent-for-comment)
 (bind-key "ESC C-k"       'tinyeat-kill-line-backward)
 (bind-key "ESC d"         'tinyeat-forward-preserve)
@@ -4149,27 +5065,26 @@ them. I don't need much actually, but these things are nice to have.
 #+END_SRC
 ** tramp
 Transparent Remote (file) Access, Multiple Protocol, remote file editing.
-#+BEGIN_SRC emacs-lisp :tangle yes
+#+BEGIN_SRC emacs-lisp
 (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)
+    ;(validate-setq tramp-persistency-file-name (expand-file-name "tramp" jj-cache-dir))
+    (validate-setq shell-prompt-pattern "^[^a-zA-Z].*[#$%>] *")
+    ;(add-to-list 'tramp-default-method-alist '("\\`localhost\\'" "\\`root\\'" "su"))
+    (validate-setq tramp-default-method "sshx")
+    ;(tramp-set-completion-function "ssh"
+    ;                               '((tramp-parse-sconfig "/etc/ssh_config")
+    ;                                 (tramp-parse-sconfig "~/.ssh/config")))
+    ;(validate-setq tramp-verbose 5)
     ))
 #+END_SRC
 
 ** transient mark
 For some reason I prefer this mode more than the way without. I want to
 see the marked region.
-#+BEGIN_SRC emacs-lisp :tangle yes
+#+BEGIN_SRC emacs-lisp
 (transient-mark-mode 1)
 (make-variable-buffer-local 'transient-mark-mode)
 (put 'transient-mark-mode 'permanent-local t)
@@ -4182,54 +5097,51 @@ 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
+#+BEGIN_SRC emacs-lisp
 (use-package undo-tree
   :ensure undo-tree
+  :diminish undo-tree-mode
   :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))
+  (progn
+    (global-undo-tree-mode)
+    (validate-setq undo-tree-visualizer-timestamps t)
+    (validate-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
+#+BEGIN_SRC emacs-lisp
 (use-package uniquify
   :init
   (progn
-    (setq uniquify-buffer-name-style 'post-forward)
-    (setq uniquify-after-kill-buffer-p t)
-    (setq uniquify-ignore-buffers-re "^\\*")))
+    (validate-setq uniquify-buffer-name-style 'post-forward)
+    (validate-setq uniquify-after-kill-buffer-p t)
+    (validate-setq uniquify-ignore-buffers-re "^\\*")))
 #+END_SRC
 
 ** url
 url contains code to parse and handle URLs - who would have thought? I
 set it to send Accept-language header and tell it to not send email,
 operating system or location info.
-#+BEGIN_SRC emacs-lisp :tangle yes
-(setq url-mime-language-string "de,en")
-(setq url-privacy-level (quote (email os lastloc)))
+#+BEGIN_SRC emacs-lisp
+(validate-setq url-mime-language-string "de,en")
+(validate-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
+#+BEGIN_SRC emacs-lisp
 (use-package visual-regexp
   :ensure visual-regexp
   :bind (("C-M-%" . vr/replace)
@@ -4243,13 +5155,49 @@ 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
+#+BEGIN_SRC emacs-lisp
 (use-package volatile-highlights
   :ensure volatile-highlights
-  :init
+  :config
   (volatile-highlights-mode t)
   :diminish volatile-highlights-mode)
 #+END_SRC
+** wgrep
+[2015-09-28 Mon 14:48]
+#+BEGIN_SRC emacs-lisp
+(use-package wgrep
+  :ensure wgrep
+  :config
+  (progn
+    (validate-setq wgrep-auto-save-buffer t)
+    (validate-setq wgrep-enable-key "r")
+    )
+  )
+#+END_SRC
+** windmove
+[2015-02-23 Mon 14:38]
+Easily move between splitted windows.
+#+BEGIN_SRC emacs-lisp
+(use-package windmove
+  :init
+  (progn
+    (windmove-default-keybindings)
+    ; maybe also:
+    ;(validate-setq org-replace-disputed-keys t)
+    ))
+#+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
+(use-package winner
+  :ensure t
+  :defer t
+  :config (winner-mode 1))
+#+END_SRC
 ** writegood
 This highlights some /weaselwords/, a mode to /aid in finding common
 writing problems/...
@@ -4263,9 +5211,10 @@ writing problems/...
 #+END_SRC
 ** web-mode
 [2014-06-01 Sun 22:48]
-#+BEGIN_SRC emacs-lisp :tangle yes
+#+BEGIN_SRC emacs-lisp
 (use-package web-mode
   :ensure web-mode
+  :defer t
   :mode (("\\.phtml\\'" . web-mode)
          ("\\.tpl\\.php\\'" . web-mode)
          ("\\.jsp\\'" . web-mode)
@@ -4279,16 +5228,22 @@ writing problems/...
   (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))))
+                (validate-setq web-mode-markup-indent-offset 2)
+                (validate-setq web-mode-css-indent-offset 2)
+                (validate-setq web-mode-code-indent-offset 2)
+                (validate-setq web-mode-enable-css-colorization t)
+                (validate-setq web-mode-enable-comment-keywords t)
+                (validate-setq web-mode-enable-current-element-highlight t))))
   :config
   (progn
+    (validate-setq web-mode-enable-current-element-highlight t)
+    (validate-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))
+      :ensure impatient-mode
+      :defer t
+      :commands impatient-mode))
   )
 
 #+END_SRC
@@ -4296,21 +5251,22 @@ writing problems/...
 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
+#+BEGIN_SRC emacs-lisp
 (use-package yafolding
+  :ensure t
   :bind (("C-#" . yafolding)
          ("C-c C-f" . yafolding-toggle-all-by-current-level))
   :commands (yafolding yafolding-toggle-all-by-current-level)
   )
+
 #+END_SRC
 ** yaml-mode
 [2013-04-28 So 01:13]
 YAML is a nice format for data, which is both, human and machine
 readable/editable without getting a big headache.
-#+BEGIN_SRC emacs-lisp :tangle yes
+#+BEGIN_SRC emacs-lisp
 (use-package yaml-mode
   :ensure yaml-mode
-
   :mode ("\\.ya?ml\\'" . yaml-mode)
   :config
     (bind-key "C-m" 'newline-and-indent yaml-mode-map ))
@@ -4320,16 +5276,23 @@ readable/editable without getting a big headache.
 [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))
+#+BEGIN_SRC emacs-lisp
+;(validate-setq yas-snippet-dirs (expand-file-name "yasnippet/snippets" jj-elisp-dir))
 (use-package yasnippet
   :ensure yasnippet
-  :init
+  :defer t
+  :diminish yas-minor-mode
+  :commands yas-global-mode
+  :config
   (progn
-    (yas-global-mode 1)
     ;; Integrate hippie-expand with ya-snippet
     (add-to-list 'hippie-expand-try-functions-list
                  'yas-hippie-try-expand)
+    (yas-global-mode 1)
+    (validate-setq yas-expand-only-for-last-commands '(self-insert-command))
+    (bind-key "\t" 'hippie-expand yas-minor-mode-map)
+
+    (validate-setq yas-snippet-dirs (expand-file-name "snippets" jj-dir))
     ))
 #+END_SRC
 * Thats it