updates
[emacs.git] / .emacs.d / config / emacs.org
index 2ccd0ca..61d5706 100644 (file)
@@ -79,63 +79,58 @@ https://github.com/jwiegley/use-package
 *** elpa
 The Emacs Lisp Package Archive contains things I want.
 #+BEGIN_SRC emacs-lisp :tangle yes
-  (when (> emacs-major-version 23)
-    (require 'package)
-    (setq package-user-dir (expand-file-name "elpa" jj-elisp-dir))
-    (package-initialize)
-    (add-to-list 'package-archives '("marmalade"    . "http://marmalade-repo.org/packages/"))
-    (add-to-list 'package-archives '("melpa-stable" . "http://melpa-stable.milkbox.net/packages/"))
-    (add-to-list 'package-archives '("melpa"        . "http://melpa.milkbox.net/packages/"))
-    (add-to-list 'package-archives '("elpy"         . "http://jorgenschaefer.github.io/packages/"))
-    (add-to-list 'package-archives '("gnu"          . "http://elpa.gnu.org/packages/"))
-    )
+(when (> emacs-major-version 23)
+  (require 'package)
+  (setq package-user-dir (expand-file-name "elpa" jj-elisp-dir))
+  (dolist (source '(("melpa" . "http://melpa.org/packages/")
+                    ("melpa-stable" . "http://stable.melpa.org/packages/")
+                    ("marmalade" . "http://marmalade-repo.org/packages/")
+                    ("elpy"         . "http://jorgenschaefer.github.io/packages/")
+                    ("elpa" . "http://elpa.gnu.org/packages/")
+))
+    (add-to-list 'package-archives source t))
+  (package-initialize)
+)
 #+END_SRC
 
 ** Path settings
 *** Load path
 We need to define the load-path. As I have lots of things I add
-locally, its getting a few entries. I only leave out org-mode here, as
-that is already done in =init.el=.
+locally, its getting a few entries. I disliked the repeated
+/add-to-list/ lines, so I now just take all subdirectories of
+jj-elisp-dir and add them.
 
-I also disliked the repeated /add-to-list/ lines, so I now just have
-one variable and go over that in a loop.
+Additionally I also ensure that files in there are recompiled, when
+neccessary.
 #+BEGIN_SRC emacs-lisp :tangle yes
-(defvar jj-elisp-subdirs '(local gnus icicle org/contrib tiny mo-git-blame cedet
-                           cedet/eieio ecb jdee/lisp sunrise multiple-cursors
-                           auto-complete yasnippet magit mmm emms/lisp
-                           elpy find-file-in-project fuzzy idomenu
-                           popup git-rebase-mode git-commit-mode)
-  "List of subdirectories in jj-elisp-dir to add to load-path")
-
-(let (dirval)
-  (dolist (dirval jj-elisp-subdirs)
-    (let ((name (expand-file-name (symbol-name dirval) jj-elisp-dir)))
-      (when (file-exists-p name)
-          (add-to-list 'load-path name)))))
-;; For older emacsen we need an extra directory, which should be at
-;; THE END of the load path
-(when (version< emacs-version "24")
-  (add-to-list 'load-path (expand-file-name "emacs23" jj-elisp-dir) t))
-
+(dolist
+    (project (directory-files jj-elisp-dir t "\\w+"))
+  (when (file-directory-p project)
+    (if (string= project "emacs23")
+        (when (version< emacs-version "24")
+          (add-to-list 'load-path project))
+      (add-to-list 'load-path project))
+    ;(byte-recompile-directory project 0)
+   ))
 #+END_SRC
 
 *** Info path
 Help emacs to find the info files
 #+BEGIN_SRC emacs-lisp :tangle no
-(setq Info-directory-list '("~/emacs/info"
-                            "/usr/local/share/info/"
-                            "/usr/local/info/"
-                            "/usr/local/gnu/info/"
-                            "/usr/local/gnu/lib/info/"
-                            "/usr/local/gnu/lib/emacs/info/"
-                            "/usr/local/emacs/info/"
-                            "/usr/local/lib/info/"
-                            "/usr/local/lib/emacs/info/"
-                            "/usr/share/info/emacs-23"
-                            "/usr/share/info/"
-                            "/usr/share/info/"))
+(setq Info-directory-list (cons jj-info-dir
+                                '("/usr/local/share/info/"
+                                  "/usr/local/info/"
+                                  "/usr/local/gnu/info/"
+                                  "/usr/local/gnu/lib/info/"
+                                  "/usr/local/gnu/lib/emacs/info/"
+                                  "/usr/local/emacs/info/"
+                                  "/usr/local/lib/info/"
+                                  "/usr/local/lib/emacs/info/"
+                                  "/usr/share/info/emacs-23"
+                                  "/usr/share/info/"
+                                  "/usr/share/info/")))
 (setq Info-default-directory-list
-      (cons "~/emacs/info" Info-default-directory-list))
+      (cons jj-info-dir Info-default-directory-list))
 #+END_SRC
 
 ** Interface related
@@ -155,8 +150,10 @@ Usually I want the lines to break at 72 characters.
 #+END_SRC
 
 And it is nice to have a final newline in files.
+(Now off, ethan-wspace is doing it better).
 #+BEGIN_SRC emacs-lisp :tangle yes
-(setq require-final-newline t)
+(setq require-final-newline nil)
+(setq mode-require-final-newline nil)
 #+END_SRC
 
 After I typed 300 characters or took a break for more than a minute it
@@ -271,9 +268,8 @@ I do not want my cursor to blink.
 I don't want to see the menu-bar, tool-bar or scrollbar.
 #+BEGIN_SRC emacs-lisp :tangle yes
 (when window-system
-  (menu-bar-mode -1)
-  (tool-bar-mode -1)
-  (set-scroll-bar-mode nil))
+  (dolist (mode '(menu-bar-mode tool-bar-mode scroll-bar-mode))
+  (when (fboundp mode) (funcall mode -1))))
 #+END_SRC
 **** When using emacs in daemon mode
 Emacs has a very nice mode where it detaches itself and runs as daemon -
@@ -315,12 +311,14 @@ Size indication lets me know how far I am in a buffer.
 And modeline-posn is great. It will hilight the column number in the
 modeline in red as soon as you are over the defined limit.
 
+
 #+BEGIN_SRC emacs-lisp :tangle yes
 (line-number-mode 1)
 (column-number-mode 1)
 (size-indication-mode 1)
 (display-time-mode 1)
 (setq display-time-day-and-date nil)
+(setq display-time-default-load-average nil)
 (setq display-time-24hr-format t)
 (setq modelinepos-column-limit 72)
 
@@ -358,7 +356,8 @@ character(s).
       (org-mode . "Ω")
       (org-indent-mode . "")
       (sh-mode . " Σ")
-      (nxhtml-mode . "nx"))
+      (nxhtml-mode . "nx")
+      (subword-mode . ""))
 
     "Alist for `clean-mode-line'.
 
@@ -410,7 +409,7 @@ Shell. zsh in my case.
 
 *** Emacs shell
 Basic settings for emacs integrated shell
-#+BEGIN_SRC emacs-lisp :tangle yes
+#+BEGIN_SRC emacs-lisp :tangle no
 (use-package eshell
   :defer t
   :init
@@ -424,29 +423,29 @@ Basic settings for emacs integrated shell
             (delete-region (match-beginning 0) (match-end 0))
             (goto-char beg)
             (insert "spawn "))))
-
       (add-hook 'eshell-expand-input-functions 'eshell-spawn-external-command)
-
       (eval-after-load "em-unix"
         '(progn
            (unintern 'eshell/su)
            (unintern 'eshell/sudo))))
-
     (add-hook 'eshell-first-time-mode-hook 'eshell-initialize)
-
-    (setq eshell-cmpl-cycle-completions nil
-          eshell-save-history-on-exit t
-          eshell-cmpl-dir-ignore "\\`\\(\\.\\.?\\|CVS\\|\\.svn\\|\\.git\\)/\\'")
     )
   :config
   (progn
     (require 'em-cmpl)
     (require 'em-prompt)
     (require 'em-term)
-
+    (use-package f
+      :ensure f)
+    (setq eshell-cmpl-cycle-completions nil
+          eshell-save-history-on-exit t
+          eshell-cmpl-dir-ignore "\\`\\(\\.\\.?\\|CVS\\|\\.svn\\|\\.git\\)/\\'")
     (setenv "PAGER" "cat")
-    (add-to-list 'eshell-visual-commands "ssh")
-    (add-to-list 'eshell-visual-commands "tail")
+    (setq eshell-visual-commands
+          '("less" "tmux" "htop" "top" "bash" "zsh" "tail"))
+    (setq eshell-visual-subcommands
+          '(("git" "log" "l" "diff" "show")))
+
     (add-to-list 'eshell-command-completions-alist
                  '("gunzip" "gz\\'"))
     (add-to-list 'eshell-command-completions-alist
@@ -457,7 +456,34 @@ Basic settings for emacs integrated shell
               '(lambda () (define-key eshell-mode-map "\C-a" 'eshell-bol)))
     (add-hook 'eshell-preoutput-filter-functions
               'ansi-color-filter-apply)
-    ))
+    ;; Prompt with a bit of help from http://www.emacswiki.org/emacs/EshellPrompt
+
+    (defmacro with-face (str &rest properties)
+      `(propertize ,str 'face (list ,@properties)))
+
+    (defun eshell/abbr-pwd ()
+      (let ((home (getenv "HOME"))
+            (path (eshell/pwd)))
+        (cond
+         ((string-equal home path) "~")
+         ((f-ancestor-of? home path) (concat "~/" (f-relative path home)))
+         (path))))
+
+    (defun eshell/my-prompt ()
+      (let ((header-bg "#161616"))
+        (concat
+         (with-face user-login-name :foreground "cyan")
+         (with-face (concat "@" hostname) :foreground "white")
+         " "
+         (with-face (eshell/abbr-pwd) :foreground "#009900")
+         (if (= (user-uid) 0)
+             (with-face "#" :foreground "red")
+           (with-face "$" :foreground "#69b7f0"))
+         " ")))
+
+    (setq eshell-prompt-function 'eshell/my-prompt)
+    (setq eshell-highlight-prompt nil)
+    (setq eshell-prompt-regexp "^[^#$\n]+[#$] ")))
 #+END_SRC
 
 *** Isearch related
@@ -512,30 +538,23 @@ In this day and age, UTF-8 is the way to go.
 (prefer-coding-system 'utf-8)
 (set-charset-priority 'unicode)
 (setq default-process-coding-system '(utf-8-unix . utf-8-unix))
+(when (display-graphic-p)
+  (setq x-select-request-type '(UTF8_STRING COMPOUND_TEXT TEXT STRING)))
 #+END_SRC
 
 *** Hilight matching parentheses
 While I do have the nifty shortcut to jump to the other parentheses,
 hilighting them makes it obvious where they are.
 #+BEGIN_SRC emacs-lisp :tangle yes
-(unless
-    (use-package mic-paren
-      :init
-      (paren-activate))
-
-  (use-package paren
-    :init
-    (progn
-      (show-paren-mode +1)
-      (setq show-paren-style 'parenthesis)
-      )
-    )
-  )
+(use-package mic-paren
+  :init
+  (paren-activate))
 #+END_SRC
 *** Kill other buffers
 While many editors allow you to close "all the other files, not the one
 you are in", emacs doesn't have this... Except, now it will.
-#+BEGIN_SRC emacs-lisp :tangle yes
+(Update 30.05.2014: Not used ever, deactivated)
+#+BEGIN_SRC emacs-lisp :tangle no
 (bind-key "C-c k" 'prelude-kill-other-buffers)
 #+END_SRC
 *** Scrolling
@@ -554,13 +573,11 @@ jump half-windows?
 The default how emacs handles cutting/pasting with the primary selection
 changed in emacs24. I am used to the old way, so get it back.
 #+BEGIN_SRC emacs-lisp :tangle yes
-(setq x-select-enable-primary t)
-(setq x-select-enable-clipboard t        ;; copy-paste should work ...
-  interprogram-paste-function            ;; ...with...
-  'x-cut-buffer-or-selection-value)      ;; ...other X clients
-
+(setq select-enable-primary t)
+(setq select-enable-clipboard nil)
+(setq interprogram-paste-function 'x-cut-buffer-or-selection-value)
+(setq mouse-drag-copy-region t)
 #+END_SRC
-
 *** Global keyboard changes not directly related to a mode
 Disable /suspend_frame/ function, I dislike it.
 #+BEGIN_SRC emacs-lisp :tangle yes
@@ -568,12 +585,36 @@ Disable /suspend_frame/ function, I dislike it.
 (unbind-key "C-x C-z")
 #+END_SRC
 
+http://endlessparentheses.com/kill-entire-line-with-prefix-argument.html?source=rss
+#+BEGIN_SRC emacs-lisp :tangle yes
+(defmacro bol-with-prefix (function)
+  "Define a new function which calls FUNCTION.
+Except it moves to beginning of line before calling FUNCTION when
+called with a prefix argument. The FUNCTION still receives the
+prefix argument."
+  (let ((name (intern (format "endless/%s-BOL" function))))
+    `(progn
+       (defun ,name (p)
+         ,(format
+           "Call `%s', but move to BOL when called with a prefix argument."
+           function)
+         (interactive "P")
+         (when p
+           (forward-line 0))
+         (call-interactively ',function))
+       ',name)))
+
+(global-set-key [remap paredit-kill] (bol-with-prefix paredit-kill))
+(global-set-key [remap org-kill-line] (bol-with-prefix org-kill-line))
+(global-set-key [remap kill-line] (bol-with-prefix kill-line))
+#+END_SRC
+
 Default of *C-k* is to kill from the point to the end of line. If
 'kill-whole-line' (see [[id:0a1560d9-7e55-47ab-be52-b3a8b8eea4aa][the kill-whole-line part in "General stuff"]]) is
 set, including newline. But to kill the entire line, one still needs a
 *C-a* in front of it. So I change it, by defining a function to do just this for
 me. Lazyness++.
-#+BEGIN_SRC emacs-lisp :tangle yes
+#+BEGIN_SRC emacs-lisp :tangle no
 (defun kill-entire-line ()
   "Kill this entire line (including newline), regardless of where point is within the line."
   (interactive)
@@ -581,14 +622,13 @@ me. Lazyness++.
   (kill-line)
   (back-to-indentation))
 
-(unbind-key "C-z")
 (bind-key* "C-k" 'kill-entire-line)
 (global-set-key [remap kill-whole-line] 'kill-entire-line)
 #+END_SRC
 
 And the same is true when I'm in org-mode, which has an own kill function...
 (the keybinding happens later, after org-mode is loaded fully)
-#+BEGIN_SRC emacs-lisp :tangle yes
+#+BEGIN_SRC emacs-lisp :tangle no
 (defun jj-org-kill-line (&optional arg)
   "Kill the entire line, regardless of where point is within the line, org-mode-version"
   (interactive "P")
@@ -648,10 +688,18 @@ AKA transpose lines.
 
 "Pull" lines up, join them
 #+BEGIN_SRC emacs-lisp :tangle yes
-(bind-key "M-j"
-          (lambda ()
-            (interactive)
-            (join-line -1)))
+(defun join-line-or-lines-in-region ()
+  "Join this line or the lines in the selected region.
+Joins single lines in reverse order to the default, ie. pulls the next one up."
+  (interactive)
+  (cond ((region-active-p)
+         (let ((min (line-number-at-pos (region-beginning))))
+           (goto-char (region-end))
+           (while (> (line-number-at-pos) min)
+             (join-line ))))
+        (t (let ((current-prefix-arg '(4)))
+             (call-interactively 'join-line)))))
+(bind-key "M-j" 'join-line-or-lines-in-region)
 #+END_SRC
 
 When I press Enter I almost always want to go to the right indentation on the next line.
@@ -762,7 +810,32 @@ buffers path.
 
 Align code
 #+BEGIN_SRC emacs-lisp :tangle yes
-(bind-key "M-[" 'align-code)
+(bind-key "H-a" 'align-code)
+#+END_SRC
+
+Insert date
+#+BEGIN_SRC emacs-lisp :tangle yes
+(bind-key "C-c d" 'insert-date)
+#+END_SRC
+
+Another key for indenting
+#+BEGIN_SRC emacs-lisp :tangle yes
+(bind-key "H-i" 'indent-region)
+#+END_SRC
+
+Clean all whitespace stuff
+#+BEGIN_SRC emacs-lisp :tangle yes
+(bind-key "H-w" 'whitespace-cleanup)
+#+END_SRC
+
+Comment/Uncomment
+#+BEGIN_SRC emacs-lisp :tangle yes
+(bind-key "H-c" 'comment-dwim)
+#+END_SRC
+
+Show keystrokes in progress
+#+BEGIN_SRC emacs-lisp :tangle yes
+(setq echo-keystrokes 0.1)
 #+END_SRC
 **** Overwrite mode
 Usually you can press the *Ins*ert key, to get into overwrite mode. I
@@ -773,11 +846,64 @@ disabling that.
 (unbind-key "<kp-insert>")
 #+END_SRC
 
-** Miscellaneous stuff
-Weeks start on Monday, not sunday.
+*** Easily navigate sillyCased words
+#+BEGIN_SRC emacs-lisp :tangle yes
+(global-subword-mode 1)
+#+END_SRC
+*** Delete file of current buffer, then kill buffer
+[2014-06-14 Sat 23:03]
 #+BEGIN_SRC emacs-lisp :tangle yes
-(setq calendar-week-start-day 1)
+(defun delete-current-buffer-file ()
+  "Removes file connected to current buffer and kills buffer."
+  (interactive)
+  (let ((filename (buffer-file-name))
+        (buffer (current-buffer))
+        (name (buffer-name)))
+    (if (not (and filename (file-exists-p filename)))
+        (ido-kill-buffer)
+      (when (yes-or-no-p "Are you sure you want to remove this file? ")
+        (delete-file filename)
+        (kill-buffer buffer)
+        (message "File '%s' successfully removed" filename)))))
+
+(global-set-key (kbd "C-x C-k") 'delete-current-buffer-file)
+#+END_SRC
+*** Rename file of current buffer
+[2014-06-14 Sat 23:04]
+#+BEGIN_SRC emacs-lisp :tangle yes
+(defun rename-current-buffer-file ()
+  "Renames current buffer and file it is visiting."
+  (interactive)
+  (let ((name (buffer-name))
+        (filename (buffer-file-name)))
+    (if (not (and filename (file-exists-p filename)))
+        (error "Buffer '%s' is not visiting a file!" name)
+      (let ((new-name (read-file-name "New name: " filename)))
+        (if (get-buffer new-name)
+            (error "A buffer named '%s' already exists!" new-name)
+          (rename-file filename new-name 1)
+          (rename-buffer new-name)
+          (set-visited-file-name new-name)
+          (set-buffer-modified-p nil)
+          (message "File '%s' successfully renamed to '%s'"
+                   name (file-name-nondirectory new-name)))))))
+
+(global-set-key (kbd "C-x C-S-r") 'rename-current-buffer-file)
+#+END_SRC
+*** Quickly find emacs lisp sources
+[2014-06-22 Sun 23:05]
+#+BEGIN_SRC emacs-lisp :tangle yes
+(bind-key "C-l" 'find-library 'help-command)
+(bind-key "C-f" 'find-function 'help-command)
+(bind-key "C-k" 'find-function-on-key 'help-command)
+(bind-key "C-v" 'find-variable 'help-command)
+#+END_SRC
+*** Adjust occur
+[2015-01-26 Mon 16:01]
+#+BEGIN_SRC emacs-lisp :tangle yes
+(bind-key "M-s o" 'occur-dwim)
 #+END_SRC
+** Miscellaneous stuff
 
 Searches and matches should ignore case.
 #+BEGIN_SRC emacs-lisp :tangle yes
@@ -831,6 +957,7 @@ From https://raw.github.com/qdot/conf_emacs/master/emacs_conf.org
 
 #+BEGIN_SRC emacs-lisp :tangle yes
 (setq-default indicate-empty-lines t)
+(setq sentence-end-double-space nil)
 #+END_SRC
 
 Hilight annotations in comments, like FIXME/TODO/...
@@ -895,7 +1022,6 @@ Restore removed var alias, used by ruby-electric-brace and others
 (unless (boundp 'last-command-char)
   (defvaralias 'last-command-char 'last-command-event))
 #+END_SRC
-
 * Customized variables
 :PROPERTIES:
 :ID: 0102208d-fdf6-4928-9e40-7e341bd3aa3a
@@ -923,9 +1049,8 @@ ways.
 (use-package abbrev
   :commands abbrev-mode
   :diminish abbrev-mode
-  :init
+  :idle
   (hook-into-modes #'abbrev-mode '(text-mode-hook))
-
   :config
   (progn
     (setq save-abbrevs 'silently)
@@ -938,7 +1063,6 @@ ways.
                 (add-hook 'expand-expand-hook 'indent-according-to-mode)
                 (add-hook 'expand-jump-hook 'indent-according-to-mode)))))
 #+END_SRC
-
 ** ace-jump-mode
 [2013-04-28 So 11:26]
 Quickly move around in buffers.
@@ -957,15 +1081,55 @@ Use H-w to switch windows
   :commands ace-window
   :bind ("H-w" . ace-window))
 #+END_SRC
+** aggressive-indent
+[2014-10-27 Mon 13:08]
+electric-indent-mode is enough to keep your code nicely aligned when
+all you do is type. However, once you start shifting blocks around,
+transposing lines, or slurping and barfing sexps, indentation is bound
+to go wrong.
+
+aggressive-indent-mode is a minor mode that keeps your code always
+indented. It reindents after every command, making it more reliable
+than electric-indent-mode.
+#+BEGIN_SRC emacs-lisp :tangle yes
+(use-package aggressive-indent
+  :ensure aggressive-indent
+  :commands (aggressive-indent-mode global-aggressive-indent-mode)
+  :config
+  (progn
+    (global-aggressive-indent-mode 0)
+    (setq aggressive-indent-comments-too 0)
+    (add-to-list 'aggressive-indent-excluded-modes 'html-mode)
+    ))
+#+END_SRC
+** anzu
+[2014-06-01 Sun 23:02]
+Provides a minor mode which displays current match and total matches
+information in the mode-line in various search modes.
+#+BEGIN_SRC emacs-lisp :tangle yes
+(use-package anzu
+  :ensure anzu
+  :diminish anzu-mode
+  :defer t
+  :idle
+  (progn
+    (global-anzu-mode 1))
+  :config
+  (progn
+    (setq anzu-search-threshold 1000)
+    (set-face-attribute 'anzu-mode-line nil :foreground "yellow" :weight 'bold)))
+#+END_SRC
 ** ascii
 [2014-05-21 Wed 00:33]
 #+BEGIN_SRC emacs-lisp :tangle yes
 (use-package ascii
-  :commands (ascii-on ascii-toggle)
+  :commands (ascii-on ascii-toggle ascii-display)
+  :bind (("C-c e A" . ascii-toggle))
   :init
   (progn
     (defun ascii-toggle ()
       (interactive)
+      (defvar ascii-display nil)
       (if ascii-display
           (ascii-off)
         (ascii-on)))
@@ -979,7 +1143,6 @@ Use H-w to switch windows
 (setq TeX-parse-self t)
 (setq TeX-PDF-mode t)
 #+END_SRC
-
 ** auto-complete mode
 [2013-04-27 Sa 16:33]
 And aren't we all lazy? I definitely am, and I like my emacs doing as
@@ -987,46 +1150,72 @@ much possible work for me as it can.
 So here, auto-complete-mode, which lets emacs do this, based on what I
 already had typed.
 #+BEGIN_SRC emacs-lisp :tangle yes
-(use-package auto-complete
+(use-package auto-complete-config
   :ensure auto-complete
-  :init
-  (progn
-    (global-auto-complete-mode t)
-    )
+  :idle
+  (ac-config-default)
   :config
   (progn
-    (setq ac-comphist-file (expand-file-name "ac-comphist.dat" jj-cache-dir))
-
-    (setq ac-expand-on-auto-complete nil)
-    (setq ac-dwim t)
-    (setq ac-auto-start t)
-
-    ;;----------------------------------------------------------------------------
-    ;; Use Emacs' built-in TAB completion hooks to trigger AC (Emacs >= 23.2)
-    ;;----------------------------------------------------------------------------
-    (setq tab-always-indent 'complete)  ;; use 't when auto-complete is disabled
-    (add-to-list 'completion-styles 'initials t)
-
     ;; hook AC into completion-at-point
     (defun sanityinc/auto-complete-at-point ()
       (when (and (not (minibufferp))
                  (fboundp 'auto-complete-mode)
                  auto-complete-mode)
         (auto-complete)))
-
     (defun set-auto-complete-as-completion-at-point-function ()
       (add-to-list 'completion-at-point-functions 'sanityinc/auto-complete-at-point))
+    ;; Exclude very large buffers from dabbrev
+    (defun sanityinc/dabbrev-friend-buffer (other-buffer)
+      (< (buffer-size other-buffer) (* 1 1024 1024)))
+
+    (use-package pos-tip
+      :ensure t)
+
+    ;; custom keybindings to use tab, enter and up and down arrows
+    (bind-key "\t" 'ac-expand ac-complete-mode-map)
+    (bind-key "\r" 'ac-complete ac-complete-mode-map)
+    (bind-key "M-n" 'ac-next ac-complete-mode-map)
+    (bind-key "M-p" 'ac-previous ac-complete-mode-map)
+    (bind-key "C-s" 'ac-isearch ac-completing-map)
+    (bind-key "M-TAB" 'auto-complete ac-mode-map)
+
+    (setq ac-comphist-file (expand-file-name "ac-comphist.dat" jj-cache-dir))
+    (setq ac-use-comphist t)
+    (setq ac-expand-on-auto-complete nil)
+    (setq ac-dwim t)
+    (setq ac-auto-start 3)
+    (setq ac-delay 0.3)
+    (setq ac-menu-height 15)
+    (setq ac-quick-help-delay 0.5)
+    (setq ac-use-fuzzy t)
+
+    (ac-flyspell-workaround)
+
+    ;; use 't when auto-complete is disabled
+    (setq tab-always-indent 'complete)
+    (add-to-list 'completion-styles 'initials t)
+
+     ;; Use space and punctuation to accept the current the most likely completion.
+    (setq auto-completion-syntax-alist (quote (global accept . word)))
+     ;; Avoid completion for short trivial words.
+    (setq auto-completion-min-chars (quote (global . 3)))
+    (setq completion-use-dynamic t)
 
     (add-hook 'auto-complete-mode-hook 'set-auto-complete-as-completion-at-point-function)
 
-    ;(require 'ac-dabbrev)
+    ;; Exclude very large buffers from dabbrev
+    (setq dabbrev-friend-buffer-function 'sanityinc/dabbrev-friend-buffer)
+
+    (use-package ac-dabbrev
+      :ensure t)
+
     (set-default 'ac-sources
                  '(ac-source-imenu
                    ac-source-dictionary
                    ac-source-words-in-buffer
                    ac-source-words-in-same-mode-buffers
-                   ac-source-words-in-all-buffer))
-;               ac-source-dabbrev))
+    ;               ac-source-words-in-all-buffer
+                   ac-source-dabbrev))
 
     (dolist (mode '(magit-log-edit-mode log-edit-mode org-mode text-mode haml-mode
                                         sass-mode yaml-mode csv-mode espresso-mode haskell-mode
@@ -1035,28 +1224,11 @@ already had typed.
                                         js3-mode css-mode less-css-mode sql-mode ielm-mode))
       (add-to-list 'ac-modes mode))
 
-;; Exclude very large buffers from dabbrev
-    (defun sanityinc/dabbrev-friend-buffer (other-buffer)
-      (< (buffer-size other-buffer) (* 1 1024 1024)))
-
-    (setq dabbrev-friend-buffer-function 'sanityinc/dabbrev-friend-buffer)
-
-
-;; custom keybindings to use tab, enter and up and down arrows
-(bind-key "\t" 'ac-expand ac-complete-mode-map)
-(bind-key "\r" 'ac-complete ac-complete-mode-map)
-(bind-key "M-n" 'ac-next ac-complete-mode-map)
-(bind-key "M-p" 'ac-previous ac-complete-mode-map)
-(bind-key "M-TAB" 'auto-complete ac-mode-map)
-
-(setq auto-completion-syntax-alist (quote (global accept . word))) ;; Use space and punctuation to accept the current the most likely completion.
-(setq auto-completion-min-chars (quote (global . 3))) ;; Avoid completion for short trivial words.
-(setq completion-use-dynamic t)
+    (add-hook 'latex-mode-hook 'auto-complete-mode)
+    (add-hook 'LaTeX-mode-hook 'auto-complete-mode)
+    (add-hook 'prog-mode-hook 'auto-complete-mode)
+    (add-hook 'org-mode-hook 'auto-complete-mode)))
 
-(add-hook 'latex-mode-hook 'auto-complete-mode)
-(add-hook 'LaTeX-mode-hook 'auto-complete-mode)
-(add-hook 'prog-mode-hook 'auto-complete-mode)
-(add-hook 'org-mode-hook 'auto-complete-mode)))
 #+END_SRC
 
 ** auto-revert
@@ -1066,9 +1238,10 @@ with it. Not to have to revert buffers myself
 (use-package autorevert
   :commands auto-revert-mode
   :diminish auto-revert-mode
-  :init
+  :idle
   (progn
     (setq global-auto-revert-mode t)
+    (setq global-auto-revert-non-file-buffers t)
     (global-auto-revert-mode)))
 #+END_SRC
 
@@ -1087,10 +1260,10 @@ where =temporary-file-directory= is not inside my home).
   :init
   (progn
     (setq backup-directory jj-backup-directory)
-    (setq tramp-backup-directory (concat jj-backup-directory "/tramp"))
-    (if (not (file-exists-p tramp-backup-directory))
-        (make-directory tramp-backup-directory))
-    (setq tramp-backup-directory-alist `((".*" . ,tramp-backup-directory)))
+    ;(setq tramp-backup-directory (concat jj-backup-directory "/tramp"))
+    ;(if (not (file-exists-p tramp-backup-directory))
+    ;    (make-directory tramp-backup-directory))
+    ;(setq tramp-backup-directory-alist `((".*" . ,tramp-backup-directory)))
     (setq backup-directory-alist `(("." . ,jj-backup-directory)))
     (setq auto-save-list-file-prefix (concat jj-backup-directory ".auto-saves-"))
     (setq auto-save-file-name-transforms `((".*" ,jj-backup-directory t)))
@@ -1137,6 +1310,43 @@ are saved automatically when they are killed"
                       (member method '("su" "sudo"))))))))))
 
 #+END_SRC
+** browse-kill-ring
+[2014-12-11 Thu 11:31]
+#+BEGIN_SRC emacs-lisp :tangle yes
+(use-package browse-kill-ring
+  :commands (browse-kill-ring browse-kill-ring-mode)
+  :bind ("M-y" . browse-kill-ring)
+  )
+#+END_SRC
+** calendar
+[2014-06-10 Tue 22:20]
+#+BEGIN_SRC emacs-lisp :tangle yes
+(use-package cal
+  :commands (cal/insert)
+  :bind ("C-c c" . cal/insert)
+  :config
+  (progn
+    ; Weeks start on Monday, not sunday.
+    (setq calendar-week-start-day 1)
+
+    ; Display ISO week numbers in Calendar Mode
+    (copy-face font-lock-constant-face 'calendar-iso-week-face)
+    (set-face-attribute 'calendar-iso-week-face nil :height 0.7)
+    (setq calendar-intermonth-text
+          '(propertize
+            (format "%2d"
+                    (car
+                     (calendar-iso-from-absolute
+                      (calendar-absolute-from-gregorian (list month day year)))))
+            'font-lock-face 'calendar-iso-week-face))
+    (copy-face 'default 'calendar-iso-week-header-face)
+    (set-face-attribute 'calendar-iso-week-header-face nil :height 0.7)
+    (setq calendar-intermonth-header
+          (propertize "Wk"                  ; or e.g. "KW" in Germany
+                      'font-lock-face 'calendar-iso-week-header-face))))
+
+#+END_SRC
+
 ** crontab-mode
 [2013-05-21 Tue 23:18]
 #+BEGIN_SRC emacs-lisp :tangle yes
@@ -1147,7 +1357,8 @@ are saved automatically when they are killed"
 #+END_SRC
 
 ** css
-#+BEGIN_SRC emacs-lisp :tangle yes
+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
@@ -1202,23 +1413,30 @@ movement keys.
 #+BEGIN_SRC emacs-lisp :tangle yes
 (use-package diff-mode
   :commands diff-mode
-  :mode ("COMMIT_EDITMSG$" . diff-mode)
+  :mode (("\\.diff" . diff-mode))
   :config
   (use-package diff-mode-))
 #+END_SRC
-For some file endings we need to tell emacs what mode we want for them.
-I only list modes here where I don't have any other special
-configuration.
+
 
 ** dired & co
-I like dired and work a lot with it, but it tends to leave lots of
-windows around.
-dired-single to the rescue.
 #+BEGIN_SRC emacs-lisp :tangle yes
 (use-package dired
-  :defer t
+  :commands (dired dired-other-window dired-other-frame dired-noselect
+                   dired-mode dired-jump)
+  :defines (dired-omit-regexp-orig)
   :init
   (progn
+    (setq diredp-hide-details-initially-flag nil))
+  :config
+  (progn
+    (setq dired-auto-revert-buffer (quote dired-directory-changed-p))
+    (setq dired-dwim-target t)
+    (setq dired-listing-switches "-alh")
+    (setq dired-recursive-copies (quote top))
+    (setq dired-recursive-deletes (quote top))
+    (bind-key "F" 'find-name-dired dired-mode-map)
+
     (defvar mark-files-cache (make-hash-table :test #'equal))
 
     (defun mark-similar-versions (name)
@@ -1231,14 +1449,45 @@ dired-single to the rescue.
     (defun dired-mark-similar-version ()
       (interactive)
       (setq mark-files-cache (make-hash-table :test #'equal))
-      (dired-mark-sexp '(mark-similar-versions name))))
-  :config
-  (progn
-    (setq dired-auto-revert-buffer (quote dired-directory-changed-p))
-    (setq dired-dwim-target t)
-    (setq dired-listing-switches "-alh")
-    (setq dired-recursive-copies (quote top))
-    (setq dired-recursive-deletes (quote top))
+      (dired-mark-sexp '(mark-similar-versions name)))
+
+    (use-package dired+
+      :ensure dired+)
+
+    (use-package dired-x)
+    (setq dired-guess-shell-alist-user
+          '(("\\.pdf\\'" "mupdf" "evince")
+            ("\\.\\(?:djvu\\|eps\\)\\'" "evince")
+            ("\\.\\(?:jpg\\|jpeg\\|png\\|gif\\|xpm\\)\\'" "eog")
+            ("\\.\\(?:xcf\\)\\'" "gimp")
+            ("\\.csv\\'" "libreoffice")
+            ("\\.tex\\'" "pdflatex" "latex")
+            ("\\.\\(?:mp4\\|mkv\\|avi\\|flv\\|ogv\\)\\(?:\\.part\\)?\\'" "vlc")
+            ("\\.html?\\'" "conkeror")))
+
+    (use-package dired-single
+      :ensure dired-single
+      :init
+      (progn
+        (bind-key "<return>" 'dired-single-buffer dired-mode-map)
+        (bind-key "<mouse-1>" 'dired-single-buffer-mouse dired-mode-map)
+        (bind-key "^"
+                  (function
+           (lambda nil (interactive) (dired-single-buffer ".."))) dired-mode-map )))
+
+    (use-package wdired
+      :ensure wdired
+      :init
+      (progn
+        (setq wdired-allow-to-change-permissions t)
+        (bind-key "r" 'wdired-change-to-wdired-mode dired-mode-map)))
+
+    (use-package gnus-dired
+      :commands (gnus-dired-attach gnus-dired-mode)
+      :init
+      (progn
+        ;;(add-hook 'dired-mode-hook 'turn-on-gnus-dired-mode)
+        (bind-key "a" 'gnus-dired-attach dired-mode-map)))
 
     (defun dired-package-initialize ()
       (unless (featurep 'runner)
@@ -1246,30 +1495,6 @@ dired-single to the rescue.
         (use-package runner
           :ensure runner)
 
-        (use-package dired-single
-          :ensure dired-single
-          :init
-          (progn
-            (bind-key "<return>" 'dired-single-buffer dired-mode-map)
-            (bind-key "<mouse-1>" 'dired-single-buffer-mouse dired-mode-map)
-            (bind-key "^"
-              (function
-               (lambda nil (interactive) (dired-single-buffer ".."))) dired-mode-map )))
-
-        (use-package wdired
-          :ensure wdired
-          :init
-          (progn
-            (setq wdired-allow-to-change-permissions t)
-            (bind-key "r" 'wdired-change-to-wdired-mode dired-mode-map)))
-
-        (use-package gnus-dired
-          :init
-          (progn
-            (require 'gnus-dired)
-            (add-hook 'dired-mode-hook 'turn-on-gnus-dired-mode)
-            (bind-key "a" 'gnus-dired-attach dired-mode-map)))
-
         (bind-key "M-!" 'async-shell-command dired-mode-map)
         (unbind-key "M-s f" dired-mode-map)
 
@@ -1325,48 +1550,72 @@ dired-single to the rescue.
       (interactive
        (list (read-directory-name "First directory: "
                                   (expand-file-name "~")
-                                  nil nil "dl/")
+                                  nil nil "/Downloads/")
              (read-directory-name "Second directory: "
                                   (expand-file-name "~")
-                                  nil nil "Archives/")))
+                                  nil nil "/")))
       (dired first-dir)
       (dired-other-window second-dir))
-    (bind-key "C-c J" 'dired-double-jump)))
+    (bind-key "C-c J" 'dired-double-jump)
 
-#+END_SRC
+    (defun dired-back-to-top ()
+      (interactive)
+      (goto-char (point-min))
+      (dired-next-line 4))
 
-** easypg
-EasyPG is a GnuPG interface for Emacs.
+    (define-key dired-mode-map
+      (vector 'remap 'beginning-of-buffer) 'dired-back-to-top)
+
+    (defun dired-jump-to-bottom ()
+      (interactive)
+      (goto-char (point-max))
+      (dired-next-line -1))
+
+    (define-key dired-mode-map
+      (vector 'remap 'end-of-buffer) 'dired-jump-to-bottom)))
+
+#+END_SRC
+** discover-my-major
+[2014-06-01 Sun 23:32]
+Discover key bindings and their meaning for the current Emacs major mode.
 #+BEGIN_SRC emacs-lisp :tangle yes
-(require 'epa-file)
-(epa-file-enable)
+(use-package discover-my-major
+  :ensure discover-my-major
+  :commands discover-my-major
+  :bind ("C-h C-m" . discover-my-major))
 #+END_SRC
-
-I took the following from [[http://www.emacswiki.org/emacs/EasyPG][EmacsWiki: Easy PG]]
+** easypg
+EasyPG is a GnuPG interface for Emacs.
+Bookmark: [[http://www.emacswiki.org/emacs/EasyPG][EmacsWiki: Easy PG]]
 #+BEGIN_SRC emacs-lisp :tangle yes
-(defadvice epg--start (around advice-epg-disable-agent disable)
-  "Don't allow epg--start to use gpg-agent in plain text
-    terminals."
-  (if (display-graphic-p)
-      ad-do-it
-    (let ((agent (getenv "GPG_AGENT_INFO")))
-      (setenv "GPG_AGENT_INFO" nil) ; give us a usable text password prompt
-      ad-do-it
-      (setenv "GPG_AGENT_INFO" agent))))
-(ad-enable-advice 'epg--start 'around 'advice-epg-disable-agent)
-(ad-activate 'epg--start)
+(use-package epa-file
+  :config
+  (progn
+    (epa-file-enable)
+    ;; I took the following from [[http://www.emacswiki.org/emacs/EasyPG][EmacsWiki: Easy PG]]
+    (defadvice epg--start (around advice-epg-disable-agent disable)
+      "Don't allow epg--start to use gpg-agent in plain text
+    terminals . "
+      (if (display-graphic-p)
+          ad-do-it
+        (let ((agent (getenv "GPG_AGENT_INFO")))
+          (setenv "GPG_AGENT_INFO" nil) ; give us a usable text password prompt
+          ad-do-it
+          (setenv "GPG_AGENT_INFO" agent))))
+    (ad-enable-advice 'epg--start 'around 'advice-epg-disable-agent)
+    (ad-activate 'epg--start)
+    ))
 #+END_SRC
 ** ediff
 [2013-04-21 So 20:36]
 ediff - don't start another frame
-#+BEGIN_SRC elisp
+#+BEGIN_SRC emacs-lisp :tangle yes
 (use-package ediff
   :pre-init
   (progn
     (defvar ctl-period-equals-map)
     (define-prefix-command 'ctl-period-equals-map)
     (bind-key "C-. =" 'ctl-period-equals-map)
-
     (bind-key "C-. = c" 'compare-windows)) ; not an ediff command, but it fits
 
   :bind (("C-. = b" . ediff-buffers)
@@ -1378,7 +1627,12 @@ ediff - don't start another frame
          ("C-. = p" . ediff-patch-file)
          ("C-. = P" . ediff-patch-buffer)
          ("C-. = l" . ediff-regions-linewise)
-         ("C-. = w" . ediff-regions-wordwise)))
+         ("C-. = w" . ediff-regions-wordwise))
+  :config (progn
+            (setq ediff-window-setup-function 'ediff-setup-windows-plain)
+            (setq ediff-split-window-function 'split-window-horizontally)
+            )
+)
 #+END_SRC
 ** emms
 EMMS is the Emacs Multimedia System.
@@ -1538,13 +1792,35 @@ EMMS is the Emacs Multimedia System.
                    "m3u" "ogg" "flac" "mp3" "wav" "mod" "au" "aiff"))))
 (emms-player-set emms-player-mpd 'regex emms-player-mpd-supported-regexp)
 
+#+END_SRC
+** ethan-wspace
+[2014-06-01 Sun 15:00]
+Proper whitespace handling
+#+BEGIN_SRC emacs-lisp :tangle yes
+(use-package ethan-wspace
+  :ensure ethan-wspace
+  :diminish (ethan-wspace-mode . "ew")
+  :init
+  (global-ethan-wspace-mode 1))
+#+END_SRC
+
+** expand-region
+[2014-06-01 Sun 15:16]
+#+BEGIN_SRC emacs-lisp :tangle yes
+(use-package expand-region
+  :ensure expand-region
+  :bind ("C-M-+" . er/expand-region)
+  :commands er/expand-region)
 #+END_SRC
 ** filladapt
 [2013-05-02 Thu 00:04]
+Filladapt by KyleJones enhances Emacs’ fill functions by guessing a
+fill prefix, such as a comment sequence in program code, and handling
+bullet points like “1.” or “*”.
 #+BEGIN_SRC emacs-lisp :tangle yes
 (use-package filladapt
   :diminish filladapt-mode
-  :init
+  :idle
   (setq-default filladapt-mode t))
 #+END_SRC
 ** flycheck
@@ -1555,8 +1831,22 @@ understand for me.
 #+BEGIN_SRC emacs-lisp :tangle yes
 (use-package flycheck
   :ensure flycheck
-  :init
-  (add-hook 'after-init-hook #'global-flycheck-mode))
+  :diminish flycheck-mode
+  :bind (("M-n" . next-error)
+         ("M-p" . previous-error))
+  :idle
+  (progn
+    (add-hook 'find-file-hook
+          (lambda ()
+            (when (not (equal 'emacs-lisp-mode major-mode))
+              (flycheck-mode)))))
+  :config
+  (progn
+    (use-package flycheck-color-mode-line
+      :ensure flycheck-color-mode-line)
+    (setq flycheck-highlighting-mode nil)
+    (add-hook 'flycheck-mode-hook 'flycheck-color-mode-line-mode)
+    ))
 #+END_SRC
 ** font-lock
 Obviously emacs can do syntax hilighting. For more things than you ever
@@ -1597,9 +1887,10 @@ And I want to have it everywhere.
          ("C-x s" . git-gutter+-stage-hunks)
          ("C-x c" . git-gutter+-commit)
          )
-  :init
+  :idle
   (progn
-    (setq git-gutter+-disabled-modes '(org-mode)))
+    (setq git-gutter+-disabled-modes '(org-mode))
+    (global-git-gutter+-mode 1))
   :config
   (progn
     (use-package git-gutter-fringe+
@@ -1608,19 +1899,94 @@ And I want to have it everywhere.
       (progn
         (setq git-gutter-fr+-side 'right-fringe)
         ;(git-gutter-fr+-minimal)
-        ))
-    (global-git-gutter+-mode 1)))
+        ))))
 
 #+END_SRC
+** git-messenger
+[2015-02-22 Sun 14:00]
+Provides function that popup commit message at current line. This is
+useful when you want to know why this line was changed.
+#+BEGIN_SRC emacs-lisp :tangle yes
+(use-package git-messenger
+  :ensure git-messenger
+  :commands (git-messenger:popup-message)
+  :bind (("C-x v p" . git-messenger:popup-message))
+  :config
+  (progn
+    (bind-key "m" 'git-messenger:copy-message git-messenger-map)
+    (add-hook 'git-messenger:popup-buffer-hook 'magit-commit-mode)
+    (setq git-messenger:show-detail t)))
+#+END_SRC
+** git timemachine
+[2014-07-23 Mi 12:57]
+Browse historic versions of a file with p (previous) and n (next).
+#+BEGIN_SRC emacs-lisp :tangle yes
+(use-package git-timemachine
+  :ensure git-timemachine
+  :commands git-timemachine)
+#+END_SRC
 ** gnus
 Most of my gnus config is in an own file, [[file:gnus.org][gnus.org]], here I only have
 what I want every emacs to know.
 #+BEGIN_SRC emacs-lisp :tangle yes
-(bind-key* "\M-n" 'gnus) ; Start gnus with M-n
+(bind-key "C-c g" 'gnus) ; Start gnus with M-n
 (after 'gnus
   (jj-init-theme)
 )
 #+END_SRC
+** golden ratio
+[2015-02-20 Fri 16:27]
+When working with many windows at the same time, each window has a
+size that is not convenient for editing.
+
+golden-ratio helps on this issue by resizing automatically the windows
+you are working on to the size specified in the "Golden Ratio". The
+window that has the main focus will have the perfect size for editing,
+while the ones that are not being actively edited will be re-sized to
+a smaller size that doesn't get in the way, but at the same time will
+be readable enough to know it's content.
+#+BEGIN_SRC emacs-lisp :tangle yes
+(use-package golden-ratio
+  :ensure golden-ratio
+  :diminish golden-ratio-mode
+  :init
+  (progn
+    (golden-ratio-mode 1)
+    (setq golden-ratio-exclude-buffer-names '("*LV*" "*guide-key*"))
+    (setq golden-ratio-exclude-modes '("calendar-mode" "gnus-summary-mode"
+                                       "gnus-article-mode" "calc-mode" "calc-trail-mode"
+                                       "bbdb-mode"))
+    ))
+#+END_SRC
+** goto last change
+[2015-02-22 Sun 13:28]
+Move point through buffer-undo-list positions.
+#+BEGIN_SRC emacs-lisp :tangle yes
+(use-package goto-last-change
+  :commands (goto-last-change)
+  :bind (("M-g l" . goto-last-change))
+  )
+#+END_SRC
+** guide-key
+[2014-06-11 Wed 22:27]
+guide-key.el displays the available key bindings automatically and
+dynamically.
+
+For whatever reason I like this more than icicles <backtab> completion
+for this.
+#+BEGIN_SRC emacs-lisp :tangle yes
+(use-package guide-key
+  :ensure guide-key
+  :diminish guide-key-mode
+  :init
+  (progn
+    (setq guide-key/guide-key-sequence '("C-x" "C-c" "M-g"))
+    (guide-key-mode 1)
+    (setq guide-key/recursive-key-sequence-flag t)
+    (setq guide-key/popup-window-position 'bottom)
+    (setq guide-key/idle-delay 0.5)))
+
+#+END_SRC
 
 ** highlight mode
 [2014-05-21 Wed 23:51]
@@ -1630,8 +1996,6 @@ what I want every emacs to know.
          ("M-o r" . highlight-regexp)
          ("M-o w" . highlight-phrase)))
 
-;;;_ , hilit-chg
-
 (use-package hilit-chg
   :bind ("M-o C" . highlight-changes-mode))
 
@@ -1641,9 +2005,9 @@ Crazy way of completion. It looks at the word before point and then
 tries to expand it in various ways.
 #+BEGIN_SRC emacs-lisp :tangle yes
 (use-package hippie-exp
-  :defer t
   :bind ("M-/" . hippie-expand)
-  :init
+  :commands hippie-expand
+  :config
   (progn
     (setq hippie-expand-try-functions-list '(try-expand-dabbrev
                                              try-expand-dabbrev-all-buffers
@@ -1656,8 +2020,8 @@ tries to expand it in various ways.
                                              try-complete-lisp-symbol))))
 #+END_SRC
 ** html-helper
-Instead of default /html-mode/ I use /html-helper-mode/.
-#+BEGIN_SRC emacs-lisp :tangle yes
+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$")
@@ -1665,7 +2029,82 @@ Instead of default /html-mode/ I use /html-helper-mode/.
 (add-auto-mode 'html-helper-mode "\\.(jsp|tmpl)\\'")
 (defalias 'html-mode 'html-helper-mode)
 #+END_SRC
+** hydra
+[2015-01-26 Mon 15:50]
+This is a package for GNU Emacs that can be used to tie related
+commands into a family of short bindings with a common prefix - a
+Hydra.
+
+Once you summon the Hydra through the prefixed binding (the body + any
+one head), all heads can be called in succession with only a short
+extension.
+
+The Hydra is vanquished once Hercules, any binding that isn't the
+Hydra's head, arrives. Note that Hercules, besides vanquishing the
+Hydra, will still serve his orignal purpose, calling his proper
+command. This makes the Hydra very seamless, it's like a minor mode
+that disables itself auto-magically.
+#+BEGIN_SRC emacs-lisp :tangle yes
+(use-package hydra
+  :ensure hydra
+  :init
+  (progn
+    (setq hydra-is-helpful t)
+    (setq hydra-lv t)
+
+    (defhydra hydra-zoom (:color red)
+      "zoom"
+      ("g" text-scale-increase "in")
+      ("l" text-scale-decrease "out")
+      ("q" nil "quit"))
+    (bind-key "<F2>" 'hydra-zoom/toggle)
+
+    (defhydra hydra-error (:color red)
+      "goto-error"
+      ("h" first-error "first")
+      ("j" next-error "next")
+      ("k" previous-error "prev")
+      ("v" recenter-top-bottom "recenter")
+      ("q" nil "quit"))
+    (bind-key "M-g e" 'hydra-error/body)
+
+    (defhydra hydra-launcher (:color blue)
+      "Launch"
+      ("h" man "man")
+      ("r" (browse-url "http://www.reddit.com/r/emacs/") "reddit")
+      ("w" (browse-url "http://www.emacswiki.org/") "emacswiki")
+      ("s" shell "shell")
+      ("q" nil "cancel"))
+    (bind-key "C-c r" 'hydra-launcher/body)
+
+    ; whitespace mode gets loaded late, so variable may not be there yet. Workaround...
+    (defvar whitespace-mode nil)
+    (defhydra hydra-toggle (:color pink)
+      "
+_a_ abbrev-mode:        % 4`abbrev-mode^^^^     _f_ auto-fill-mode:    %`auto-fill-function
+_c_ auto-complete-mode: % 4`auto-complete-mode     _r_ auto-revert-mode:  %`auto-revert-mode
+_d_ debug-on-error:     % 4`debug-on-error^     _t_ truncate-lines:    %`truncate-lines
+_w_ whitespace-mode:    % 4`whitespace-mode     _g_ golden-ratio-mode: %`golden-ratio-mode
+_l_ linum-mode:         % 4`linum-mode     _k_ linum relative:    %`linum-format
+
+"
+      ("a" abbrev-mode nil)
+      ("c" auto-complete-mode nil)
+      ("i" aggressive-indent-mode nil)
+      ("d" toggle-debug-on-error nil)
+      ("f" auto-fill-mode nil)
+      ("g" golden-ratio-mode nil)
+      ("t" toggle-truncate-lines nil)
+      ("w" whitespace-mode nil)
+      ("r" auto-revert-mode nil)
+      ("l" linum-mode nil)
+      ("k" linum-relative-toggle nil)
+      ("q" nil "cancel"))
+    (bind-key "C-c C-v" 'hydra-toggle/body)
+    ))
+
 
+#+END_SRC
 ** ibuffer
 [2014-05-21 Wed 23:54]
 #+BEGIN_SRC emacs-lisp :tangle yes
@@ -1675,13 +2114,20 @@ Instead of default /html-mode/ I use /html-helper-mode/.
          ("C-x C-b" . ibuffer)
          ("<XF86WebCam>" . ibuffer)
          )
-  :commands ibuffer
-  :init
+  :commands (ibuffer)
+  :defines (ibuffer-filtering-alist
+            ibuffer-filter-groups ibuffer-compile-formats ibuffer-git-column-length
+            ibuffer-show-empty-filter-groups ibuffer-saved-filter-groups)
+  :config
   (progn
     (defvar my-ibufffer-separator " • ")
     (setq ibuffer-filter-group-name-face 'variable-pitch
           ibuffer-use-header-line t
           ibuffer-old-time 12)
+    (unbind-key "M-o" ibuffer-mode-map)
+    (bind-key "s" 'isearch-forward-regexp ibuffer-mode-map)
+    (bind-key "." 'ibuffer-invert-sorting ibuffer-mode-map)
+
     (use-package ibuffer-vc
       :ensure t
       :commands
@@ -1698,12 +2144,7 @@ Instead of default /html-mode/ I use /html-helper-mode/.
         ad-do-it
         (ibuffer-update nil t)
         (unless (string= recent-buffer-name "*Ibuffer*")
-          (ibuffer-jump-to-buffer recent-buffer-name)))))
-  :config
-  (progn
-    (unbind-key "M-o" ibuffer-mode-map)
-    (bind-key "s" 'isearch-forward-regexp ibuffer-mode-map)
-    (bind-key "." 'ibuffer-invert-sorting ibuffer-mode-map)
+          (ibuffer-jump-to-buffer recent-buffer-name))))
 
     (defun ibuffer-magit-status ()
       (interactive)
@@ -1728,9 +2169,8 @@ Instead of default /html-mode/ I use /html-helper-mode/.
            (-flatten
             (--map
              (list
-              (cons  (f-slash (f-expand (cdr it))) (concat (car it) my-ibufffer-separator))
+              (cons  (f-slash (f-expand (cdr it))) my-ibufffer-separator)
               (cons  (f-slash (f-canonical (cdr it))) (concat (car it) my-ibufffer-separator)))
-
              '(
                ("dak" . "/develop/dak/")
                ("org" . "~/org/")
@@ -1756,7 +2196,7 @@ Instead of default /html-mode/ I use /html-helper-mode/.
        (t
         (format "%8d" (buffer-size)))))
 
-    (require 'ibuf-ext)
+    (use-package ibuf-ext)
     (define-ibuffer-filter filename2
         "Toggle current view to buffers with filename matching QUALIFIER."
       (:description "filename2"
@@ -1973,13 +2413,25 @@ Incremental mini-buffer completion preview: Type in the minibuffer,
 list of matching commands is echoed
 #+BEGIN_SRC emacs-lisp :tangle yes
 (icomplete-mode 99)
+#+END_SRC
+** iedit
+[2014-05-26 Mon 22:49]
+#+BEGIN_SRC emacs-lisp :tangle yes
+(use-package iedit
+  :ensure iedit
+  :commands (iedit-mode)
+  :defer t
+  :bind (("C-;" . iedit-mode)
+         ("C-," . iedit-mode-toggle-on-function))
+  )
+
 #+END_SRC
 ** info stuff
 [2014-05-20 Tue 23:35]
 #+BEGIN_SRC emacs-lisp :tangle yes
 (use-package info
   :bind ("C-h C-i" . info-lookup-symbol)
-
+  :commands info-lookup-symbol
   :config
   (progn
     ;; (defadvice info-setup (after load-info+ activate)
@@ -2016,18 +2468,37 @@ gnus, so we have a list of modes where we don't want to see it.
       (unless (member major-mode linum-mode-inhibit-modes-list)
         ad-do-it))
 
-    (ad-activate 'linum-on))
+    (ad-activate 'linum-on)
+
+    (use-package linum-relative
+      :ensure linum-relative
+      :init
+      (progn
+        (setq linum-format 'dynamic)
+        )))
   :init
   (global-linum-mode 1))
 #+END_SRC
 
 ** lisp editing stuff
+
 [2013-04-21 So 21:00]
 I'm not doing much of it, except for my emacs and gnus configs, but
 then I like it nice too...
 #+BEGIN_SRC emacs-lisp :tangle yes
 (bind-key "TAB" 'lisp-complete-symbol read-expression-map)
 
+(defun remove-elc-on-save ()
+  "If you're saving an elisp file, likely the .elc is no longer valid."
+  (make-local-variable 'after-save-hook)
+  (add-hook 'after-save-hook
+            (lambda ()
+              (if (file-exists-p (concat buffer-file-name "c"))
+                  (delete-file (concat buffer-file-name "c"))))))
+
+(add-hook 'emacs-lisp-mode-hook 'turn-on-eldoc-mode)
+(add-hook 'emacs-lisp-mode-hook 'remove-elc-on-save)
+
 (use-package paredit
   :ensure paredit
   :diminish paredit-mode " π")
@@ -2048,7 +2519,6 @@ then I like it nice too...
 (after "eldoc"
   '(diminish 'eldoc-mode))
 #+END_SRC
-
 ** magit
 [2013-04-21 So 20:48]
 magit is a mode for interacting with git.
@@ -2069,16 +2539,16 @@ magit is a mode for interacting with git.
                             )
           magit-repo-dirs-depth 4
           magit-log-auto-more t)
-    (use-package magit-blame
-      :commands magit-blame-mode)
 
-    (use-package magit-filenotify
-      :ensure magit-filenotify)
+    (use-package magit-blame
+      :commands magit-blame-mode
+      :defer t)
 
     (use-package magit-svn
       :ensure magit-svn
       :commands (magit-svn-mode
-                 turn-on-magit-svn))
+                 turn-on-magit-svn)
+      :defer t)
 
     (add-hook 'magit-mode-hook 'hl-line-mode)
     (defun magit-status-with-prefix ()
@@ -2093,10 +2563,31 @@ magit is a mode for interacting with git.
     (unbind-key "M-h" magit-mode-map)
     (unbind-key "M-s" magit-mode-map)
 
+    (use-package magit-find-file
+      :ensure magit-find-file
+      :commands (magit-find-file-completing-read)
+      :defer t
+      :init
+      (progn
+        (bind-key "C-x C-f" 'magit-find-file-completing-read magit-mode-map)))
+
     (add-hook 'magit-log-edit-mode-hook
               #'(lambda ()
                   (set-fill-column 72)
                   (flyspell-mode)))
+
+    (defadvice magit-status (around magit-fullscreen activate)
+      (window-configuration-to-register :magit-fullscreen)
+      ad-do-it
+      (delete-other-windows))
+
+    (defun magit-quit-session ()
+      "Restores the previous window configuration and kills the magit buffer"
+      (interactive)
+      (kill-buffer)
+      (jump-to-register :magit-fullscreen))
+
+    (bind-key "q" 'magit-quit-session magit-status-mode-map)
     ))
 #+END_SRC
 ** markdown-mode
@@ -2109,8 +2600,10 @@ magit is a mode for interacting with git.
 #+END_SRC
 ** message
 #+BEGIN_SRC emacs-lisp :tangle yes
-(require 'message)
-(setq message-kill-buffer-on-exit t)
+(use-package message
+  :idle
+  (progn
+    (setq message-kill-buffer-on-exit t)))
 #+END_SRC
 ** mingus
 [[https://github.com/pft/mingus][Mingus]] is a nice interface to mpd, the Music Player Daemon.
@@ -2136,6 +2629,7 @@ Edit minibuffer in a full (text-mode) buffer by pressing *M-C-e*.
 #+BEGIN_SRC emacs-lisp :tangle yes
 (use-package miniedit
   :ensure miniedit
+  :commands miniedit
   :config
   (progn
     (bind-key "M-C-e" 'miniedit minibuffer-local-map)
@@ -2145,11 +2639,12 @@ Edit minibuffer in a full (text-mode) buffer by pressing *M-C-e*.
   ))
 #+END_SRC
 
+
 ** mmm-mode
 [2013-05-21 Tue 23:39]
 MMM Mode is a minor mode for Emacs that allows Multiple Major Modes to
 coexist in one buffer.
-#+BEGIN_SRC emacs-lisp :tangle yes
+#+BEGIN_SRC emacs-lisp :tangle no
 (use-package mmm-auto
   :ensure mmm-mode
   :init
@@ -2188,7 +2683,6 @@ coexist in one buffer.
 ** mo-git-blame
 This is [[https://github.com/mbunkus/mo-git-blame][mo-git-blame -- An interactive, iterative 'git blame' mode for
 Emacs]].
-
 #+BEGIN_SRC emacs-lisp :tangle yes
 (use-package mo-git-blame
   :ensure mo-git-blame
@@ -2207,19 +2701,46 @@ Use multiple cursors mode. See [[http://emacsrocks.com/e13.html][Emacs Rocks! mu
 (use-package multiple-cursors
   :ensure multiple-cursors
   :defer t
+  :commands (mc/remove-fake-cursors
+             mc/create-fake-cursor-at-point
+             mc/pop-state-from-overlay
+             mc/maybe-multiple-cursors-mode)
+  :defines (multiple-cursors-mode
+            mc--read-char
+            mc--read-quoted-char
+            rectangular-region-mode)
   :bind (("C-S-c C-S-c" . mc/edit-lines)
          ("C->"     . mc/mark-next-like-this)
          ("C-<"     . mc/mark-previous-like-this)
-         ("C-c C-<" . mc/mark-all-like-this))
+         ("C-c C-<" . mc/mark-all-like-this)
+         ("C-c i"   . mc/insert-numbers))
   :config
   (progn
     (bind-key "a" 'mc/mark-all-like-this region-bindings-mode-map)
-    (bind-key  "p" 'mc/mark-previous-like-this region-bindings-mode-map)
-    (bind-key  "n" 'mc/mark-next-like-this region-bindings-mode-map)
-    (bind-key  "l" 'mc/edit-lines region-bindings-mode-map)
-    (bind-key  "m" 'mc/mark-more-like-this-extended region-bindings-mode-map)
+    (bind-key "p" 'mc/mark-previous-like-this region-bindings-mode-map)
+    (bind-key "n" 'mc/mark-next-like-this region-bindings-mode-map)
+    (bind-key "l" 'mc/edit-lines region-bindings-mode-map)
+    (bind-key "m" 'mc/mark-more-like-this-extended region-bindings-mode-map)
     (setq mc/list-file (expand-file-name "mc-cache.el" jj-cache-dir))))
 #+END_SRC
+** neotree
+[2014-08-27 Wed 17:15]
+A emacs tree plugin
+#+BEGIN_SRC emacs-lisp :tangle yes
+(use-package neotree
+  :ensure neotree
+  :defer t
+  :bind (("<f8>" . neotree-toggle))
+  :commands (neotree-find
+             neotree-toggle
+             neotree)
+  :idle
+  (progn
+    (setq neo-smart-open t))
+  :config
+  (progn
+    (bind-key "^" 'neotree-select-up-node neotree-mode-map)))
+#+END_SRC
 ** nxml
 [2013-05-22 Wed 22:02]
 nxml-mode is a major mode for editing XML.
@@ -2431,14 +2952,14 @@ And now a largish set of keybindings...
 #+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
 (bind-key "C-c l" 'org-store-link)
 (bind-key "C-c a" 'org-agenda)
-(bind-key "C-c b" 'org-iswitchb)
+;(bind-key "C-c b" 'org-iswitchb)
 (define-key mode-specific-map [?a] 'org-agenda)
 
 (bind-key "<f12>"     'org-agenda)
 (bind-key "<f5>"      'bh/org-todo)
 (bind-key "<S-f5>"    'bh/widen)
 (bind-key "<f7>"      'bh/set-truncate-lines)
-(bind-key "<f8>"      'org-cycle-agenda-files)
+;(bind-key "<f8>"      'org-cycle-agenda-files)
 
 (bind-key "<f9> <f9>" 'bh/show-org-agenda)
 (bind-key "<f9> b"    'bbdb)
@@ -2470,7 +2991,7 @@ And now a largish set of keybindings...
 (bind-key "C-M-r"     'org-capture)
 (bind-key "C-c r"     'org-capture)
 (bind-key "C-S-<f12>" 'bh/save-then-publish)
-(bind-key "C-k" 'jj-org-kill-line org-mode-map)
+;(bind-key "C-k" 'jj-org-kill-line org-mode-map)
 
 #+END_SRC
 
@@ -3212,7 +3733,7 @@ sequence =C-c C-v h= (bound to `=org-babel-describe-bindings=') will
 display a list of the code blocks commands and their related keys.
 
 #+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
-(setq org-use-speed-commands t)
+(setq org-use-speed-commands nil)
 (setq org-speed-commands-user (quote (("0" . ignore)
                                       ("1" . ignore)
                                       ("2" . ignore)
@@ -3275,6 +3796,7 @@ display a list of the code blocks commands and their related keys.
           'append)
 #+END_SRC
 
+
 The following displays the contents of code blocks in Org-mode files
 using the major-mode of the code.  It also changes the behavior of
 =TAB= to as if it were used in the appropriate major mode.  This means
@@ -3312,7 +3834,7 @@ up here to be used.
 #+BEGIN_SRC emacs-lisp :tangle yes
 (use-package cperl-mode
   :commands cperl-mode
-  :init
+  :idle
   (progn
     (defalias 'perl-mode 'cperl-mode)
     (add-auto-mode 'cperl-mode "\\.\\([pP][Llm]\\|al\\)\\'")
@@ -3359,12 +3881,19 @@ up here to be used.
 #+BEGIN_SRC emacs-lisp :tangle yes
 (use-package puppet-mode
   :mode ("\\.pp\\'" . puppet-mode)
+  :commands puppet-mode
+  :idle
+  (progn
+    (defun my-puppet-mode-hook ()
+      (setq require-final-newline nil))
+    (add-hook 'puppet-mode-hook 'my-puppet-mode-hook))
   :config
-  (use-package puppet-ext
-  :init
   (progn
-    (bind-key "C-x ?" 'puppet-set-anchor puppet-mode-map)
-    (bind-key "C-c C-r" 'puppet-create-require puppet-mode-map))))
+    (use-package puppet-ext
+      :init
+      (progn
+        (bind-key "C-x ?" 'puppet-set-anchor puppet-mode-map)
+        (bind-key "C-c C-r" 'puppet-create-require puppet-mode-map)))))
 #+END_SRC
 
 ** python
@@ -3373,7 +3902,7 @@ various variables. Elpy author may like them, but I'm not him...
 #+BEGIN_SRC emacs-lisp :tangle yes
 (use-package elpy
   :defer t
-  :mode ("\.py" . elpy-mode)
+  :mode ("\.py" . python-mode)
   :init
   (progn
     (safe-load (concat jj-elisp-dir "/elpy/elpy-autoloads.el"))
@@ -3413,6 +3942,11 @@ various variables. Elpy author may like them, but I'm not him...
     ;; is disabled, which can cause some confusion.
     (add-hook 'python-mode-hook 'elpy-initialize-local-variables)
 
+    (defun my-python-mode-hook ()
+      (setq require-final-newline nil)
+      (setq mode-require-final-newline))
+    (add-hook 'python-mode-hook 'my-python-mode-hook)
+
     ;; Flymake support using flake8, including warning faces.
     (when (and (executable-find "flake8")
                (not (executable-find python-check-command)))
@@ -3524,13 +4058,15 @@ and tell which statements are at the same depth.
 #+BEGIN_SRC emacs-lisp :tangle yes
 (use-package rainbow-delimiters
   :ensure rainbow-delimiters
+  :commands rainbow-delimiters-mode
   :init
-  (global-rainbow-delimiters-mode))
+  (add-hook 'prog-mode-hook #'rainbow-delimiters-mode))
 #+END_SRC
 ** rainbow-mode
 #+BEGIN_SRC emacs-lisp :tangle yes
 (use-package rainbow-mode
   :ensure rainbow-mode
+  :defer t
   :diminish rainbow-mode)
 #+END_SRC
 
@@ -3538,7 +4074,7 @@ and tell which statements are at the same depth.
 Saner regex syntax
 #+BEGIN_SRC emacs-lisp :tangle yes
 (use-package re-builder
-  :command re-builder
+  :commands re-builder
   :defer t
   :config
   (setq reb-re-syntax 'string))
@@ -3747,7 +4283,18 @@ Store at which point I have been in files.
 (require 'saveplace)
 (setq save-place-file (expand-file-name "saved-places" jj-cache-dir))
 #+END_SRC
-
+** simple-httpd
+[2014-06-10 Tue 22:05]
+#+BEGIN_SRC emacs-lisp :tangle yes
+(use-package simple-httpd
+  :ensure simple-httpd
+  :commands (httpd-start httpd-stop)
+  :config
+  (progn
+    (setq httpd-root "/srv/www")
+    )
+)
+#+END_SRC
 ** sh
 Settings for shell scripts
 #+BEGIN_SRC emacs-lisp :tangle yes
@@ -3772,6 +4319,15 @@ Settings for shell scripts
 (use-package sh-toggle
   :bind ("C-. C-z" . shell-toggle))
 #+END_SRC
+** smartscan
+[2015-02-24 Tue 23:35]
+Make =M-n= and =M-p= go forward/backword to the symbol at point.
+#+BEGIN_SRC emacs-lisp :tangle yes
+(use-package smartscan
+  :ensure smartscan
+  :defer t
+  :idle (global-smartscan-mode t))
+#+END_SRC
 ** timestamp
 By default, Emacs can update the time stamp for the following two
 formats if one exists in the first 8 lines of the file.
@@ -3780,7 +4336,7 @@ formats if one exists in the first 8 lines of the file.
 #+BEGIN_SRC emacs-lisp :tangle yes
 (use-package time-stamp
   :commands time-stamp
-  :init
+  :idle
   (progn
     (add-hook 'write-file-hooks 'time-stamp)
     (setq time-stamp-active t))
@@ -3803,22 +4359,16 @@ them. I don't need much actually, but these things are nice to have.
 (autoload 'tinycomment-indent-for-comment      "tinycomment" "" t)
 (autoload 'tinyeat-forward-preserve            "tinyeat" "" t)
 (autoload 'tinyeat-backward-preserve           "tinyeat" "" t)
-(autoload 'tinyeat-delete-paragraph            "tinyeat" "" t)
-(autoload 'tinyeat-kill-line                   "tinyeat" "" t)
-(autoload 'tinyeat-zap-line                    "tinyeat" "" t)
 (autoload 'tinyeat-kill-line-backward          "tinyeat" "" t)
-(autoload 'tinyeat-kill-buffer-lines-point-max "tinyeat" "" t)
-(autoload 'tinyeat-kill-buffer-lines-point-min "tinyeat" "" t)
 #+END_SRC
 *** Keyboard changes for tiny-tools
 #+BEGIN_SRC emacs-lisp :tangle yes
-(bind-key  "\M-;" 'tinycomment-indent-for-comment)
+(bind-key "\M-;"          'tinycomment-indent-for-comment)
 (bind-key "ESC C-k"       'tinyeat-kill-line-backward)
 (bind-key "ESC d"         'tinyeat-forward-preserve)
 (bind-key "<M-backspace>" 'tinyeat-backward-preserve)
 (bind-key "<S-backspace>" 'tinyeat-delete-whole-word)
 #+END_SRC
-
 ** tramp
 Transparent Remote (file) Access, Multiple Protocol, remote file editing.
 #+BEGIN_SRC emacs-lisp :tangle yes
@@ -3828,8 +4378,7 @@ Transparent Remote (file) Access, Multiple Protocol, remote file editing.
   (progn
     (setq tramp-persistency-file-name (expand-file-name "tramp" jj-cache-dir))
     (setq shell-prompt-pattern "^[^a-zA-Z].*[#$%>] *")
-    (add-to-list 'tramp-default-method-alist '("\\`localhost\\'" "\\`root\\'" "su")
-                 )
+    (add-to-list 'tramp-default-method-alist '("\\`localhost\\'" "\\`root\\'" "su"))
     (setq tramp-debug-buffer nil)
     (setq tramp-default-method "sshx")
     (tramp-set-completion-function "ssh"
@@ -3844,6 +4393,9 @@ For some reason I prefer this mode more than the way without. I want to
 see the marked region.
 #+BEGIN_SRC emacs-lisp :tangle yes
 (transient-mark-mode 1)
+(make-variable-buffer-local 'transient-mark-mode)
+(put 'transient-mark-mode 'permanent-local t)
+(setq-default transient-mark-mode t)
 #+END_SRC
 ** undo-tree
 [2013-04-21 So 11:07]
@@ -3855,26 +4407,23 @@ keeping the full power of emacs undo/redo.
 #+BEGIN_SRC emacs-lisp :tangle yes
 (use-package undo-tree
   :ensure undo-tree
+  :diminish undo-tree-mode
   :init
-  (global-undo-tree-mode)
-  :diminish undo-tree-mode)
-#+END_SRC
-
-Additionally I would like to keep the region active should I undo
-while I have one.
-
-#+BEGIN_SRC emacs-lisp :tangle yes
-;; Keep region when undoing in region
-(defadvice undo-tree-undo (around keep-region activate)
-  (if (use-region-p)
-      (let ((m (set-marker (make-marker) (mark)))
-            (p (set-marker (make-marker) (point))))
-        ad-do-it
-        (goto-char p)
-        (set-mark m)
-        (set-marker p nil)
-        (set-marker m nil))
-    ad-do-it))
+  (progn
+    (global-undo-tree-mode)
+    (setq undo-tree-visualizer-timestamps t)
+    (setq undo-tree-visualizer-diff t)
+    ;; Keep region when undoing in region
+    (defadvice undo-tree-undo (around keep-region activate)
+      (if (use-region-p)
+          (let ((m (set-marker (make-marker) (mark)))
+                (p (set-marker (make-marker) (point))))
+            ad-do-it
+            (goto-char p)
+            (set-mark m)
+            (set-marker p nil)
+            (set-marker m nil))
+        ad-do-it))))
 #+END_SRC
 ** uniquify
 Always have unique buffernames. See [[http://www.gnu.org/software/emacs/manual/html_node/emacs/Uniquify.html][Uniquify - GNU Emacs Manual]]
@@ -3895,6 +4444,18 @@ operating system or location info.
 (setq url-mime-language-string "de,en")
 (setq url-privacy-level (quote (email os lastloc)))
 #+END_SRC
+** visual-regexp
+[2014-06-01 Sun 21:38]
+visual-regexp for Emacs is like replace-regexp, but with live visual
+feedback directly in the buffer
+#+BEGIN_SRC emacs-lisp :tangle yes
+(use-package visual-regexp
+  :ensure visual-regexp
+  :bind (("C-M-%" . vr/replace)
+         ("M-%" . vr/query-replace)
+         ("C-c m" . vr/mc-mark))
+  :defer t)
+#+END_SRC
 ** volatile highlights
 [2013-04-21 So 20:31]
 VolatileHighlights highlights changes to the buffer caused by commands
@@ -3904,29 +4465,81 @@ your operation actually changed in the buffer.
 #+BEGIN_SRC emacs-lisp :tangle yes
 (use-package volatile-highlights
   :ensure volatile-highlights
-  :init
+  :idle
   (volatile-highlights-mode t)
   :diminish volatile-highlights-mode)
 #+END_SRC
+** winner mode - undo and redo window configuration
+[2015-02-24 Tue 23:11]
+=winner-mode= lets you use =C-c <left>= and =C-c <right>= to switch between
+window configurations. This is handy when something has popped up a
+buffer that you want to look at briefly before returning to whatever
+you were working on. When you're done, press =C-c <left>=.
+#+BEGIN_SRC emacs-lisp :tangle yes
+(use-package winner
+  :ensure t
+  :defer t
+  :idle (winner-mode 1))
+#+END_SRC
 ** writegood
 This highlights some /weaselwords/, a mode to /aid in finding common
 writing problems/...
 [2013-04-27 Sa 23:29]
-#+BEGIN_SRC emacs-lisp :tangle yes
+#+BEGIN_SRC emacs-lisp :tangle no
 (use-package writegood-mode
   :ensure writegood-mode
   :defer t
   :init
   (bind-key "C-c g" 'writegood-mode))
 #+END_SRC
+** web-mode
+[2014-06-01 Sun 22:48]
+#+BEGIN_SRC emacs-lisp :tangle yes
+(use-package web-mode
+  :ensure web-mode
+  :defer t
+  :mode (("\\.phtml\\'" . web-mode)
+         ("\\.tpl\\.php\\'" . web-mode)
+         ("\\.jsp\\'" . web-mode)
+         ("\\.as[cp]x\\'" . web-mode)
+         ("\\.erb\\'" . web-mode)
+         ("\\.mustache\\'" . web-mode)
+         ("\\.html\\'" . web-mode)
+         ("\\.css\\'" . web-mode)
+         ("\\.djhtml\\'" . web-mode))
+  :init
+  (progn
+    (add-hook 'web-mode-hook
+              (lambda ()
+                (setq web-mode-markup-indent-offset 2)
+                (setq web-mode-css-indent-offset 2)
+                (setq web-mode-code-indent-offset 2)
+                (setq web-mode-enable-css-colorization t)
+                (setq web-mode-enable-comment-keywords t)
+                (setq web-mode-enable-current-element-highlight t))))
+  :config
+  (progn
+    (setq web-mode-enable-current-element-highlight t)
+    (setq web-mode-ac-sources-alist
+          '(("css" . (ac-source-css-property))
+            ("html" . (ac-source-words-in-buffer ac-source-abbrev))))
+    (use-package impatient-mode
+      :ensure impatient-mode
+      :defer t
+      :commands impatient-mode))
+  )
+
+#+END_SRC
 ** yafolding
 Yet another folding extension for the Emacs editor. Unlike many
 others, this one works by just using the existing indentation of the
 file, so basically works in every halfway structured file.
 #+BEGIN_SRC emacs-lisp :tangle yes
-(bind-key "C-#" 'yafolding)
-;;(define-key global-map (kbd "C-c C-f") 'yafolding-toggle-all)
-(bind-key "C-c C-f" 'yafolding-toggle-all-by-current-level)
+(use-package yafolding
+  :bind (("C-#" . yafolding)
+         ("C-c C-f" . yafolding-toggle-all-by-current-level))
+  :commands (yafolding yafolding-toggle-all-by-current-level)
+  )
 #+END_SRC
 ** yaml-mode
 [2013-04-28 So 01:13]
@@ -3935,7 +4548,6 @@ readable/editable without getting a big headache.
 #+BEGIN_SRC emacs-lisp :tangle yes
 (use-package yaml-mode
   :ensure yaml-mode
-
   :mode ("\\.ya?ml\\'" . yaml-mode)
   :config
     (bind-key "C-m" 'newline-and-indent yaml-mode-map ))
@@ -3949,12 +4561,17 @@ whatever the snippet holds.
 (setq yas-snippet-dirs (expand-file-name "yasnippet/snippets" jj-elisp-dir))
 (use-package yasnippet
   :ensure yasnippet
-  :init
+  :defer t
+  :diminish yas-minor-mode
+  :commands yas-global-mode
+  :idle
   (progn
-    (yas-global-mode 1)
     ;; Integrate hippie-expand with ya-snippet
     (add-to-list 'hippie-expand-try-functions-list
                  'yas-hippie-try-expand)
+    (yas-global-mode 1)
+    (setq yas-expand-only-for-last-commands '(self-insert-command))
+    (bind-key "\t" 'hippie-expand yas-minor-mode-map)
     ))
 #+END_SRC
 * Thats it