Add interleave mode
[emacs.git] / .emacs.d / config / emacs.org
index 3f02b09..bcdd492 100644 (file)
@@ -5,8 +5,6 @@
 #+SETUPFILE:   ~/.emacs.d/elisp/org-templates/level-0.org
 #+LATEX_CMD:   xelatex
 #+PROPERTY: header-args    :tangle yes
-# @compile: (message "FOO")
-# @compile: (byte-compile-file "config.el")
 
 * Base settings, Stuff without an extra package
 ** Configure package loading
@@ -28,11 +26,11 @@ normal runtime.
   (dolist (source '(("melpa" . "http://melpa.org/packages/")
                     ("melpa-stable" . "http://stable.melpa.org/packages/")
                     ("marmalade" . "http://marmalade-repo.org/packages/")
-                    ("elpy"         . "http://jorgenschaefer.github.io/packages/")
+                    ;("elpy"         . "http://jorgenschaefer.github.io/packages/")
                     ("elpa" . "http://elpa.gnu.org/packages/")
                    ))
     (add-to-list 'package-archives source t))
-  (package-initialize)
+  ;(package-initialize)
 
 
  ;; set use-package-verbose to t for interpreted .emacs,
@@ -62,7 +60,8 @@ normal runtime.
  (eval-when-compile
    (require 'use-package))
  (require 'bind-key)
- (require 'diminish)
+ (use-package diminish
+  :ensure t)
  #+END_SRC
 
 ** Tangle on save
@@ -80,13 +79,6 @@ Tangle my config on save, so next startup shouldn't need to do it.
 (add-hook 'after-save-hook #'my-tangle-config-org-hook-func)
 #+END_SRC
 
-** Schema validation for the config
-[2016-10-30 Sun 17:15]
-#+BEGIN_SRC emacs-lisp
-(use-package validate
-  :ensure t)
-#+END_SRC
-
 ** safe-load
 safe-load does not break emacs initialization, should a file be
 unreadable while emacs boots up.
@@ -199,21 +191,21 @@ Help emacs to find the info files
 *** Hide Startup message
  I dislike the startup message
  #+BEGIN_SRC emacs-lisp
- (validate-setq inhibit-splash-screen t)
- (validate-setq inhibit-startup-message t)
+ (setq inhibit-splash-screen t)
+ (setq inhibit-startup-message t)
  #+END_SRC
 
 *** Linebreak at 72
  Usually I want the lines to break at 72 characters.
  #+BEGIN_SRC emacs-lisp
- (validate-setq fill-column 72)
+ (setq fill-column 72)
  #+END_SRC
 
 *** Require final newline
  And it is nice to have a final newline in files.
  #+BEGIN_SRC emacs-lisp
- (validate-setq require-final-newline nil)
- (validate-setq mode-require-final-newline nil)
+ (setq require-final-newline nil)
+ (setq mode-require-final-newline nil)
  #+END_SRC
 
 *** Autosave
@@ -221,17 +213,17 @@ Help emacs to find the info files
  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
- (validate-setq auto-save-interval 300)
- (validate-setq auto-save-timeout   60)
+ (setq auto-save-interval 300)
+ (setq auto-save-timeout   60)
  #+END_SRC
 
 *** Name and mail settings
  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
- (validate-setq user-full-name "Joerg Jaspert")
- (validate-setq user-mail-address "joerg@ganneff.de")
- (validate-setq mail-user-agent (quote gnus-user-agent))
+ (setq user-full-name "Joerg Jaspert")
+ (setq user-mail-address "joerg@ganneff.de")
+ (setq mail-user-agent (quote gnus-user-agent))
  #+END_SRC
 
 *** Smtpmail
@@ -243,8 +235,8 @@ Help emacs to find the info files
    :ensure t
    :config
    (progn
-     (validate-setq smtpmail-default-smtp-server "localhost")
-     (validate-setq smtpmail-smtp-server "localhost")))
+     (setq smtpmail-default-smtp-server "localhost")
+     (setq smtpmail-smtp-server "localhost")))
  #+END_SRC
 
 *** Compressed files
@@ -268,7 +260,7 @@ Help emacs to find the info files
  Recenter in a different order - first go to top, then middle, then
  bottom
  #+BEGIN_SRC emacs-lisp
- (validate-setq recenter-positions '(top middle bottom))
+ (setq recenter-positions '(top middle bottom))
  #+END_SRC
 
 ** Look / Theme
@@ -276,7 +268,10 @@ Help emacs to find the info files
  I've tried various different fonts and while I like the Terminus font
  most for my shells, in Emacs Inconsolata clearly wins.
  #+BEGIN_SRC emacs-lisp
- (set-frame-font "Inconsolata-14")
+ ; (set-frame-font "Inconsolata-14")
+ (set-frame-font "Hack-10")
+ (add-to-list 'default-frame-alist
+                 '(font . "Hack-10"))
  #+END_SRC
 
 *** Background dark
@@ -310,29 +305,29 @@ Help emacs to find the info files
        (setq solarized-distinct-fringe-background t)
 
        ;; ;; Don't change the font for some headings and titles
-       ;; (validate-setq solarized-use-variable-pitch nil)
+       ;; (setq solarized-use-variable-pitch nil)
 
        ;; ;; make the modeline high contrast
-       ;; (validate-setq solarized-high-contrast-mode-line nil)
+       ;; (setq solarized-high-contrast-mode-line nil)
 
        ;; ;; Use less bolding
-       ;; (validate-setq solarized-use-less-bold t)
+       ;; (setq solarized-use-less-bold t)
 
        ;; ;; Use more italics
-       ;; (validate-setq solarized-use-more-italic t)
+       ;; (setq solarized-use-more-italic t)
 
        ;; ;; Use less colors for indicators such as git:gutter, flycheck and similar
-       ;; (validate-setq solarized-emphasize-indicators nil)
+       ;; (setq solarized-emphasize-indicators nil)
 
        ;; ;; Don't change size of org-mode headlines (but keep other size-changes)
-       ;; (validate-setq solarized-scale-org-headlines nil)
+       ;; (setq solarized-scale-org-headlines nil)
 
        ;; ;; Avoid all font-size changes
-       ;; (validate-setq solarized-height-minus-1 1)
-       ;; (validate-setq solarized-height-plus-1 1)
-       ;; (validate-setq solarized-height-plus-2 1)
-       ;; (validate-setq solarized-height-plus-3 1)
-       ;; (validate-setq solarized-height-plus-4 1)
+       ;; (setq 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)
        (setq x-underline-at-descent-line t)
 
      (add-to-list 'custom-theme-load-path jj-theme-dir)
@@ -358,12 +353,16 @@ I do not want my cursor to blink.
 #+BEGIN_SRC emacs-lisp
 (blink-cursor-mode -1)
 #+END_SRC
-*** Menu, Tool and Scrollbar
+*** Menu, Tool and Scrollbar, File/Dialog boxes
 I don't want to see the menu-bar, tool-bar or scrollbar.
+And I don't want silly graphic file dialog or boxes.
 #+BEGIN_SRC emacs-lisp
 (when window-system
   (dolist (mode '(menu-bar-mode tool-bar-mode scroll-bar-mode))
-  (when (fboundp mode) (funcall mode -1))))
+    (when (fboundp mode) (funcall mode -1)))
+  (if (fboundp 'use-file-dialog) (setq use-file-dialog nil))
+  (if (fboundp 'use-dialog-box) (setq use-dialog-box nil))
+  )
 #+END_SRC
 **** When using emacs in daemon mode
 Emacs has a very nice mode where it detaches itself and runs as daemon -
@@ -394,17 +393,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
-(validate-setq enable-recursive-minibuffers 't)
+(setq enable-recursive-minibuffers 't)
 #+END_SRC
 *** No GC during minibuffer action
 [2016-02-15 Mon 22:09]
 See [[https://bling.github.io/blog/2016/01/18/why-are-you-changing-gc-cons-threshold/][Why are you changing gc cons threshold?]] for more details.
 #+BEGIN_SRC emacs-lisp
 (defun my-minibuffer-setup-hook ()
-  (validate-setq gc-cons-threshold most-positive-fixnum))
+  (setq gc-cons-threshold most-positive-fixnum))
 
 (defun my-minibuffer-exit-hook ()
-  (validate-setq gc-cons-threshold 16777216))
+  (setq gc-cons-threshold 16777216))
 
 (add-hook 'minibuffer-setup-hook #'my-minibuffer-setup-hook)
 (add-hook 'minibuffer-exit-hook #'my-minibuffer-exit-hook)
@@ -420,13 +419,13 @@ modeline in red as soon as you are over the defined limit.
 (column-number-mode 1)
 (size-indication-mode 1)
 (display-time-mode 1)
-(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)
+(setq display-time-day-and-date nil)
+(setq display-time-default-load-average nil)
+(setq display-time-24hr-format t)
+(setq display-time-mail-string "")
+(setq display-time-default-load-average nil)
+(setq display-time-interval 15)
+(setq modelinepos-column-limit 72)
 
 (use-package modeline-posn
   :ensure t
@@ -454,6 +453,7 @@ character(s).
       (paredit-mode . " π")
       (eldoc-mode . "")
       (abbrev-mode . "")
+      (golden-ratio-mode . "")
       ;; Major modes
       (lisp-interaction-mode . "λ")
       (hi-lock-mode . "")
@@ -479,7 +479,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,
 so take it our for now...
@@ -498,8 +498,8 @@ so take it our for now...
  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
+   ;;(setq confirm-kill-processes nil)
+   (setq kill-buffer-query-functions
                   (delq 'process-kill-buffer-query-function kill-buffer-query-functions))
  #+END_SRC
 ** Keyboard related changes
@@ -556,7 +556,7 @@ From [[http://endlessparentheses.com/faster-pop-to-mark-command.html?source=rss]
   (let ((p (point)))
     (dotimes (i 10)
       (when (= p (point)) ad-do-it))))
-(validate-setq set-mark-command-repeat-pop t)
+(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
@@ -580,7 +580,16 @@ make up our own.
 #+BEGIN_SRC emacs-lisp
 (bind-key "C-c C-q" 'mark-sexp)
 #+END_SRC
+*** Make it easy to edit this config
+[2018-12-30 Sun 16:54]
+#+BEGIN_SRC emacs-lisp
+(defun find-config ()
+    "Edit emacs.org"
+    (interactive)
+    (find-file "~/.emacs.d/config/emacs.org"))
 
+(bind-key "C-c I" 'find-config)
+#+END_SRC
 ** Miscellaneous stuff
 *** Isearch related
 Incremental search is great, but annoyingly you need to type whatever
@@ -598,7 +607,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
-(validate-setq frame-title-format "%b (%i)")
+(setq frame-title-format "%b (%I/%i)")
 #+END_SRC
 
 *** yes-or-no-p
@@ -618,9 +627,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)
-(validate-setq default-process-coding-system '(utf-8-unix . utf-8-unix))
+(setq default-process-coding-system '(utf-8-unix . utf-8-unix))
 (when (display-graphic-p)
-  (validate-setq x-select-request-type '(UTF8_STRING COMPOUND_TEXT TEXT STRING)))
+  (setq x-select-request-type '(UTF8_STRING COMPOUND_TEXT TEXT STRING)))
 #+END_SRC
 
 *** Kill other buffers
@@ -634,11 +643,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
-(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)
+(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)
 #+END_SRC
 
 *** Copy/Paste with X
@@ -646,10 +655,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
-(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)
+(setq select-enable-primary t)
+(setq select-enable-clipboard nil)
+(setq interprogram-paste-function 'x-cut-buffer-or-selection-value)
+(setq mouse-drag-copy-region t)
 #+END_SRC
 *** Global keyboard changes not directly related to a mode
 **** disable suspend frame
@@ -741,7 +750,8 @@ changed in emacs24. I am used to the old way, so get it back.
 **** rgrep
  Rgrep is infinitely useful in multi-file projects.
  #+begin_src emacs-lisp
- (bind-key "C-x C-g" 'rgrep)
+; (bind-key "C-x C-g" 'rgrep)
+(bind-key "C-x C-g" 'counsel-ag)
  #+end_src
 **** Transpose lines
  Easy way to move a line up - or down. Simpler than dealing with C-x C-t
@@ -782,7 +792,7 @@ changed in emacs24. I am used to the old way, so get it back.
                      (other-window -1)))
  #+END_SRC
 **** Edit file as root
- #+BEGIN_SRC emacs-lisp 
+ #+BEGIN_SRC emacs-lisp
  (bind-key "C-x C-r" 'prelude-sudo-edit)
  #+END_SRC
 **** Just one space with newline
@@ -800,8 +810,8 @@ changed in emacs24. I am used to the old way, so get it back.
    :ensure keyfreq
    :config
    (progn
-     (validate-setq keyfreq-file (expand-file-name "keyfreq" jj-cache-dir))
-     (validate-setq keyfreq-file-lock (expand-file-name "keyfreq.lock" jj-cache-dir))
+     (setq keyfreq-file (expand-file-name "keyfreq" jj-cache-dir))
+     (setq keyfreq-file-lock (expand-file-name "keyfreq.lock" jj-cache-dir))
      (keyfreq-mode 1)
      (keyfreq-autosave-mode 1)))
  #+END_SRC
@@ -818,7 +828,7 @@ changed in emacs24. I am used to the old way, so get it back.
        (newline)
        (insert line-text))))
 
- (bind-key "C-c p" 'duplicate-line)
+ (bind-key "C-x d" 'duplicate-line)
  #+END_SRC
 **** Smarter move to the beginning of the line.
 That is, it first moves to the beginning of the line - and on second
@@ -835,7 +845,7 @@ That is, it first moves to the beginning of the line - and on second
  If ARG is not nil or 1, move forward ARG - 1 lines first.  If
  point reaches the beginning or end of the buffer, stop there."
    (interactive "^p")
-   (validate-setq arg (or arg 1))
+   (setq arg (or arg 1))
 
    ;; Move lines first
    (when (/= arg 1)
@@ -894,7 +904,7 @@ That is, it first moves to the beginning of the line - and on second
 
  Show keystrokes in progress
  #+BEGIN_SRC emacs-lisp
- (validate-setq echo-keystrokes 0.1)
+ (setq echo-keystrokes 0.1)
  #+END_SRC
 **** Overwrite mode
 Usually you can press the *Ins*ert key, to get into overwrite mode. I
@@ -951,7 +961,7 @@ disabling that.
  #+END_SRC
 **** Quickly find emacs lisp sources
  [2014-06-22 Sun 23:05]
- #+BEGIN_SRC emacs-lisp
+ #+BEGIN_SRC emacs-lisp :tangle no
  (bind-key "C-l" 'find-library 'help-command)
  (bind-key "C-f" 'find-function 'help-command)
  (bind-key "C-k" 'find-function-on-key 'help-command)
@@ -974,13 +984,13 @@ disabling that.
 What should be displayed in the mode-line for files with those types
 of line endings.
 #+BEGIN_SRC emacs-lisp
-(validate-setq eol-mnemonic-dos "(DOS)")
-(validate-setq eol-mnemonic-mac "(Mac)")
+(setq eol-mnemonic-dos "(DOS)")
+(setq eol-mnemonic-mac "(Mac)")
 #+END_SRC
 
 #+BEGIN_SRC emacs-lisp
-(validate-setq max-lisp-eval-depth 1000)
-(validate-setq max-specpdl-size 3000)
+(setq max-lisp-eval-depth 1000)
+(setq max-specpdl-size 3000)
 #+END_SRC
 *** Unfill paragraph
 From https://raw.github.com/qdot/conf_emacs/master/emacs_conf.org
@@ -995,7 +1005,7 @@ From https://raw.github.com/qdot/conf_emacs/master/emacs_conf.org
 
 #+BEGIN_SRC emacs-lisp
 (setq-default indicate-empty-lines t)
-(validate-setq sentence-end-double-space nil)
+(setq sentence-end-double-space nil)
 #+END_SRC
 *** Hilight annotations in comments, like FIXME/TODO/...
 #+BEGIN_SRC emacs-lisp :tangle yes
@@ -1003,11 +1013,11 @@ From https://raw.github.com/qdot/conf_emacs/master/emacs_conf.org
 #+END_SRC
 *** Wait a bit longer before considering emacs idle
 #+BEGIN_SRC emacs-lisp :tangle yes
-(validate-setq idle-update-delay 2)
+(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)
+(setq gnutls-min-prime-bits 4096)
 #+END_SRC
 *** Emacs defaults to using --insecure - and supporting ssl3. No thanks.
 #+BEGIN_SRC emacs-lisp :tangle yes
@@ -1042,11 +1052,12 @@ From https://raw.github.com/qdot/conf_emacs/master/emacs_conf.org
 #+END_SRC
 **** Edit-server for chromium extension "Edit with emacs"
 [2015-10-15 Thu 22:32]
-#+BEGIN_SRC emacs-lisp :tangle no
+#+BEGIN_SRC emacs-lisp :tangle yes
 (use-package edit-server
+  :ensure t
   :config
   (progn
-    (validate-setq edit-server-new-frame nil)
+    (setq edit-server-new-frame nil)
     (edit-server-start)))
 #+END_SRC
 *** Adjust buffer mode for zsh commandline editing buffers
@@ -1058,8 +1069,41 @@ Now I want the buffers of it appear in sh-mode by default
 #+BEGIN_SRC emacs-lisp
 (add-auto-mode 'sh-mode "zshe.*$")
 #+END_SRC
+*** No need for lockfiles (foo~)
+[2017-12-08 Fri 09:29]
+#+BEGIN_SRC emacs-lisp
+(setq create-lockfiles nil)
+(setq make-backup-files nil)
+#+END_SRC
+*** Always kick trailing whitespace
+[2018-12-30 Sun 16:58]
+#+BEGIN_SRC emacs-lisp
+(add-hook 'before-save-hook 'delete-trailing-whitespace)
+#+END_SRC
+*** kill ring settings
+[2018-12-30 Sun 23:06]
+#+BEGIN_SRC emacs-lisp
+(setq kill-ring-max 200                 ; More killed items
+      kill-do-not-save-duplicates t     ; No duplicates in kill ring
+      ;; Save the contents of the clipboard to kill ring before killing
+      save-interprogram-paste-before-kill t)
 
-
+#+END_SRC
+*** Fold anything more indented than current line
+[2018-02-14 Mi 12:39]
+Taken from [[https://stackoverflow.com/questions/1587972/how-to-display-indentation-guides-in-emacs/4459159#4459159][stackoverflow]]
+#+BEGIN_SRC emacs-lisp
+(defun aj-toggle-fold ()
+  "Toggle fold all lines larger than indentation on current line"
+  (interactive)
+  (let ((col 1))
+    (save-excursion
+      (back-to-indentation)
+      (setq col (+ 1 (current-column)))
+      (set-selective-display
+       (if selective-display nil (or col 1))))))
+;(bind-key "C-i" 'aj-toggle-fold)
+#+END_SRC
 * Customized variables
 [2013-05-02 Thu 22:14]
 The following contains a set of variables i may reasonably want to
@@ -1100,7 +1144,7 @@ This can be 0 for immediate, or a floating point value."
  custom-set here, but we need it anyways.
 
  #+BEGIN_SRC emacs-lisp
- (validate-setq custom-file jj-custom-file)
+ (setq custom-file jj-custom-file)
  (safe-load custom-file)
  #+END_SRC
 
@@ -1115,68 +1159,71 @@ different text. Abbrevs are defined by the user to expand in specific
 ways.
 Also see [[http://endlessparentheses.com/ispell-and-abbrev-the-perfect-auto-correct.html][Ispell and Abbrev, the Perfect Auto-Correct]].
 #+BEGIN_SRC emacs-lisp :tangle yes
-  (use-package abbrev
-    :commands abbrev-mode
-    :diminish abbrev-mode
-    :bind (:map ctl-x-map
-           ("C-i" . endless/ispell-word-then-abbrev))
-    :init
-    (progn
-      (setq-default abbrev-mode t)
-      (hook-into-modes #'abbrev-mode '(text-mode-hook)))
-    :config
-    (progn
-      (validate-setq save-abbrevs 'silently)
-      (validate-setq abbrev-file-name (expand-file-name "abbrev_defs" jj-cache-dir))
-      (if (file-exists-p abbrev-file-name)
-          (quietly-read-abbrev-file))
-
-      (add-hook 'expand-load-hook
-                (lambda ()
-                  (add-hook 'expand-expand-hook 'indent-according-to-mode)
-                  (add-hook 'expand-jump-hook 'indent-according-to-mode)))
-
-      (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)))
+(use-package abbrev
+  :commands abbrev-mode
+  :diminish abbrev-mode
+  :bind (:map ctl-x-map
+              ("C-i" . endless/ispell-word-then-abbrev))
+  :init
+  (progn
+    (setq-default abbrev-mode t)
+    (hook-into-modes #'abbrev-mode '(text-mode-hook)))
+  :config
+  (progn
+    (setq save-abbrevs 'silently)
+    (setq abbrev-file-name (expand-file-name "abbrev_defs" jj-cache-dir))
+    (if (file-exists-p abbrev-file-name)
+        (quietly-read-abbrev-file))
+
+    (add-hook 'expand-load-hook
+              (lambda ()
+                (add-hook 'expand-expand-hook 'indent-according-to-mode)
+                (add-hook 'expand-jump-hook 'indent-according-to-mode)))
+
+    (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 (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))
+          (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"))))
+    (setq save-abbrevs 'silently)))
 #+END_SRC
 ** Atomic chrome, edit text from Chrome in Emacs
 [2017-03-09 Do 14:56]
 #+BEGIN_SRC emacs-lisp
 (use-package atomic-chrome
   :ensure t
+  :if window-system
   :init
   (progn
-    (atomic-chrome-start-server)))
+    (atomic-chrome-start-server)
+    (setq atomic-chrome-buffer-open-style 'full)
+))
 #+END_SRC
 ** ace-window
 [2013-04-21 So 20:27]
@@ -1188,7 +1235,7 @@ Use H-w to switch windows
   :bind ("H-w" . ace-window)
   :config
   (progn
-    (validate-setq aw-keys '(?a ?s ?d ?f ?j ?k ?l))
+    (setq aw-keys '(?a ?s ?d ?f ?j ?k ?l))
     ))
 #+END_SRC
 ** anzu
@@ -1204,7 +1251,7 @@ information in the mode-line in various search modes.
     (global-anzu-mode 1)
   :config
   (progn
-    (validate-setq anzu-search-threshold 1000)
+    (setq anzu-search-threshold 1000)
     (set-face-attribute 'anzu-mode-line nil :foreground "yellow" :weight 'bold)))
 #+END_SRC
 ** CANCELLED ansible                                             :CANCELLED:
@@ -1232,7 +1279,7 @@ avy is a GNU Emacs package for jumping to visible text using a char-based decisi
          )
   :config
   (progn
-    (validate-setq avy-all-windows 'all-frames)
+    (setq avy-all-windows 'all-frames)
     (setq avi-keys '(?a ?s ?d ?e ?f ?h ?j ?k ?l ?n ?m ?v ?r ?u) )
     ))
 #+END_SRC
@@ -1243,8 +1290,8 @@ avy is a GNU Emacs package for jumping to visible text using a char-based decisi
     :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")))
+      (setq browse-url-browser-function (quote browse-url-generic))
+      (setq browse-url-generic-program "/usr/bin/x-www-browser")))
 #+END_SRC
 
 ** CANCELLED Emacs shell                                         :CANCELLED:
@@ -1290,7 +1337,7 @@ Basic settings for emacs integrated shell
     (use-package 'em-prompt)
     (use-package 'em-term)
 
-    (validate-setq eshell-cmpl-cycle-completions nil
+    (setq eshell-cmpl-cycle-completions nil
           eshell-save-history-on-exit t
           eshell-buffer-maximum-lines 20000
           eshell-history-size 350
@@ -1300,9 +1347,9 @@ Basic settings for emacs integrated shell
           eshell-cmpl-dir-ignore "\\`\\(\\.\\.?\\|CVS\\|\\.svn\\|\\.git\\)/\\'")
 
     (setenv "PAGER" "cat")
-    (validate-setq eshell-visual-commands
+    (setq eshell-visual-commands
           '("less" "tmux" "htop" "top" "bash" "zsh" "tail"))
-    (validate-setq eshell-visual-subcommands
+    (setq eshell-visual-subcommands
           '(("git" "log" "l" "diff" "show")))
 
     (add-to-list 'eshell-command-completions-alist
@@ -1349,7 +1396,7 @@ Basic settings for emacs integrated shell
       :ensure t
       :init
       (progn
-        (validate-setq eshell-highlight-prompt nil
+        (setq eshell-highlight-prompt nil
               ;; epe-git-dirty-char "Ϟ"
               epe-git-dirty-char "*"
               eshell-prompt-function 'epe-theme-dakrone)))
@@ -1357,12 +1404,12 @@ Basic settings for emacs integrated shell
     (defun eshell/magit ()
       "Function to open magit-status for the current directory"
       (interactive)
-      (magit-status default-directory)
+      (magit-status-internal default-directory)
       nil)
 
-    (validate-setq eshell-prompt-function 'eshell/my-prompt)
-    (validate-setq eshell-highlight-prompt nil)
-    (validate-setq eshell-prompt-regexp "^[^#$\n]+[#$] ")))
+    (setq eshell-prompt-function 'eshell/my-prompt)
+    (setq eshell-highlight-prompt nil)
+    (setq eshell-prompt-regexp "^[^#$\n]+[#$] ")))
 #+END_SRC
 
 ** keep-buffers
@@ -1387,7 +1434,7 @@ In the past I had a long function that just recreated them, but the
     (midnight-mode)
     :config
     (progn
-      (validate-setq clean-buffer-list-kill-buffer-names (quote ("*Help*" "*Apropos*"
+      (setq clean-buffer-list-kill-buffer-names (quote ("*Help*" "*Apropos*"
                                                                  "*Man " "*Buffer List*"
                                                                  "*Compile-Log*"
                                                                  "*info*" "*vc*"
@@ -1422,32 +1469,32 @@ Paradox is a nicer interface to the package system
    :defer 5
    :init
      (paradox-enable)
-    
+
 #+END_SRC
 ** Shell (ZSH)
 [2013-04-23 Tue 16:43]
 Shell. zsh in my case.
 #+BEGIN_SRC emacs-lisp
-  (use-package shell
-    :commands (shell)
-    :defer t
-    :config
-    (progn
-       (validate-setq shell-file-name "zsh")
-       (validate-setq shell-command-switch "-c")
-       (validate-setq explicit-shell-file-name shell-file-name)
-       (setenv "SHELL" shell-file-name)
-       (setq explicit-sh-args '("-login" "-i"))
-       (add-hook 'shell-mode-hook 'ansi-color-for-comint-mode-on)
-       (validate-setq comint-scroll-to-bottom-on-input t)  ; always insert at the bottom
-       (validate-setq comint-scroll-to-bottom-on-output t) ; always add output at the bottom
-       (validate-setq comint-scroll-show-maximum-output t) ; scroll to show max possible output
-       (validate-setq comint-completion-autolist t)        ; show completion list when ambiguous
-       (validate-setq comint-input-ignoredups t)           ; no duplicates in command history
-       (validate-setq comint-completion-addsuffix t)       ; insert space/slash after file completion
-       (validate-setq comint-buffer-maximum-size 20000)    ; max lenght of the buffer in lines
-       (validate-setq comint-prompt-read-only nil)         ; if this is t, it breaks shell-command
-       ))
+(use-package shell
+  :commands (shell)
+  :defer t
+  :hook (shell-mode . ansi-color-for-comint-mode-on)
+  :config
+  (progn
+     (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"))
+     (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
+     ))
 #+END_SRC
 
 ** ascii
@@ -1486,95 +1533,57 @@ Shell. zsh in my case.
      ;; Compilation command
      (add-hook 'LaTeX-mode-hook (lambda () (setq compile-command "latexmk -pdf")))))
  #+END_SRC
-** auto-complete mode
- [2013-04-27 Sa 16:33]
- And aren't we all lazy? I definitely am, and I like my emacs doing as
- much possible work for me as it can.
- So here, auto-complete-mode, which lets emacs do this, based on what I
- already had typed.
- #+BEGIN_SRC emacs-lisp
- (use-package auto-complete
-   :ensure auto-complete
-   :commands auto-complete-mode
-   :bind (("C-n" . ac-next)
-          ("C-p" . ac-previous)
-          :map ac-complete-mode-map
-          ("\t" . ac-expand)
-          ("\r" . ac-complete)
-          ("M-n" . ac-next)
-          ("M-p" . ac-previous)
-          :map ac-mode-map
-          ("M-TAB" . auto-complete)
-          :map ac-completing-map
-          ("C-s" . ac-isearch))
-   :init
-   (progn
-     (auto-complete-mode t))
-   :config
-   (progn
-     (ac-config-default)
-     ;; hook AC into completion-at-point
-     (defun sanityinc/auto-complete-at-point ()
-       (when (and (not (minibufferp))
-                  (fboundp 'auto-complete-mode)
-                  auto-complete-mode)
-         (auto-complete)))
-     (defun set-auto-complete-as-completion-at-point-function ()
-       (add-to-list 'completion-at-point-functions 'sanityinc/auto-complete-at-point))
-     ;; Exclude very large buffers from dabbrev
-     (defun sanityinc/dabbrev-friend-buffer (other-buffer)
-       (< (buffer-size other-buffer) (* 1 1024 1024)))
-
-     (use-package pos-tip
-       :ensure 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
-     (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.
-     (setq auto-completion-syntax-alist (quote (global accept . word)))
-      ;; Avoid completion for short trivial words.
-     (setq auto-completion-min-chars (quote (global . 3)))
-     (setq completion-use-dynamic t)
-
-     (add-hook 'auto-complete-mode-hook 'set-auto-complete-as-completion-at-point-function)
+** company-mode
+[2017-12-08 Fri 09:42]
+Auto-completion comp any mode.
+#+BEGIN_SRC emacs-lisp
+(use-package company
+  :ensure t
+  :defer t
+  :diminish company-mode
+  :init (global-company-mode)
+  :config
+  (progn
+    ;; Use Company for completion
+    (bind-key [remap completion-at-point] #'company-complete company-mode-map)
+    (global-company-mode)
+
+    (setq company-dabbrev-downcase nil)
+    (setq company-echo-delay 0)
+    (setq company-idle-delay 0.2)
+    (setq company-minimum-prefix-length 2)
+    (setq company-require-match nil)
+    (setq company-selection-wrap-around t)
+    (setq company-show-numbers t)
+    (setq company-tooltip-align-annotations t)
+    (setq company-tooltip-flip-when-above t)
+    (setq company-tooltip-limit 10)
+    (setq company-transformers '(company-sort-by-occurrence)) ; weight by frequency
+    ))
 
-     ;; Exclude very large buffers from dabbrev
-     (setq dabbrev-friend-buffer-function 'sanityinc/dabbrev-friend-buffer)
+(use-package company-quickhelp          ; Documentation popups for Company
+  :ensure t
+  :defer t
+  :init (add-hook 'global-company-mode-hook #'company-quickhelp-mode))
 
-     (use-package ac-dabbrev
-       :ensure t)
+(use-package company-statistics
+    :ensure t
+    :config
+    (add-hook 'after-init-hook 'company-statistics-mode))
 
-     (set-default 'ac-sources
-                  '(ac-source-imenu
-                    ac-source-dictionary
-                    ac-source-words-in-buffer
-                    ac-source-words-in-same-mode-buffers
-     ;               ac-source-words-in-all-buffer
-                    ac-source-dabbrev))
+(use-package company-go
+  :ensure t
+  :defer t
+  :init
+  (with-eval-after-load 'company
+    (add-to-list 'company-backends 'company-go)))
 
-     (dolist (mode '(magit-log-edit-mode log-edit-mode org-mode text-mode haml-mode
-                     sass-mode yaml-mode csv-mode espresso-mode haskell-mode 
-                     html-mode nxml-mode sh-mode smarty-mode clojure-mode go-mode
-                     lisp-mode textile-mode markdown-mode tuareg-mode python-mode
-                     js3-mode css-mode less-css-mode sql-mode ielm-mode))
-       (add-to-list 'ac-modes mode))
+(use-package company-auctex
+  :ensure t)
 
-     (hook-into-modes 'auto-complete-mode '(latex-mode-hook LaTeX-mode-hook prog-mode-hook html-mode lisp-mode css-mode org-mode-hook))))
- #+END_SRC
+(use-package company-jedi
+  :ensure t)
+#+END_SRC
 
 ** auto-revert
  When files change outside emacs for whatever reason I want emacs to deal
@@ -1585,7 +1594,7 @@ Shell. zsh in my case.
    :diminish auto-revert-mode
    :init
    (progn
-     (validate-setq global-auto-revert-mode t)
+     (setq global-auto-revert-mode t)
      (setq global-auto-revert-non-file-buffers t)
      (global-auto-revert-mode)))
  #+END_SRC
@@ -1606,22 +1615,22 @@ CLOSED: [2017-08-26 Sa 14:41]
             ("\C-cw" . backup-walker-start))
    :init
    (progn
-     (validate-setq backup-directory jj-backup-directory)
- ;    (validate-setq tramp-backup-directory (concat jj-backup-directory "/tramp"))
+     (setq backup-directory jj-backup-directory)
+ ;    (setq tramp-backup-directory (concat jj-backup-directory "/tramp"))
  ;    (if (not (file-exists-p tramp-backup-directory))
  ;        (make-directory tramp-backup-directory))
- ;    (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)
+ ;    (setq tramp-backup-directory-alist `((".*" . ,tramp-backup-directory)))
+     (setq backup-directory-alist `(("." . ,jj-backup-directory)))
+     (setq auto-save-list-file-prefix (concat jj-backup-directory ".auto-saves-"))
+     (setq auto-save-file-name-transforms `((".*" ,jj-backup-directory t)))
+
+     (setq version-control t)     ;; Use version numbers for backups
+     (setq kept-new-versions 10)  ;; Number of newest versions to keep
+     (setq kept-old-versions 2)   ;; Number of oldest versions to keep
+     (setq delete-old-versions t) ;; Ask to delete excess backup versions?
+     (setq backup-by-copying t)
+     (setq backup-by-copying-when-linked t) ;; Copy linked files, don't rename.
+     (setq make-backup-files t)
 
      (defadvice kill-buffer (around kill-buffer)
        "Always save before killing a file buffer"
@@ -1648,7 +1657,7 @@ CLOSED: [2017-08-26 Sa 14:41]
          (set-buffer-modified-p nil))
        (kill-buffer))
 
-     (validate-setq backup-enable-predicate
+     (setq backup-enable-predicate
            (lambda (name)
              (and (normal-backup-enable-predicate name)
                   (not
@@ -1657,54 +1666,17 @@ CLOSED: [2017-08-26 Sa 14:41]
                        (member method '("su" "sudo"))))))))))
 
  #+END_SRC
-** CANCELLED browse-kill-ring                                    :CANCELLED:
-CLOSED: [2017-08-26 Sat 14:46]
-:LOGBOOK:
-- State "CANCELLED"  from              [2017-08-26 Sat 14:46] \\
-  deactivated
-:END:
- [2014-12-11 Thu 11:31]
- Currently replaced with counsel, see Ivy
- #+BEGIN_SRC emacs-lisp :tangle no
- (use-package browse-kill-ring
-   :ensure t
-   :commands (browse-kill-ring browse-kill-ring-mode)
-   :bind ("M-y" . browse-kill-ring)
-   )
- #+END_SRC
-** CANCELLED calendar                                            :CANCELLED:
-CLOSED: [2017-08-26 Sat 14:47]
-:LOGBOOK:
-- State "CANCELLED"  from              [2017-08-26 Sat 14:47]
-:END:
- [2014-06-10 Tue 22:20]
+** c mode
+[2019-01-25 Fr 14:40]
  #+BEGIN_SRC emacs-lisp
- (use-package calendar
-   :commands (cal/insert)
-   :bind ("C-c c" . cal/insert)
-   :config
-   (progn
-     ; Weeks start on Monday, not sunday.
-     (validate-setq calendar-week-start-day 1)
-     (validate-setq calendar-date-style 'european)
-
-     ; Display ISO week numbers in Calendar Mode
-     (copy-face font-lock-constant-face 'calendar-iso-week-face)
-     (set-face-attribute 'calendar-iso-week-face nil :height 0.7)
-     (validate-setq calendar-intermonth-text
-           '(propertize
-             (format "%2d"
-                     (car
-                      (calendar-iso-from-absolute
-                       (calendar-absolute-from-gregorian (list month day year)))))
-             'font-lock-face 'calendar-iso-week-face))
-     (copy-face 'default 'calendar-iso-week-header-face)
-     (set-face-attribute 'calendar-iso-week-header-face nil :height 0.7)
-     (validate-setq calendar-intermonth-header
-           (propertize "Wk"                  ; or e.g. "KW" in Germany
-                       'font-lock-face 'calendar-iso-week-header-face))))
-
+(use-package cc-mode
+  :defer t
+  :mode (("\\.pc\\'" . c-mode)
+         ("\\.awk\\'" . awk-mode)
+         ("\\.c\\'" . c-mode))
+  :commands (c-mode awk-mode))
  #+END_SRC
+
 ** corral
  [2015-10-15 Thu 11:34]
  Corral is a lightweight package that lets you quickly wrap parentheses
@@ -1717,7 +1689,7 @@ CLOSED: [2017-08-26 Sat 14:47]
    :config
    (progn
      ; Interpret # and * as part of the word
-     (validate-setq corral-syntax-entries '((?# "_")
+     (setq corral-syntax-entries '((?# "_")
                                    (?* "_")
                                    (?$ ".")
                                    (?/ ".")))
@@ -1745,36 +1717,6 @@ CLOSED: [2017-08-26 Sat 14:47]
    :mode ("\\.?cron\\(tab\\)?\\'" . crontab-mode))
  #+END_SRC
 
-** CANCELLED css                                                 :CANCELLED:
-CLOSED: [2017-08-26 Sat 14:50]
-:LOGBOOK:
-- State "CANCELLED"  from              [2017-08-26 Sat 14:50] \\
-  web mode it is
-:END:
- web-mode takes over, see [[*web-mode][web-mode]]
- #+BEGIN_SRC emacs-lisp :tangle no
- (use-package css-mode
-   :mode ("\\.css\\'" . css-mode)
-   :defer t
-   :config
-   (progn
-   ;;; CSS flymake
-     (use-package flymake-css
-       :ensure flymake-css
-       :config
-       (progn
-         (defun maybe-flymake-css-load ()
-           "Activate flymake-css as necessary, but not in derived modes."
-           (when (eq major-mode 'css-mode)
-             (flymake-css-load)))
-         (add-hook 'css-mode-hook 'maybe-flymake-css-load)))
-     ;;; Auto-complete CSS keywords
-     (eval-after-load 'auto-complete
-       '(progn
-          (dolist (hook '(css-mode-hook sass-mode-hook scss-mode-hook))
-            (add-hook hook 'ac-css-mode-setup))))))
- #+END_SRC
-
 ** cua
  I know that this lets it look "more like windows", but I don't much care
  about its paste/copy/cut keybindings, the really nice part is the great
@@ -1782,7 +1724,7 @@ CLOSED: [2017-08-26 Sat 14:50]
  know this mode. The normal keybindings for those are just to useless.
  #+BEGIN_SRC emacs-lisp
  (cua-mode t)
- (validate-setq cua-enable-cua-keys (quote shift))
+ (setq cua-enable-cua-keys (quote shift))
  #+END_SRC
 
  Luckily cua-mode easily supports this, with the following line I just
@@ -1818,27 +1760,28 @@ CLOSED: [2017-08-26 Sat 14:50]
    :defines (dired-omit-regexp-orig)
    :bind (:map dired-mode-map
           ("F" . find-name-dired)
-          ("/" . dired-narrow))
+          ("/" . dired-narrow)
+          ("r" . wdired-change-to-wdired-mode))
    :defer
    :init
    (progn
      (setq diredp-hide-details-initially-flag nil))
    :config
    (progn
-     (validate-setq dired-auto-revert-buffer (quote dired-directory-changed-p))
-     (validate-setq dired-dwim-target t)
-     (validate-setq dired-listing-switches "-alh")
-     (validate-setq dired-listing-switches "-alXh --group-directories-first")
-     (validate-setq dired-recursive-copies (quote top))
-     (validate-setq dired-recursive-deletes (quote top))
+     (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))
 
      (use-package dired+
-       :ensure dired+)
+          :load-path "elisp/local")
 
      (use-package dired-x
        :init
        (progn
-         (validate-setq dired-guess-shell-alist-user
+         (setq dired-guess-shell-alist-user
                         '(("\\.pdf\\'" "mupdf")
                           ("\\.\\(?:djvu\\|eps\\)\\'" "evince")
                           ("\\.\\(?:jpg\\|jpeg\\|png\\|gif\\|xpm\\)\\'" "eog")
@@ -1861,8 +1804,7 @@ CLOSED: [2017-08-26 Sat 14:50]
 
      (use-package wdired
        :ensure wdired
-       :bind (:map dired-mode-map
-              ("r" . wdired-change-to-wdired-mode))
+       :commands (wdired-change-to-wdired-mode)
        :config
        (progn
          (setq wdired-allow-to-change-permissions t)))
@@ -1886,13 +1828,13 @@ CLOSED: [2017-08-26 Sat 14:50]
      (defun mark-similar-versions (name)
        (let ((pat name))
          (if (string-match "^\\(.+?\\)-[0-9._-]+$" pat)
-             (validate-setq pat (match-string 1 pat)))
+             (setq pat (match-string 1 pat)))
          (or (gethash pat mark-files-cache)
              (ignore (puthash pat t mark-files-cache)))))
 
      (defun dired-mark-similar-version ()
        (interactive)
-       (validate-setq mark-files-cache (make-hash-table :test #'equal))
+       (setq mark-files-cache (make-hash-table :test #'equal))
        (dired-mark-sexp '(mark-similar-versions name)))
 
      (defun dired-package-initialize ()
@@ -1910,7 +1852,7 @@ CLOSED: [2017-08-26 Sat 14:50]
                  parent-dir)
              (while (and (not (file-exists-p file))
                          (progn
-                           (validate-setq parent-dir
+                           (setq parent-dir
                                           (file-name-directory
                                            (directory-file-name
                                             (file-name-directory file))))
@@ -1918,7 +1860,7 @@ CLOSED: [2017-08-26 Sat 14:50]
                            (not (string= (file-name-directory file)
                                          parent-dir))))
                ;; Move up to the parent dir and try again.
-               (validate-setq file (expand-file-name ".git" parent-dir)))
+               (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))
@@ -1948,17 +1890,17 @@ CLOSED: [2017-08-26 Sat 14:50]
 
      (add-hook 'dired-mode-hook 'dired-package-initialize)
 
-     (defun dired-double-jump (first-dir second-dir)
-       (interactive
-        (list (read-directory-name "First directory: "
-                                   (expand-file-name "~")
-                                   nil nil "/Downloads/")
-              (read-directory-name "Second directory: "
-                                   (expand-file-name "~")
-                                   nil nil "/")))
-       (dired first-dir)
-       (dired-other-window second-dir))
-     (bind-key "C-c J" 'dired-double-jump)
+     ;; (defun dired-double-jump (first-dir second-dir)
+     ;;   (interactive
+     ;;    (list (read-directory-name "First directory: "
+     ;;                               (expand-file-name "~")
+     ;;                               nil nil "~/Downloads/")
+     ;;          (read-directory-name "Second directory: "
+     ;;                               (expand-file-name "~")
+     ;;                               nil nil "~/")))
+     ;;   (dired first-dir)
+     ;;   (dired-other-window second-dir))
+     ;; (bind-key "C-c J" 'dired-double-jump)
 
      (defun dired-back-to-top ()
        (interactive)
@@ -2031,322 +1973,11 @@ CLOSED: [2017-08-26 Sat 14:50]
           ("C-. = l" . ediff-regions-linewise)
           ("C-. = w" . ediff-regions-wordwise))
    :config (progn
-             (validate-setq ediff-window-setup-function 'ediff-setup-windows-plain)
-             (validate-setq ediff-split-window-function 'split-window-horizontally)
+             (setq ediff-window-setup-function 'ediff-setup-windows-plain)
+             (setq ediff-split-window-function 'split-window-horizontally)
              )
  )
  #+END_SRC
-** CANCELLED edit-server                                         :CANCELLED:
-CLOSED: [2017-08-26 Sat 14:55]
-:LOGBOOK:
-- State "CANCELLED"  from              [2017-08-26 Sat 14:55] \\
-  no more workinng
-:END:
- [2015-12-16 Wed 22:13]
- Allows chromium to "send" files (textbox inputs) to emacs to edit.
- #+BEGIN_SRC emacs-lisp :tangle no
- (use-package edit-server
-   :ensure t
-   :if window-system
-   :config
-   (progn
-     (validate-setq edit-server-new-frame t)
-     (edit-server-start)))
- #+END_SRC
-** CANCELLED emms                                                :CANCELLED:
-CLOSED: [2017-08-26 Sat 14:55]
-:LOGBOOK:
-- State "CANCELLED"  from              [2017-08-26 Sat 14:55]
-:END:
-
- EMMS is the Emacs Multimedia System.
- #+BEGIN_SRC emacs-lisp :tangle no
- (require 'emms-source-file)
- (require 'emms-source-playlist)
- (require 'emms-info)
- (require 'emms-cache)
- (require 'emms-playlist-mode)
- (require 'emms-playing-time)
- (require 'emms-player-mpd)
- (require 'emms-playlist-sort)
- (require 'emms-mark)
- (require 'emms-browser)
- (require 'emms-lyrics)
- (require 'emms-last-played)
- (require 'emms-score)
- (require 'emms-tag-editor)
- (require 'emms-history)
- (require 'emms-i18n)
-
- (validate-setq emms-playlist-default-major-mode 'emms-playlist-mode)
- (add-to-list 'emms-track-initialize-functions 'emms-info-initialize-track)
- (emms-playing-time 1)
- (emms-lyrics 1)
- (add-hook 'emms-player-started-hook 'emms-last-played-update-current)
- ;(add-hook 'emms-player-started-hook 'emms-player-mpd-sync-from-emms)
- (emms-score 1)
- (when (fboundp 'emms-cache) ; work around compiler warning
-   (emms-cache 1))
- (validate-setq emms-score-default-score 3)
-
- (defun emms-mpd-init ()
-   "Connect Emms to mpd."
-   (interactive)
-   (emms-player-mpd-connect))
-
- ;; players
- (require 'emms-player-mpd)
- (validate-setq emms-player-mpd-server-name "localhost")
- (validate-setq emms-player-mpd-server-port "6600")
- (add-to-list 'emms-info-functions 'emms-info-mpd)
- (add-to-list 'emms-player-list 'emms-player-mpd)
- (validate-setq emms-volume-change-function 'emms-volume-mpd-change)
- (validate-setq emms-player-mpd-sync-playlist t)
-
- (validate-setq emms-source-file-default-directory "/var/lib/mpd/music")
- (validate-setq emms-player-mpd-music-directory "/var/lib/mpd/music")
- (validate-setq emms-info-auto-update t)
- (validate-setq emms-lyrics-scroll-p t)
- (validate-setq emms-lyrics-display-on-minibuffer t)
- (validate-setq emms-lyrics-display-on-modeline nil)
- (validate-setq emms-lyrics-dir "~/.emacs.d/var/lyrics")
-
- (validate-setq emms-last-played-format-alist
-       '(((emms-last-played-seconds-today) . "%H:%M")
-         (604800                           . "%a %H:%M") ; this week
-         ((emms-last-played-seconds-month) . "%d.%m.%Y")
-         ((emms-last-played-seconds-year)  . "%d.%m.%Y")
-         (t                                . "Never played")))
-
- ;; Playlist format
- (defun my-describe (track)
-   (let* ((empty "...")
-          (name (emms-track-name track))
-          (type (emms-track-type track))
-          (short-name (file-name-nondirectory name))
-          (play-count (or (emms-track-get track 'play-count) 0))
-          (last-played (or (emms-track-get track 'last-played) '(0 0 0)))
-          (artist (or (emms-track-get track 'info-artist) empty))
-          (year (emms-track-get track 'info-year))
-          (playing-time (or (emms-track-get track 'info-playing-time) 0))
-          (min (/ playing-time 60))
-          (sec (% playing-time 60))
-          (album (or (emms-track-get track 'info-album) empty))
-          (tracknumber (emms-track-get track 'info-tracknumber))
-          (short-name (file-name-sans-extension
-                       (file-name-nondirectory name)))
-          (title (or (emms-track-get track 'info-title) short-name))
-          (rating (emms-score-get-score name))
-          (rate-char ?☭)
-          )
-     (format "%12s %20s (%.4s) [%-20s] - %2s. %-30s | %2d %s"
-             (emms-last-played-format-date last-played)
-             artist
-             year
-             album
-             (if (and tracknumber ; tracknumber
-                      (not (zerop (string-to-number tracknumber))))
-                 (format "%02d" (string-to-number tracknumber))
-               "")
-             title
-             play-count
-             (make-string rating rate-char)))
- )
-
- (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)
- (global-set-key (kbd "H-<f9> <f9>") 'emms-mpd-init)
- (global-set-key (kbd "H-<f9> d") 'emms-play-dired)
- (global-set-key (kbd "H-<f9> x") 'emms-start)
- (global-set-key (kbd "H-<f9> v") 'emms-stop)
- (global-set-key (kbd "H-<f9> n") 'emms-next)
- (global-set-key (kbd "H-<f9> p") 'emms-previous)
- (global-set-key (kbd "H-<f9> o") 'emms-show)
- (global-set-key (kbd "H-<f9> h") 'emms-shuffle)
- (global-set-key (kbd "H-<f9> SPC") 'emms-pause)
- (global-set-key (kbd "H-<f9> a") 'emms-add-directory-tree)
- (global-set-key (kbd "H-<f9> b") 'emms-smart-browse)
- (global-set-key (kbd "H-<f9> l") 'emms-playlist-mode-go)
-
- (global-set-key (kbd "H-<f9> r") 'emms-toggle-repeat-track)
- (global-set-key (kbd "H-<f9> R") 'emms-toggle-repeat-playlist)
- (global-set-key (kbd "H-<f9> m") 'emms-lyrics-toggle-display-on-minibuffer)
- (global-set-key (kbd "H-<f9> M") 'emms-lyrics-toggle-display-on-modeline)
-
- (global-set-key (kbd "H-<f9> <left>") (lambda () (interactive) (emms-seek -10)))
- (global-set-key (kbd "H-<f9> <right>") (lambda () (interactive) (emms-seek +10)))
- (global-set-key (kbd "H-<f9> <down>") (lambda () (interactive) (emms-seek -60)))
- (global-set-key (kbd "H-<f9> <up>") (lambda () (interactive) (emms-seek +60)))
-
- (global-set-key (kbd "H-<f9> s u") 'emms-score-up-playing)
- (global-set-key (kbd "H-<f9> s d") 'emms-score-down-playing)
- (global-set-key (kbd "H-<f9> s o") 'emms-score-show-playing)
- (global-set-key (kbd "H-<f9> s s") 'emms-score-set-playing)
-
- (define-key emms-playlist-mode-map "u" 'emms-score-up-playing)
- (define-key emms-playlist-mode-map "d" 'emms-score-down-playing)
- (define-key emms-playlist-mode-map "o" 'emms-score-show-playing)
- (define-key emms-playlist-mode-map "s" 'emms-score-set-playing)
- (define-key emms-playlist-mode-map "r" 'emms-mpd-init)
- (define-key emms-playlist-mode-map "N"  'emms-playlist-new)
-
- (define-key emms-playlist-mode-map "x" 'emms-start)
- (define-key emms-playlist-mode-map "v" 'emms-stop)
- (define-key emms-playlist-mode-map "n" 'emms-next)
- (define-key emms-playlist-mode-map "p" 'emms-previous)
-
- (validate-setq emms-playlist-buffer-name "*EMMS Playlist*"
-       emms-playlist-mode-open-playlists t)
-
- ;; Faces
- (if (window-system)
-     ((lambda ()
-        (set-face-attribute
-         'emms-browser-artist-face nil
-         :family "Arno Pro")
-        )
- ))
-
- (validate-setq emms-player-mpd-supported-regexp
-       (or (emms-player-mpd-get-supported-regexp)
-           (concat "\\`http://\\|"
-                   (emms-player-simple-regexp
-                    "m3u" "ogg" "flac" "mp3" "wav" "mod" "au" "aiff"))))
- (emms-player-set emms-player-mpd 'regex emms-player-mpd-supported-regexp)
-
- #+END_SRC
-** CANCELLED Emacs shell                                         :CANCELLED:
-CLOSED: [2017-08-26 Sat 14:56]
-:LOGBOOK:
-- State "CANCELLED"  from              [2017-08-26 Sat 14:56]
-:END:
- Basic settings for emacs integrated shell
- #+BEGIN_SRC emacs-lisp :tangle no
- (use-package eshell
-   :defer t
-   :commands eshell
-   :init
-   (progn
-     (defun eshell-initialize ()
-       (defun eshell-spawn-external-command (beg end)
-         "Parse and expand any history references in current input."
-         (save-excursion
-           (goto-char end)
-           (when (looking-back "&!" beg)
-             (delete-region (match-beginning 0) (match-end 0))
-             (goto-char beg)
-             (insert "spawn "))))
-       (add-hook 'eshell-expand-input-functions 'eshell-spawn-external-command)
-       (eval-after-load "em-unix"
-         '(progn
-            (unintern 'eshell/su)
-            (unintern 'eshell/sudo))))
-     (add-hook 'eshell-first-time-mode-hook 'eshell-initialize)
-     )
-   :config
-   (progn
-     (defalias 'emacs 'find-file)
-     (defalias 'ec 'find-file)
-     (defalias 'e 'find-file)
-
-     (use-package f
-       :ensure f)
-     (use-package 'em-cmpl)
-     (use-package 'em-prompt)
-     (use-package 'em-term)
-
-     (validate-setq eshell-cmpl-cycle-completions nil
-           eshell-save-history-on-exit t
-           eshell-buffer-maximum-lines 20000
-           eshell-history-size 350
-           eshell-buffer-shorthand t
-           eshell-highlight-prompt t
-           eshell-plain-echo-behavior t
-           eshell-cmpl-dir-ignore "\\`\\(\\.\\.?\\|CVS\\|\\.svn\\|\\.git\\)/\\'")
-
-     (setenv "PAGER" "cat")
-     (validate-setq eshell-visual-commands
-           '("less" "tmux" "htop" "top" "bash" "zsh" "tail"))
-     (validate-setq eshell-visual-subcommands
-           '(("git" "log" "l" "diff" "show")))
-
-     (add-to-list 'eshell-command-completions-alist
-                  '("gunzip" "gz\\'"))
-     (add-to-list 'eshell-command-completions-alist
-                  '("tar" "\\(\\.tar|\\.tgz\\|\\.tar\\.gz\\)\\'"))
-
-     (when (not (functionp 'eshell/rgrep))
-       (defun eshell/rgrep (&rest args)
-         "Use Emacs grep facility instead of calling external grep."
-         (eshell-grep "rgrep" args t)))
-
-     ;(set-face-attribute 'eshell-prompt nil :foreground "turquoise1")
-     (add-hook 'eshell-mode-hook ;; for some reason this needs to be a hook
-               '(lambda () (define-key eshell-mode-map "\C-a" 'eshell-bol)))
-     (add-hook 'eshell-preoutput-filter-functions
-               'ansi-color-filter-apply)
-     ;; Prompt with a bit of help from http://www.emacswiki.org/emacs/EshellPrompt
-
-     (defmacro with-face (str &rest properties)
-       `(propertize ,str 'face (list ,@properties)))
-
-     (defun eshell/abbr-pwd ()
-       (let ((home (getenv "HOME"))
-             (path (eshell/pwd)))
-         (cond
-          ((string-equal home path) "~")
-          ((f-ancestor-of? home path) (concat "~/" (f-relative path home)))
-          (path))))
-
-     (defun eshell/my-prompt ()
-       (let ((header-bg "#161616"))
-         (concat
-          (with-face user-login-name :foreground "cyan")
-          (with-face (concat "@" hostname) :foreground "white")
-          " "
-          (with-face (eshell/abbr-pwd) :foreground "#009900")
-          (if (= (user-uid) 0)
-              (with-face "#" :foreground "red")
-            (with-face "$" :foreground "#69b7f0"))
-          " ")))
-
-     (use-package eshell-prompt-extras
-       :ensure t
-       :init
-       (progn
-         (validate-setq eshell-highlight-prompt nil
-               ;; epe-git-dirty-char "Ϟ"
-               epe-git-dirty-char "*"
-               eshell-prompt-function 'epe-theme-dakrone)))
-
-     (defun eshell/magit ()
-       "Function to open magit-status for the current directory"
-       (interactive)
-       (magit-status default-directory)
-       nil)
-
-     (validate-setq eshell-prompt-function 'eshell/my-prompt)
-     (validate-setq eshell-highlight-prompt nil)
-     (validate-setq eshell-prompt-regexp "^[^#$\n]+[#$] ")))
-
- #+END_SRC
-
-** CANCELLED ethan-wspace                                        :CANCELLED:
-CLOSED: [2017-08-26 Sat 14:57]
-:LOGBOOK:
-- State "CANCELLED"  from              [2017-08-26 Sat 14:57]
-:END:
- [2014-06-01 Sun 15:00]
- Proper whitespace handling
- #+BEGIN_SRC emacs-lisp :tangle no
- (use-package ethan-wspace
-   :ensure ethan-wspace
-   :diminish (ethan-wspace-mode . "ew")
-   :init
-   (global-ethan-wspace-mode 1))
- #+END_SRC
 ** Eww - Emacs browser
  [2016-10-03 Mo 21:30]
 Eww - Emacs browser (needs emacs 24.4 or higher)
@@ -2374,13 +2005,13 @@ Eww - Emacs browser (needs emacs 24.4 or higher)
       ;; Make the binding for `revert-buffer' do `eww-reload' in eww-mode
       (define-key eww-mode-map [remap revert-buffer] #'eww-reload)
 
-      ;; (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
+      ;; (setq eww-search-prefix                 "https://duckduckgo.com/html/?q=")
+      (setq eww-search-prefix                 "https://www.google.com/search?q=")
+      (setq eww-download-directory            "~/Downloads")
+      ;; (setq eww-form-checkbox-symbol          "[ ]")
+      (setq eww-form-checkbox-symbol          "☐") ; Unicode hex 2610
+      ;; (setq eww-form-checkbox-selected-symbol "[X]")
+      (setq eww-form-checkbox-selected-symbol "☑") ; Unicode hex 2611
       ;; Improve the contract of pages like Google results
       ;; http://emacs.stackexchange.com/q/2955/115
       (setq shr-color-visible-luminance-min 80) ; default = 40
@@ -2526,8 +2157,20 @@ Eww - Emacs browser (needs emacs 24.4 or higher)
    :ensure t
    :config
    (progn
-     (exec-path-from-shell-initialize)
-     (exec-path-from-shell-copy-env "GOPATH")))
+     ;; Import additional environment variables beyond just $PATH
+     (dolist (var '("PYTHONPATH"         ; Python modules
+                    "INFOPATH"           ; Info directories
+                    "JAVA_OPTS"          ; Options for java processes
+                    "RUST_SRC_PATH"      ; Rust sources, for racer
+                    "CARGO_HOME"         ; Cargo home, for racer
+                    "GOPATH"
+                    "GPG_TTY"
+                    "GPG_AGENT_INFO"
+                    "SSH_AUTH_SOCK"
+                    "SSH_AGENT_PID"
+                    ))
+       (add-to-list 'exec-path-from-shell-variables var))
+     (exec-path-from-shell-initialize)))
  #+END_SRC
 ** expand-region
  [2014-06-01 Sun 15:16]
@@ -2537,7 +2180,7 @@ Eww - Emacs browser (needs emacs 24.4 or higher)
    :bind ("C-M-+" . er/expand-region)
    :commands er/expand-region)
  #+END_SRC
-** NEXT eyebrowse
+** eyebrowse                                                     :CANCELLED:
 :LOGBOOK:
 - State "NEXT"       from "CANCELLED"  [2017-09-16 Sat 23:06]
 - State "CANCELLED"  from              [2017-08-26 Sat 15:06]
@@ -2548,30 +2191,19 @@ Eww - Emacs browser (needs emacs 24.4 or higher)
  managers like i3wm with their workspaces do. It displays their current
  state in the modeline by default. The behaviour is modeled after
  ranger, a file manager written in Python.
- #+BEGIN_SRC emacs-lisp
+ #+BEGIN_SRC emacs-lisp :tangle no
  (use-package eyebrowse
    :ensure t
    :config
    (progn
-     (validate-setq eyebrowse-mode-line-separator " "
+     (setq eyebrowse-mode-line-separator " "
                     eyebrowse-new-workspace t)
      (eyebrowse-setup-opinionated-keys)
+     (setq eyebrowse-new-workspace t)
      (eyebrowse-mode t)
      ))
  #+END_SRC
 
-** filladapt
- [2013-05-02 Thu 00:04]
- Filladapt by KyleJones enhances Emacs’ fill functions by guessing a
- fill prefix, such as a comment sequence in program code, and handling
- bullet points like “1.” or “*”.
- #+BEGIN_SRC emacs-lisp
- (use-package filladapt
-   :load-path ("elisp/local")
-   :diminish filladapt-mode
-   :init
-   (setq-default filladapt-mode t))
- #+END_SRC
 ** flycheck
  [2013-04-28 So 22:21]
  Flycheck is a on-the-fly syntax checking tool, supposedly better than Flymake.
@@ -2587,10 +2219,10 @@ Eww - Emacs browser (needs emacs 24.4 or higher)
    (progn
      (use-package flycheck-color-mode-line
        :ensure flycheck-color-mode-line)
-     (validate-setq flycheck-highlighting-mode 'nil)
-     (validate-setq flycheck-flake8-maximum-line-length '150)
+     (setq flycheck-highlighting-mode 'nil)
+     (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")
+     (setq flycheck-sh-shellcheck-executable "/usr/bin/shellcheck -e 2086")
      (add-hook 'find-file-hook
            (lambda ()
              (when (not (equal 'emacs-lisp-mode major-mode))
@@ -2606,44 +2238,11 @@ Eww - Emacs browser (needs emacs 24.4 or higher)
    :init
    (progn
      (global-font-lock-mode 1)
-     (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
-** CANCELLED form-feed-mode                                      :CANCELLED:
-CLOSED: [2017-08-26 Sat 15:07]
-:LOGBOOK:
-- State "CANCELLED"  from              [2017-08-26 Sat 15:07]
-:END:
- [2015-08-31 Mon 11:27]
- Display nice lines instead of page breaks
- #+BEGIN_SRC emacs-lisp :tangle no
- (use-package form-feed
-   :ensure t
-   )
- #+END_SRC
-** CANCELLED git commit mode                                     :CANCELLED:
-CLOSED: [2017-08-26 Sat 15:07]
-:LOGBOOK:
-- State "CANCELLED"  from              [2017-08-26 Sat 15:07]
-:END:
- #+BEGIN_SRC emacs-lisp :tangle no
- (use-package git-commit
-   :commands git-commit
-   :mode ("COMMIT_EDITMSG" . git-commit-mode))
- #+END_SRC
-
-** CANCELLED git rebase mode                                     :CANCELLED:
-CLOSED: [2017-08-26 Sat 15:07]
-:LOGBOOK:
-- State "CANCELLED"  from              [2017-08-26 Sat 15:07]
-:END:
- #+BEGIN_SRC emacs-lisp :tangle no
- (use-package git-rebase
-   :commands git-rebase
-   :mode ("git-rebase-todo" . git-rebase-mode))
+     (setq font-lock-maximum-decoration t)
+     (setq jit-lock-defer-time nil)
+     (setq jit-lock-stealth-nice 0.1)
+     (setq jit-lock-stealth-time 0.2)
+     (setq jit-lock-stealth-verbose nil)))
  #+END_SRC
 ** git-gutter+
  [2014-05-21 Wed 22:56]
@@ -2668,7 +2267,7 @@ CLOSED: [2017-08-26 Sat 15:07]
        :ensure git-gutter-fringe+
        :config
        (progn
-         (validate-setq git-gutter-fr+-side 'right-fringe)
+         (setq git-gutter-fr+-side 'right-fringe)
          ;(git-gutter-fr+-minimal)
          ))))
  #+END_SRC
@@ -2685,7 +2284,7 @@ CLOSED: [2017-08-26 Sat 15:07]
    (progn
      (bind-key "m" 'git-messenger:copy-message git-messenger-map)
      (add-hook 'git-messenger:popup-buffer-hook 'magit-revision-mode)
-     (validate-setq git-messenger:show-detail t)))
+     (setq git-messenger:show-detail t)))
  #+END_SRC
 ** git timemachine
  [2014-07-23 Mi 12:57]
@@ -2711,7 +2310,7 @@ CLOSED: [2017-08-26 Sat 15:07]
      (add-hook 'gnus-startup-hook 'bbdb-insinuate-gnus)
 
      (setq bbdb-add-mails t)
-     (setq bbdb-canonicalize-redundant-mails t)
+     (setq bbdb-ignore-redundant-mails t)
      (setq bbdb-complete-mail-allow-cycling t)
      (setq bbdb-complete-name-allow-cycling t)
      (setq bbdb-completion-type 'primary-or-name)
@@ -2742,6 +2341,8 @@ CLOSED: [2017-08-26 Sat 15:07]
      (put 'seen-in 'field-separator "; ")
      (put 'interface 'field-seperator "; ")
      )
+   (use-package counsel-bbdb
+     :ensure t)
    )
  #+END_SRC
 
@@ -2749,532 +2350,427 @@ CLOSED: [2017-08-26 Sat 15:07]
  Most of my gnus config is in an own file, [[file:gnus.org][gnus.org]], here I only have
  what I want every emacs to know.
  #+BEGIN_SRC emacs-lisp
-  (use-package gnus
-    :commands (gnus)
-    :bind (("C-c g" . gnus)
-           :map gnus-summary-mode-map
-           ("<f6>" . jj-forward-spam)
-           ("C-<f1>" . jj-move-mail-spambox)
-           ("C-<f2>" . jj-copy-mail-hambox)
-           ("C-c x" . gnus-scum-expunge)
-           :map gnus-group-mode-map
-           ("GG" . notmuch-search)
-           :map notmuch-show-mode-map
-           ("C-c C-c" . lld-notmuch-goto-message-in-gnus)
+ (use-package gnus
+   :commands (gnus)
+   :bind (("C-c g" . gnus)
+          :map gnus-summary-mode-map
+          ("<f6>" . jj-forward-spam)
+          ("C-<f1>" . jj-move-mail-spambox)
+          ("C-<f2>" . jj-copy-mail-hambox)
+          ("C-c x" . gnus-scum-expunge)
+          :map gnus-group-mode-map
+          ("GG" . notmuch-search)
+          )
+   :init
+   (progn
+     (after 'gnus
+       (jj-init-theme))
+     )
+   :config
+   (progn
+     (bbdb-initialize)
+     ; When emacs exits, gnus does too, no need to ask me
+     (defun exit-gnus-on-exit ()
+       (if (and (fboundp 'gnus-group-exit)
+                (gnus-alive-p))
+           (with-current-buffer (get-buffer "*Group*")
+             (gnus-group-exit))))
+     (add-hook 'kill-emacs-hook 'exit-gnus-on-exit)
+
+     ;; prettier summary buffers
+
+       (setq gnus-sum-thread-tree-indent " ") ;; " "
+       (setq gnus-sum-thread-tree-root "\u229e ") ;; "⊞ "
+       (setq gnus-sum-thread-tree-false-root "\u22a1 ") ;; "⊡ "
+       (setq gnus-sum-thread-tree-single-indent "  ") ;; " "
+       (setq gnus-sum-thread-tree-vertical " \u2502") ;; " │"
+       (setq gnus-sum-thread-tree-leaf-with-other " \u251c\u2500 ") ;; " ├─ "
+       (setq gnus-sum-thread-tree-single-leaf " \u2570\u2500 ") ;; " ╰─ "
+
+     (use-package gnus-cite
+       :config
+       (progn
+         (defface dwa/mail-citation '((((class color)
+                                        (background dark))
+                                       (:background "#383838"))
+                                      (((class color)
+                                        (background light))
+                                       (:background "#efefef")))
+           "Mail citation base face.")
+         (loop for x in gnus-cite-face-list do
+               (set-face-attribute x nil ':inherit 'dwa/mail-citation))))
+
+     (setq message-subscribed-address-functions
+           '(gnus-find-subscribed-addresses))
+
+     (if (string-match (system-name) "delenn.ganneff.de")
+         (progn
+           (setq imap-ssl-program "openssl s_client -no_ssl2 -no_ssl3 -tls1 -connect %s:%p")
+
+           (use-package org-gnus)
+
+           (setq gnus-secondary-select-methods
+                 '((nnml "")
+
+                   (nnimap "nsb"
+                           (nnimap-address "localhost")
+                           (nnimap-user "nsb@auth")
+                           (nnimap-nov-is-evil t)
+                           (nnimap-stream network)
+                           (nnir-search-engine notmuch)
+                           )
+                   (nnimap "gmail"
+                           (nnimap-address "localhost")
+                           (nnimap-user "gmail@auth")
+                           (nnimap-stream network)
+                           (nnimap-nov-is-evil t)
+                           (nnir-search-engine notmuch)
+                           )
+                   ))
+           ;;** Von wo holt Gnus News
+           (setq gnus-select-method '(nnimap "ganneff"
+                                             (nnimap-address "localhost")
+                                             (nnimap-user "ganneff@auth")
+                                             (nnimap-stream network)
+                                             (nnimap-nov-is-evil t)
+                                             (nnir-search-engine notmuch)
+                                             ))
+           ;;** Kopien aller Mails/News speichern
+           (setq gnus-message-archive-group
+                 '((if (message-news-p)
+                       "nnfolder+archive:Sentnews"
+                     "nnimap+ganneff:Sentmail")))
            )
-    :init
-    (progn
-      (after 'gnus
-        (jj-init-theme))
-      )
-    :config
-    (progn
-      (bbdb-initialize)
-      ; When emacs exits, gnus does too, no need to ask me
-      (defun exit-gnus-on-exit ()
-        (if (and (fboundp 'gnus-group-exit)
-                 (gnus-alive-p))
-            (with-current-buffer (get-buffer "*Group*")
-              (gnus-group-exit))))
-      (add-hook 'kill-emacs-hook 'exit-gnus-on-exit)
-    
-      ;; prettier summary buffers
-      
-        (setq gnus-sum-thread-tree-indent " ") ;; " "
-        (setq gnus-sum-thread-tree-root "\u229e ") ;; "⊞ "
-        (setq gnus-sum-thread-tree-false-root "\u22a1 ") ;; "⊡ "
-        (setq gnus-sum-thread-tree-single-indent "  ") ;; " "
-        (setq gnus-sum-thread-tree-vertical " \u2502") ;; " │"
-        (setq gnus-sum-thread-tree-leaf-with-other " \u251c\u2500 ") ;; " ├─ "
-        (setq gnus-sum-thread-tree-single-leaf " \u2570\u2500 ") ;; " ╰─ "
-
-      (use-package gnus-cite
-        :config
-        (progn
-          (defface dwa/mail-citation '((((class color)
-                                         (background dark))
-                                        (:background "#383838"))
-                                       (((class color)
-                                         (background light))
-                                        (:background "#efefef")))
-            "Mail citation base face.")
-          (loop for x in gnus-cite-face-list do
-                (set-face-attribute x nil ':inherit 'dwa/mail-citation))))
-
-      (use-package time-date
-        :config
-        (setq message-citation-line-function 'september-citation-line))
-
-      (setq message-subscribed-address-functions
-            '(gnus-find-subscribed-addresses))
-
-      (if (string-match system-name "delenn.ganneff.de")
-          (progn
-            (setq imap-ssl-program "openssl s_client -no_ssl2 -no_ssl3 -tls1 -connect %s:%p")
-
-            (use-package notmuch
-              :config
-              (setq notmuch-search-oldest-first nil))
-            (use-package org-gnus)
-          
-            (setq gnus-secondary-select-methods
-                  '((nnml "")
-
-                    (nnimap "nsb"
-                            (nnimap-address "localhost")
-                            (nnimap-user "nsb@auth")
-                            (nnimap-nov-is-evil t)
-                            (nnimap-stream network)
-                            (nnir-search-engine notmuch)
-                            )
-                    (nnimap "gmail"
-                            (nnimap-address "localhost")
-                            (nnimap-user "gmail@auth")
-                            (nnimap-stream network)
-                            (nnimap-nov-is-evil t)
-                            (nnir-search-engine notmuch)
-                            )
-                    ))
-            ;;** Von wo holt Gnus News
-            (setq gnus-select-method '(nnimap "ganneff"
-                                              (nnimap-address "localhost")
-                                              (nnimap-user "ganneff@auth")
-                                              (nnimap-stream network)
-                                              (nnimap-nov-is-evil t)
-                                              (nnir-search-engine notmuch)
-                                              ))
-            ;;** Kopien aller Mails/News speichern
-            (setq gnus-message-archive-group
-                  '((if (message-news-p)
-                        "nnfolder+archive:Sentnews"
-                      "nnimap+ganneff:Sentmail")))
-            )
-        )
-      (setq nnir-mail-backend (nth 1 gnus-secondary-select-methods))
-
-      ;;** dont always read the active file.
-      (setq gnus-read-active-file 'some)
-
-      ;;** nnimap nich cachen, ebenso nnml
-      (setq gnus-uncacheable-groups "^\\(nnml\\|nnimap\\)")
-
-      ;;** Bei langsamer Anbindung dies auf t setzen
-      (setq gnus-asynchronous t)
-
-      ;;** Mein Gnus soll regelmaessig nach neuen Mails/News schauen.
-      (gnus-demon-add-handler 'us-get-only-mail 20 10)
-      (gnus-demon-init)
-
-      ;; Set the default value of `mm-discouraged-alternatives'.
-      (eval-after-load "gnus-sum"
-        '(add-to-list
-          'gnus-newsgroup-variables
-          '(mm-discouraged-alternatives
-            . '("text/html" "text/richtext"))))
-
-      ;; Display `text/html' parts in `nnrss' groups only.
-      (add-to-list
-       'gnus-parameters
-       '("\\`nnrss:" (mm-discouraged-alternatives nil)))
-
-      ;;** Message Size Limit
-      (setq message-send-mail-partially-limit 5000000)
-
-      (setq message-send-mail-function 'message-send-mail-with-sendmail)
-      (setq smtpmail-default-smtp-server "localhost")
-      (setq message-sendmail-envelope-from 'header)
-
-      ;;** Keinen Sender Header zufuegen !
-      (add-to-list 'message-syntax-checks '(sender . disabled))
-
-      ;;** Auto-Subscribe
-      (setq gnus-auto-subscribed-groups
-            (concat gnus-auto-subscribed-groups
-                    "\\|^nnimap*"))
-
-      ;;** Kaputte Subjects Aw: Statt Re: fixen:
-      (setq message-subject-re-regexp "^[     ]*\\([RrAaFf][EeWw]:[   ]*\\)*[         ]*")
-
-      ;;** Immer Gruppen nach Topics anzeigen
-      (add-hook 'gnus-group-mode-hook 'gnus-topic-mode)
-
-      ;;** Summary Anzeige umdefinieren.
-      (setq gnus-summary-line-format "%U%R%z (%4k) %uy%* %B%(%[ %-22,22f %]%) %s\n")
-      (setq gnus-summary-gather-subject-limit 'fuzzy)
-
-      ;;** Und die Gruppenanzeige will ich auch anders. Will sehen wann ich zuletzt da reingesehen hab.
-      (setq gnus-group-line-format
-            "%M%S%p%P %4ux/%4i/%6R: %(%-55,55ug%3O%)%l <%2,2~(cut 6)d.%2,2~(cut 4)d.%2,2~(cut 2)d>\n")
-
-      ;;** Different topic lines
-      (setq gnus-topic-line-format "%i[ %u&topic-line; ] %v\n")
-
-      ;;** Für die umdefinierte Gruppenanzeige muss Gnus aber einen Timestamp in der Gruppe speichern.
-      (add-hook 'gnus-select-group-hook 'gnus-group-set-timestamp)
-
-      ;;** Ich will manchmal den Empfänger statt des Absenders sehen
-      (setq gnus-extra-headers '(To Newsgroups Newsgroup Cc))
-      (setq nnmail-extra-headers gnus-extra-headers)
-      (setq gnus-ignored-from-addresses '("\\(\\(\\(joerg\\)\\(\\.jaspert\\)?\\)\\|root\\|gf\\)@\\(debian\\.org\\|ganneff\\.de\\|debconf\\.org\\|spi-inc\\.org\\|nsb-software\\.de\\|dlh\\.de\\)"))
-
-      ;; Don't send to these address in wide reply.
-      (setq message-dont-reply-to-names  (append '("notifications@github\\.com"
-                                                   ".*@noreply\\.github\\.com"
-                                                   )
-                                          gnus-ignored-from-addresses))
-
-      ;;** Threads um 2 Zeichen einruecken.
-      (setq gnus-thread-indent-level 1)
-
-      ;;** Posting Styles. Nettes Feature
-      (setq gnus-posting-styles
-            '(
-              (".*"
-               (from "Joerg Jaspert <joerg@ganneff.de>")) ; Globale Einstellung
-              ("Allgemein.Sabrina"
-               (from "Joerg (悠軻) Jaspert <joerg@debian.org>"))
-              ("Debian.Private"
-               (from "Joerg Jaspert <joerg@debian.org>")
-               (signature-file "~/.signature.private"))
-              ("dlh"
-               (from "Joerg Jaspert <joerg@nsb-software.de>")
-               (signature-file "~/.signature.nsb")
-               (organization "NSB Nguyen Softwareentwicklung & beratung GmbH")
-               (gcc "nnimap+nsb:Sent"))
-              ("nnimap\\+nsb:.*"
-               (from "Joerg Jaspert <joerg@nsb-software.de>")
-               (signature-file "~/.signature.nsb")
-               (organization "NSB Nguyen Softwareentwicklung & beratung GmbH")
-               (gcc "nnimap+nsb:Sent"))
-              ("nnimap\\+nsb:shared.gf.*"
-               (from "Joerg Jaspert <gf@nsb-software.de>"))
-              ("Debian"
-               (from "Joerg Jaspert <joerg@debian.org>"))
-              ("Debian.AM"
-               (Gcc "nnimap+ganneff:Debian.AM"))
-              ("Debian.DAM"
-               (reply-to "Debian Account Managers <da-manager@debian.org>"))
-              ("Debconf"
-               (from "Joerg Jaspert <joerg@debconf.org>"))
-              ("Bugs"
-               (from "Joerg Jaspert <joerg@debian.org>"))
-              ("SPI"
-               (from "Joerg Jaspert <joerg@debian.org>"))
-              ))
-
-
-      ;;** Ich will die Header in den Nachrichten sehen die ich schreibe.
-      (setq message-generate-headers-first t)
-
-      ;;** Und immer schoen Header zufuegen.
-      (setq message-default-headers (concat "Organization: Ganneff\n"))
-      (add-hook 'message-send-hook 'my-message-add-content)
-
-      ;;** Und Courtesy-Mails wollen wir schon mal grad gar nicht
-      (add-hook 'message-header-setup-hook 'my-message-header-setup-hook)
-
-      ;;** Antworten auf meine Nachrichten hervorheben, hochscoren
-      (add-hook 'message-sent-hook 'gnus-score-followup-article)
-      (add-hook 'message-sent-hook 'gnus-score-followup-thread)
-
-      ;;** In Forwards bitte das Subject aufraeumen
-      (setq message-wash-forwarded-subjects t)
-
-      ;;** Zitieren ohne Sig. Ausser Idioten sind zu doof die korrekt abzutrennen.
-      (setq message-cite-function 'message-cite-original-without-signature)
-
-      ;;** Grosse Newsgroups. Gnus fragt da laestigerweise immer nach.
-      ;;** Aber da ich viele grosse Gruppen und nen schnellen Rechner habe
-      ;;** soll der erst recht spaet nachfragen. Erst wenns wirklich fies wird. 
-      (setq gnus-large-newsgroup "15000")
-
-      ;;** Beim Betreten einer Gruppe keinen Artikel auswählen. Gegen Adaptive Scoring iss des !
-      (setq gnus-auto-select-first nil)
-
-      ;;** Wenn ich in einer Gruppe fertig bin soll Gnus nich fragen ob ich in
-      ;;** die naechste will. Es soll einfach tun.
-      (setq gnus-auto-select-next 'quietly)
-
-      ;;** Hervorhebungen (Unterstrichen und Fett bei "_X_" und "*X*")
-      (add-hook 'gnus-article-display-hook 'gnus-article-emphasize t)
-
-      ;;** Gnus Visible Headers
-      (setq gnus-visible-headers
-            '("^From:"
-              "^Newsgroups:"
-              "^Subject:"
-              "^Date:"
-              "^Followup-To:"
-              "^Reply-To:"
-              "^Organization:"
-              "^Summary:"
-              "^Keywords:"
-              "^To:"
-              "^[BGF]?Cc:"
-              "^Posted-To:"
-              "^Mail-Copies-To:"
-              "^Apparently-To:"
-              "^X-Gnus-Warning:"
-              "^Resent-From:"
-              "^Xref:"
-              "^X-Spam-Status:"
-              "^X-Sent:"
-              "^X-Mailer:"
-              "^X-Newsreader:"
-              "^X-User-Agent:"
-              "^User-Agent:"))
-
-      ;;; Order of headers
-      (setq gnus-sorted-header-list '("^From:"
-                                      "^Subject:"
-                                      "^Summary:"
-                                      "^Keywords:"
-                                      "^Newsgroups:"
-                                      "^Followup-To:"
-                                      "^To:"
-                                      "^Cc:"
-                                      "^Date:"
-                                      "^Organization:"
-                                      "^User-Agent:"
-                                      "^X-Mailer:"
-                                      "^X-Newsreader:"))
-
-      ;;** Automagischen Zeilenumbruch bei News/Mailangabe nach 72 Zeichen. SO wies sein soll.
-      (add-hook 'message-mode-hook
-                (lambda ()
-                  (setq fill-column 72)
-                  (turn-on-auto-fill)
-                  (epa-mail-mode 1)
-                  ))
-
-      ;;** Save gnus score files. Ziemlich doof wenn nicht
-      (setq gnus-save-score t)
-
-      ;;** Score Einstellungen. Welches Global File und woher die Scores holen.
-      (setq gnus-global-score-files '("~/News/all.SCORE"))
-      (setq gnus-score-find-score-files-function '(gnus-score-find-bnews bbdb/gnus-score))
-
-      ;;** Adaptives Scoring
-      (setq gnus-use-adaptive-scoring t)
-      (defvar gnus-default-adaptive-score-alist
-        '((gnus-unread-mark)
-          (gnus-ticked-mark (from 5))
-          (gnus-dormant-mark (from 6))
-          (gnus-del-mark (subject -5))
-          (gnus-read-mark (from 5) (subject 3))
-          (gnus-expirable-mark (from -2) (subject -2))
-          (gnus-killed-mark (from -2) (subject -4))
-          (gnus-kill-file-mark)
-          (gnus-ancient-mark)
-          (gnus-low-score-mark)
-          (gnus-catchup-mark (subject -3))
-          ))
-
-      ;;** Damit ich nicht mit Megabytegrossen Scorefiles rummachen muss, muss bei Adaptive-Scoring
-      ;;** der Kram automagisch gelöscht werden. Sonst hats keinen Sinn ! 
-      (setq gnus-decay-scores t)
-
-      ;;** Artikel mit weniger Score werden nicht angezeigt
-      (setq gnus-summary-expunge-below -1000)
-
-      ;;** work around unimplemented handling of multiple similar attachments
-      ;;** (recommended by ShengHuo Zhu Fri 20 Jul 2001 13:14)
-      (setq gnus-mime-display-multipart-related-as-mixed t)
-
-      ;;** Bilderchen direkt anzeigen.
-      (setq mm-inline-large-images t)
-
-      ;;** ueberfluessige Leerzeilen loeschen
-      (setq gnus-treat-strip-trailing-blank-lines t)
-      (setq gnus-treat-strip-leading-blank-lines t)
-
-      ;;** Falsch gebaute Attachments ? Nich mit mir. Nuja, UUE wech. Was solls. Will ich eh nich haben
-      (setq mm-uu-configure-list '((uu . disabled)))
-
-      (use-package message-utils
-        :commands (message-mark-inserted-region message-mark-insert-file message-strip-subject-was message-change-subject message-xpost-fup2 message-add-archive-header message-reduce-to-to-cc)
-        :bind ((:map message-mode-map
-                     ("C-c m" . message-mark-inserted-region)
-                     ("C-c f" . message-mark-insert-file)
-                     ("C-c x" . message-xpost-fup2)
-                     ("C-c s" . message-change-subject)
-                     ("C-c a" . message-add-archive-header)
-                     ("C-c t" . message-reduce-to-to-cc)
-                     )))
-      (add-hook 'message-header-setup-hook 'message-strip-subject-was)
-      (add-hook 'message-setup-hook 'message-utils-setup)
-
-      ;;** Nun das Paket um einfachst Fussnoten eingeben zu können.
-      (use-package footnote
-        :commands (footnote-mode)
-        :config
-        (setq footnote-body-tag-spacing 1
-              footnote-spaced-footnotes nil
-              footnote-style 'numeric-latin
-              footnote-section-tag "Fussnoten: "))
-      (add-hook 'message-mode-hook 'footnote-mode)
-
-      ;;** Meine Smileys mag ich gelb
-      (use-package smiley
-        :init
-        (progn
-          (setq gnus-treat-display-smileys t)
-          (setq smiley-flesh-color "Yellow")
-          (setq smiley-data-directory "~/emacs/etc/smilies/")))
-
-      (use-package mml-sec
-        :commands (sign-or-crypt)
-        :config
-        (progn
-          (setq mm-verify-option 'always)
-          ;; Keine extra Signatur erzeugen.
-          (mml-signencrypt-style "pgpmime" 'combined)
-          (setq mml-secure-openpgp-sign-with-sender 't)
-          (setq gpg-unabbrev-trust-alist
-                '(("TRUST_UNDEFINED" . trust-undefined)
-                  ("TRUST_NEVER"     . trust-none)
-                  ("TRUST_MARGINAL"  . trust-marginal)
-                  ("TRUST_FULLY"     . trust-full)
-                  ("TRUST_ULTIMATE"  . trust-ultimate)))
-          ))
-      (add-hook 'gnus-message-setup-hook 'sign-or-crypt)
-
-      ;;** utf-8, coding systems
-      (setq mm-coding-system-priorities
-            '(iso-latin-1 iso-latin-9 utf-8))
-
-      (unify-8859-on-encoding-mode 1)
-      (unify-8859-on-decoding-mode 1)
-      (prefer-coding-system 'latin-9)
-      (prefer-coding-system 'latin-1)
-      (prefer-coding-system 'utf-8)
-
-      ;;** org-mode
-      (add-hook 'message-mode-hook 'orgstruct++-mode 'append)
-      (add-hook 'message-mode-hook 'orgtbl-mode 'append)
-
-      (use-package message-x
-        :ensure t)
-
-      (use-package randomsig
-        :bind ((:map message-mode-map
-                ("C-c s" . randomsig-replace-sig)
-                ("C-c S" . randomsig-select-sig)
-                :map gnus-summary-save-map
-                ("-" 'gnus/randomsig-summary-read-sig)
-                ))
-        :config
-        (progn
-          (setq randomsig-dir "/home/joerg/sigs")
-          (setq message-signature 'randomsig-signature)))
-    
-      (use-package sieve
-        :mode ("\\.siv\\'" . sieve-mode)
-        :config
-        (require 'gnus-sieve)
-      )
-
-      (setq gnus-use-correct-string-widths nil)
-
-      (setq nnrss-wash-html-in-text-plain-parts t)
-      (setq canlock-password "canlockjjaspert")
-      (setq canlock-sha1-function (quote canlock-sha1-with-openssl))
-      (setq canlock-sha1-function-for-verify (quote canlock-sha1-with-openssl))
-      (setq gnus-agent nil)
-      (setq gnus-article-banner-alist (quote ((banner-perl . "^--.?
-  .+
-  .+
-  .+
-  .+
-  .+
-  Die Nutzung von.+html") (banner-debian . "^--.?
-  To UNSUBSCRIBE.*
-  .*@lists.debian.org$") (banner-debian-de . "^--.?
-  -+
-  Um sich aus der Liste auszutragen.+
-  .+
-  .+
-  .+
-  -+$\\|[0-9]+ eingetragene Mitglieder in dieser Liste.") (banner-sourceforge . "^_+
-  .+@lists.sourceforge.net
-  http://lists.sourceforge.net.+
-  .+
-  $") (banner-amavis . "^_+
-  .+AMaViS-.*
-  .*
-  .*
-  .*amavis-faq.php3$"))))
-      (setq gnus-article-sort-functions (quote (gnus-article-sort-by-number gnus-article-sort-by-score gnus-article-sort-by-date)))
-      (setq gnus-article-x-face-command (quote gnus-display-x-face-in-from))
-      (setq gnus-boring-article-headers (quote (empty newsgroups followup-to reply-to)))
-      (setq gnus-build-sparse-threads nil)
-      (setq gnus-buttonized-mime-types '("multipart/signed"))
-      (setq
-       ;; collaps long citations
-       ;; (w/ `gnus-treat-hide-citation t' or `W W c'):
-       gnus-cited-closed-text-button-line-format
-       "%(%{... [ %n lines (%l chars) of citation hidden, click here to expand ] ...%}%)\n"
-       gnus-cited-lines-visible '(3 . 6) ; (top . bottom)
-       ;; [...]
-       gnus-treat-hide-citation t)
-
-      (setq gnus-default-article-saver (quote gnus-summary-save-in-file))
-                                          ; (setq gnus-default-charset (quote iso-8859-1))
-      (setq gnus-generate-tree-function (quote gnus-generate-vertical-tree))
-      (setq gnus-group-charset-alist (quote (("\\(^\\|:\\)hk\\>\\|\\(^\\|:\\)tw\\>\\|\\<big5\\>" cn-big5) ("\\(^\\|:\\)cn\\>\\|\\<chinese\\>" cn-gb-2312) ("\\(^\\|:\\)fj\\>\\|\\(^\\|:\\)japan\\>" iso-2022-jp-2) ("\\(^\\|:\\)tnn\\>\\|\\(^\\|:\\)pin\\>\\|\\(^\\|:\\)sci.lang.japan" iso-2022-7bit) ("\\(^\\|:\\)relcom\\>" koi8-r) ("\\(^\\|:\\)fido7\\>" koi8-r) ("\\(^\\|:\\)\\(cz\\|hun\\|pl\\|sk\\|hr\\)\\>" iso-8859-2) ("\\(^\\|:\\)israel\\>" iso-8859-1) ("\\(^\\|:\\)han\\>" euc-kr) ("\\(^\\|:\\)alt.chinese.text.big5\\>" chinese-big5) ("\\(^\\|:\\)soc.culture.vietnamese\\>" vietnamese-viqr) ("\\(^\\|:\\)\\(comp\\|rec\\|alt\\|sci\\|soc\\|news\\|gnu\\|bofh\\)\\>" iso-8859-1))))
-      (setq gnus-group-name-charset-group-alist (quote ((".*" . iso-8859-1))))
-      (setq gnus-group-name-charset-method-alist (quote ((nntp . iso-8859-1))))
-      (setq gnus-group-posting-charset-alist (quote (("^\\(no\\|fr\\)\\.[^,]*\\(,[
-  ]*\\(no\\|fr\\)\\.[^,]*\\)*$" iso-8859-1 (iso-8859-1)) ("^\\(fido7\\|relcom\\)\\.[^,]*\\(,[
-  ]*\\(fido7\\|relcom\\)\\.[^,]*\\)*$" koi8-r (koi8-r)) (message-this-is-mail nil nil) (message-this-is-news nil t))))(setq gnus-gcc-mark-as-read t)
-      (setq gnus-list-identifiers "\\[\\(a-zA-Z\\)+\\]")
-      (setq gnus-message-replyencrypt nil)
-      (setq gnus-message-replysign nil)
-      (setq gnus-novice-user nil)
-      (setq gnus-refer-thread-limit t)
-      (setq gnus-save-duplicate-list t)
-      (setq gnus-simplify-ignored-prefixes nil)
-      (setq gnus-summary-exit-hook (quote (gnus-summary-bubble-group)))
-      (setq gnus-summary-mode-line-format "Gnus: %g [%A] %Z - killed: %E")
-      (setq gnus-suppress-duplicates t)
-      (setq gnus-thread-indent-level 2)
-      (setq gnus-thread-sort-functions (quote (gnus-thread-sort-by-number gnus-thread-sort-by-score gnus-thread-sort-by-date)))
-      (setq gnus-treat-capitalize-sentences nil)
-      (setq gnus-treat-date-local (quote head))
-      (setq gnus-treat-display-picons nil)
-      (setq gnus-treat-display-xface (quote head))
-      (setq gnus-treat-fill-article nil)
-      (setq gnus-treat-fill-long-lines nil)
-      (setq gnus-treat-from-picon (quote head))
-      (setq gnus-treat-mail-picon (quote head))
-      (setq gnus-treat-newsgroups-picon (quote head))
-      (setq gnus-treat-strip-pgp (quote head))
-      (setq gnus-treat-unsplit-urls t)
-      (setq gnus-treat-x-pgp-sig (quote head))
-      (setq gnus-use-picons t)
-      (setq gnus-uu-post-encode-method (quote gnus-uu-post-encode-mime))
-      (setq message-archive-note "X-No-Archive: Yes")
-                                          ;(setq message-default-charset (quote iso-8859-1))
-      (setq message-make-forward-subject-function (quote message-forward-subject-fwd))
-      (setq message-max-buffers 5)
-      (setq message-send-hook (quote (my-message-add-content)))
-      (setq message-subscribed-regexps (quote (".*@lists.*" ".*@postfix.org" ".*@nongnu.org")))
-      (setq message-use-followup-to (quote use))
-      (setq mm-automatic-display (quote ("text/plain" "text/enriched" "text/richtext" "image/jpeg" "text/x-vcard" "image/pjepg" "image/.*" "message/delivery-status" "multipart/.*" "message/rfc822" "text/x-patch" "application/pgp-signature" "application/emacs-lisp" "application/x-pkcs7-signature" "application/pkcs7-signature" "application/x-pkcs7-mime" "application/pkcs7-mime" "application/pgp")))
-      (setq mm-body-charset-encoding-alist (quote ((iso-2022-jp . 7bit) (iso-2022-jp-2 . 7bit) (iso-8859-1 . 8bit) (iso-8859-15 . 8bit))))
-      (setq mm-decrypt-option (quote known))
-      (setq mm-inlined-types (quote ("image/jpeg" "image/.*" "text/.*" "message/delivery-status" "message/rfc822" "message/partial" "message/external-body" "application/emacs-lisp" "application/x-emacs-lisp" "application/pgp-signature" "application/x-pkcs7-signature" "application/pkcs7-signature" "application/x-pkcs7-mime" "application/pkcs7-mime" "application/pgp")))
-      (setq mm-verify-option (quote always))
-      (setq nnimap-authinfo-file "~/.nnimap")
-      (setq gnus-save-newsrc-file nil)
-      (setq gnus-read-newsrc-file nil)
-      (setq gnus-always-read-dribble-file t)
-
-      (setq gnus-refer-article-method
-            '(current
-              (nnweb "refer" (nnweb-type dejanews))))
+       )
+     (setq nnir-mail-backend (nth 1 gnus-secondary-select-methods))
+
+     ;;** dont always read the active file.
+     (setq gnus-read-active-file 'some)
+
+     ;;** nnimap nich cachen, ebenso nnml
+     (setq gnus-uncacheable-groups "^\\(nnml\\|nnimap\\)")
+
+     ;;** Bei langsamer Anbindung dies auf t setzen
+     (setq gnus-asynchronous t)
+
+     ;;** Mein Gnus soll regelmaessig nach neuen Mails/News schauen.
+     (gnus-demon-add-handler 'us-get-only-mail 20 10)
+     (gnus-demon-init)
+
+     ;; Set the default value of `mm-discouraged-alternatives'.
+     (eval-after-load "gnus-sum"
+       '(add-to-list
+         'gnus-newsgroup-variables
+         '(mm-discouraged-alternatives
+           . '("text/html" "text/richtext"))))
+
+     ;; Display `text/html' parts in `nnrss' groups only.
+     (add-to-list
+      'gnus-parameters
+      '("\\`nnrss:" (mm-discouraged-alternatives nil)))
+
+     ;;** Auto-Subscribe
+     (setq gnus-auto-subscribed-groups
+           (concat gnus-auto-subscribed-groups
+                   "\\|^nnimap*"))
+
+     ;;** Immer Gruppen nach Topics anzeigen
+     (add-hook 'gnus-group-mode-hook 'gnus-topic-mode)
+
+     ;;** Summary Anzeige umdefinieren.
+     (setq gnus-summary-line-format "%U%R%z (%4k) %uy%* %B%(%[ %-22,22f %]%) %s\n")
+     (setq gnus-summary-gather-subject-limit 'fuzzy)
+
+     ;;** Und die Gruppenanzeige will ich auch anders. Will sehen wann ich zuletzt da reingesehen hab.
+     (setq gnus-group-line-format
+           "%M%S%p%P %4ux/%4i/%6R: %(%-55,55ug%3O%)%l <%2,2~(cut 6)d.%2,2~(cut 4)d.%2,2~(cut 2)d>\n")
+
+     ;;** Different topic lines
+     (setq gnus-topic-line-format "%i[ %u&topic-line; ] %v\n")
+
+     ;;** Für die umdefinierte Gruppenanzeige muss Gnus aber einen Timestamp in der Gruppe speichern.
+     (add-hook 'gnus-select-group-hook 'gnus-group-set-timestamp)
+
+     ;;** Ich will manchmal den Empfänger statt des Absenders sehen
+     (setq gnus-extra-headers '(To Newsgroups Newsgroup Cc))
+     (setq nnmail-extra-headers gnus-extra-headers)
+     (setq gnus-ignored-from-addresses '("\\(\\(\\(joerg\\)\\(\\.jaspert\\)?\\)\\|root\\|gf\\)@\\(debian\\.org\\|ganneff\\.de\\|debconf\\.org\\|spi-inc\\.org\\|nsb-software\\.de\\|dlh\\.de\\)"))
+
+     ;; Don't send to these address in wide reply.
+     (setq message-dont-reply-to-names  (append '("notifications@github\\.com"
+                                                  ".*@noreply\\.github\\.com"
+                                                  )
+                                         gnus-ignored-from-addresses))
+
+     ;;** Threads um 2 Zeichen einruecken.
+     (setq gnus-thread-indent-level 1)
+
+     ;;** Posting Styles. Nettes Feature
+     (setq gnus-posting-styles
+           '(
+             (".*"
+              (from "Joerg Jaspert <joerg@ganneff.de>")) ; Globale Einstellung
+             ("Allgemein.Sabrina"
+              (from "Joerg (悠軻) Jaspert <joerg@debian.org>"))
+             ("Debian.Private"
+              (from "Joerg Jaspert <joerg@debian.org>")
+              (signature-file "~/.signature.private"))
+             ("dlh"
+              (from "Joerg Jaspert <joerg@nsb-software.de>")
+              (signature-file "~/.signature.nsb")
+              (organization "NSB Nguyen Softwareentwicklung & beratung GmbH")
+              (gcc "nnimap+nsb:Sent"))
+             ("nnimap\\+nsb:.*"
+              (from "Joerg Jaspert <joerg@nsb-software.de>")
+              (signature-file "~/.signature.nsb")
+              (organization "NSB Nguyen Softwareentwicklung & beratung GmbH")
+              (gcc "nnimap+nsb:Sent"))
+             ("nnimap\\+nsb:shared.gf.*"
+              (from "Joerg Jaspert <gf@nsb-software.de>"))
+             ("Debian"
+              (from "Joerg Jaspert <joerg@debian.org>"))
+             ("Debian.AM"
+              (Gcc "nnimap+ganneff:Debian.AM"))
+             ("Debian.DAM"
+              (reply-to "Debian Account Managers <da-manager@debian.org>"))
+             ("Debconf"
+              (from "Joerg Jaspert <joerg@debconf.org>"))
+             ("Bugs"
+              (from "Joerg Jaspert <joerg@debian.org>"))
+             ("SPI"
+              (from "Joerg Jaspert <joerg@debian.org>"))
+             ))
+
+
+     ;;** Antworten auf meine Nachrichten hervorheben, hochscoren
+     (add-hook 'message-sent-hook 'gnus-score-followup-article)
+     (add-hook 'message-sent-hook 'gnus-score-followup-thread)
+
+     ;;** Grosse Newsgroups. Gnus fragt da laestigerweise immer nach.
+     ;;** Aber da ich viele grosse Gruppen und nen schnellen Rechner habe
+     ;;** soll der erst recht spaet nachfragen. Erst wenns wirklich fies wird.
+     (setq gnus-large-newsgroup "15000")
+
+     ;;** Beim Betreten einer Gruppe keinen Artikel auswählen. Gegen Adaptive Scoring iss des !
+     (setq gnus-auto-select-first nil)
+
+     ;;** Wenn ich in einer Gruppe fertig bin soll Gnus nich fragen ob ich in
+     ;;** die naechste will. Es soll einfach tun.
+     (setq gnus-auto-select-next 'quietly)
+
+     ;;** Hervorhebungen (Unterstrichen und Fett bei "_X_" und "*X*")
+     (add-hook 'gnus-article-display-hook 'gnus-article-emphasize t)
+
+     ;;** Gnus Visible Headers
+     (setq gnus-visible-headers
+           '("^From:"
+             "^Newsgroups:"
+             "^Subject:"
+             "^Date:"
+             "^Followup-To:"
+             "^Mail-Followup-To:"
+             "^Reply-To:"
+             "^Organization:"
+             "^Summary:"
+             "^Keywords:"
+             "^To:"
+             "^[BGF]?Cc:"
+             "^Posted-To:"
+             "^Mail-Copies-To:"
+             "^Apparently-To:"
+             "^X-Gnus-Warning:"
+             "^Resent-From:"
+             "^Xref:"
+             "^X-Spam-Status:"
+             "^X-Sent:"
+             "^X-Mailer:"
+             "^X-Newsreader:"
+             "^X-User-Agent:"
+             "^User-Agent:"))
+
+     ;;; Order of headers
+     (setq gnus-sorted-header-list '("^From:"
+                                     "^Subject:"
+                                     "^Summary:"
+                                     "^Keywords:"
+                                     "^Newsgroups:"
+                                     "^Followup-To:"
+                                     "^To:"
+                                     "^Cc:"
+                                     "^Date:"
+                                     "^Organization:"
+                                     "^User-Agent:"
+                                     "^X-Mailer:"
+                                     "^X-Newsreader:"))
+
+     ;;** Save gnus score files. Ziemlich doof wenn nicht
+     (setq gnus-save-score t)
+
+     ;;** Score Einstellungen. Welches Global File und woher die Scores holen.
+     (setq gnus-global-score-files '("~/News/all.SCORE"))
+     (setq gnus-score-find-score-files-function '(gnus-score-find-bnews bbdb/gnus-score))
+
+     ;;** Adaptives Scoring
+     (setq gnus-use-adaptive-scoring t)
+     (defvar gnus-default-adaptive-score-alist
+       '((gnus-unread-mark)
+         (gnus-ticked-mark (from 5))
+         (gnus-dormant-mark (from 6))
+         (gnus-del-mark (subject -5))
+         (gnus-read-mark (from 5) (subject 3))
+         (gnus-expirable-mark (from -2) (subject -2))
+         (gnus-killed-mark (from -2) (subject -4))
+         (gnus-kill-file-mark)
+         (gnus-ancient-mark)
+         (gnus-low-score-mark)
+         (gnus-catchup-mark (subject -3))
+         ))
 
-      ))
+     ;;** Damit ich nicht mit Megabytegrossen Scorefiles rummachen muss, muss bei Adaptive-Scoring
+     ;;** der Kram automagisch gelöscht werden. Sonst hats keinen Sinn !
+     (setq gnus-decay-scores t)
+
+     ;;** Artikel mit weniger Score werden nicht angezeigt
+     (setq gnus-summary-expunge-below -1000)
+
+     ;;** work around unimplemented handling of multiple similar attachments
+     ;;** (recommended by ShengHuo Zhu Fri 20 Jul 2001 13:14)
+     (setq gnus-mime-display-multipart-related-as-mixed t)
+
+     ;;** Bilderchen direkt anzeigen.
+     (setq mm-inline-large-images t)
+
+     ;;** ueberfluessige Leerzeilen loeschen
+     (setq gnus-treat-strip-trailing-blank-lines t)
+     (setq gnus-treat-strip-leading-blank-lines t)
+
+     ;;** Falsch gebaute Attachments ? Nich mit mir. Nuja, UUE wech. Was solls. Will ich eh nich haben
+     (setq mm-uu-configure-list '((uu . disabled)))
+
+     ;; (use-package message-utils
+     ;;   :commands (message-mark-inserted-region message-mark-insert-file message-strip-subject-was message-change-subject message-xpost-fup2 message-add-archive-header message-reduce-to-to-cc)
+     ;;   :bind ((:map message-mode-map
+     ;;                ("C-c m" . message-mark-inserted-region)
+     ;;                ("C-c f" . message-mark-insert-file)
+     ;;                ("C-c x" . message-xpost-fup2)
+     ;;                ("C-c s" . message-change-subject)
+     ;;                ("C-c a" . message-add-archive-header)
+     ;;                ("C-c t" . message-reduce-to-to-cc)
+     ;;                )))
+     ;(add-hook 'message-header-setup-hook 'message-strip-subject-was)
+     ;(add-hook 'message-setup-hook 'message-utils-setup)
+
+     ;;** Meine Smileys mag ich gelb
+     (use-package smiley
+       :init
+       (progn
+         (setq gnus-treat-display-smileys t)
+         (setq smiley-flesh-color "Yellow")
+         (setq smiley-data-directory "~/emacs/etc/smilies/")))
+
+     ;;** utf-8, coding systems
+     (setq mm-coding-system-priorities
+           '(iso-latin-1 iso-latin-9 utf-8))
+
+     (use-package sieve
+       :mode ("\\.siv\\'" . sieve-mode)
+       :config
+       (require 'gnus-sieve)
+     )
+
+     (setq gnus-use-correct-string-widths nil)
+
+     (setq nnrss-wash-html-in-text-plain-parts t)
+     (setq canlock-password "canlockjjaspert")
+     (setq canlock-sha1-function (quote canlock-sha1-with-openssl))
+     (setq canlock-sha1-function-for-verify (quote canlock-sha1-with-openssl))
+     (setq gnus-agent nil)
+     (setq gnus-article-banner-alist (quote ((banner-perl . "^--.?
+ .+
+ .+
+ .+
+ .+
+ .+
+ Die Nutzung von.+html") (banner-debian . "^--.?
+ To UNSUBSCRIBE.*
+ .*@lists.debian.org$") (banner-debian-de . "^--.?
+ -+
+ Um sich aus der Liste auszutragen.+
+ .+
+ .+
+ .+
+ -+$\\|[0-9]+ eingetragene Mitglieder in dieser Liste.") (banner-sourceforge . "^_+
+ .+@lists.sourceforge.net
+ http://lists.sourceforge.net.+
+ .+
+ $") (banner-amavis . "^_+
+ .+AMaViS-.*
+ .*
+ .*
+ .*amavis-faq.php3$"))))
+     (setq gnus-article-sort-functions (quote (gnus-article-sort-by-number gnus-article-sort-by-score gnus-article-sort-by-date)))
+     (setq gnus-article-x-face-command (quote gnus-display-x-face-in-from))
+     (setq gnus-boring-article-headers (quote (empty newsgroups followup-to reply-to)))
+     (setq gnus-build-sparse-threads nil)
+     (setq gnus-buttonized-mime-types '("multipart/signed"))
+     (setq
+      ;; collaps long citations
+      ;; (w/ `gnus-treat-hide-citation t' or `W W c'):
+      gnus-cited-closed-text-button-line-format
+      "%(%{... [ %n lines (%l chars) of citation hidden, click here to expand ] ...%}%)\n"
+      gnus-cited-lines-visible '(3 . 6) ; (top . bottom)
+      ;; [...]
+      gnus-treat-hide-citation t)
+
+     (setq gnus-default-article-saver (quote gnus-summary-save-in-file))
+                                         ; (setq gnus-default-charset (quote iso-8859-1))
+     (setq gnus-generate-tree-function (quote gnus-generate-vertical-tree))
+     (setq gnus-group-charset-alist (quote (("\\(^\\|:\\)hk\\>\\|\\(^\\|:\\)tw\\>\\|\\<big5\\>" cn-big5) ("\\(^\\|:\\)cn\\>\\|\\<chinese\\>" cn-gb-2312) ("\\(^\\|:\\)fj\\>\\|\\(^\\|:\\)japan\\>" iso-2022-jp-2) ("\\(^\\|:\\)tnn\\>\\|\\(^\\|:\\)pin\\>\\|\\(^\\|:\\)sci.lang.japan" iso-2022-7bit) ("\\(^\\|:\\)relcom\\>" koi8-r) ("\\(^\\|:\\)fido7\\>" koi8-r) ("\\(^\\|:\\)\\(cz\\|hun\\|pl\\|sk\\|hr\\)\\>" iso-8859-2) ("\\(^\\|:\\)israel\\>" iso-8859-1) ("\\(^\\|:\\)han\\>" euc-kr) ("\\(^\\|:\\)alt.chinese.text.big5\\>" chinese-big5) ("\\(^\\|:\\)soc.culture.vietnamese\\>" vietnamese-viqr) ("\\(^\\|:\\)\\(comp\\|rec\\|alt\\|sci\\|soc\\|news\\|gnu\\|bofh\\)\\>" iso-8859-1))))
+     (setq gnus-group-name-charset-group-alist (quote ((".*" . iso-8859-1))))
+     (setq gnus-group-name-charset-method-alist (quote ((nntp . iso-8859-1))))
+     (setq gnus-group-posting-charset-alist (quote (("^\\(no\\|fr\\)\\.[^,]*\\(,[
+ ]*\\(no\\|fr\\)\\.[^,]*\\)*$" iso-8859-1 (iso-8859-1)) ("^\\(fido7\\|relcom\\)\\.[^,]*\\(,[
+ ]*\\(fido7\\|relcom\\)\\.[^,]*\\)*$" koi8-r (koi8-r)) (message-this-is-mail nil nil) (message-this-is-news nil t))))(setq gnus-gcc-mark-as-read t)
+     (setq gnus-list-identifiers "\\[\\(a-zA-Z\\)+\\]")
+     (setq gnus-message-replyencrypt nil)
+     (setq gnus-message-replysign nil)
+     (setq gnus-novice-user nil)
+     (setq gnus-refer-thread-limit t)
+     (setq gnus-save-duplicate-list t)
+     (setq gnus-simplify-ignored-prefixes nil)
+     (setq gnus-summary-exit-hook (quote (gnus-summary-bubble-group)))
+     (setq gnus-summary-mode-line-format "Gnus: %g [%A] %Z - killed: %E")
+     (setq gnus-suppress-duplicates t)
+     (setq gnus-thread-indent-level 2)
+     (setq gnus-thread-sort-functions (quote (gnus-thread-sort-by-number gnus-thread-sort-by-score gnus-thread-sort-by-date)))
+     (setq gnus-treat-capitalize-sentences nil)
+     (setq gnus-treat-date-local (quote head))
+     (setq gnus-treat-display-picons nil)
+     (setq gnus-treat-display-x-face (quote head))
+     (setq gnus-treat-fill-article nil)
+     (setq gnus-treat-fill-long-lines nil)
+     (setq gnus-treat-from-picon (quote head))
+     (setq gnus-treat-mail-picon (quote head))
+     (setq gnus-treat-newsgroups-picon (quote head))
+     (setq gnus-treat-unsplit-urls t)
+     (setq gnus-treat-x-pgp-sig (quote head))
+     (setq gnus-use-picons t)
+     (setq gnus-uu-post-encode-method (quote gnus-uu-post-encode-mime))
+     (setq mm-automatic-display (quote ("text/plain" "text/enriched" "text/richtext" "image/jpeg" "text/x-vcard" "image/pjepg" "image/.*" "message/delivery-status" "multipart/.*" "message/rfc822" "text/x-patch" "application/pgp-signature" "application/emacs-lisp" "application/x-pkcs7-signature" "application/pkcs7-signature" "application/x-pkcs7-mime" "application/pkcs7-mime" "application/pgp")))
+     (setq mm-body-charset-encoding-alist (quote ((iso-2022-jp . 7bit) (iso-2022-jp-2 . 7bit) (iso-8859-1 . 8bit) (iso-8859-15 . 8bit))))
+     (setq mm-decrypt-option (quote known))
+     (setq mm-inlined-types (quote ("image/jpeg" "image/.*" "text/.*" "message/delivery-status" "message/rfc822" "message/partial" "message/external-body" "application/emacs-lisp" "application/x-emacs-lisp" "application/pgp-signature" "application/x-pkcs7-signature" "application/pkcs7-signature" "application/x-pkcs7-mime" "application/pkcs7-mime" "application/pgp")))
+     (setq mm-verify-option (quote always))
+     (setq nnimap-authinfo-file "~/.nnimap")
+     (setq gnus-save-newsrc-file nil)
+     (setq gnus-read-newsrc-file nil)
+     (setq gnus-always-read-dribble-file t)
+
+     (setq gnus-refer-article-method
+           '(current
+             (nnweb "refer" (nnweb-type dejanews))))
+
+     ))
 
  #+END_SRC
 ** go-mode
@@ -3327,15 +2823,45 @@ CLOSED: [2017-08-26 Sat 15:07]
  #+BEGIN_SRC emacs-lisp
  (use-package golden-ratio
    :ensure golden-ratio
-   :diminish golden-ratio-mode
+   :diminish (golden-ratio-mode . "ⓖ")
+   :commands (golden-ratio-mode golden-ratio)
+   :bind (("C-c t g" . my-toggle-golden-ratio))
    :init
    (progn
+     (defun my-toggle-golden-ratio ()
+       (interactive)
+       (if (bound-and-true-p golden-ratio-mode)
+           (progn
+             (golden-ratio-mode -1)
+             (balance-windows))
+         (golden-ratio-mode)
+         (golden-ratio)))
      (golden-ratio-mode 1)
-     (validate-setq golden-ratio-exclude-buffer-names '("*LV*" "*guide-key*" "*Ediff Control Panel*"))
-     (validate-setq golden-ratio-exclude-modes '("calendar-mode" "gnus-summary-mode"
-                                        "gnus-article-mode" "calc-mode" "calc-trail-mode"
-                                        "bbdb-mode"))
-     ))
+     )
+   :config
+   (progn
+     (setq golden-ratio-exclude-buffer-names '("*LV*" "*guide-key*" "*Ediff Control Panel*"))
+     (setq golden-ratio-exclude-modes '("calendar-mode"
+                                        "gnus-summary-mode"
+                                        "gnus-article-mode"
+                                        "calc-mode"
+                                        "calc-trail-mode"
+                                        "bbdb-mode"
+                                        "notmuch-message-mode"
+                                        "dired-mode"
+                                        "ediff-mode"
+                                        ))
+     (setq golden-ratio-exclude-buffer-regexp `(,(rx bos "*which-key*" eos)
+                                                ,(rx bos "*NeoTree*" eos)))
+     (setq golden-ratio-extra-commands '(windmove-up
+                                         windmove-down
+                                         windmove-left
+                                         windmove-right
+                                         ace-window
+                                         ace-delete-window
+                                         ace-select-window
+                                         ace-swap-window
+                                         ace-maximize-window))))
  #+END_SRC
 ** goto last change
  [2015-02-22 Sun 13:28]
@@ -3346,7 +2872,12 @@ CLOSED: [2017-08-26 Sat 15:07]
    :bind (("M-g l" . goto-last-change))
    )
  #+END_SRC
-** guide-key
+** CANCELLED guide-key                                           :CANCELLED:
+CLOSED: [2018-12-30 Sun 17:09]
+:LOGBOOK:
+- State "CANCELLED"  from              [2018-12-30 Sun 17:09] \\
+  ersetzt von which-key
+:END:
  [2014-06-11 Wed 22:27]
  guide-key.el displays the available key bindings automatically and
  dynamically.
@@ -3357,20 +2888,21 @@ CLOSED: [2017-08-26 Sat 15:07]
  (use-package guide-key
    :ensure guide-key
    :diminish guide-key-mode
+   :disable t
    :config
    (progn
-     (validate-setq guide-key/guide-key-sequence '("C-x" "C-c" "M-g" "M-s"))
+     (setq guide-key/guide-key-sequence '("C-x" "C-c" "M-g" "M-s"))
      (guide-key-mode 1)
-     (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)))
+     (setq guide-key/recursive-key-sequence-flag t)
+     (setq guide-key/popup-window-position 'bottom)
+     (setq guide-key/idle-delay 0.5)))
 
  #+END_SRC
 
 ** highlighting modes
  [2014-05-21 Wed 23:51]
  #+BEGIN_SRC emacs-lisp
-(use-package hi-lock
+ (use-package hi-lock
    :bind (("M-o l" . highlight-lines-matching-regexp)
           ("M-o r" . highlight-regexp)
           ("M-o w" . highlight-phrase)
@@ -3389,6 +2921,12 @@ CLOSED: [2017-08-26 Sat 15:07]
    (set-face-background 'highlight-indentation-face "#283d83")
    (set-face-background 'highlight-indentation-current-column-face "#285f85")
    )
+
+ (use-package highlight-numbers          ; Fontify number literals
+   :ensure t
+   :init (add-hook 'prog-mode-hook #'highlight-numbers-mode))
+ :defer t
+
  #+END_SRC
 ** hippie-exp
  Crazy way of completion. It looks at the word before point and then
@@ -3399,7 +2937,7 @@ CLOSED: [2017-08-26 Sat 15:07]
    :commands hippie-expand
    :config
    (progn
-     (validate-setq hippie-expand-try-functions-list '(try-expand-dabbrev
+     (setq hippie-expand-try-functions-list '(try-expand-dabbrev
                                               try-expand-dabbrev-all-buffers
                                               try-expand-dabbrev-from-kill
                                               try-complete-file-name-partially
@@ -3409,20 +2947,6 @@ CLOSED: [2017-08-26 Sat 15:07]
                                               try-complete-lisp-symbol-partially
                                               try-complete-lisp-symbol))))
  #+END_SRC
-** CANCELLED html-helper                                         :CANCELLED:
-CLOSED: [2017-08-26 Sat 15:09]
-:LOGBOOK:
-- State "CANCELLED"  from              [2017-08-26 Sat 15:09]
-:END:
- Replaced by web-mode [[*web-mode][web-mode]]
- #+BEGIN_SRC emacs-lisp :tangle no
- (autoload 'html-helper-mode "html-helper-mode" "Yay HTML" t)
- (add-auto-mode 'html-helper-mode "\\.html$")
- (add-auto-mode 'html-helper-mode "\\.asp$")
- (add-auto-mode 'html-helper-mode "\\.phtml$")
- (add-auto-mode 'html-helper-mode "\\.(jsp|tmpl)\\'")
- (defalias 'html-mode 'html-helper-mode)
- #+END_SRC
 ** hydra
  [2015-01-26 Mon 15:50]
  This is a package for GNU Emacs that can be used to tie related
@@ -3443,8 +2967,8 @@ CLOSED: [2017-08-26 Sat 15:09]
    :ensure hydra
    :init
    (progn
-     (validate-setq hydra-is-helpful t)
-     (validate-setq hydra-lv t)
+     (setq hydra-is-helpful t)
+     (setq hydra-lv t)
 
      (defhydra hydra-error (:color red)
        "goto-error"
@@ -3455,18 +2979,18 @@ CLOSED: [2017-08-26 Sat 15:09]
        ("q" nil "quit"))
      (bind-key "M-g e" 'hydra-error/body)
 
-     (defhydra hydra-gnus (:color red)
-       "gnus functions"
-       ("m" gnus-uu-mark-thread "mark thread")
-       ("d" gnus-summary-delete-article "delete article(s)")
-       ("r" gnus-summary-mark-as-read-forward "mark read")
-       ("n" gnus-summary-next-thread "next thread")
-       ("p" gnus-summary-prev-thread "previous thread")
-       ("g" gnus-summary-next-group "next group")
-       ("l" gnus-recenter "recenter")
-       ("x" gnus-summary-limit-to-unread "unread")
-       ("q" nil "quit"))
-     (bind-key "C-c h" 'hydra-gnus/body)
+     ;; (defhydra hydra-gnus (:color red)
+     ;;   "gnus functions"
+     ;;   ("m" gnus-uu-mark-thread "mark thread")
+     ;;   ("d" gnus-summary-delete-article "delete article(s)")
+     ;;   ("r" gnus-summary-mark-as-read-forward "mark read")
+     ;;   ("n" gnus-summary-next-thread "next thread")
+     ;;   ("p" gnus-summary-prev-thread "previous thread")
+     ;;   ("g" gnus-summary-next-group "next group")
+     ;;   ("l" gnus-recenter "recenter")
+     ;;   ("x" gnus-summary-limit-to-unread "unread")
+     ;;   ("q" nil "quit"))
+     ;; (bind-key "C-c h" 'hydra-gnus/body)
 
      (defhydra hydra-launcher (:color blue)
        "Launch"
@@ -3490,7 +3014,7 @@ CLOSED: [2017-08-26 Sat 15:09]
  "
        ("a" abbrev-mode nil)
        ("c" auto-complete-mode nil)
-       ("i" aggressive-indent-mode nil)
+;       ("i" aggressive-indent-mode nil)
        ("d" toggle-debug-on-error nil)
        ("f" auto-fill-mode nil)
        ("g" golden-ratio-mode nil)
@@ -3524,7 +3048,7 @@ CLOSED: [2017-08-26 Sat 15:09]
    :config
    (progn
      (defvar my-ibufffer-separator " • ")
-     (validate-setq ibuffer-filter-group-name-face 'variable-pitch
+     (setq ibuffer-filter-group-name-face 'variable-pitch
            ibuffer-use-header-line t)
      (unbind-key "M-o" ibuffer-mode-map)
 
@@ -3564,9 +3088,9 @@ CLOSED: [2017-08-26 Sat 15:09]
                     (if (file-regular-p buffer-path)
                         (file-name-directory buffer-path)
                       buffer-path)))
-             (magit-status default-directory)))))
+             (magit-status-internal default-directory)))))
 
-     (validate-setq ibuffer-directory-abbrev-alist
+     (setq ibuffer-directory-abbrev-alist
            (-uniq
             (-flatten
              (--map
@@ -3600,7 +3124,7 @@ CLOSED: [2017-08-26 Sat 15:09]
 
      (use-package ibuf-ext
        :config
-       (validate-setq ibuffer-old-time 12))
+       (setq ibuffer-old-time 12))
 
      (define-ibuffer-filter filename2
          "Toggle current view to buffers with filename matching QUALIFIER."
@@ -3616,18 +3140,18 @@ CLOSED: [2017-08-26 Sat 15:09]
      (defun ibuffer-magit-define-filter-groups ()
        (when (and (not ibuffer-magit-filter-groups)
                 (boundp 'magit-repo-dirs))
-         (validate-setq ibuffer-magit-filter-groups
+         (setq ibuffer-magit-filter-groups
                (--map (list
                        (concat "git:: "
                                (file-name-nondirectory (directory-file-name it)))
                        `(filename2 . ,it))
-                      (mapcar 'cdr (magit-list-repos magit-repo-dirs))))))
+                      (mapcar 'cdr (magit-list-repos))))))
 
      (defun ibuffer-set-filter-groups-by-root  ()
        (interactive)
        ;; (ibuffer-projectile-define-filter-groups)
        ;; (ibuffer-magit-define-filter-groups)
-       (validate-setq ibuffer-filter-groups
+       (setq ibuffer-filter-groups
              (-concat
               ;; ibuffer-projectile-filter-groups
               ibuffer-magit-filter-groups
@@ -3662,7 +3186,7 @@ CLOSED: [2017-08-26 Sat 15:09]
              (let ((selected-buffer (ibuffer-current-buffer)))
                (if (not ibuffer-filter-groups)
                    (ibuffer-set-filter-groups-by-root)
-                 (validate-setq ibuffer-filter-groups nil))
+                 (setq ibuffer-filter-groups nil))
                (pop-to-buffer ibuf)
                (ibuffer-update nil t)
                (ibuffer-jump-to-buffer (buffer-name selected-buffer )))))))
@@ -3671,14 +3195,14 @@ CLOSED: [2017-08-26 Sat 15:09]
 
      (defun ibuffer-back-to-top ()
        (interactive)
-       (beginning-of-buffer)
-       (next-line 3))
+       (goto-char (point-min))
+       (forward-line 3))
 
      (defun ibuffer-jump-to-bottom ()
        (interactive)
-       (end-of-buffer)
+       (goto-char (point-max))
        (beginning-of-line)
-       (next-line -2))
+       (forward-line -2))
 
      (define-key ibuffer-mode-map
        (vector 'remap 'end-of-buffer) 'ibuffer-jump-to-bottom)
@@ -3693,7 +3217,7 @@ CLOSED: [2017-08-26 Sat 15:09]
            ibuffer-default-directory "~/"
            )
 
-     (validate-setq ibuffer-formats '((mark vc-status-mini
+     (setq ibuffer-formats '((mark vc-status-mini
                                    " "
                                    (git-status 8 8 :left)
                                    " "
@@ -3712,7 +3236,7 @@ CLOSED: [2017-08-26 Sat 15:09]
                                    " " filename)
                              ))
 
-      (validate-setq ibuffer-saved-filter-groups
+      (setq ibuffer-saved-filter-groups
             (quote (("flat")
                     ("default"
                      ("dired"  (mode . dired-mode))
@@ -3772,6 +3296,7 @@ CLOSED: [2017-08-26 Sat 15:09]
                               (mode . haml-mode)
                               (mode . nxml-mode)
                               (mode . go-mode)
+                              (mode . rust-mode)
                               (mode . css-mode)))
                      ("other" (or
                                (mode . magit-log-edit-mode)
@@ -3795,6 +3320,7 @@ CLOSED: [2017-08-26 Sat 15:09]
                               (mode . haml-mode)
                               (mode . nxml-mode)
                               (mode . go-mode)
+                              (mode . rust-mode)
                               (mode . css-mode)))
                      ;; -------------------------------------------------
                      ;; configuration/data files
@@ -3853,30 +3379,32 @@ CLOSED: [2017-08-26 Sat 15:09]
    ;; too cautious for most people. You’ll still be prompted for
    ;; confirmation when deleting modified buffers after the option has
    ;; been turned off.
-   (validate-setq ibuffer-expert t)
+   (setq ibuffer-expert t)
  ))
  #+END_SRC
 ** ivy-mode, swiper, counsel
  [2015-10-16 Fri 16:28]
  Full docs at http://oremacs.com/swiper/
  #+BEGIN_SRC emacs-lisp
- (use-package swiper
-   :ensure swiper
-   :bind (("C-s" . swiper)
-          ("C-r" . swiper)
-          ("C-c C-r" . ivy-resume)
-          ("<f7>" . ivy-resume))
-   :config
-   (progn
-     ;(ivy-mode 1)
-     (validate-setq ivy-use-virtual-buffers t)
-     ;;advise swiper to recenter on exit
-     (defun bjm-swiper-recenter (&rest args)
-       "recenter display after swiper"
-       (recenter)
-       )
-     (advice-add 'swiper :after #'bjm-swiper-recenter)
-     ))
+  (use-package swiper
+    :ensure swiper
+    :bind (("C-s" . swiper)
+           ("C-r" . swiper)
+           ("C-c r" . ivy-resume)
+           ("<f7>" . ivy-resume))
+    :config
+    (progn
+      ;(ivy-mode 1)
+      (setq ivy-use-virtual-buffers t)
+      (setq ivy-count-format "(%d/%d) ")
+      (setq ivy-initial-inputs-alist nil)
+      ;;advise swiper to recenter on exit
+      (defun bjm-swiper-recenter (&rest args)
+        "recenter display after swiper"
+        (recenter)
+        )
+      (advice-add 'swiper :after #'bjm-swiper-recenter)
+      ))
  #+END_SRC
  counsel is a collection of Ivy enhanced versions of common Emacs
  commands, see https://github.com/abo-abo/swiper
@@ -3890,28 +3418,17 @@ CLOSED: [2017-08-26 Sat 15:09]
            ("<f1> u" . counsel-unicode-char)
            ("C-c j" . counsel-git-grep)
             :map ivy-minibuffer-map
-            ("M-y" . ivy-next-line)))
+            ("M-y" . ivy-forward-line)))
  #+END_SRC
 ** icicles
  [[http://article.gmane.org/gmane.emacs.orgmode/4574/match%3Dicicles]["In case you never heard of it, Icicles is to ‘TAB’ completion what
  ‘TAB’ completion is to typing things manually every time.”]]
  #+BEGIN_SRC emacs-lisp
  (use-package icicles
-   :ensure icicles
+   :load-path "elisp/icicles"
    :config
    (icy-mode 1))
  #+END_SRC
-** CANCELLED icomplete                                           :CANCELLED:
-CLOSED: [2017-08-26 Sat 14:44]
-:LOGBOOK:
-- State "CANCELLED"  from              [2017-08-26 Sat 14:44] \\
-  ivy and icomplete dont work together
-:END:
- Incremental mini-buffer completion preview: Type in the minibuffer,
- list of matching commands is echoed
- #+BEGIN_SRC emacs-lisp
- (icomplete-mode 99)
- #+END_SRC
 ** iedit
  [2014-05-26 Mon 22:49]
  #+BEGIN_SRC emacs-lisp
@@ -3943,6 +3460,13 @@ CLOSED: [2017-08-26 Sat 14:44]
  (use-package info-look
    :commands info-lookup-add-help)
  #+END_SRC
+** interleave mode
+[2019-05-19 Sun 21:22]
+Easy note taking for PDF files
+#+BEGIN_SRC emacs-lisp
+(use-package interleave
+  :ensure t)
+#+END_SRC
 ** ispell
  [2016-11-13 Sun 13:22]
  #+BEGIN_SRC emacs-lisp
@@ -3950,53 +3474,85 @@ CLOSED: [2017-08-26 Sat 14:44]
    :defer t
    :config
    (progn
-     (validate-setq ispell-personal-dictionary (expand-file-name "~/flydict" jj-cache-dir))
+     (setq ispell-personal-dictionary (expand-file-name "~/flydict" jj-cache-dir))
 
-     (validate-setq ispell-dictionary "de_DE")
-     (validate-setq ispell-program-name "hunspell")
+     (setq ispell-dictionary "de_DE")
+     (setq ispell-program-name "hunspell")
      (add-to-list 'ispell-skip-region-alist '("#\\+BEGIN_SRC" . "#\\+END_SRC"))
      (add-to-list 'ispell-skip-region-alist '("#\\+BEGIN_EXAMPLE" . "#\\+END_EXAMPLE"))
      ))
  #+END_SRC
+** json mode
+[2018-12-30 Sun 23:20]
+#+BEGIN_SRC emacs-lisp
+(use-package json-mode                  ; JSON files
+  :ensure t
+  :defer t
+  :mode ("config.data" . json-mode)
+  :config
+  (progn                                ; https://github.com/skeeto/.emacs.d
+    (setf json-reformat:pretty-string? t
+          json-reformat:indent-width 2)
+    (define-key json-mode-map (kbd "M-q")
+      (lambda ()
+        (interactive)
+        (if (region-active-p)
+            (call-interactively #'json-reformat-region)
+          (json-reformat-region (point-min) (point-max)))))
+
+    (add-hook 'json-mode-hook
+              ;; Fix JSON mode indentation
+              (lambda () (setq-local js-indent-level 4)))))
+#+END_SRC
 ** linum (line number)
  Various modes should have line numbers in front of each line.
 
  But then there are some where it would just be deadly - like org-mode,
  gnus, so we have a list of modes where we don't want to see it.
- #+BEGIN_SRC emacs-lisp
- (use-package linum
-   :diminish linum-mode
-   :config
-   (progn
-     (validate-setq linum-format "%3d ")
-     (setq linum-mode-inhibit-modes-list '(org-mode
-                                           eshell-mode
-                                           shell-mode
-                                           gnus-group-mode
-                                           gnus-summary-mode
-                                           gnus-article-mode))
-
-     (defadvice linum-on (around linum-on-inhibit-for-modes)
-       "Stop the load of linum-mode for some major modes."
-       (unless (member major-mode linum-mode-inhibit-modes-list)
-         ad-do-it))
-
-     (ad-activate 'linum-on)
-
-     (use-package linum-relative
-       :ensure linum-relative
-       :init
-       (progn
-         (validate-setq linum-format 'dynamic)
-         )))
-   :init
-   (global-linum-mode 1))
+#+BEGIN_SRC emacs-lisp
+(if (version<= "26.0.50" emacs-version )
+    (progn
+      (global-display-line-numbers-mode 1)
+      (add-hook 'gnus-group-mode-hook (lambda (&optional dummy) (display-line-numbers-mode -1)))
+      (add-hook 'gnus-summary-mode-hook (lambda (&optional dummy) (display-line-numbers-mode -1)))
+      (add-hook 'gnus-article-mode-hook (lambda (&optional dummy) (display-line-numbers-mode -1))))
+  (progn
+    ; Old emacs versions
+    (use-package linum
+      :diminish linum-mode
+      :defines (linum-mode-inhibit-modes-list)
+      :config
+      (progn
+        (setq linum-format "%3d ")
+        (setq linum-mode-inhibit-modes-list '(org-mode
+                                              eshell-mode
+                                              shell-mode
+                                              gnus-group-mode
+                                              gnus-summary-mode
+                                              gnus-article-mode))
+
+        (defadvice linum-on (around linum-on-inhibit-for-modes)
+          "Stop the load of linum-mode for some major modes."
+          (unless (member major-mode linum-mode-inhibit-modes-list)
+            ad-do-it))
+
+        (ad-activate 'linum-on)
+
+        (use-package linum-relative
+          :ensure linum-relative
+          :init
+          (progn
+            (setq linum-format 'dynamic)
+            )))
+      :init
+      (global-linum-mode 1))
 
- (use-package hlinum
-   :ensure t
-   :config
-   (progn
-     (hlinum-activate)))
+    (use-package hlinum
+      :ensure t
+      :config
+      (progn
+        (hlinum-activate)))
+    ))
  #+END_SRC
 
 ** lisp editing stuff
@@ -4051,73 +3607,68 @@ CLOSED: [2017-08-26 Sat 14:44]
  [2013-04-21 So 20:48]
  magit is a mode for interacting with git.
  #+BEGIN_SRC emacs-lisp
- (use-package magit
-   :ensure magit
-   :commands  (magit-log magit-run-gitk magit-run-git-gui magit-status
-                         magit-git-repo-p magit-list-repos)
-   :bind (("C-x g" . magit-status)
-          ("C-x G" . magit-status-with-prefix)
-          :magit-status-mode-map
-          ("q" . magit-quit-session ))
 (use-package magit
+    :ensure magit
+    :commands  (magit-log-other magit-run-gitk magit-run-git-gui magit-status
+                          magit-git-repo-p magit-list-repos)
+    :bind (("C-x g" . magit-status)
+           ("C-x G" . magit-status-with-prefix)
+           :map magit-status-mode-map
+           ("q" . magit-quit-session ))
 
-   :config
-   (progn
-     (setq magit-repository-directories '("~/devel"
-                                          "~/git/"
-                                          ))
-     (setq magit-repository-directories-depth 4)
-     (setq magit-log-auto-more t)
+    :config
+    (progn
+      (setq magit-repository-directories '(("~/devel" . 4)
+                                           ("~/git/" . 4)
+                                           ))
+      (setq magit-log-auto-more t)
+      (setq magit-completing-read-function 'ivy-completing-read)
 
-     ; VC shouldnt do anything with git
-     (setq vc-handled-backends (delq 'Git vc-handled-backends))
+      ; VC shouldnt do anything with git
+      (setq vc-handled-backends (delq 'Git vc-handled-backends))
 
-     (use-package magit-blame
-       :commands magit-blame-mode)
+      (use-package magit-blame
+        :commands magit-blame-mode)
 
-     (add-hook 'magit-mode-hook 'hl-line-mode)
-     (defun magit-status-with-prefix ()
-       (interactive)
-       (let ((current-prefix-arg '(4)))
-         (call-interactively 'magit-status)))
-     (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)
-
-     (add-hook 'magit-log-edit-mode-hook
-               #'(lambda ()
-                   (set-fill-column 72)
-                   (flyspell-mode)))
-
-     (add-hook 'git-rebase-mode-hook
-               #'(lambda ()
-                   (smartscan-mode 0))
-               )
-     (defadvice magit-status (around magit-fullscreen activate)
-       (window-configuration-to-register :magit-fullscreen)
-       ad-do-it
-       (delete-other-windows))
+      (add-hook 'magit-mode-hook 'hl-line-mode)
+      (defun magit-status-with-prefix ()
+        (interactive)
+        (let ((current-prefix-arg '(4)))
+          (call-interactively 'magit-status)))
+      (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)
+
+      (add-hook 'magit-log-edit-mode-hook
+                #'(lambda ()
+                    (set-fill-column 72)
+                    (flyspell-mode)))
+
+      (add-hook 'git-rebase-mode-hook
+                #'(lambda ()
+                    (smartscan-mode 0))
+                )
+      (defadvice magit-status (around magit-fullscreen activate)
+        (window-configuration-to-register :magit-fullscreen)
+        ad-do-it
+        (delete-other-windows))
+
+      (defun magit-quit-session ()
+        "Restores the previous window configuration and kills the magit buffer"
+        (interactive)
+        (kill-buffer)
+        (jump-to-register :magit-fullscreen))
 
-     (defun magit-quit-session ()
-       "Restores the previous window configuration and kills the magit buffer"
-       (interactive)
-       (kill-buffer)
-       (jump-to-register :magit-fullscreen))
-
-     (defun magit-rebase-unpushed (commit &optional args)
-       "Start an interactive rebase sequence over all unpushed commits."
-       (interactive (list (magit-get-tracked-branch)
-                          (magit-rebase-arguments)))
-       (if (setq commit (magit-rebase-interactive-assert commit))
-           (magit-run-git-sequencer "rebase" "-i" commit args)
-         (magit-log-select
-          `(lambda (commit)
-             (magit-rebase-interactive (concat commit "^") (list ,@args))))))
-
-     (magit-define-popup-action 'magit-rebase-popup ?l "Rebase unpushed" 'magit-rebase-unpushed)
-     ))
+     (use-package forge
+       :ensure t
+       :config
+       (progn
+         (setq gitlab.salsa.debian.org.user "joerg")
+         ))
+      ))
  #+END_SRC
 ** markdown-mode
  [2014-05-20 Tue 23:04]
@@ -4131,33 +3682,173 @@ CLOSED: [2017-08-26 Sat 14:44]
 ** message
  #+BEGIN_SRC emacs-lisp
  (use-package message
+   :commands (message-mode)
+   :after (notmuch)
+   :bind (:map notmuch-message-mode-map
+               ("C-c M-m" . 'my-message-mark-inserted-region)
+               ("C-c h" . 'harden-newlines))
    :config
    (progn
-     (validate-setq message-kill-buffer-on-exit t)))
- #+END_SRC
-** CANCELLED mingus                                              :CANCELLED:
-CLOSED: [2017-08-26 Sat 15:18]
-:LOGBOOK:
-- State "CANCELLED"  from              [2017-08-26 Sat 15:18]
-:END:
- [[https://github.com/pft/mingus][Mingus]] is a nice interface to mpd, the Music Player Daemon.
+     (setq message-kill-buffer-on-exit t)
 
- I want to access it from anywhere using =F6=.
- #+BEGIN_SRC emacs-lisp :tangle no
- (use-package mingus-stays-home
-   :bind ( "<f6>" . mingus)
-   :defer t
-   :config
-   (progn
-     (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
+     (use-package time-date
+       :config
+       (setq message-citation-line-function 'september-citation-line))
+
+     ;;** Message Size Limit
+     (setq message-send-mail-partially-limit 5000000)
+
+     (setq message-send-mail-function 'message-send-mail-with-sendmail)
+     (setq smtpmail-default-smtp-server "localhost")
+     (setq message-sendmail-envelope-from 'header)
+
+     ;;** Keinen Sender Header zufuegen !
+     (add-to-list 'message-syntax-checks '(sender . disabled))
+
+     ;;** Kaputte Subjects Aw: Statt Re: fixen:
+     (setq message-subject-re-regexp "^[     ]*\\([RrAaFf][EeWw]:[   ]*\\)*[         ]*")
+
+     ;;** Ich will die Header in den Nachrichten sehen die ich schreibe.
+     (setq message-generate-headers-first t)
+
+     ;;** Und immer schoen Header zufuegen.
+     (setq message-default-headers (concat "Organization: Ganneff\n"))
+     (add-hook 'message-send-hook 'my-message-add-content)
+
+     ;;** Und Courtesy-Mails wollen wir schon mal grad gar nicht
+     (add-hook 'message-header-setup-hook 'my-message-header-setup-hook)
 
+     ;;** In Forwards bitte das Subject aufraeumen
+     (setq message-wash-forwarded-subjects t)
+
+     ;;** Zitieren ohne Sig. Ausser Idioten sind zu doof die korrekt abzutrennen.
+     (setq message-cite-function 'message-cite-original-without-signature)
+
+     ;;** Automagischen Zeilenumbruch bei News/Mailangabe.
+     (add-hook 'message-mode-hook
+               (lambda ()
+                 (setq fill-column 72)
+                 (turn-on-auto-fill)
+                 (epa-mail-mode 1)
+                 ))
+     (add-hook 'notmuch-message-mode-hook
+               (lambda ()
+                 (setq fill-column 72)
+                 (turn-on-auto-fill)
+                 (epa-mail-mode 1)
+                 ))
+     (setq fill-flowed-encode-column 78)
+
+     ;;** org-mode
+     (add-hook 'message-mode-hook 'orgstruct++-mode 'append)
+     (add-hook 'message-mode-hook 'orgtbl-mode 'append)
+
+     (setq message-forward-as-mime t)
+     (use-package message-x
+       :load-path "elisp/local")
+
+     (use-package randomsig
+       :bind (:map message-mode-map
+                   ("C-c s" . randomsig-replace-sig)
+                   ("C-c S" . randomsig-select-sig))
+       :config
+       (progn
+         (setq randomsig-dir "/home/joerg/sigs")
+         (setq message-signature 'randomsig-signature)))
+
+     (setq message-archive-note "X-No-Archive: Yes")
+     (setq message-make-forward-subject-function (quote message-forward-subject-fwd))
+     (setq message-max-buffers 5)
+     (setq message-send-hook (quote (my-message-add-content)))
+     (setq message-subscribed-regexps (quote (".*@lists.*" ".*@postfix.org" ".*@nongnu.org")))
+     (setq message-use-followup-to (quote use))
+
+                                         ; use format=flowed mail style, see
+     (require 'messages-are-flowing)
+     (setq mml-enable-flowed t)
+     (add-hook 'message-mode-hook #'messages-are-flowing-use-and-mark-hard-newlines)
+
+     ; A function to mark newlines as hard newlines for format=flowed stuff
+     (defun harden-newlines (beg end)
+       (interactive "r")
+       (save-excursion
+         (save-restriction
+           (narrow-to-region beg end)
+           (goto-char (point-min))
+           (while (search-forward "\n" nil t)
+             (put-text-property (1- (point)) (point) 'hard t)))))
+
+     (defun harden-message-buffer ()
+       (interactive)
+       (save-excursion
+         (message-goto-body)
+         (message "Hardening body")
+         (while (search-forward "\n" nil t)
+           (put-text-property (1- (point)) (point) 'hard t))))
+
+     (add-hook 'message-send-hook 'harden-message-buffer)
+     (add-hook 'notmuch-mua-send-hook 'harden-message-buffer)
+     ; In format=flowed our enclosing tags must end with a hard newline
+     (defun my-message-mark-inserted-region (beg end &optional verbatim)
+       "Mark some region in the current article with enclosing tags.
+ See `message-mark-insert-begin' and `message-mark-insert-end'.
+ If VERBATIM, use slrn style verbatim marks (\"#v+\" and \"#v-\")."
+       (interactive "r\nP")
+       (save-excursion
+         ;; add to the end of the region first, otherwise end would be invalid
+         (goto-char end)
+         (insert (if verbatim "#v-\n" message-mark-insert-end))
+         (put-text-property (1- (point)) (point) 'hard t)
+         (goto-char beg)
+         (insert (if verbatim "#v+\n" message-mark-insert-begin))
+         (put-text-property (1- (point)) (point) 'hard t)
+         )
+
+       ;;** Nun das Paket um einfachst Fussnoten eingeben zu können.
+       (use-package footnote
+         :commands (footnote-mode)
+         :config
+         (setq footnote-body-tag-spacing 1
+               footnote-spaced-footnotes nil
+               footnote-style 'numeric-latin
+               footnote-section-tag "Footnotes:"))
+       (add-hook 'message-mode-hook 'footnote-mode))
+     ))
+ #+END_SRC
+** mml
+[2018-12-31 Mon 13:28]
+#+BEGIN_SRC emacs-lisp
+(use-package mml
+  :config
+  (progn
+    ;; http://mbork.pl/2015-11-28_Fixing_mml-attach-file_using_advice
+    (defun mml-attach-file--go-to-eob (orig-fun &rest args)
+      "Go to the end of buffer before attaching files."
+      (save-excursion
+        (save-restriction
+          (widen)
+          (goto-char (point-max))
+          (apply orig-fun args))))
+
+    (advice-add 'mml-attach-file :around #'mml-attach-file--go-to-eob)
+    (setq mm-verify-option 'always)
+    ))
+(use-package mml-sec
+  :commands (sign-or-crypt)
+  :hook ((message-setup gnus-message-setup notmuch-message-setup) . sign-or-crypt)
+  :config
+  (progn
+    ;; Keine extra Signatur erzeugen.
+    (mml-signencrypt-style "pgpmime" 'combined)
+    (setq mml-secure-openpgp-sign-with-sender 't)
+    (setq gpg-unabbrev-trust-alist
+          '(("TRUST_UNDEFINED" . trust-undefined)
+            ("TRUST_NEVER"     . trust-none)
+            ("TRUST_MARGINAL"  . trust-marginal)
+            ("TRUST_FULLY"     . trust-full)
+            ("TRUST_ULTIMATE"  . trust-ultimate)))
+    ))
+#+END_SRC
 ** miniedit
  Edit minibuffer in a full (text-mode) buffer by pressing *M-C-e*.
  #+BEGIN_SRC emacs-lisp
@@ -4173,50 +3864,6 @@ CLOSED: [2017-08-26 Sat 15:18]
    ))
  #+END_SRC
 
-** CANCELLED mmm-mode                                            :CANCELLED:
-CLOSED: [2017-08-26 Sat 15:18]
-:LOGBOOK:
-- State "CANCELLED"  from              [2017-08-26 Sat 15:18]
-:END:
- [2013-05-21 Tue 23:39]
- MMM Mode is a minor mode for Emacs that allows Multiple Major Modes to
- coexist in one buffer.
- #+BEGIN_SRC emacs-lisp :tangle no
- (use-package mmm-auto
-   :ensure mmm-mode
-   :init
-   (progn
-     (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
-           'html-css
-           '((css-cdata
-              :submode css-mode
-              :face mmm-code-submode-face
-              :front "<style[^>]*>[ \t\n]*\\(//\\)?<!\\[CDATA\\[[ \t]*\n?"
-              :back "[ \t]*\\(//\\)?]]>[ \t\n]*</style>"
-              :insert ((?j js-tag nil @ "<style type=\"text/css\">"
-                           @ "\n" _ "\n" @ "</script>" @)))
-             (css
-              :submode css-mode
-              :face mmm-code-submode-face
-              :front "<style[^>]*>[ \t]*\n?"
-              :back "[ \t]*</style>"
-              :insert ((?j js-tag nil @ "<style type=\"text/css\">"
-                           @ "\n" _ "\n" @ "</style>" @)))
-             (css-inline
-              :submode css-mode
-              :face mmm-code-submode-face
-              :front "style=\""
-              :back "\"")))
-          (dolist (mode (list 'html-mode 'nxml-mode))
-            (mmm-add-mode-ext-class mode "\\.r?html\\(\\.erb\\)?\\'" 'html-css))
-          (mmm-add-mode-ext-class 'html-mode "\\.php\\'" 'html-php)
-          ))))
- #+END_SRC
-
 ** mo-git-blame
  This is [[https://github.com/mbunkus/mo-git-blame][mo-git-blame -- An interactive, iterative 'git blame' mode for
  Emacs]].
@@ -4227,7 +3874,7 @@ CLOSED: [2017-08-26 Sat 15:18]
               mo-git-blame-file)
    :config
    (progn
-     (validate-setq mo-git-blame-blame-window-width 25)))
+     (setq mo-git-blame-blame-window-width 25)))
  #+END_SRC
 
 ** CANCELLED multiple cursors                                    :CANCELLED:
@@ -4262,7 +3909,7 @@ CLOSED: [2017-08-26 Sat 15:18]
      (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)
-     (validate-setq mc/list-file (expand-file-name "mc-cache.el" jj-cache-dir))))
+     (setq mc/list-file (expand-file-name "mc-cache.el" jj-cache-dir))))
  #+END_SRC
 ** neotree
  [2014-08-27 Wed 17:15]
@@ -4278,20 +3925,376 @@ CLOSED: [2017-08-26 Sat 15:18]
    :config
    (progn
      (bind-key "^" 'neotree-select-up-node neotree-mode-map)
-     (validate-setq neo-smart-open t)))
+     (setq neo-smart-open t)))
 
  #+END_SRC
 ** notmuch
  [2016-10-24 Mon 18:18]
- Nice email search
+ Nice email search and interface
  #+BEGIN_SRC emacs-lisp
  (use-package notmuch
    :ensure t
-   :defer t
    :commands (notmuch)
+   :bind (("C-c n" . notmuch)
+          :map notmuch-show-mode-map
+          ("C-c C-c" . lld-notmuch-goto-message-in-gnus)
+          :map notmuch-common-keymap
+          ("G" . nil)
+          ("s" . nil)
+          )
+   :init
+   (progn
+     (after 'notmuch
+       (jj-init-theme)))
    :config
    (progn
-     (validate-setq notmuch-search-oldest-first nil)))
+     (setq notmuch-search-oldest-first nil)
+
+     (setq smtpmail-default-smtp-server "localhost")
+
+     (setq notmuch-search-oldest-first nil)
+     (setq notmuch-search-result-format
+           '(("date" . "%12s ")
+             ("count" . "%7s ")
+             ("authors" . "%-30s ")
+             ("subject" . "%s ")
+             ("tags" . "(%s)")
+             ))
+     (setq notmuch-hello-thousands-separator ".")
+     (setq notmuch-tree-show-out t)
+     (setq notmuch-always-prompt-for-sender t)
+     (setq notmuch-crypto-process-mime t)
+     (setq notmuch-fcc-dirs
+           (quote
+            ((".*@nsb-software.de" . "nsb/.Sent")
+             ("da-manager@debian.org" . "ganneff/.Sentmail.DAM")
+             (".*" . "ganneff/.Sentmail"))))
+
+     (setq notmuch-message-headers (quote ("Subject"
+                                           "To"
+                                           "Cc"
+                                           "Bcc"
+                                           "Date"
+                                           "^Followup-To"
+                                           "Mail-Followup-To"
+                                           "Reply-To"
+                                           "^Organization"
+                                           "^Summary"
+                                           "^Keywords"
+                                           "^Posted-To"
+                                           "^Mail-Copies-To"
+                                           "^Apparently-To"
+                                           "^X-Gnus-Warning"
+                                           "^Resent-From"
+                                           "^X-Spam-Status"
+                                           "^X-Sent"
+                                           "^X-Mailer"
+                                           "^X-Newsreader"
+                                           "^X-User-Agent"
+                                           "^User-Agent" )))
+
+     (setq notmuch-show-all-tags-list nil)
+     (setq notmuch-show-mark-read-tags (list "-unread" "-inbox"))
+
+     (setq notmuch-saved-searches '(
+                                    (         :name "Nagios"                :query "from:nagios@ AND tag:unread")
+                                    (         :name "Debian BTS"            :query "from:@bugs.debian.org AND tag:unread")
+                                    (         :name "FTPMaster"             :query "from:ftpmaster@ftp-master.debian.org AND tag:unread")
+                                    (         :name "Mirror logs"           :query "(from:archvsync@* OR from:mirror+arrakis@*) AND tag:mirrors AND tag:logs AND tag:unread")
+                                    (         :name "Cron"                  :query "from:cron@ AND tag:unread")
+                                    (         :name "List Admin"            :query "subject:moderator request AND tag:unread")
+                                    (:key "i" :name "Inbox Ganneff"         :query "(tag:inbox AND tag:ganneff) AND NOT (tag:lists OR tag:kommerz OR from:support@hetzner.com or tag:mia)")
+                                    (         :name "Inbox NSB"             :query "(tag:inbox AND tag:nsb) AND NOT (tag:ganeti OR tag:lists/ganeti)")
+                                    (         :name "Inbox All"             :query "tag:inbox")
+                                    (:key "n" :name "New Mail"              :query "tag:new" )
+                                    (:key "u" :name "Unread All"            :query "tag:unread")
+                                    (         :name "Unread NSB"            :query "tag:unread AND tag:nsb AND NOT (from:nagios@ OR from:@bugs.debian.org OR from:cron@ or from:ftpmaster@ftp-master.debian.org OR tag:lists OR tag:ganeti OR tag:lists/ganeti)")
+                                    (         :name "Unread Ganneff"        :query "tag:unread AND tag:ganneff AND NOT ( \
+                                                          ( from:gitlab@salsa.debian.org AND subject:dak ) OR \
+                                                          ( ( tag:planet OR tag:kommerz OR from:cron@ OR from:archvsync@* OR \
+                                                              from:ftpmaster@ftp-master.debian.org OR from:nagios@ OR from:@bugs.debian.org \
+                                                              OR tag:lists/* OR from:support@hetzner.com) )")
+                                    (:key "f" :name "Flagged"               :query "tag:flagged")
+                                    (:key "s" :name "Sent Ganneff"          :query "tag:sent AND tag:ganneff OR tag:sent AND ( from:ganneff.de OR from:debian.org )")
+                                    (         :name "Sent NSB"              :query "tag:sent AND tag:nsb OR tag:sent AND from:nsb-software.de")
+                                    (         :name "Sent DAM"              :query "folder:ganneff/.Sentmail.DAM")
+                                    (:key "g" :name "NSB GF"                :query "tag:nsb AND tag:gf AND tag:unread")
+                                    (:key "f" :name "Important"             :query "tag:important")
+                                    (:key "t" :name "TODO"                  :query "tag:todo")
+                                    (:key "k" :name "Kommerz"               :query "tag:kommerz AND tag:unread")
+                                    (:key "d" :name "DA-Manager"            :query "to:da-manager@debian.org AND (tag:todo OR tag:unread)")
+                                    (         :name "Planet Debian"         :query "to:planet@debian.org AND tag:unread")
+                                    (         :name "Kommerz"               :query "tag:Kommerz AND (tag:unread OR tag:inbox OR tag:flagged)" :sort-order oldest-first)
+                                    (         :name "VH Unread"             :query "(tag:unread OR tag:inbox) \
+                                                                                     AND ((from:nguyen@nsb-software.de OR to:nguyen@nsb-software.de \
+                                                                                     OR from:info@nsb-software.de OR to:info@nsb-software.de  \
+                                                                                     OR from:van-hien.nguyen@dlh.de OR to:van-hien.nguyen@dlh.de \
+                                                                                     OR from:van-hien.nguyen.sp@dlh.de OR to:van-hien.nguyen.sp@dlh.de) \
+                                                                                     AND (tag:sent OR tag:sentmail OR tag:to-me))")
+                                    (         :name "VH All"                :query "(from:nguyen@nsb-software.de OR to:nguyen@nsb-software.de \
+                                                                                     OR from:info@nsb-software.de OR to:info@nsb-software.de  \
+                                                                                     OR from:van-hien.nguyen@dlh.de OR to:van-hien.nguyen@dlh.de \
+                                                                                     OR from:van-hien.nguyen.sp@dlh.de OR to:van-hien.nguyen.sp@dlh.de) \
+                                                                                     AND (tag:sent OR tag:sentmail OR tag:to-me)")
+                                    (         :name "D-Devel-Announce"      :query "tag:lists/debian-devel-announce and tag:unread")
+                                    (         :name "D-Devel"               :query "tag:lists/debian-devel and tag:unread")
+                                    (         :name "D-Project"             :query "tag:lists/debian-project and tag:unread")
+                                    (         :name "D-Private"             :query "tag:lists/debian-private and tag:unread")
+                                    (         :name "D-Vote"                :query "tag:lists/debian-vote and tag:unread")
+                                    (         :name "O-Staff"               :query "tag:lists/oftc-staff and tag:unread")
+                                    (         :name "O-Noc"                 :query "tag:lists/oftc-noc and tag:unread")
+                                    (         :name "LugFD"                 :query "tag:lists/lugfd and tag:unread")
+                                    (         :name "TODO"                  :query "tag:TODO")
+                                    (:key "2" :name "Unread 2weeks"         :query "date:2weeks...today AND tag:unread")
+                                    (         :name "Dienstpläne"           :query "date:4weeks...today AND tag:dienstplan")
+                                    (:key "m" :name "To me"                 :query "tag:to-me")
+                                    (:key "l" :name "Lists"                 :query "tag:lists AND tag:unread")
+                                    (         :name "Hetzner Support"       :query "from:support@hetzner.com AND tag:unread")
+                                    (         :name "Ganeti"                :query "(tag:ganeti OR tag:lists/ganeti) AND tag:unread")
+                                    (         :name "MIA"                   :query "tag:mia AND tag:unread")
+                                    (         :name "SPAM"                  :query "folder:ganneff/.SPAM AND tag:spam")
+                                    (         :name "Drafts"                :query "tag:draft")
+                                         ;                                        (:key "a" :name "all mail"              :query "*")
+                                    ))
+     (setq notmuch-search-line-faces
+           (quote
+            (("deleted" :foreground "tomato")
+             ("unread" :weight bold)
+             ("flagged" :foreground "wheat"))))
+
+     (setq notmuch-show-insert-text/plain-hook
+           (quote
+            (notmuch-wash-convert-inline-patch-to-part notmuch-wash-tidy-citations
+                                                       notmuch-wash-elide-blank-lines
+                                                       notmuch-wash-excerpt-citations
+                                                       )))
+
+     (setq notmuch-print-mechanism 'notmuch-print-muttprint/evince)
+     (setq notmuch-tagging-keys '(("a" notmuch-archive-tags "Archive")
+                                  ("u" notmuch-show-mark-read-tags "Mark read")
+                                  ("f" ("+flagged") "Flag")
+                                  ("s" ("+spam" "-inbox" "-unread" "-learnham" "-moveham") "Mark as spam")
+                                  ("d" ("+deleted" "-inbox" "-unread") "Delete")))
+
+     (defun jj-forward (prefix)
+       (interactive "P")
+       (let ((message-forward-as-mime nil))
+         (notmuch-show-forward-open-messages prefix)))
+     (define-key notmuch-show-mode-map "F" 'jj-forward)
+     (define-key notmuch-show-mode-map "f" 'notmuch-show-forward-message)
+
+     (define-key notmuch-search-mode-map "d"
+       (lambda (N)
+         "toggle deleted tag for message"
+         (interactive "p")
+         (setq num 0)
+         (while (< num N)
+           (setq num (1+ num))
+           (if (member "deleted" (notmuch-search-get-tags))
+               (notmuch-search-tag (list "-deleted"))
+             (notmuch-search-tag (list "+deleted" "-unread" "-inbox")))
+           (forward-line))))
+     (define-key notmuch-show-mode-map "d"
+       (lambda ()
+         "toggle deleted tag for message"
+         (interactive "p")
+         (if (member "deleted" (notmuch-show-get-tags))
+             (notmuch-show-tag (list "-deleted"))
+           (notmuch-show-tag (list "+deleted" "-unread" "-inbox")))
+         (notmuch-show-next-open-message t)))
+
+                                         ; Toggle spam tag on a message in search/show
+     (define-key notmuch-search-mode-map "s"
+       (lambda (N)
+         "toggle spam tag for message"
+         (interactive "p")
+         (setq num 0)
+         (while (< num N)
+           (setq num (1+ num))
+           (if (member "spam" (notmuch-search-get-tags))
+               (notmuch-search-tag (list "-spam" "+learnham" "+moveham"))
+             (notmuch-search-tag (list "+spam" "-unread" "-inbox")))
+           (forward-line))))
+     (define-key notmuch-show-mode-map "s"
+       (lambda ()
+         "toggle spam tag for message"
+         (interactive)
+         (if (member "spam" (notmuch-show-get-tags))
+             (notmuch-show-tag (list "-spam" "+learnham" "+moveham"))
+           (notmuch-show-tag (list "+spam" "-unread" "-inbox")))
+         (notmuch-show-next-open-message t)))
+     (define-key notmuch-tree-mode-map "s"
+       (lambda (N)
+         "toggle spam tag for message"
+         (interactive "p")
+         (setq num 0)
+         (while (< num N)
+           (setq num (1+ num))
+           (if (member "spam" (notmuch-tree-get-tags))
+               (notmuch-tree-tag (list "-spam" "+learnham" "+moveham"))
+             (notmuch-tree-tag (list "+spam" "-unread" "-inbox")))
+           (forward-line))))
+
+                                         ; Toggle learnham tag on a message in search/show
+     (define-key notmuch-search-mode-map "h"
+       (lambda (N)
+         "toggle learnham tag for message"
+         (interactive "p")
+         (setq num 0)
+         (while (< num N)
+           (setq num (1+ num))
+           (if (member "learnham" (notmuch-search-get-tags))
+               (notmuch-search-tag (list "-learnham"))
+             (notmuch-search-tag (list "+learnham" "-spam" "+moveham")))
+           (forward-line))))
+     (define-key notmuch-show-mode-map "h"
+       (lambda ()
+         "toggle learnham tag for message"
+         (interactive)
+         (if (member "learnham" (notmuch-show-get-tags))
+             (notmuch-show-tag (list "-learnham"))
+           (notmuch-show-tag (list "+learnham" "-spam" "+moveham")))
+         (notmuch-show-next-open-message t)))
+
+     (define-key notmuch-search-mode-map "u"
+       (lambda (N)
+         "toggle unread tag for message"
+         (interactive "p")
+         (setq num 0)
+         (while (< num N)
+           (setq num (1+ num))
+           (if (member "unread" (notmuch-search-get-tags))
+               (notmuch-search-tag (list "-unread" "-inbox"))
+             (notmuch-search-tag (list "+unread")))
+           (forward-line))))
+     (define-key notmuch-show-mode-map "u"
+       (lambda ()
+         "toggle unread tag for message"
+         (interactive)
+         (if (member "unread" (notmuch-show-get-tags))
+             (notmuch-show-tag (list "-unread" "-inbox"))
+           (notmuch-show-tag (list "+unread")))
+         (notmuch-show-next-open-message t)))
+
+     (define-key notmuch-search-mode-map "k"
+       (lambda (N)
+         "mark a thread killed"
+         (interactive "p")
+         (setq num 0)
+         (while (< num N)
+           (setq num (1+ num))
+           (if (member "killed" (notmuch-search-get-tags))
+               (notmuch-search-tag (list "-killed"))
+             (notmuch-search-tag (list "+killed" "-inbox" "-unread")))
+           (forward-line))))
+     (define-key notmuch-show-mode-map "k"
+       (lambda ()
+         "toggle killed tag for message"
+         (interactive)
+         (if (member "killed" (notmuch-show-get-tags))
+             (notmuch-show-tag (list "-killed"))
+           (notmuch-show-tag (list "+killed" "-inbox" "-unread")))
+         (notmuch-show-next-open-message t)))
+
+                                         ;  resend the current message in show mode.
+     (define-key notmuch-show-mode-map "b"
+       (lambda (&optional address)
+         "Bounce the current message."
+         (interactive "sBounce To: ")
+         (notmuch-show-view-raw-message)
+         (message-resend address)
+         (kill-buffer)))
+
+     ;; add unread tree command
+     (defun my-notmuch-tree-tag-thread-read ()
+       "Mark whole tree as read"
+       (interactive)
+       (notmuch-tree-tag-thread (list "-unread" "-inbox"))
+       (notmuch-tree-refresh-view))
+     (bind-key "." 'my-notmuch-tree-tag-thread-read notmuch-tree-mode-map)
+     (bind-key "C-c C-d" 'notmuch-draft-postpone message-mode-map)
+
+     (use-package counsel-notmuch
+       :ensure t)
+
+     (use-package gnus-alias
+       :ensure t
+       :after (notmuch)
+       :commands (gnus-alias-determine-identity)
+       :hook ((message-setup . gnus-alias-determine-identity))
+       :bind (:map notmuch-message-mode-map
+                   ("C-c i" . gnus-alias-select-identity))
+       :config
+       (progn
+         (setq gnus-alias-default-identity "default")
+         (setq gnus-alias-overlay-identities t)
+         (setq gnus-alias-override-user-mail-address t)
+         (setq gnus-alias-identity-alist
+               '(("default"
+                  nil ;; Does not refer to any other identity
+                  "Joerg Jaspert <joerg@ganneff.de>" ;; From Header
+                  "Ganneff.de" ;; Organization header
+                  (("Fcc" . "ganneff/.Sentmail")) ;; List of extra headers
+                  nil ;; No extra body text
+                  "bye, Joerg" ;; Signature
+                  )
+                 ("Pei-Hua"
+                  "default"
+                  "Joerg (悠軻) Jaspert <joerg@debian.org>"
+                  nil
+                  nil
+                  nil
+                  "bye, Joerg")
+                 ("NSBJoerg"
+                  nil ;; Not referencing another identity
+                  "Joerg Jaspert <joerg@nsb-software.de>"
+                  "NSB Nguyen Softwareentwicklung & beratung GmbH"
+                  (("Fcc" . "nsb/.Sent")) ;; One extra header
+                  nil ;; No extra body text
+                  "~/.signature.nsb")
+                 ("NSBGF"
+                  "NSBJoerg"
+                  "Joerg Jaspert <gf@nsb-software.de>"
+                  "NSB Nguyen Softwareentwicklung & beratung GmbH"
+                  (("Fcc" . "nsb/.Sent")) ;; One extra header
+                  nil
+                  "~/.signature.nsb"
+                  )
+                 ("Debian"
+                  nil
+                  "Joerg Jaspert <joerg@debian.org>"
+                  nil
+                  (("Fcc" . "ganneff/.Sentmail"))
+                  nil
+                  "bye, Joerg")
+                 ("DebianPrivate"
+                  "Debian"
+                  nil
+                  nil
+                  nil
+                  nil
+                  "~/.signature.private"
+                  )
+                 ("DebianDAM"
+                  "Debian"
+                  "Joerg Jaspert <da-manager@debian.org>"
+                  nil
+                  (("Fcc" . "ganneff/.Sentmail.DAM")
+                   ("Reply-To" . "Debian Account Managers <da-manager@debian.org>"))
+                  nil
+                  "bye, Joerg")
+                 ))
+
+         (setq gnus-alias-identity-rules '(("Personal" ("to" ".*@ganneff.de" both) "default")
+                                           ("Pei-Hua" ("to" "sab.tseng@gmail.com" both) "Pei-Hua")
+                                           ("NSB GF" ("any" "gf@nsb-software.de" both) "NSBGF")
+                                           ("NSB" ("any" ".*@nsb-software.de" both) "NSBJoerg")
+                                           ("DebianDAM" ("any" "da-manager@debian.org" both) "DebianDAM")
+                                           ("DebianPrivate" ("to" "debian-private@lists.debian.org" both) "DebianPrivate")
+                                           ("DebianLists" ("to" ".*@lists.debian.org" both) "Debian")
+                                           ("Debian" ("any" "joerg@debian.org" both) "Debian")
+                                           )))
+       )))
  #+END_SRC
 ** nxml
  [2013-05-22 Wed 22:02]
@@ -4316,7 +4319,7 @@ CLOSED: [2017-08-26 Sat 15:18]
        ;(add-hook 'nxml-mode-hook (lambda () (emmet-mode t)))
 
        (fset 'xml-mode 'nxml-mode)
-       (validate-setq nxml-slash-auto-complete-flag t)
+       (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)
@@ -4331,16 +4334,7 @@ CLOSED: [2017-08-26 Sat 15:18]
            (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:
@@ -4350,7 +4344,8 @@ CLOSED: [2017-08-26 Sat 15:18]
  I use org-mode a lot and, having my config for this based on [[*Bernt%20Hansen][the config of Bernt Hansen]],
  it is quite extensive. Nevertheless, it starts out small, loading it.
  #+BEGIN_SRC emacs-lisp
- (require 'org)
+ (use-package org
+  :defines (my-texcmd org-export-latex-default-packages-alist org-export-latex-classes org-alphabetical-lists web-mode-enable-comment-keywords))
  #+END_SRC
 
  My browsers (Conkeror, Iceweasel) can store links in org-mode. For
@@ -4365,7 +4360,6 @@ CLOSED: [2017-08-26 Sat 15:18]
  directories.
  #+BEGIN_SRC emacs-lisp
  (setq org-agenda-files (quote ("~/org/"
-                                "~/org/nsb"
                                 )))
  (setq org-default-notes-file "~/org/notes.org")
  #+END_SRC
@@ -4425,8 +4419,9 @@ CLOSED: [2017-08-26 Sat 15:18]
 
  ;; Enable display of the time grid so we can see the marker for the current time
  (setq org-agenda-time-grid (quote ((daily today remove-match)
-                                    #("----------------" 0 16 (org-heading t))
-                                    (0800 1000 1200 1400 1500 1700 1900 2100))))
+                                    (0800 1000 1200 1400 1500 1700 1900 2100)
+                                    "......" "----------------")
+                                    ))
 
  ;; Display tags farther right
  (setq org-agenda-tags-column -102)
@@ -4483,9 +4478,7 @@ CLOSED: [2017-08-26 Sat 15:18]
  (appt-activate t)
 
  (setq org-agenda-log-mode-items (quote (closed clock state)))
- (if (> emacs-major-version 23)
-     (setq org-agenda-span 3)
-   (setq org-agenda-ndays 3))
+ (setq org-agenda-span 4)
 
  (setq org-agenda-show-all-dates t)
  (setq org-agenda-start-on-weekday nil)
@@ -4548,7 +4541,7 @@ CLOSED: [2017-08-26 Sat 15:18]
  (bind-key "<f11>"     'org-clock-goto)
  (bind-key "C-<f11>"   'org-clock-in)
  (bind-key "C-M-r"     'org-capture)
- (bind-key "C-c r"     'org-capture)
;(bind-key "C-c r"     'org-capture)
  (bind-key "C-S-<f12>" 'bh/save-then-publish)
  ;(bind-key "C-k" 'jj-org-kill-line org-mode-map)
 
@@ -4631,7 +4624,7 @@ CLOSED: [2017-08-26 Sat 15:18]
 
  ;; Capture templates for: TODO tasks, Notes, appointments, phone calls, and org-protocol
  ;; see http://orgmode.org/manual/Template-elements.html
- (setq org-capture-templates
+(setq org-capture-templates
        (quote (("t" "todo" entry (file "~/org/refile.org")
                 "* TODO %?\nAdded: %U\n"
                 :clock-in t :clock-resume t)
@@ -4639,7 +4632,7 @@ CLOSED: [2017-08-26 Sat 15:18]
                 "* TODO %?\nAdded: %U\n%a\n"
                 :clock-in t :clock-resume t)
                ("r" "respond" entry (file "~/org/refile.org")
-                "* TODO Respond to %:from on %:subject\nSCHEDULED: %t\nAdded: %U\n%a\n"
+                "* NEXT Respond to %:from on %:subject\nSCHEDULED: %t\nAdded: %U\n%a\n"
                 :clock-in t :clock-resume t :immediate-finish t)
                ("n" "note" entry (file "~/org/refile.org")
                 "* %? :NOTE:\nAdded: %U\n%a\n"
@@ -4651,7 +4644,10 @@ CLOSED: [2017-08-26 Sat 15:18]
                 "* %?\nAdded: %U\n"
                 :clock-in t :clock-resume t)
                ("w" "org-protocol" entry (file "~/org/refile.org")
-                "* TODO Review %c\nAdded: %U\n"
+                "* TODO Review %^{Title}\nSource: %u, %c\n #+BEGIN_QUOTE\n%i\n#+END_QUOTE\nAdded: %U\n\n\n%?"
+                :immediate-finish t)
+               ("W" "org-protocol link" entry (file "~/org/refile.org")
+                "* %? [[%:link][%:description]] \nAdded: %U"
                 :immediate-finish t)
                ("p" "Phone call" entry (file "~/org/refile.org")
                 "* PHONE %? :PHONE:\nAdded: %U"
@@ -4720,86 +4716,77 @@ CLOSED: [2017-08-26 Sat 15:18]
 
  ;; Custom agenda command definitions
  (setq org-agenda-custom-commands
-       (quote (("N" "Notes" tags "NOTE"
-                ((org-agenda-overriding-header "Notes")
-                 (org-tags-match-list-sublevels t)))
-               ("h" "Habits" tags-todo "STYLE=\"habit\""
-                ((org-agenda-overriding-header "Habits")
-                 (org-agenda-sorting-strategy
-                  '(todo-state-down effort-up category-keep))))
-               (" " "Agenda"
-                ((agenda "" nil)
-                 (tags "REFILE"
-                       ((org-agenda-overriding-header "Tasks to Refile")
-                        (org-tags-match-list-sublevels nil)))
-                 (tags-todo "-HOLD-CANCELLED/!"
-                            ((org-agenda-overriding-header "Projects")
-                             (org-agenda-skip-function 'bh/skip-non-projects)
-                             (org-agenda-sorting-strategy
-                              '(category-keep))))
-                 (tags-todo "-CANCELLED/!"
-                            ((org-agenda-overriding-header "Stuck Projects")
-                             (org-agenda-skip-function 'bh/skip-non-stuck-projects)))
-                 (tags-todo "-WAITING-CANCELLED/!NEXT"
-                            ((org-agenda-overriding-header "Next Tasks")
-                             (org-agenda-skip-function 'bh/skip-projects-and-habits-and-single-tasks)
-                             (org-agenda-todo-ignore-scheduled t)
-                             (org-agenda-todo-ignore-deadlines t)
-                             (org-agenda-todo-ignore-with-date t)
-                             (org-tags-match-list-sublevels t)
-                             (org-agenda-sorting-strategy
-                              '(todo-state-down effort-up category-keep))))
-                 (tags-todo "-REFILE-CANCELLED/!-HOLD-WAITING"
-                            ((org-agenda-overriding-header "Tasks")
-                             (org-agenda-skip-function 'bh/skip-project-tasks-maybe)
-                             (org-agenda-todo-ignore-scheduled t)
-                             (org-agenda-todo-ignore-deadlines t)
-                             (org-agenda-todo-ignore-with-date t)
-                             (org-agenda-sorting-strategy
-                              '(category-keep))))
-                 (tags-todo "-CANCELLED+WAITING/!"
-                            ((org-agenda-overriding-header "Waiting and Postponed Tasks")
-                             (org-agenda-skip-function 'bh/skip-stuck-projects)
-                             (org-tags-match-list-sublevels nil)
-                             (org-agenda-todo-ignore-scheduled 'future)
-                             (org-agenda-todo-ignore-deadlines 'future)))
-                 (tags "-REFILE/"
-                       ((org-agenda-overriding-header "Tasks to Archive")
-                        (org-agenda-skip-function 'bh/skip-non-archivable-tasks)
-                        (org-tags-match-list-sublevels nil))))
-                nil)
-               ("r" "Tasks to Refile" tags "REFILE"
-                ((org-agenda-overriding-header "Tasks to Refile")
-                 (org-tags-match-list-sublevels nil)))
-               ("#" "Stuck Projects" tags-todo "-CANCELLED/!"
-                ((org-agenda-overriding-header "Stuck Projects")
-                 (org-agenda-skip-function 'bh/skip-non-stuck-projects)))
-               ("n" "Next Tasks" tags-todo "-WAITING-CANCELLED/!NEXT"
-                ((org-agenda-overriding-header "Next Tasks")
-                 (org-agenda-skip-function 'bh/skip-projects-and-habits-and-single-tasks)
-                 (org-agenda-todo-ignore-scheduled t)
-                 (org-agenda-todo-ignore-deadlines t)
-                 (org-agenda-todo-ignore-with-date t)
-                 (org-tags-match-list-sublevels t)
-                 (org-agenda-sorting-strategy
-                  '(todo-state-down effort-up category-keep))))
-               ("R" "Tasks" tags-todo "-REFILE-CANCELLED/!-HOLD-WAITING"
-                ((org-agenda-overriding-header "Tasks")
-                 (org-agenda-skip-function 'bh/skip-project-tasks-maybe)
-                 (org-agenda-sorting-strategy
-                  '(category-keep))))
-               ("p" "Projects" tags-todo "-HOLD-CANCELLED/!"
-                ((org-agenda-overriding-header "Projects")
-                 (org-agenda-skip-function 'bh/skip-non-projects)
-                 (org-agenda-sorting-strategy
-                  '(category-keep))))
-               ("w" "Waiting Tasks" tags-todo "-CANCELLED+WAITING/!"
-                ((org-agenda-overriding-header "Waiting and Postponed tasks"))
-                (org-tags-match-list-sublevels nil))
-               ("A" "Tasks to Archive" tags "-REFILE/"
-                ((org-agenda-overriding-header "Tasks to Archive")
-                 (org-agenda-skip-function 'bh/skip-non-archivable-tasks)
-                 (org-tags-match-list-sublevels nil))))))
+      (quote (("N" "Notes" tags "NOTE"
+               ((org-agenda-overriding-header "Notes")
+                (org-tags-match-list-sublevels t)))
+              ("h" "Habits" tags-todo "STYLE=\"habit\""
+               ((org-agenda-overriding-header "Habits")
+                (org-agenda-sorting-strategy
+                 '(todo-state-down effort-up category-keep))))
+              (" " "Agenda"
+               ((agenda "" nil)
+                (tags "REFILE"
+                      ((org-agenda-overriding-header "Tasks to Refile")
+                       (org-tags-match-list-sublevels nil)))
+                (tags-todo "-CANCELLED/!"
+                           ((org-agenda-overriding-header "Stuck Projects")
+                            (org-agenda-skip-function 'bh/skip-non-stuck-projects)
+                            (org-agenda-sorting-strategy
+                             '(category-keep))))
+                (tags-todo "-HOLD-CANCELLED/!"
+                           ((org-agenda-overriding-header "Projects")
+                            (org-agenda-skip-function 'bh/skip-non-projects)
+                            (org-tags-match-list-sublevels 'indented)
+                            (org-agenda-sorting-strategy
+                             '(category-keep))))
+                (tags-todo "-CANCELLED/!NEXT"
+                           ((org-agenda-overriding-header (concat "Project Next Tasks"
+                                                                  (if bh/hide-scheduled-and-waiting-next-tasks
+                                                                      ""
+                                                                    " (including WAITING and SCHEDULED tasks)")))
+                            (org-agenda-skip-function 'bh/skip-projects-and-habits-and-single-tasks)
+                            (org-tags-match-list-sublevels t)
+                            (org-agenda-todo-ignore-scheduled bh/hide-scheduled-and-waiting-next-tasks)
+                            (org-agenda-todo-ignore-deadlines bh/hide-scheduled-and-waiting-next-tasks)
+                            (org-agenda-todo-ignore-with-date bh/hide-scheduled-and-waiting-next-tasks)
+                            (org-agenda-sorting-strategy
+                             '(todo-state-down effort-up category-keep))))
+                (tags-todo "-REFILE-CANCELLED-WAITING-HOLD/!"
+                           ((org-agenda-overriding-header (concat "Project Subtasks"
+                                                                  (if bh/hide-scheduled-and-waiting-next-tasks
+                                                                      ""
+                                                                    " (including WAITING and SCHEDULED tasks)")))
+                            (org-agenda-skip-function 'bh/skip-non-project-tasks)
+                            (org-agenda-todo-ignore-scheduled bh/hide-scheduled-and-waiting-next-tasks)
+                            (org-agenda-todo-ignore-deadlines bh/hide-scheduled-and-waiting-next-tasks)
+                            (org-agenda-todo-ignore-with-date bh/hide-scheduled-and-waiting-next-tasks)
+                            (org-agenda-sorting-strategy
+                             '(category-keep))))
+                (tags-todo "-REFILE-CANCELLED-WAITING-HOLD/!"
+                           ((org-agenda-overriding-header (concat "Standalone Tasks"
+                                                                  (if bh/hide-scheduled-and-waiting-next-tasks
+                                                                      ""
+                                                                    " (including WAITING and SCHEDULED tasks)")))
+                            (org-agenda-skip-function 'bh/skip-project-tasks)
+                            (org-agenda-todo-ignore-scheduled bh/hide-scheduled-and-waiting-next-tasks)
+                            (org-agenda-todo-ignore-deadlines bh/hide-scheduled-and-waiting-next-tasks)
+                            (org-agenda-todo-ignore-with-date bh/hide-scheduled-and-waiting-next-tasks)
+                            (org-agenda-sorting-strategy
+                             '(category-keep))))
+                (tags-todo "-CANCELLED+WAITING|HOLD/!"
+                           ((org-agenda-overriding-header (concat "Waiting and Postponed Tasks"
+                                                                  (if bh/hide-scheduled-and-waiting-next-tasks
+                                                                      ""
+                                                                    " (including WAITING and SCHEDULED tasks)")))
+                            (org-agenda-skip-function 'bh/skip-non-tasks)
+                            (org-tags-match-list-sublevels nil)
+                            (org-agenda-todo-ignore-scheduled bh/hide-scheduled-and-waiting-next-tasks)
+                            (org-agenda-todo-ignore-deadlines bh/hide-scheduled-and-waiting-next-tasks)))
+                (tags "-REFILE/"
+                      ((org-agenda-overriding-header "Tasks to Archive")
+                       (org-agenda-skip-function 'bh/skip-non-archivable-tasks)
+                       (org-tags-match-list-sublevels nil))))
+               nil))))
 
  ; Overwrite the current window with the agenda
  (setq org-agenda-window-setup 'current-window)
@@ -4949,7 +4936,7 @@ CLOSED: [2017-08-26 Sat 15:18]
           (ruby . t)
           (gnuplot . t)
           (clojure . t)
-          (shell . t)
+          ;(shell . t)
           (ledger . t)
           (org . t)
           (plantuml . t)
@@ -5023,9 +5010,9 @@ CLOSED: [2017-08-26 Sat 15:18]
  ; Do not use sub or superscripts - I currently don't need this functionality in my documents
  (setq org-export-with-sub-superscripts nil)
 
- (setq org-html-head-extra (concat
-                            "<link rel=\"stylesheet\" href=\"https://ganneff.de/stylesheet.css\" type=\"text/css\" />\n"
-                            ))
;; (setq org-html-head-extra (concat
;;                            "<link rel=\"stylesheet\" href=\"https://ganneff.de/stylesheet.css\" type=\"text/css\" />\n"
;;                            ))
  (setq org-html-head-include-default-style nil)
  ; Do not generate internal css formatting for HTML exports
  (setq org-export-htmlize-output-type (quote css))
@@ -5086,17 +5073,17 @@ CLOSED: [2017-08-26 Sat 15:18]
  (defun my-auto-tex-cmd ()
    "When exporting from .org with latex, automatically run latex,
       pdflatex, or xelatex as appropriate, using latexmk."
-   (let ((texcmd)))
+   (let ((my-texcmd)))
    ;; default command: oldstyle latex via dvi
-   (setq texcmd "latexmk -dvi -pdfps -quiet %f")
+   (setq my-texcmd "latexmk -dvi -pdfps -quiet %f")
    ;; pdflatex -> .pdf
    (if (string-match "LATEX_CMD: pdflatex" (buffer-string))
-       (setq texcmd "latexmk -pdf -quiet %f"))
+       (setq my-texcmd "latexmk -pdf -quiet %f"))
    ;; xelatex -> .pdf
    (if (string-match "LATEX_CMD: xelatex" (buffer-string))
-       (setq texcmd "latexmk -pdflatex='xelatex -shell-escape' -pdf -quiet %f"))
+       (setq my-texcmd "latexmk -pdflatex='xelatex -shell-escape' -pdf -quiet %f"))
    ;; LaTeX compilation command
-   (setq org-latex-to-pdf-process (list texcmd)))
+   (setq org-latex-to-pdf-process (list my-texcmd)))
 
  (add-hook 'org-export-latex-after-initial-vars-hook 'my-auto-tex-cmd)
 
@@ -5389,6 +5376,24 @@ CLOSED: [2017-08-26 Sat 15:18]
  #+BEGIN_SRC emacs-lisp
  (require 'org-checklist)
  #+END_SRC
+** open junk file
+[2019-03-30 Sat 10:58]
+Quickly open a "junk" file to play with something.
+#+BEGIN_SRC emacs-lisp :tangle yes
+(use-package open-junk-file
+  :ensure t
+  :bind ("C-x C-a" . open-junk-file)
+  :config
+  (progn
+    (setq open-junk-file-format (expand-file-name "%Y-%m-%dT%H:%M:%S%z." jj-cache-dir))))
+#+END_SRC
+** password store
+[2019-01-25 Fri 22:41]
+#+BEGIN_SRC emacs-lisp
+(use-package pass
+  :ensure t
+  )
+#+END_SRC
 ** perl / cperl
  I like /cperl-mode/ a bit more than the default /perl-mode/, so set it
  up here to be used.
@@ -5405,7 +5410,7 @@ CLOSED: [2017-08-26 Sat 15:18]
      (add-to-list 'interpreter-mode-alist '("perl5" . cperl-mode))
      (add-to-list 'interpreter-mode-alist '("miniperl" . cperl-mode))
      (setq cperl-invalid-face nil)
-     (validate-setq cperl-close-paren-offset -4
+     (setq cperl-close-paren-offset -4
            cperl-continued-statement-offset 0
            cperl-indent-level 4
            cperl-indent-parens-as-block t
@@ -5434,6 +5439,44 @@ CLOSED: [2017-08-26 Sat 15:18]
                  (eldoc-mode))))
    )
  #+END_SRC
+** perspective
+[2018-06-12 Di 22:51]
+
+provides tagged workspaces in Emacs, similar to workspaces in windows
+managers such as Awesome and XMonad (and somewhat similar to multiple
+desktops in Gnome or Spaces in OS X).
+
+perspective.el provides multiple workspaces (or "perspectives") for
+each Emacs frame. This makes it easy to work on many separate projects
+without getting lost in all the buffers.
+
+Each perspective is composed of a window configuration and a set of
+buffers. Switching to a perspective activates its window
+configuration, and when in a perspective only its buffers are
+available by default.
+
+Commands are all prefixed by C-x x. Here are the main commands:
+
+Key -- Command
+s -- persp-switch: Query a perspective to switch or create
+k -- persp-remove-buffer: Query a buffer to remove from current perspective
+c -- persp-kill : Query a perspective to kill
+r -- persp-rename: Rename current perspective
+a -- persp-add-buffer: Query an open buffer to add to current perspective
+A -- persp-set-buffer: Add buffer to current perspective and remove it from all others
+i -- persp-import: Import a given perspective from another frame.
+n, <right> -- persp-next : Switch to next perspective
+p, <left> -- persp-prev: Switch to previous perspective
+#+BEGIN_SRC emacs-lisp :tangle no
+(use-package perspective
+  :ensure t
+  :disabled
+  :config
+  (progn
+    (setq persp-mode-prefix-key (kbd "C-c w"))
+    (persp-mode)
+))
+#+END_SRC
 ** proced
  [2016-11-01 Tue 17:57]
  #+BEGIN_SRC emacs-lisp
@@ -5479,10 +5522,15 @@ CLOSED: [2017-08-26 Sat 15:18]
  (use-package projectile
    :ensure projectile
    :commands (projectile-find-file projectile-switch-project)
+   :bind-keymap ("C-c p" . projectile-command-map)
+   :init
+  (progn
+    (projectile-mode +1))
    :config
    (progn
      (projectile-mode)
      (setq projectile-enable-caching t)
+     (setq projectile-completion-system 'ivy)
      (use-package flx-ido
        :ensure flx-ido
        :config
@@ -5491,12 +5539,12 @@ CLOSED: [2017-08-26 Sat 15:18]
          (setq ido-enable-flex-matching t)
          (setq ido-use-faces nil)
          ))
-     ; See https://github.com/ericdanan/counsel-projectile
+                                         ; See https://github.com/ericdanan/counsel-projectile
      (use-package counsel-projectile
        :ensure t
        :config
        (progn
-         (counsel-projectile-on))
+         (counsel-projectile-mode))
        )
      )
    )
@@ -5519,163 +5567,23 @@ CLOSED: [2017-08-26 Sat 15:18]
    :config
    (progn
      (defun my-puppet-mode-hook ()
-       (validate-setq require-final-newline nil))
+       (setq require-final-newline nil))
      (add-hook 'puppet-mode-hook 'my-puppet-mode-hook)
      (use-package puppet-ext)))
  #+END_SRC
+** python
+[2018-12-30 Sun 17:25]
+Emacs handles python quite well, but we can improve things with anaconda mode.
 
-** CANCELLED python                                              :CANCELLED:
-CLOSED: [2017-08-26 Sat 15:21]
-:LOGBOOK:
-- State "CANCELLED"  from              [2017-08-26 Sat 15:21]
-:END:
- Use elpy for the emacs python fun, but dont let it initialize all the
- various variables. Elpy author may like them, but I'm not him...
- #+BEGIN_SRC emacs-lisp :tangle no
- (use-package elpy
-   :defer t
-   :mode ("\.py" . python-mode)
-   :init
-   (progn
-     (safe-load (concat jj-elisp-dir "/elpy/elpy-autoloads.el"))
-     )
-   :config
-   (progn
-
-     (use-package nose
-       :ensure nose
-       :commands (nosetests-all nosetests-module nosetests-one
-                                nosetests-failed nosetests-pdb-all
-                                nosetests-pdb-module nosetests-pdb-one)
-       )
-
-     (use-package pyvenv
-       :ensure pyvenv
-       :commands (pyvenv-activate pyvenv-deactivate pyvenv-mode pyvenv-restart-python)
-       )
-
-     (use-package idomenu
-       :ensure idomenu
-       :commands (idomenu)
-       :defer t)
-
-     (use-package find-file-in-project
-       :ensure t
-       :commands (find-file-in-project ffip-project-files ffip ))
-
-     (use-package fuzzy
-       :ensure t)
-
-     ;; Local variables in `python-mode'. This is not removed when Elpy
-     ;; is disabled, which can cause some confusion.
-     (add-hook 'python-mode-hook 'elpy-initialize-local-variables)
-
-     (defun my-python-mode-hook ()
-       (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)))
-       (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.
-     (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.
-     (validate-setq flymake-start-syntax-check-on-newline nil)
-
-     ;; `ac-auto-show-menu': Short timeout because the menu is great.
-     (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.
-     (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
-     ;; binding. This is a bad interface to set the trigger key. Stop
-     ;; doing this.
-     (let ((old (when (boundp 'yas-trigger-key)
-                  yas-trigger-key)))
-       (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))
-       (validate-setq yas-snippet-dirs (list yas-snippet-dirs)))
-     (add-to-list 'yas-snippet-dirs
-                  (concat (file-name-directory (locate-library "elpy"))
-                          "snippets/")
-                  t)
-
-     ;; Now load yasnippets.
-     (yas-reload-all)
-     (elpy-enable t)
-     (elpy-use-ipython)))
-
- #+END_SRC
-
- Below is old setup
- #+BEGIN_SRC emacs-lisp :tangle no
- (autoload 'python-mode "python-mode" "Python Mode." t)
- (add-auto-mode 'python-mode "\\.py\\'")
- (add-auto-mode 'python-mode "\\.py$")
- (add-auto-mode 'python-mode "SConstruct\\'")
- (add-auto-mode 'python-mode "SConscript\\'")
- (add-to-list 'interpreter-mode-alist '("python" . python-mode))
-
- (after 'python-mode
-   (set-variable 'py-indent-offset 4)
-   (set-variable 'py-smart-indentation nil)
-   (set-variable 'indent-tabs-mode nil)
-   (define-key python-mode-map "\C-m" 'newline-and-indent)
-   (turn-on-eldoc-mode)
-   (defun python-auto-fill-comments-only ()
-     (auto-fill-mode 1)
-     (set (make-local-variable 'fill-nobreak-predicate)
-          (lambda ()
-            (not (python-in-string/comment)))))
-   (add-hook 'python-mode-hook
-             (lambda ()
-               (python-auto-fill-comments-only)))
-    ;; pymacs
-   (autoload 'pymacs-apply "pymacs")
-   (autoload 'pymacs-call "pymacs")
-   (autoload 'pymacs-eval "pymacs" nil t)
-   (autoload 'pymacs-exec "pymacs" nil t)
-   (autoload 'pymacs-load "pymacs" nil t))
- #+END_SRC
+#+BEGIN_SRC emacs-lisp
+(use-package anaconda-mode
+  :ensure t
+  :config
+  (progn
+  (add-hook 'python-mode-hook 'anaconda-mode)
+  (add-hook 'python-mode-hook 'anaconda-eldoc-mode)))
+#+END_SRC
 
- If an =ipython= executable is on the path, then assume that IPython is
- the preferred method python evaluation.
- #+BEGIN_SRC emacs-lisp :tangle no
- (when (executable-find "ipython")
-   (require 'ipython)
-   (validate-setq org-babel-python-mode 'python-mode))
-
- (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")
- (validate-setq python-shell-completion-module-string-code
-    "';'.join(module_completion('''%s'''))\n")
- (validate-setq python-shell-completion-string-code
-    "';'.join(get_ipython().Completer.all_completions('''%s'''))\n")
- #+END_SRC
 ** rainbow-delimiters
  [2013-04-09 Di 23:38]
  [[http://www.emacswiki.org/emacs/RainbowDelimiters][EmacsWiki: Rainbow Delimiters]] is a “rainbow parentheses”-like mode
@@ -5705,7 +5613,7 @@ Saner regex syntax
    :commands re-builder
    :defer t
    :config
-   (validate-setq reb-re-syntax 'string))
+   (setq reb-re-syntax 'string))
  #+END_SRC
 ** recentf
  [2014-05-19 Mo 22:56]
@@ -5719,8 +5627,8 @@ Saner regex syntax
    :init
    (progn
      (recentf-mode 1)
-     (validate-setq recentf-max-menu-items 25)
-     (validate-setq recentf-save-file (expand-file-name ".recentf" jj-cache-dir))
+     (setq recentf-max-menu-items 25)
+     (setq recentf-save-file (expand-file-name ".recentf" jj-cache-dir))
 
      (defun recentf-add-dired-directory ()
        (if (and dired-directory
@@ -5734,21 +5642,6 @@ Saner regex syntax
 
      (add-hook 'dired-mode-hook 'recentf-add-dired-directory)))
  #+END_SRC
-** CANCELLED Region bindings mode                                :CANCELLED:
-CLOSED: [2017-08-26 Sat 15:21]
-:LOGBOOK:
-- State "CANCELLED"  from              [2017-08-26 Sat 15:21]
-:END:
- [2013-05-01 Wed 22:51]
- This mode allows to have keybindings that are only alive when the
- region is active. Helpful for things that only do any useful action
- then, like for example the [[*multiple%20cursors][multiple cursors]] mode I load later.
- #+BEGIN_SRC emacs-lisp :tangle no
- (use-package region-bindings-mode
-   :ensure region-bindings-mode
-   :config
-   (region-bindings-mode-enable))
- #+END_SRC
 ** ruby
  [2013-05-22 Wed 22:33]
  Programming in ruby...
@@ -5769,23 +5662,6 @@ CLOSED: [2017-08-26 Sat 15:21]
    :defer t
    :config
    (progn
-     (use-package yari
-       :ensure t
-       :init
-       (progn
-         (defvar yari-helm-source-ri-pages
-           '((name . "RI documentation")
-             (candidates . (lambda () (yari-ruby-obarray)))
-             (action  ("Show with Yari" . yari))
-             (candidate-number-limit . 300)
-             (requires-pattern . 2)
-             "Source for completing RI documentation."))
-
-         (defun helm-yari (&optional rehash)
-           (interactive (list current-prefix-arg))
-           (when current-prefix-arg (yari-ruby-obarray rehash))
-           (helm 'yari-helm-source-ri-pages (yari-symbol-at-point)))))
-
      (defun my-ruby-smart-return ()
        (interactive)
        (when (memq (char-after) '(?\| ?\" ?\'))
@@ -5818,33 +5694,48 @@ CLOSED: [2017-08-26 Sat 15:21]
                    (run-hooks 'prog-mode-hook))))
    ))
  #+END_SRC
-** CANCELLED Rust                                                :CANCELLED:
-CLOSED: [2017-08-26 Sat 15:22]
+** Rust
 :LOGBOOK:
+- State "NEXT"       from "CANCELLED"  [2017-12-08 Fri 16:02]
+- State "CANCELLED"  from              [2017-12-08 Fri 09:38]
+- State "NEXT"       from "CANCELLED"  [2017-12-08 Fri 09:28]
 - State "CANCELLED"  from              [2017-08-26 Sat 15:22]
 :END:
  [2017-08-03 Thu 09:13]
- #+BEGIN_SRC emacs-lisp :tangle no
+ #+BEGIN_SRC emacs-lisp
  (use-package rust-mode
    :ensure t
    :config
    (progn
-     (use-package :cargo
+     (define-key rust-mode-map (kbd "TAB") #'company-indent-or-complete-common)
+     (setq company-tooltip-align-annotations t)
+     (setq rust-format-on-save t)
+     (add-hook 'rust-mode-hook
+               (lambda ()
+                 (local-set-key (kbd "C-c <tab>") #'rust-format-buffer)))
+
+     (use-package cargo
        :ensure t
        :config
        (progn
-         (add-hook 'rust-mode-hook 'cargo-minor-mode)))
+         (add-hook 'rust-mode-hook 'cargo-minor-mode))
+       :delight cargo-mode)))
 
-    
+ (use-package racer
+   :ensure t
+   :config
+   (progn
+     (add-hook 'rust-mode-hook #'racer-mode)
+     (add-hook 'racer-mode-hook #'eldoc-mode)
+     (add-hook 'racer-mode-hook #'company-mode)
      )
-   )
- #+END_SRC
-** StarDict dictionary lookup
- [2017-01-16 Mon 18:26]
- Look up stuff in the Webster dictionary using stardict
- #+BEGIN_SRC emacs-lisp
- (use-package sdcv-mode
-   :bind ("C-x d" . sdcv-search))
+   :delight racer-mode)
+
+ (use-package flycheck-rust
+   :ensure t
+   :init
+   (progn
+     (add-hook 'flycheck-mode-hook #'flycheck-rust-setup)))
  #+END_SRC
 ** sessions                                                          :FIXME:
  [2013-05-22 Wed 22:40]
@@ -5908,7 +5799,7 @@ CLOSED: [2017-08-26 Sat 15:22]
                   (outline-invisible-p))
          (if (eq major-mode 'org-mode)
              (org-reveal)
-           (show-subtree))))
+           (outline-show-subtree))))
 
      (add-hook 'session-after-jump-to-last-change-hook
                'le::maybe-reveal)
@@ -5938,14 +5829,15 @@ CLOSED: [2017-08-26 Sat 15:22]
    :init
    (progn
      (setq savehist-file (expand-file-name "savehist" jj-cache-dir))
-     (setq history-length 1000))
-   :config
-   (progn
+     (setq history-length 1000)
+     (savehist-mode +1)
      (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)))
+     (setq savehist-autosave-interval 60)
+     (setq savehist-save-minibuffer-history t
+           savehist-autosave-interval 180)
+     ))
  #+END_SRC
 
 *** saveplace
@@ -5967,7 +5859,7 @@ CLOSED: [2017-08-26 Sat 15:22]
    :commands (httpd-start httpd-stop)
    :config
    (progn
-     (validate-setq httpd-root "/srv/www")
+     (setq httpd-root "/srv/www")
      )
  )
  #+END_SRC
@@ -5981,8 +5873,8 @@ CLOSED: [2017-08-26 Sat 15:22]
      (defvar sh-script-initialized nil)
      (defun initialize-sh-script ()
        (unless sh-script-initialized
-         (validate-setq sh-script-initialized t)
-         (validate-setq sh-indent-comment t)
+         (setq sh-script-initialized t)
+         (setq sh-indent-comment t)
          (info-lookup-add-help :mode 'shell-script-mode
                                :regexp ".*"
                                :doc-spec
@@ -6035,11 +5927,10 @@ CLOSED: [2017-08-26 Sat 15:22]
    :commands time-stamp
    :config
    (progn
-     (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)))
+     (add-hook 'write-file-functions 'time-stamp)
+     (setq time-stamp-active t)
+     (setq time-stamp-format "%02H:%02M:%02S (%z) - %02d.%02m.%:y from %u (%U) on %s")
+     (setq time-stamp-time-zone nil)))
  #+END_SRC
 
 ** tiny-tools
@@ -6071,14 +5962,14 @@ CLOSED: [2017-08-26 Sat 15:22]
    :defer t
    :config
    (progn
-     ;(validate-setq tramp-persistency-file-name (expand-file-name "tramp" jj-cache-dir))
-     (validate-setq shell-prompt-pattern "^[^a-zA-Z].*[#$%>] *")
+     ;(setq tramp-persistency-file-name (expand-file-name "tramp" jj-cache-dir))
+     (setq shell-prompt-pattern "^[^a-zA-Z].*[#$%>] *")
      ;(add-to-list 'tramp-default-method-alist '("\\`localhost\\'" "\\`root\\'" "su"))
-     (validate-setq tramp-default-method "sshx")
+     (setq tramp-default-method "sshx")
      ;(tramp-set-completion-function "ssh"
      ;                               '((tramp-parse-sconfig "/etc/ssh_config")
      ;                                 (tramp-parse-sconfig "~/.ssh/config")))
-     ;(validate-setq tramp-verbose 5)
+     ;(setq tramp-verbose 5)
      ))
  #+END_SRC
 
@@ -6105,8 +5996,8 @@ CLOSED: [2017-08-26 Sat 15:22]
    :init
    (progn
      (global-undo-tree-mode)
-     (validate-setq undo-tree-visualizer-timestamps t)
-     (validate-setq undo-tree-visualizer-diff t)
+     (setq undo-tree-visualizer-timestamps t)
+     (setq undo-tree-visualizer-diff t)
      ;; Keep region when undoing in region
      (defadvice undo-tree-undo (around keep-region activate)
        (if (use-region-p)
@@ -6125,9 +6016,9 @@ CLOSED: [2017-08-26 Sat 15:22]
  (use-package uniquify
    :init
    (progn
-     (validate-setq uniquify-buffer-name-style 'post-forward)
-     (validate-setq uniquify-after-kill-buffer-p t)
-     (validate-setq uniquify-ignore-buffers-re "^\\*")))
+     (setq uniquify-buffer-name-style 'post-forward)
+     (setq uniquify-after-kill-buffer-p t)
+     (setq uniquify-ignore-buffers-re "^\\*")))
  #+END_SRC
 
 ** url
@@ -6135,8 +6026,8 @@ CLOSED: [2017-08-26 Sat 15:22]
  set it to send Accept-language header and tell it to not send email,
  operating system or location info.
  #+BEGIN_SRC emacs-lisp
- (validate-setq url-mime-language-string "de,en")
- (validate-setq url-privacy-level (quote (email os lastloc)))
+ (setq url-mime-language-string "de,en")
+ (setq url-privacy-level (quote (email os lastloc)))
  #+END_SRC
 ** visual-regexp
  [2014-06-01 Sun 21:38]
@@ -6145,11 +6036,23 @@ CLOSED: [2017-08-26 Sat 15:22]
  #+BEGIN_SRC emacs-lisp
  (use-package visual-regexp
    :ensure visual-regexp
+   :commands (vr/replace vr/query-replace vr/mc-mark)
    :bind (("C-M-%" . vr/replace)
           ("M-%" . vr/query-replace)
           ("C-c m" . vr/mc-mark))
    :defer t)
  #+END_SRC
+** visual-regexp-steroids
+[2018-12-29 Sat 22:33]
+And [[https://github.com/benma/visual-regexp-steroids.el][visual-regexp-steroids]] is enabling the use of other regexp
+engines, by default it uses python.
+#+BEGIN_SRC emacs-lisp
+(use-package visual-regexp-steroids
+   :ensure t
+   :requires (visual-regexp)
+   :after (visual-regexp)
+)
+#+END_SRC
 ** volatile highlights
  [2013-04-21 So 20:31]
  VolatileHighlights highlights changes to the buffer caused by commands
@@ -6159,9 +6062,9 @@ CLOSED: [2017-08-26 Sat 15:22]
  #+BEGIN_SRC emacs-lisp
  (use-package volatile-highlights
    :ensure volatile-highlights
+   :diminish volatile-highlights-mode
    :init
-   (volatile-highlights-mode t)
-   :diminish volatile-highlights-mode)
+   (volatile-highlights-mode t))
  #+END_SRC
 ** wgrep
  [2015-09-28 Mon 14:48]
@@ -6173,27 +6076,27 @@ CLOSED: [2017-08-26 Sat 15:22]
    (add-hook 'grep-setup-hook 'wgrep-setup)
    :config
    (progn
-     (validate-setq wgrep-auto-save-buffer t)
-     (validate-setq wgrep-enable-key "r")
+     (setq wgrep-auto-save-buffer t)
+     (setq wgrep-enable-key "r")
      )
    )
  #+END_SRC
-** CANCELLED windmove                                            :CANCELLED:
-CLOSED: [2017-08-26 Sat 15:29]
-:LOGBOOK:
-- State "CANCELLED"  from              [2017-08-26 Sat 15:29]
-:END:
- [2015-02-23 Mon 14:38]
- Easily move between splitted windows.
- #+BEGIN_SRC emacs-lisp :tangle no
- (use-package windmove
-   :init
-   (progn
-     (windmove-default-keybindings)
-     ; maybe also:
-     ;(validate-setq org-replace-disputed-keys t)
-     ))
- #+END_SRC
+** which key
+[2018-12-30 Sun 17:08]
+#+BEGIN_SRC emacs-lisp
+(use-package which-key
+  :ensure t
+  :diminish which-key-mode
+  :init (which-key-mode)
+  :config
+  (progn
+    (setq which-key-sort-order 'which-key-local-then-key-order)
+    (setq which-key-idle-delay 0.4)
+    (setq which-key-idle-secondary-delay 0)
+    (setq which-key-show-remaining-keys t)
+    (setq which-key-compute-remaps t)
+    ))
+#+END_SRC
 ** winner mode - undo and redo window configuration
  [2015-02-24 Tue 23:11]
  =winner-mode= lets you use =C-c <left>= and =C-c <right>= to switch between
@@ -6206,21 +6109,6 @@ CLOSED: [2017-08-26 Sat 15:29]
    :defer t
    :config (winner-mode 1))
  #+END_SRC
-** CANCELLED writegood                                           :CANCELLED:
-CLOSED: [2017-08-26 Sat 15:30]
-:LOGBOOK:
-- State "CANCELLED"  from              [2017-08-26 Sat 15:30]
-:END:
- This highlights some /weaselwords/, a mode to /aid in finding common
- writing problems/...
- [2013-04-27 Sa 23:29]
- #+BEGIN_SRC emacs-lisp :tangle no
- (use-package writegood-mode
-   :ensure writegood-mode
-   :defer t
-   :init
-   (bind-key "C-c g" 'writegood-mode))
- #+END_SRC
 ** web-mode
  [2014-06-01 Sun 22:48]
  #+BEGIN_SRC emacs-lisp
@@ -6248,8 +6136,8 @@ CLOSED: [2017-08-26 Sat 15:30]
                  (setq web-mode-enable-current-element-highlight t))))
    :config
    (progn
-     (validate-setq web-mode-enable-current-element-highlight t)
-     (validate-setq web-mode-ac-sources-alist
+     (setq web-mode-enable-current-element-highlight t)
+     (setq web-mode-ac-sources-alist
            '(("css" . (ac-source-css-property))
              ("html" . (ac-source-words-in-buffer ac-source-abbrev))))
      (use-package impatient-mode
@@ -6278,23 +6166,30 @@ CLOSED: [2017-08-26 Sat 15:30]
  readable/editable without getting a big headache.
  #+BEGIN_SRC emacs-lisp
  (use-package yaml-mode
-   :ensure yaml-mode
+   :ensure t
+   :defer t
    :mode ("\\.\\(e?ya?\\|ra\\)ml\\'" . yaml-mode)
    :config
-     (bind-key "C-m" 'newline-and-indent yaml-mode-map ))
+   (progn
+     (add-hook 'yaml-mode-hook
+             (lambda ()
+               (setq-local paragraph-separate ".*>-$\\|[   \f]*$")
+               (setq-local paragraph-start paragraph-separate)
+               (run-hooks 'prog-mode-hook)))
+     (bind-key "C-m" 'newline-and-indent yaml-mode-map )))
  #+END_SRC
 ** yasnippet
  [2013-04-27 Sa 23:16]
  Yasnippet is a template system. Type an abbreviation, expand it into
  whatever the snippet holds.
  #+BEGIN_SRC emacs-lisp
- ;(validate-setq yas-snippet-dirs (expand-file-name "yasnippet/snippets" jj-elisp-dir))
+ ;(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
-   :bind (:yas-minor-mode-map
+   :bind (:map yas-minor-mode-map
           ("\t" . hippie-expand))
    :config
    (progn
@@ -6302,7 +6197,15 @@ CLOSED: [2017-08-26 Sat 15:30]
      (add-to-list 'hippie-expand-try-functions-list
                   'yas-hippie-try-expand)
      (yas-global-mode 1)
-     (validate-setq yas-expand-only-for-last-commands '(self-insert-command))
-     (validate-setq yas-snippet-dirs (expand-file-name "snippets" jj-dir))
+     (setq yas-expand-only-for-last-commands '(self-insert-command))
+     (setq yas-snippet-dirs (expand-file-name "snippets" jj-dir))
      ))
  #+END_SRC
+** zop-to-char
+[2018-12-30 Sun 23:11]
+#+BEGIN_SRC emacs-lisp
+(use-package zop-to-char                ; Better zapping
+  :ensure t
+  :bind (("M-z" . zop-to-char)
+         ("M-Z" . zop-up-to-char)))
+#+END_SRC
\ No newline at end of file