Changes
[emacs.git] / .emacs.d / config / emacs.org
index d1fa7a9..3b88516 100644 (file)
@@ -53,13 +53,6 @@ Handier way to add modes to auto-mode-alist
   (dolist (pattern patterns)
     (add-to-list 'auto-mode-alist (cons pattern mode))))
 #+END_SRC
-*** config helpers use-package/bind-key
-Helpers for the config
-https://github.com/jwiegley/use-package
-#+BEGIN_SRC emacs-lisp
-(require 'use-package)
-(require 'bind-key)
-#+END_SRC
 *** hook-into-modes
 [2014-05-20 Tue 22:36]
 #+BEGIN_SRC emacs-lisp
@@ -82,19 +75,35 @@ The Emacs Lisp Package Archive contains things I want.
 ))
     (add-to-list 'package-archives source t))
   (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)
-  :idle
+  :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
@@ -117,20 +126,20 @@ jj-elisp-dir and add them.
 *** Info path
 Help emacs to find the info files
 #+BEGIN_SRC emacs-lisp :tangle yes
-(setq Info-directory-list (cons jj-info-dir
-                                '("/usr/local/share/info/"
-                                  "/usr/local/info/"
-                                  "/usr/local/gnu/info/"
-                                  "/usr/local/gnu/lib/info/"
-                                  "/usr/local/gnu/lib/emacs/info/"
-                                  "/usr/local/emacs/info/"
-                                  "/usr/local/lib/info/"
-                                  "/usr/local/lib/emacs/info/"
-                                  "/usr/share/info/emacs-23"
-                                  "/usr/share/info/"
-                                  "/usr/share/info/")))
-(setq Info-default-directory-list
-      (cons jj-info-dir Info-default-directory-list))
+(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
@@ -140,44 +149,48 @@ Help emacs to find the info files
 :END:
 I dislike the startup message
 #+BEGIN_SRC emacs-lisp
-(setq inhibit-splash-screen t)
-(setq inhibit-startup-message t)
+(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
-(setq fill-column 72)
+(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
-(setq require-final-newline nil)
-(setq mode-require-final-newline nil)
+(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
-(setq auto-save-interval 300)
-(setq auto-save-timeout   60)
+(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
-(setq user-full-name "Joerg Jaspert")
-(setq user-mail-address "joerg@ganneff.de")
-(setq mail-user-agent (quote gnus-user-agent))
+(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
-(setq smtpmail-default-smtp-server "localhost")
-(setq smtpmail-smtp-server "localhost")
+(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.
@@ -198,7 +211,7 @@ for new users. Enable them.
 Recenter in a different order - first go to top, then middle, then
 bottom
 #+BEGIN_SRC emacs-lisp
-(setq recenter-positions '(top middle bottom))
+(validate-setq recenter-positions '(top middle bottom))
 #+END_SRC
 *** Look / Theme
 I've tried various different fonts and while I like the Terminus font
@@ -237,46 +250,48 @@ shell. Consistent look is great.
 )
 #+END_SRC
 #+BEGIN_SRC emacs-lisp
-(use-package solarized
-  :load-path "elisp/solarized-emacs"
+(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
-      ;; (setq solarized-use-variable-pitch nil)
+      ;; (validate-setq solarized-use-variable-pitch nil)
 
       ;; ;; make the modeline high contrast
-      ;; (setq solarized-high-contrast-mode-line t)
+      ;; (validate-setq solarized-high-contrast-mode-line t)
 
       ;; ;; Use less bolding
-      ;; (setq solarized-use-less-bold t)
+      ;; (validate-setq solarized-use-less-bold t)
 
       ;; ;; Use more italics
-      ;; (setq solarized-use-more-italic t)
+      ;; (validate-setq solarized-use-more-italic t)
 
       ;; ;; Use less colors for indicators such as git:gutter, flycheck and similar
-      ;; (setq solarized-emphasize-indicators nil)
+      ;; (validate-setq solarized-emphasize-indicators nil)
 
       ;; ;; Don't change size of org-mode headlines (but keep other size-changes)
-      ;; (setq solarized-scale-org-headlines nil)
+      ;; (validate-setq solarized-scale-org-headlines nil)
 
       ;; ;; Avoid all font-size changes
-      ;; (setq solarized-height-minus-1 1)
-      ;; (setq solarized-height-plus-1 1)
-      ;; (setq solarized-height-plus-2 1)
-      ;; (setq solarized-height-plus-3 1)
-      ;; (setq solarized-height-plus-4 1)
+      ;; (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)
 
-      (if (eq jj-color-style 'dark )(load-theme 'solarized-dark t)
-        (load-theme 'solarized-light t))
-      (set-face-attribute 'org-date nil :underline nil)
-      (message "Initializing theme solarized-dark")
-      )
     (add-to-list 'custom-theme-load-path jj-theme-dir)
     (add-hook 'after-init-hook 'jj-init-theme)
     (jj-init-theme)))
@@ -317,15 +332,14 @@ 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
-  (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))
+   (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.
@@ -335,17 +349,17 @@ As it says, it does a hilight of the current line.
 *** Allow recursive minibuffers
 This allows (additional) minibuffer commands while in the minibuffer.
 #+BEGIN_SRC emacs-lisp
-(setq enable-recursive-minibuffers 't)
+(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 ()
-  (setq gc-cons-threshold most-positive-fixnum))
+  (validate-setq gc-cons-threshold most-positive-fixnum))
 
 (defun my-minibuffer-exit-hook ()
-  (setq gc-cons-threshold 800000))
+  (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)
@@ -361,18 +375,21 @@ modeline in red as soon as you are over the defined limit.
 (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 t
-  :idle
+  :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
 
@@ -417,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,
@@ -432,27 +449,33 @@ read in emacs.
 (setq-default major-mode 'org-mode)
 #+END_SRC
 #+BEGIN_SRC emacs-lisp :tangle no
-(setq initial-major-mode 'org-mode)
+(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
-(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
-(setq comint-buffer-maximum-size 20000)    ; max lenght of the buffer in lines
-(setq comint-prompt-read-only nil)         ; if this is t, it breaks shell-command
+  (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
@@ -508,7 +531,33 @@ From [[http://endlessparentheses.com/faster-pop-to-mark-command.html?source=rss]
   (let ((p (point)))
     (dotimes (i 10)
       (when (= p (point)) ad-do-it))))
-(setq set-mark-command-repeat-pop t)
+(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.
@@ -518,14 +567,20 @@ Searches and matches should ignore case.
 
 Which buffers to get rid off at midnight.
 #+BEGIN_SRC emacs-lisp
-(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")))
+  (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
 
 Don't display a cursor in non-selected windows.
@@ -536,13 +591,13 @@ Don't display a cursor in non-selected windows.
 What should be displayed in the mode-line for files with those types
 of line endings.
 #+BEGIN_SRC emacs-lisp
-(setq eol-mnemonic-dos "(DOS)")
-(setq eol-mnemonic-mac "(Mac)")
+(validate-setq eol-mnemonic-dos "(DOS)")
+(validate-setq eol-mnemonic-mac "(Mac)")
 #+END_SRC
 
 #+BEGIN_SRC emacs-lisp
-(setq max-lisp-eval-depth 1000)
-(setq max-specpdl-size 3000)
+(validate-setq max-lisp-eval-depth 1000)
+(validate-setq max-specpdl-size 3000)
 #+END_SRC
 
 Unfill paragraph
@@ -558,18 +613,51 @@ From https://raw.github.com/qdot/conf_emacs/master/emacs_conf.org
 
 #+BEGIN_SRC emacs-lisp
 (setq-default indicate-empty-lines t)
-(setq sentence-end-double-space nil)
+(validate-setq sentence-end-double-space nil)
 #+END_SRC
 
 Hilight annotations in comments, like FIXME/TODO/...
-#+BEGIN_SRC emacs-lisp
+#+BEGIN_SRC emacs-lisp :tangle no
 (add-hook 'prog-mode-hook 'font-lock-comment-annotations)
 #+END_SRC
 
+Wait a bit longer before considering emacs idle
+#+BEGIN_SRC emacs-lisp :tangle yes
+(validate-setq idle-update-delay 2)
+#+END_SRC
+
+Make gnutls a bit safer, the default is an absurdly low 256
+#+BEGIN_SRC emacs-lisp :tangle yes
+(validate-setq gnutls-min-prime-bits 4096)
+#+END_SRC
+
+Emacs defaults to using --insecure - and supporting ssl3. No thanks.
+#+BEGIN_SRC emacs-lisp :tangle yes
+(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
+Resolve symlinks without asking
+#+BEGIN_SRC emacs-lisp :tangle yes
+(setq-default find-file-visit-truename t)
+#+END_SRC
+#+BEGIN_SRC emacs-lisp :tangle yes
+(setq-default bidi-display-reordering nil)
+#+END_SRC
+
 *** Browser
 #+BEGIN_SRC emacs-lisp
-(setq browse-url-browser-function (quote browse-url-generic))
-(setq browse-url-generic-program "/usr/bin/x-www-browser")
+  (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
 
 *** When saving a script - make it executable
@@ -590,7 +678,7 @@ Hilight annotations in comments, like FIXME/TODO/...
 (use-package edit-server
   :config
   (progn
-    (setq edit-server-new-frame nil)
+    (validate-setq edit-server-new-frame nil)
     (edit-server-start)))
 #+END_SRC
 ** Customized variables
@@ -641,7 +729,7 @@ things I keep for a long while into statements somewhere else, not just
 custom-set here, but we need it anyways.
 
 #+BEGIN_SRC emacs-lisp
-(setq custom-file jj-custom-file)
+(validate-setq custom-file jj-custom-file)
 (safe-load custom-file)
 #+END_SRC
 
@@ -656,20 +744,61 @@ ways.
 (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))
+    (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))
 
+    (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
+** 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.
@@ -680,14 +809,11 @@ avy is a GNU Emacs package for jumping to visible text using a char-based decisi
   :bind (("H-SPC" . avy-goto-char-2)
          ("M-g g" . avy-goto-line)
          )
-  :init
-  (progn
-    (setq avy-all-windows 'all-frames)
-    (setq avi-keys '(?a ?s ?d ?e ?f ?h ?j ?k ?l ?n ?m ?v ?r ?u) )
-    )
   :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
@@ -701,7 +827,7 @@ Use H-w to switch windows
   :bind ("H-w" . ace-window)
   :config
   (progn
-    (setq aw-keys '(?a ?s ?d ?f ?j ?k ?l))
+    (validate-setq aw-keys '(?a ?s ?d ?f ?j ?k ?l))
     ))
 #+END_SRC
 ** aggressive-indent
@@ -721,7 +847,7 @@ than electric-indent-mode.
   :config
   (progn
     (global-aggressive-indent-mode 0)
-    (setq aggressive-indent-comments-too 0)
+    (validate-setq aggressive-indent-comments-too 0)
     (add-to-list 'aggressive-indent-excluded-modes 'html-mode)
     ))
 #+END_SRC
@@ -734,18 +860,17 @@ information in the mode-line in various search modes.
   :ensure anzu
   :diminish anzu-mode
   :defer t
-  :idle
-  (progn
-    (global-anzu-mode 1))
   :config
   (progn
-    (setq anzu-search-threshold 1000)
+    (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
@@ -760,11 +885,11 @@ information in the mode-line in various search modes.
     (bind-key "C-c e A" 'ascii-toggle)))
 #+END_SRC
 ** auctex
-#+BEGIN_SRC emacs-lisp
-(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)
+#+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]
@@ -775,10 +900,9 @@ already had typed.
 #+BEGIN_SRC emacs-lisp
 (use-package auto-complete-config
   :ensure auto-complete
-  :idle
-  (ac-config-default)
   :config
   (progn
+    (ac-config-default)
     ;; hook AC into completion-at-point
     (defun sanityinc/auto-complete-at-point ()
       (when (and (not (minibufferp))
@@ -802,20 +926,20 @@ already had typed.
     (bind-key "C-s" 'ac-isearch ac-completing-map)
     (bind-key "M-TAB" 'auto-complete ac-mode-map)
 
-    (setq ac-comphist-file (expand-file-name "ac-comphist.dat" jj-cache-dir))
-    (setq ac-use-comphist t)
-    (setq ac-expand-on-auto-complete nil)
-    (setq ac-dwim t)
-    (setq ac-auto-start 3)
-    (setq ac-delay 0.3)
-    (setq ac-menu-height 15)
-    (setq ac-quick-help-delay 0.5)
-    (setq ac-use-fuzzy t)
+    (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)
 
     (ac-flyspell-workaround)
 
     ;; use 't when auto-complete is disabled
-    (setq tab-always-indent 'complete)
+    (validate-setq tab-always-indent 'complete)
     (add-to-list 'completion-styles 'initials t)
 
      ;; Use space and punctuation to accept the current the most likely completion.
@@ -861,10 +985,10 @@ with it. Not to have to revert buffers myself
 (use-package autorevert
   :commands auto-revert-mode
   :diminish auto-revert-mode
-  :idle
+  :config
   (progn
-    (setq global-auto-revert-mode t)
-    (setq global-auto-revert-non-file-buffers t)
+    (validate-setq global-auto-revert-mode t)
+    (validate-setq global-auto-revert-non-file-buffers t)
     (global-auto-revert-mode)))
 #+END_SRC
 
@@ -883,22 +1007,22 @@ where =temporary-file-directory= is not inside my home).
            ("\C-cw" . backup-walker-start))
   :init
   (progn
-    (setq backup-directory jj-backup-directory)
-;    (setq tramp-backup-directory (concat jj-backup-directory "/tramp"))
+    (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))
-;    (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)
+;    (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)
 
     (defadvice kill-buffer (around kill-buffer)
       "Always save before killing a file buffer"
@@ -925,7 +1049,7 @@ are saved automatically when they are killed"
         (set-buffer-modified-p nil))
       (kill-buffer))
 
-    (setq backup-enable-predicate
+    (validate-setq backup-enable-predicate
           (lambda (name)
             (and (normal-backup-enable-predicate name)
                  (not
@@ -938,6 +1062,7 @@ are saved automatically when they are killed"
 [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)
   )
@@ -945,18 +1070,19 @@ are saved automatically when they are killed"
 ** calendar
 [2014-06-10 Tue 22:20]
 #+BEGIN_SRC emacs-lisp
-(use-package cal
+(use-package calendar
   :commands (cal/insert)
   :bind ("C-c c" . cal/insert)
   :config
   (progn
     ; Weeks start on Monday, not sunday.
-    (setq calendar-week-start-day 1)
+    (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)
-    (setq calendar-intermonth-text
+    (validate-setq calendar-intermonth-text
           '(propertize
             (format "%2d"
                     (car
@@ -965,23 +1091,23 @@ are saved automatically when they are killed"
             '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
+    (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] 
+[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
-  :idle
+  :config
   (progn
     ; Interpret # and * as part of the word
-    (setq corral-syntax-entries '((?# "_")
+    (validate-setq corral-syntax-entries '((?# "_")
                                   (?* "_")
                                   (?$ ".")
                                   (?/ ".")))
@@ -1042,7 +1168,7 @@ 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)
-(setq cua-enable-cua-keys (quote shift))
+(validate-setq cua-enable-cua-keys (quote shift))
 #+END_SRC
 
 Luckily cua-mode easily supports this, with the following line I just
@@ -1056,20 +1182,18 @@ movement keys.
 
 ** Debian related
 #+BEGIN_SRC emacs-lisp
-(require 'dpkg-dev-el-loaddefs nil 'noerror)
-(require 'debian-el-loaddefs nil 'noerror)
+  (require 'dpkg-dev-el-loaddefs nil 'noerror)
+  (require 'debian-el-loaddefs nil 'noerror)
 
-(setq debian-changelog-full-name "Joerg Jaspert")
-(setq debian-changelog-mailing-address "joerg@debian.org")
+  (setq debian-changelog-full-name "Joerg Jaspert")
+  (setq debian-changelog-mailing-address "joerg@debian.org")
 #+END_SRC
 
 ** diff-mode
 #+BEGIN_SRC emacs-lisp
 (use-package diff-mode
   :commands diff-mode
-  :mode (("\\.diff" . diff-mode))
-  :config
-  (use-package diff-mode-))
+  :mode (("\\.diff" . diff-mode)))
 #+END_SRC
 
 ** dired & co
@@ -1078,33 +1202,35 @@ movement keys.
   :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
-    (setq dired-auto-revert-buffer (quote dired-directory-changed-p))
-    (setq dired-dwim-target t)
-    (setq dired-listing-switches "-alh")
-    (setq dired-listing-switches "-alXh --group-directories-first")
-    (setq dired-recursive-copies (quote top))
-    (setq dired-recursive-deletes (quote top))
-    (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")))
-
-    (bind-key "F" 'find-name-dired dired-mode-map)
+    (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))
 
     (use-package dired+
       :ensure dired+)
 
-    (use-package dired-x)
+    (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")))))
 
     (use-package dired-single
       :ensure dired-single
@@ -1114,15 +1240,23 @@ movement keys.
         (bind-key "<mouse-1>" 'dired-single-buffer-mouse dired-mode-map)
         (bind-key "^"
                   (function
-           (lambda nil (interactive) (dired-single-buffer ".."))) dired-mode-map )))
+                   (lambda nil (interactive) (dired-single-buffer ".."))) dired-mode-map )))
 
     (use-package wdired
       :ensure wdired
-      :init
+      :bind (:map dired-mode-map
+             ("r" . wdired-change-to-wdired-mode))
+      :config
       (progn
-        (setq wdired-allow-to-change-permissions t)
+        (validate-setq wdired-allow-to-change-permissions t)
         (bind-key "r" 'wdired-change-to-wdired-mode dired-mode-map)))
 
+    (use-package dired-narrow
+      :ensure t
+      :diminish dired-narrow-mode
+      :bind (:map dired-mode-map
+                  ("/" . dired-narrow)))
+
     (use-package gnus-dired
       :commands (gnus-dired-attach gnus-dired-mode)
       :init
@@ -1138,13 +1272,13 @@ movement keys.
     (defun mark-similar-versions (name)
       (let ((pat name))
         (if (string-match "^\\(.+?\\)-[0-9._-]+$" pat)
-            (setq pat (match-string 1 pat)))
+            (validate-setq pat (match-string 1 pat)))
         (or (gethash pat mark-files-cache)
             (ignore (puthash pat t mark-files-cache)))))
 
     (defun dired-mark-similar-version ()
       (interactive)
-      (setq mark-files-cache (make-hash-table :test #'equal))
+      (validate-setq mark-files-cache (make-hash-table :test #'equal))
       (dired-mark-sexp '(mark-similar-versions name)))
 
     (defun dired-package-initialize ()
@@ -1162,15 +1296,15 @@ movement keys.
                 parent-dir)
             (while (and (not (file-exists-p file))
                         (progn
-                          (setq parent-dir
-                                (file-name-directory
-                                 (directory-file-name
-                                  (file-name-directory file))))
+                          (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.
-              (setq file (expand-file-name ".git" parent-dir)))
+              (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))
@@ -1265,7 +1399,7 @@ Bookmark: [[http://www.emacswiki.org/emacs/EasyPG][EmacsWiki: Easy PG]]
 ediff - don't start another frame
 #+BEGIN_SRC emacs-lisp
 (use-package ediff
-  :pre-init
+  :init
   (progn
     (defvar ctl-period-equals-map)
     (define-prefix-command 'ctl-period-equals-map)
@@ -1283,8 +1417,8 @@ ediff - don't start another frame
          ("C-. = l" . ediff-regions-linewise)
          ("C-. = w" . ediff-regions-wordwise))
   :config (progn
-            (setq ediff-window-setup-function 'ediff-setup-windows-plain)
-            (setq ediff-split-window-function 'split-window-horizontally)
+            (validate-setq ediff-window-setup-function 'ediff-setup-windows-plain)
+            (validate-setq ediff-split-window-function 'split-window-horizontally)
             )
 )
 #+END_SRC
@@ -1294,9 +1428,10 @@ Allows chromium to "send" files (textbox inputs) to emacs to edit.
 #+BEGIN_SRC emacs-lisp
 (use-package edit-server
   :ensure t
-  :idle
+  :if window-system
+  :config
   (progn
-    (setq edit-server-new-frame t)
+    (validate-setq edit-server-new-frame t)
     (edit-server-start)))
 #+END_SRC
 ** emms
@@ -1320,7 +1455,7 @@ EMMS is the Emacs Multimedia System.
 (require 'emms-history)
 (require 'emms-i18n)
 
-(setq emms-playlist-default-major-mode 'emms-playlist-mode)
+(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)
@@ -1329,7 +1464,7 @@ EMMS is the Emacs Multimedia System.
 (emms-score 1)
 (when (fboundp 'emms-cache) ; work around compiler warning
   (emms-cache 1))
-(setq emms-score-default-score 3)
+(validate-setq emms-score-default-score 3)
 
 (defun emms-mpd-init ()
   "Connect Emms to mpd."
@@ -1338,22 +1473,22 @@ EMMS is the Emacs Multimedia System.
 
 ;; players
 (require 'emms-player-mpd)
-(setq emms-player-mpd-server-name "localhost")
-(setq emms-player-mpd-server-port "6600")
+(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)
-(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
+(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")
@@ -1395,7 +1530,7 @@ EMMS is the Emacs Multimedia System.
             (make-string rating rate-char)))
 )
 
-(setq emms-track-description-function 'my-describe)
+(validate-setq emms-track-description-function 'my-describe)
 
 ;; (global-set-key (kbd "C-<f9> t") 'emms-play-directory-tree)
 ;; (global-set-key (kbd "H-<f9> e") 'emms-play-file)
@@ -1439,7 +1574,7 @@ EMMS is the Emacs Multimedia System.
 (define-key emms-playlist-mode-map "n" 'emms-next)
 (define-key emms-playlist-mode-map "p" 'emms-previous)
 
-(setq emms-playlist-buffer-name "*EMMS Playlist*"
+(validate-setq emms-playlist-buffer-name "*EMMS Playlist*"
       emms-playlist-mode-open-playlists t)
 
 ;; Faces
@@ -1451,7 +1586,7 @@ EMMS is the Emacs Multimedia System.
        )
 ))
 
-(setq emms-player-mpd-supported-regexp
+(validate-setq emms-player-mpd-supported-regexp
       (or (emms-player-mpd-get-supported-regexp)
           (concat "\\`http://\\|"
                   (emms-player-simple-regexp
@@ -1495,7 +1630,7 @@ Basic settings for emacs integrated shell
     (use-package 'em-prompt)
     (use-package 'em-term)
 
-    (setq eshell-cmpl-cycle-completions nil
+    (validate-setq eshell-cmpl-cycle-completions nil
           eshell-save-history-on-exit t
           eshell-buffer-maximum-lines 20000
           eshell-history-size 350
@@ -1505,9 +1640,9 @@ Basic settings for emacs integrated shell
           eshell-cmpl-dir-ignore "\\`\\(\\.\\.?\\|CVS\\|\\.svn\\|\\.git\\)/\\'")
 
     (setenv "PAGER" "cat")
-    (setq eshell-visual-commands
+    (validate-setq eshell-visual-commands
           '("less" "tmux" "htop" "top" "bash" "zsh" "tail"))
-    (setq eshell-visual-subcommands
+    (validate-setq eshell-visual-subcommands
           '(("git" "log" "l" "diff" "show")))
 
     (add-to-list 'eshell-command-completions-alist
@@ -1554,7 +1689,7 @@ Basic settings for emacs integrated shell
       :ensure t
       :init
       (progn
-        (setq eshell-highlight-prompt nil
+        (validate-setq eshell-highlight-prompt nil
               ;; epe-git-dirty-char "Ϟ"
               epe-git-dirty-char "*"
               eshell-prompt-function 'epe-theme-dakrone)))
@@ -1565,9 +1700,9 @@ Basic settings for emacs integrated shell
       (magit-status default-directory)
       nil)
 
-    (setq eshell-prompt-function 'eshell/my-prompt)
-    (setq eshell-highlight-prompt nil)
-    (setq eshell-prompt-regexp "^[^#$\n]+[#$] ")))
+    (validate-setq eshell-prompt-function 'eshell/my-prompt)
+    (validate-setq eshell-highlight-prompt nil)
+    (validate-setq eshell-prompt-regexp "^[^#$\n]+[#$] ")))
 
 #+END_SRC
 
@@ -1587,7 +1722,7 @@ jump to the next/previous occurence of it.
 I want to see the buffername and its size, not the host I am on in my
 frame title.
 #+BEGIN_SRC emacs-lisp
-(setq frame-title-format "%b (%i)")
+(validate-setq frame-title-format "%b (%i)")
 #+END_SRC
 
 *** Protect some buffers
@@ -1596,7 +1731,7 @@ 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
-  :init
+  :config
   (progn
     (keep-buffers-mode 1)
     (push '("\\`*scratch" . erase) keep-buffers-protected-alist)
@@ -1621,9 +1756,9 @@ In this day and age, UTF-8 is the way to go.
 (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 default-process-coding-system '(utf-8-unix . utf-8-unix))
 (when (display-graphic-p)
-  (setq x-select-request-type '(UTF8_STRING COMPOUND_TEXT TEXT STRING)))
+  (validate-setq x-select-request-type '(UTF8_STRING COMPOUND_TEXT TEXT STRING)))
 #+END_SRC
 
 *** Hilight matching parentheses
@@ -1631,7 +1766,7 @@ 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
-  :init
+  :config
   (paren-activate))
 #+END_SRC
 *** Kill other buffers
@@ -1645,11 +1780,11 @@ you are in", emacs doesn't have this... Except, now it will.
 Default scrolling behaviour in emacs is a bit annoying, who wants to
 jump half-windows?
 #+BEGIN_SRC emacs-lisp
-(setq scroll-margin 3)
-(setq scroll-conservatively 100000)
-(setq scroll-up-aggressively 0.0)
-(setq scroll-down-aggressively 0.0)
-(setq scroll-preserve-screen-position 'always)
+(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
 
 *** Copy/Paste with X
@@ -1657,10 +1792,10 @@ jump half-windows?
 The default how emacs handles cutting/pasting with the primary selection
 changed in emacs24. I am used to the old way, so get it back.
 #+BEGIN_SRC emacs-lisp
-(setq select-enable-primary t)
-(setq select-enable-clipboard nil)
-(setq interprogram-paste-function 'x-cut-buffer-or-selection-value)
-(setq mouse-drag-copy-region t)
+(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.
@@ -1822,10 +1957,10 @@ Count which commands I use how often.
 #+BEGIN_SRC emacs-lisp
 (use-package keyfreq
   :ensure keyfreq
-  :init
+  :config
   (progn
-    (setq keyfreq-file (expand-file-name "keyfreq" jj-cache-dir))
-    (setq keyfreq-file-lock (expand-file-name "keyfreq.lock" jj-cache-dir))
+    (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
@@ -1861,7 +1996,7 @@ the beginning of the line.
 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))
+  (validate-setq arg (or arg 1))
 
   ;; Move lines first
   (when (/= arg 1)
@@ -1920,7 +2055,7 @@ Comment/Uncomment
 
 Show keystrokes in progress
 #+BEGIN_SRC emacs-lisp
-(setq echo-keystrokes 0.1)
+(validate-setq echo-keystrokes 0.1)
 #+END_SRC
 **** Overwrite mode
 Usually you can press the *Ins*ert key, to get into overwrite mode. I
@@ -1999,7 +2134,184 @@ Proper whitespace handling
   :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
@@ -2015,8 +2327,9 @@ fill prefix, such as a comment sequence in program code, and handling
 bullet points like “1.” or “*”.
 #+BEGIN_SRC emacs-lisp
 (use-package filladapt
+  :load-path ("elisp/local")
   :diminish filladapt-mode
-  :idle
+  :config
   (setq-default filladapt-mode t))
 #+END_SRC
 ** flycheck
@@ -2030,19 +2343,18 @@ understand for me.
   :diminish flycheck-mode
   :bind (("M-n" . next-error)
          ("M-p" . previous-error))
-  :idle
-  (progn
-    (add-hook 'find-file-hook
-          (lambda ()
-            (when (not (equal 'emacs-lisp-mode major-mode))
-              (flycheck-mode)))))
   :config
   (progn
     (use-package flycheck-color-mode-line
       :ensure flycheck-color-mode-line)
-    (setq flycheck-highlighting-mode 'nil)
-    (setq flycheck-flake8-maximum-line-length '150)
+    (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
@@ -2054,7 +2366,11 @@ And I want to have it everywhere.
   :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]
@@ -2090,17 +2406,15 @@ Display nice lines instead of page breaks
          ("C-x s" . git-gutter+-stage-hunks)
          ("C-x c" . git-gutter+-commit)
          )
-  :idle
-  (progn
-    (setq git-gutter+-disabled-modes '(org-mode))
-    (global-git-gutter+-mode 1))
   :config
   (progn
+    (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)
         ))))
 
@@ -2117,8 +2431,8 @@ useful when you want to know why this line was changed.
   :config
   (progn
     (bind-key "m" 'git-messenger:copy-message git-messenger-map)
-    (add-hook 'git-messenger:popup-buffer-hook 'magit-commit-mode)
-    (setq git-messenger:show-detail t)))
+    (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]
@@ -2155,8 +2469,8 @@ be readable enough to know it's content.
   :init
   (progn
     (golden-ratio-mode 1)
-    (setq golden-ratio-exclude-buffer-names '("*LV*" "*guide-key*" "*Ediff Control Panel*"))
-    (setq golden-ratio-exclude-modes '("calendar-mode" "gnus-summary-mode"
+    (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"))
     ))
@@ -2181,13 +2495,13 @@ for this.
 (use-package guide-key
   :ensure guide-key
   :diminish guide-key-mode
-  :init
+  :config
   (progn
-    (setq guide-key/guide-key-sequence '("C-x" "C-c" "M-g" "M-s"))
+    (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
 
@@ -2213,7 +2527,7 @@ tries to expand it in various ways.
   :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
@@ -2253,8 +2567,8 @@ that disables itself auto-magically.
   :ensure hydra
   :init
   (progn
-    (setq hydra-is-helpful t)
-    (setq hydra-lv t)
+    (validate-setq hydra-is-helpful t)
+    (validate-setq hydra-lv t)
 
     (defhydra hydra-zoom (:color red)
       "zoom"
@@ -2338,9 +2652,8 @@ _l_ linum-mode:         % 4`linum-mode     _k_ linum relative:    %`linum-format
   :config
   (progn
     (defvar my-ibufffer-separator " • ")
-    (setq ibuffer-filter-group-name-face 'variable-pitch
-          ibuffer-use-header-line t
-          ibuffer-old-time 12)
+    (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)
@@ -2385,7 +2698,7 @@ _l_ linum-mode:         % 4`linum-mode     _k_ linum relative:    %`linum-format
     (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
@@ -2417,7 +2730,10 @@ _l_ linum-mode:         % 4`linum-mode     _k_ linum relative:    %`linum-format
        (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"
@@ -2432,7 +2748,7 @@ _l_ linum-mode:         % 4`linum-mode     _k_ linum relative:    %`linum-format
     (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)))
@@ -2443,7 +2759,7 @@ _l_ linum-mode:         % 4`linum-mode     _k_ linum relative:    %`linum-format
       (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
@@ -2478,7 +2794,7 @@ _l_ linum-mode:         % 4`linum-mode     _k_ linum relative:    %`linum-format
             (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 )))))))
@@ -2501,7 +2817,7 @@ _l_ linum-mode:         % 4`linum-mode     _k_ linum relative:    %`linum-format
     (define-key ibuffer-mode-map
       (vector 'remap 'beginning-of-buffer) 'ibuffer-back-to-top)
 
-    (setq ibuffer-default-sorting-mode 'recency
+    (validate-setq ibuffer-default-sorting-mode 'recency
           ibuffer-eliding-string "…"
           ibuffer-compile-formats t
           ibuffer-git-column-length 6
@@ -2509,7 +2825,7 @@ _l_ linum-mode:         % 4`linum-mode     _k_ linum relative:    %`linum-format
           ibuffer-default-directory "~/"
           )
 
-    (setq ibuffer-formats '((mark vc-status-mini
+    (validate-setq ibuffer-formats '((mark vc-status-mini
                                   " "
                                   (git-status 8 8 :left)
                                   " "
@@ -2528,7 +2844,7 @@ _l_ linum-mode:         % 4`linum-mode     _k_ linum relative:    %`linum-format
                                   " " filename)
                             ))
 
-     (setq ibuffer-saved-filter-groups
+     (validate-setq ibuffer-saved-filter-groups
            (quote (("flat")
                    ("default"
                     ("dired"  (mode . dired-mode))
@@ -2667,7 +2983,7 @@ _l_ linum-mode:         % 4`linum-mode     _k_ linum relative:    %`linum-format
   ;; 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
@@ -2683,7 +2999,7 @@ _l_ linum-mode:         % 4`linum-mode     _k_ linum relative:    %`linum-format
   :config
   (progn
     ;(ivy-mode 1)
-    (setq ivy-use-virtual-buffers t)
+    (validate-setq ivy-use-virtual-buffers t)
     ;;advise swiper to recenter on exit
     (defun bjm-swiper-recenter (&rest args)
       "recenter display after swiper"
@@ -2697,8 +3013,8 @@ _l_ linum-mode:         % 4`linum-mode     _k_ linum relative:    %`linum-format
 ‘TAB’ completion is to typing things manually every time.”]]
 #+BEGIN_SRC emacs-lisp
 (use-package icicles
-  :load-path "elisp/icicle/"
-  :init
+  :ensure icicles
+  :config
   (icy-mode 1))
 #+END_SRC
 ** icomplete
@@ -2748,7 +3064,7 @@ gnus, so we have a list of modes where we don't want to see it.
   :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
@@ -2767,11 +3083,12 @@ gnus, so we have a list of modes where we don't want to see it.
       :ensure linum-relative
       :init
       (progn
-        (setq linum-format 'dynamic)
+        (validate-setq linum-format 'dynamic)
         )))
   :init
   (global-linum-mode 1))
 (use-package hlinum
+  :ensure t
   :config
   (progn
     (hlinum-activate)))
@@ -2784,6 +3101,7 @@ 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
 (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."
@@ -2807,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))
@@ -2816,6 +3133,15 @@ 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.
@@ -2823,52 +3149,49 @@ magit is a mode for interacting with git.
 (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
       :defer t)
 
-    ; (use-package magit-svn
-    ;   :ensure magit-svn
-    ;   :commands (magit-svn-mode
-    ;              turn-on-magit-svn)
-    ;   :defer t)
+                                        ; (use-package magit-svn
+                                        ;   :ensure magit-svn
+                                        ;   :commands (magit-svn-mode
+                                        ;              turn-on-magit-svn)
+                                        ;   :defer t)
 
     (add-hook 'magit-mode-hook 'hl-line-mode)
     (defun magit-status-with-prefix ()
       (interactive)
       (let ((current-prefix-arg '(4)))
         (call-interactively 'magit-status)))
-    )
-  :config
-  (progn
     (setenv "GIT_PAGER" "")
 
     (unbind-key "M-h" magit-mode-map)
     (unbind-key "M-s" magit-mode-map)
     (add-to-list 'magit-no-confirm 'stage-all-changes)
-    (setq magit-push-always-verify nil)
-    (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)))
+    (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 ()
@@ -2896,11 +3219,11 @@ magit is a mode for interacting with git.
       "Start an interactive rebase sequence over all unpushed commits."
       (interactive (list (magit-get-tracked-branch)
                          (magit-rebase-arguments)))
-      (if (setq commit (magit-rebase-interactive-assert commit))
+      (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))))))
+         `(lambda (commit)
+            (magit-rebase-interactive (concat commit "^") (list ,@args))))))
 
     (magit-define-popup-action 'magit-rebase-popup ?l "Rebase unpushed" 'magit-rebase-unpushed)
     ))
@@ -2909,6 +3232,7 @@ magit is a mode for interacting with git.
 [2014-05-20 Tue 23:04]
 #+BEGIN_SRC emacs-lisp
 (use-package markdown-mode
+  :ensure t
   :mode (("\\.md\\'" . markdown-mode)
          ("\\.mdwn\\'" . markdown-mode))
   :defer t)
@@ -2916,27 +3240,27 @@ magit is a mode for interacting with git.
 ** message
 #+BEGIN_SRC emacs-lisp
 (use-package message
-  :idle
+  :config
   (progn
-    (setq message-kill-buffer-on-exit t)))
+    (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
+#+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
@@ -2963,8 +3287,8 @@ coexist in one buffer.
   :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
@@ -3004,14 +3328,14 @@ Emacs]].
              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
+#+BEGIN_SRC emacs-lisp :tangle no
 (use-package multiple-cursors
   :ensure multiple-cursors
   :defer t
@@ -3035,7 +3359,7 @@ 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]
@@ -3048,51 +3372,72 @@ A emacs tree plugin
   :commands (neotree-find
              neotree-toggle
              neotree)
-  :idle
+  :config
   (progn
-    (setq neo-smart-open t))
+    (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
-    (bind-key "^" 'neotree-select-up-node neotree-mode-map)))
+    (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
-(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)))
-     ))
+  (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:
@@ -3753,7 +4098,7 @@ A new exporter created by Nicolas Goaziou was introduced in org 8.0.
 (require 'ox-html)
 (require 'ox-latex)
 (require 'ox-ascii)
-(require 'ox-reveal)
+;(require 'ox-reveal)
 ;; FIXME, check the following two
 ;(require 'ox-icalendar)
 ;(require 'ox-odt)
@@ -4147,7 +4492,7 @@ up here to be used.
 #+BEGIN_SRC emacs-lisp
 (use-package cperl-mode
   :commands cperl-mode
-  :idle
+  :config
   (progn
     (defalias 'perl-mode 'cperl-mode)
     (add-auto-mode 'cperl-mode "\\.\\([pP][Llm]\\|al\\)\\'")
@@ -4156,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
@@ -4189,30 +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
 (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
-  :idle
-  (progn
-    (defun my-puppet-mode-hook ()
-      (setq require-final-newline nil))
-    (add-hook 'puppet-mode-hook 'my-puppet-mode-hook))
   :config
   (progn
-    (use-package puppet-ext
-      :init
-      (progn
-        (bind-key "C-x ?" 'puppet-set-anchor puppet-mode-map)
-        (bind-key "C-c C-r" 'puppet-create-require puppet-mode-map)))))
+    (defun 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
+#+BEGIN_SRC emacs-lisp :tangle no
 (use-package elpy
   :defer t
   :mode ("\.py" . python-mode)
@@ -4256,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
@@ -4292,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/")
@@ -4348,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
@@ -4390,7 +4742,7 @@ Saner regex syntax
   :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]
@@ -4404,8 +4756,8 @@ files. This list is is automatically saved across Emacs sessions.
   :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
@@ -4424,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
+#+BEGIN_SRC emacs-lisp :tangle no
 (use-package region-bindings-mode
   :ensure region-bindings-mode
-  :init
+  :config
   (region-bindings-mode-enable))
 #+END_SRC
 ** ruby
@@ -4451,6 +4803,7 @@ Programming in ruby...
   :config
   (progn
     (use-package yari
+      :ensure t
       :init
       (progn
         (defvar yari-helm-source-ri-pages
@@ -4502,17 +4855,21 @@ Programming in ruby...
 [2013-05-22 Wed 22:40]
 Save and restore the desktop
 #+BEGIN_SRC emacs-lisp
-(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))
+(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
@@ -4535,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
@@ -4576,27 +4934,35 @@ 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
-(setq-default save-place t)
-(require 'saveplace)
-(setq save-place-file (expand-file-name "saved-places" jj-cache-dir))
+(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]
@@ -4606,7 +4972,7 @@ Store at which point I have been in files.
   :commands (httpd-start httpd-stop)
   :config
   (progn
-    (setq httpd-root "/srv/www")
+    (validate-setq httpd-root "/srv/www")
     )
 )
 #+END_SRC
@@ -4620,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
@@ -4634,6 +5000,21 @@ Settings for shell scripts
 (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.
@@ -4641,7 +5022,7 @@ Make =M-n= and =M-p= go forward/backword to the symbol at point.
 (use-package smartscan
   :ensure smartscan
   :defer t
-  :idle (global-smartscan-mode t))
+  :config (global-smartscan-mode t))
 #+END_SRC
 ** timestamp
 By default, Emacs can update the time stamp for the following two
@@ -4651,15 +5032,13 @@ formats if one exists in the first 8 lines of the file.
 #+BEGIN_SRC emacs-lisp
 (use-package time-stamp
   :commands time-stamp
-  :idle
-  (progn
-    (add-hook 'write-file-hooks 'time-stamp)
-    (setq time-stamp-active t))
   :config
   (progn
-    (setq time-stamp-format "%02H:%02M:%02S (%z) - %02d.%02m.%:y from %u (%U) on %s")
-    (setq time-stamp-old-format-warn nil)
-    (setq time-stamp-time-zone nil)))
+    (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
@@ -4691,15 +5070,14 @@ Transparent Remote (file) Access, Multiple Protocol, remote file editing.
   :defer t
   :config
   (progn
-    ;(setq tramp-persistency-file-name (expand-file-name "tramp" jj-cache-dir))
-    (setq shell-prompt-pattern "^[^a-zA-Z].*[#$%>] *")
+    ;(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"))
-    (setq tramp-debug-buffer nil)
-    (setq tramp-default-method "sshx")
+    (validate-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-verbose 5)
     ))
 #+END_SRC
 
@@ -4726,8 +5104,8 @@ keeping the full power of emacs undo/redo.
   :init
   (progn
     (global-undo-tree-mode)
-    (setq undo-tree-visualizer-timestamps t)
-    (setq undo-tree-visualizer-diff t)
+    (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)
@@ -4746,9 +5124,9 @@ Always have unique buffernames. See [[http://www.gnu.org/software/emacs/manual/h
 (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
@@ -4756,8 +5134,8 @@ 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
-(setq url-mime-language-string "de,en")
-(setq url-privacy-level (quote (email os lastloc)))
+(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]
@@ -4780,7 +5158,7 @@ your operation actually changed in the buffer.
 #+BEGIN_SRC emacs-lisp
 (use-package volatile-highlights
   :ensure volatile-highlights
-  :idle
+  :config
   (volatile-highlights-mode t)
   :diminish volatile-highlights-mode)
 #+END_SRC
@@ -4789,10 +5167,10 @@ your operation actually changed in the buffer.
 #+BEGIN_SRC emacs-lisp
 (use-package wgrep
   :ensure wgrep
-  :idle
+  :config
   (progn
-    (setq wgrep-auto-save-buffer t)
-    (setq wgrep-enable-key "r")
+    (validate-setq wgrep-auto-save-buffer t)
+    (validate-setq wgrep-enable-key "r")
     )
   )
 #+END_SRC
@@ -4805,7 +5183,7 @@ Easily move between splitted windows.
   (progn
     (windmove-default-keybindings)
     ; maybe also:
-    ;(setq org-replace-disputed-keys t)
+    ;(validate-setq org-replace-disputed-keys t)
     ))
 #+END_SRC
 ** winner mode - undo and redo window configuration
@@ -4818,7 +5196,7 @@ you were working on. When you're done, press =C-c <left>=.
 (use-package winner
   :ensure t
   :defer t
-  :idle (winner-mode 1))
+  :config (winner-mode 1))
 #+END_SRC
 ** writegood
 This highlights some /weaselwords/, a mode to /aid in finding common
@@ -4850,16 +5228,16 @@ 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
-    (setq web-mode-enable-current-element-highlight t)
-    (setq web-mode-ac-sources-alist
+    (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
@@ -4875,10 +5253,12 @@ 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
 (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]
@@ -4897,20 +5277,22 @@ readable/editable without getting a big headache.
 Yasnippet is a template system. Type an abbreviation, expand it into
 whatever the snippet holds.
 #+BEGIN_SRC emacs-lisp
-;(setq yas-snippet-dirs (expand-file-name "yasnippet/snippets" jj-elisp-dir))
+;(validate-setq yas-snippet-dirs (expand-file-name "yasnippet/snippets" jj-elisp-dir))
 (use-package yasnippet
   :ensure yasnippet
   :defer t
   :diminish yas-minor-mode
   :commands yas-global-mode
-  :idle
+  :config
   (progn
     ;; Integrate hippie-expand with ya-snippet
     (add-to-list 'hippie-expand-try-functions-list
                  'yas-hippie-try-expand)
     (yas-global-mode 1)
-    (setq yas-expand-only-for-last-commands '(self-insert-command))
+    (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