Adjust
authorJoerg Jaspert <joerg@debian.org>
Sun, 1 Mar 2015 13:37:07 +0000 (14:37 +0100)
committerJoerg Jaspert <joerg@debian.org>
Sun, 1 Mar 2015 13:37:07 +0000 (14:37 +0100)
.emacs.d/config/customized.el
.emacs.d/config/emacs.org

index caff8d9..239529e 100644 (file)
  '(sieve-manage-default-port 4190)
  '(tab-width 8)
  '(text-mode-hook (quote (turn-on-auto-fill text-mode-hook-identify)))
  '(sieve-manage-default-port 4190)
  '(tab-width 8)
  '(text-mode-hook (quote (turn-on-auto-fill text-mode-hook-identify)))
- '(tool-bar-mode nil nil (tool-bar)))
+ '(tool-bar-mode nil nil (tool-bar))
+ '(vc-handled-backends (quote (SVN Git))))
 
 (custom-set-faces
  ;; custom-set-faces was added by Custom.
 
 (custom-set-faces
  ;; custom-set-faces was added by Custom.
index 3df71a0..c80554d 100644 (file)
@@ -405,1394 +405,1433 @@ Shell. zsh in my case.
 (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-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
 
 #+END_SRC
 
-*** Emacs shell
-Basic settings for emacs integrated shell
-#+BEGIN_SRC emacs-lisp :tangle no
-(use-package eshell
-  :defer t
-  :init
-  (progn
-    (defun eshell-initialize ()
-      (defun eshell-spawn-external-command (beg end)
-        "Parse and expand any history references in current input."
-        (save-excursion
-          (goto-char end)
-          (when (looking-back "&!" beg)
-            (delete-region (match-beginning 0) (match-end 0))
-            (goto-char beg)
-            (insert "spawn "))))
-      (add-hook 'eshell-expand-input-functions 'eshell-spawn-external-command)
-      (eval-after-load "em-unix"
-        '(progn
-           (unintern 'eshell/su)
-           (unintern 'eshell/sudo))))
-    (add-hook 'eshell-first-time-mode-hook 'eshell-initialize)
-    )
-  :config
-  (progn
-    (require 'em-cmpl)
-    (require 'em-prompt)
-    (require 'em-term)
-    (use-package f
-      :ensure f)
-    (setq eshell-cmpl-cycle-completions nil
-          eshell-save-history-on-exit t
-          eshell-cmpl-dir-ignore "\\`\\(\\.\\.?\\|CVS\\|\\.svn\\|\\.git\\)/\\'")
-    (setenv "PAGER" "cat")
-    (setq eshell-visual-commands
-          '("less" "tmux" "htop" "top" "bash" "zsh" "tail"))
-    (setq eshell-visual-subcommands
-          '(("git" "log" "l" "diff" "show")))
-
-    (add-to-list 'eshell-command-completions-alist
-                 '("gunzip" "gz\\'"))
-    (add-to-list 'eshell-command-completions-alist
-                 '("tar" "\\(\\.tar|\\.tgz\\|\\.tar\\.gz\\)\\'"))
-
-    ;(set-face-attribute 'eshell-prompt nil :foreground "turquoise1")
-    (add-hook 'eshell-mode-hook ;; for some reason this needs to be a hook
-              '(lambda () (define-key eshell-mode-map "\C-a" 'eshell-bol)))
-    (add-hook 'eshell-preoutput-filter-functions
-              'ansi-color-filter-apply)
-    ;; Prompt with a bit of help from http://www.emacswiki.org/emacs/EshellPrompt
-
-    (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
-Incremental search is great, but annoyingly you need to type whatever
-you want. If you want to search for just the next (or previous)
-occurence of what is at your cursor position use the following.
-*C-x* will insert the current word while *M-up* and *M-down* will just
-jump to the next/previous occurence of it.
-#+BEGIN_SRC emacs-lisp :tangle yes
-(bind-key "C-x" 'sacha/isearch-yank-current-word isearch-mode-map)
-(bind-key* "<M-up>" 'sacha/search-word-backward)
-(bind-key* "<M-down>" 'sacha/search-word-forward)
-#+END_SRC
+** Miscellaneous stuff
 
 
-*** Frame configuration
-I want to see the buffername and its size, not the host I am on in my
-frame title.
+Searches and matches should ignore case.
 #+BEGIN_SRC emacs-lisp :tangle yes
 #+BEGIN_SRC emacs-lisp :tangle yes
-(setq frame-title-format "%b (%i)")
+(setq-default case-fold-search t)
 #+END_SRC
 
 #+END_SRC
 
-*** Protect some buffers
-I don't want some buffers to be killed, **scratch** for example.
-In the past I had a long function that just recreated them, but the
-=keep-buffers= package is easier.
+Which buffers to get rid off at midnight.
 #+BEGIN_SRC emacs-lisp :tangle yes
 #+BEGIN_SRC emacs-lisp :tangle yes
-(use-package keep-buffers
-  :init
-  (progn
-    (keep-buffers-mode 1)
-    (push '("\\`*scratch" . erase) keep-buffers-protected-alist)
-    (push '("\\`*Org Agenda" . nil) keep-buffers-protected-alist)
-    (push '("\\`*Group" . nil) keep-buffers-protected-alist)
-    ))
+(setq clean-buffer-list-kill-buffer-names (quote ("*Help*" "*Apropos*"
+                                                  "*Man " "*Buffer List*"
+                                                  "*Compile-Log*"
+                                                  "*info*" "*vc*"
+                                                  "*vc-diff*" "*diff*"
+                                                  "*Customize"
+                                                  "*tramp/" "*debug "
+                                                  "*magit" "*Calendar")))
 #+END_SRC
 
 #+END_SRC
 
-*** yes-or-no-p
-Emas usually wants you to type /yes/ or /no/ fully. What a mess, I am
-lazy.
+Don't display a cursor in non-selected windows.
 #+BEGIN_SRC emacs-lisp :tangle yes
 #+BEGIN_SRC emacs-lisp :tangle yes
-(defalias 'yes-or-no-p 'y-or-n-p)
+(setq-default cursor-in-non-selected-windows nil)
 #+END_SRC
 
 #+END_SRC
 
-*** Language/i18n stuff
-In this day and age, UTF-8 is the way to go.
+What should be displayed in the mode-line for files with those types
+of line endings.
 #+BEGIN_SRC emacs-lisp :tangle yes
 #+BEGIN_SRC emacs-lisp :tangle yes
-(set-language-environment 'utf-8)
-(set-default-coding-systems 'utf-8)
-(set-terminal-coding-system 'utf-8)
-(set-keyboard-coding-system 'utf-8)
-(set-clipboard-coding-system 'utf-8)
-(prefer-coding-system 'utf-8)
-(set-charset-priority 'unicode)
-(setq default-process-coding-system '(utf-8-unix . utf-8-unix))
-(when (display-graphic-p)
-  (setq x-select-request-type '(UTF8_STRING COMPOUND_TEXT TEXT STRING)))
+(setq eol-mnemonic-dos "(DOS)")
+(setq eol-mnemonic-mac "(Mac)")
 #+END_SRC
 
 #+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
-(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.
-(Update 30.05.2014: Not used ever, deactivated)
-#+BEGIN_SRC emacs-lisp :tangle no
-(bind-key "C-c k" 'prelude-kill-other-buffers)
-#+END_SRC
-*** Scrolling
-Default scrolling behaviour in emacs is a bit annoying, who wants to
-jump half-windows?
+Much larger threshold for garbage collection prevents it to run too often.
 #+BEGIN_SRC emacs-lisp :tangle yes
 #+BEGIN_SRC emacs-lisp :tangle yes
-(setq scroll-margin 0)
-(setq scroll-conservatively 100000)
-(setq scroll-up-aggressively 0.0)
-(setq scroll-down-aggressively 0.0)
-(setq scroll-preserve-screen-position t)
+(setq gc-cons-threshold 48000000)
 #+END_SRC
 
 #+END_SRC
 
-*** Copy/Paste with X
-[2013-04-09 Di 23:31]
-The default how emacs handles cutting/pasting with the primary selection
-changed in emacs24. I am used to the old way, so get it back.
-#+BEGIN_SRC emacs-lisp :tangle yes
-(setq 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
 #+BEGIN_SRC emacs-lisp :tangle yes
-(unbind-key "C-z")
-(unbind-key "C-x C-z")
+(setq max-lisp-eval-depth 1000)
+(setq max-specpdl-size 3000)
 #+END_SRC
 
 #+END_SRC
 
-http://endlessparentheses.com/kill-entire-line-with-prefix-argument.html?source=rss
+Unfill paragraph
+From https://raw.github.com/qdot/conf_emacs/master/emacs_conf.org
 #+BEGIN_SRC emacs-lisp :tangle yes
 #+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 no
-(defun kill-entire-line ()
-  "Kill this entire line (including newline), regardless of where point is within the line."
+(defun unfill-paragraph ()
+  "Takes a multi-line paragraph and makes it into a single line of text."
   (interactive)
   (interactive)
-  (beginning-of-line)
-  (kill-line)
-  (back-to-indentation))
-
-(bind-key* "C-k" 'kill-entire-line)
-(global-set-key [remap kill-whole-line] 'kill-entire-line)
+  (let ((fill-column (point-max)))
+    (fill-paragraph nil)))
+(bind-key "H-u" 'unfill-paragraph)
 #+END_SRC
 
 #+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 no
-(defun jj-org-kill-line (&optional arg)
-  "Kill the entire line, regardless of where point is within the line, org-mode-version"
-  (interactive "P")
-  (beginning-of-line)
-  (org-kill-line arg)
-  (back-to-indentation)
-  )
+#+BEGIN_SRC emacs-lisp :tangle yes
+(setq-default indicate-empty-lines t)
+(setq sentence-end-double-space nil)
 #+END_SRC
 
 #+END_SRC
 
-I really hate tabs, so I don't want any indentation to try using them.
-And in case a project really needs them, I can change it just for that
-file/project, but luckily none of those I work in is as broken.
+Hilight annotations in comments, like FIXME/TODO/...
 #+BEGIN_SRC emacs-lisp :tangle yes
 #+BEGIN_SRC emacs-lisp :tangle yes
-(setq-default indent-tabs-mode nil)
+(add-hook 'prog-mode-hook 'font-lock-comment-annotations)
 #+END_SRC
 
 #+END_SRC
 
-Make the % key jump to the matching {}[]() if on another, like vi, see [[id:b6e6cf73-9802-4a7b-bd65-fdb6f9745319][the function]]
+*** Browser
 #+BEGIN_SRC emacs-lisp :tangle yes
 #+BEGIN_SRC emacs-lisp :tangle yes
-(bind-key* "M-5" 'match-paren)
+(setq browse-url-browser-function (quote browse-url-generic))
+(setq browse-url-generic-program "/usr/bin/x-www-browser")
 #+END_SRC
 
 #+END_SRC
 
-Instead of the default "mark-defun" I want a more readline-like setting.
+*** When saving a script - make it executable
 #+BEGIN_SRC emacs-lisp :tangle yes
 #+BEGIN_SRC emacs-lisp :tangle yes
-(bind-key "C-M-h" 'backward-kill-word)
+(add-hook 'after-save-hook 'executable-make-buffer-file-executable-if-script-p)
 #+END_SRC
 
 #+END_SRC
 
-Align whatever with a regexp.
+*** Emacs Server
 #+BEGIN_SRC emacs-lisp :tangle yes
 #+BEGIN_SRC emacs-lisp :tangle yes
-(bind-key "C-x \\" 'align-regexp)
+(use-package server
+  :init
+  (progn
+    (add-hook 'after-init-hook 'server-start)))
 #+END_SRC
 
 #+END_SRC
 
-Font size changes
+** Customized variables
+[2013-05-02 Thu 22:14]
+The following contains a set of variables i may reasonably want to
+change on other systems - which don't affect the init file loading
+process. So I *can* use the customization interface for it...
 #+BEGIN_SRC emacs-lisp :tangle yes
 #+BEGIN_SRC emacs-lisp :tangle yes
-(bind-key "C-+" 'text-scale-increase)
-(bind-key "C--" 'text-scale-decrease)
-#+END_SRC
-
-Regexes are too useful, so use the regex search by default.
-#+begin_src emacs-lisp
-(bind-key "C-s"   'isearch-forward-regexp)
-(bind-key "C-r"   'isearch-backward-regexp)
-(bind-key "C-M-s" 'isearch-forward)
-(bind-key "C-M-r" 'isearch-backward)
-#+end_src
+(defgroup ganneff nil
+  "Modify ganneffs settings"
+  :group 'environment)
 
 
-Rgrep is infinitely useful in multi-file projects.
-#+begin_src emacs-lisp
-(bind-key "C-x C-g" 'rgrep)
-#+end_src
+(defgroup ganneff-org-mode nil
+  "Ganneffs org-mode settings"
+  :tag "Ganneffs org-mode settings"
+  :group 'ganneff
+  :link '(custom-group-link "ganneff"))
 
 
-Easy way to move a line up - or down. Simpler than dealing with C-x C-t
-AKA transpose lines.
-#+BEGIN_SRC emacs-lisp :tangle yes
-(bind-key "<M-S-up>"  'move-line-up)
-(bind-key "<M-S-down>" 'move-line-down)
-#+END_SRC
+(defcustom bh/organization-task-id "d0db0d3c-f22e-42ff-a654-69524ff7cc91"
+  "ID of the organization task."
+  :tag "Organization Task ID"
+  :type 'string
+  :group 'ganneff-org-mode)
 
 
-"Pull" lines up, join them
-#+BEGIN_SRC emacs-lisp :tangle yes
-(defun join-line-or-lines-in-region ()
-  "Join this line or the lines in the selected region.
-Joins single lines in reverse order to the default, ie. pulls the next one up."
-  (interactive)
-  (cond ((region-active-p)
-         (let ((min (line-number-at-pos (region-beginning))))
-           (goto-char (region-end))
-           (while (> (line-number-at-pos) min)
-             (join-line ))))
-        (t (let ((current-prefix-arg '(4)))
-             (call-interactively 'join-line)))))
-(bind-key "M-j" 'join-line-or-lines-in-region)
+(defcustom org-my-archive-expiry-days 2
+  "The number of days after which a completed task should be auto-archived.
+This can be 0 for immediate, or a floating point value."
+  :tag "Archive expiry days"
+  :type 'float
+  :group 'ganneff-org-mode)
 #+END_SRC
 
 #+END_SRC
 
-When I press Enter I almost always want to go to the right indentation on the next line.
-#+BEGIN_SRC emacs-lisp :tangle yes
-(bind-key "RET" 'newline-and-indent)
-#+END_SRC
 
 
-Easier undo, and i don't need suspend-frame
+** Compatibility
+[2013-05-21 Tue 23:22]
+Restore removed var alias, used by ruby-electric-brace and others
 #+BEGIN_SRC emacs-lisp :tangle yes
 #+BEGIN_SRC emacs-lisp :tangle yes
-(bind-key "C-z" 'undo)
+(unless (boundp 'last-command-char)
+  (defvaralias 'last-command-char 'last-command-event))
 #+END_SRC
 #+END_SRC
+* Customized variables
+:PROPERTIES:
+:ID: 0102208d-fdf6-4928-9e40-7e341bd3aa3a
+:END:
+Of course I want to be able to use the customize interface, and some
+things can only be set via it (or so they say). I usually prefer to put
+things I keep for a long while into statements somewhere else, not just
+custom-set here, but we need it anyways.
 
 
-Window switching, go backwards. (C-x o goes to the next window)
 #+BEGIN_SRC emacs-lisp :tangle yes
 #+BEGIN_SRC emacs-lisp :tangle yes
-(bind-key "C-x O" (lambda ()
-                    (interactive)
-                    (other-window -1)))
+(setq custom-file jj-custom-file)
+(safe-load custom-file)
 #+END_SRC
 
 #+END_SRC
 
-Edit file as root
-#+BEGIN_SRC emacs-lisp :tangle yes
-(bind-key "C-x C-r" 'prelude-sudo-edit)
-#+END_SRC
+The source of this is:
+#+INCLUDE: "~/.emacs.d/config/customized.el" src emacs-lisp
 
 
-M-space is bound to just-one-space, which is great for programming. What
-it does is remove all spaces around the cursor, except for one. But to
-be really useful, it also should include newlines. It doesn’t do this by
-default. Rather, you have to call it with a negative argument. Sure
-not, bad Emacs.
-#+BEGIN_SRC emacs-lisp :tangle yes
-(bind-key "M-SPC" 'just-one-space-with-newline)
-#+END_SRC
 
 
-Count which commands I use how often.
+* Extra modes and their configuration
+** abbrev
+A defined abbrev is a word which expands, if you insert it, into some
+different text. Abbrevs are defined by the user to expand in specific
+ways.
 #+BEGIN_SRC emacs-lisp :tangle yes
 #+BEGIN_SRC emacs-lisp :tangle yes
-(use-package keyfreq
-  :ensure keyfreq
-  :init
+(use-package abbrev
+  :commands abbrev-mode
+  :diminish abbrev-mode
+  :idle
+  (hook-into-modes #'abbrev-mode '(text-mode-hook))
+  :config
   (progn
   (progn
-    (setq keyfreq-file (expand-file-name "keyfreq" jj-cache-dir))
-    (setq keyfreq-file-lock (expand-file-name "keyfreq.lock" jj-cache-dir))
-    (keyfreq-mode 1)
-    (keyfreq-autosave-mode 1)))
-#+END_SRC
-
-Duplicate current line
-#+BEGIN_SRC emacs-lisp :tangle yes
-(defun duplicate-line ()
-  "Insert a copy of the current line after the current line."
-  (interactive)
-  (save-excursion
-    (let ((line-text (buffer-substring-no-properties
-                      (line-beginning-position)
-                      (line-end-position))))
-      (move-end-of-line 1)
-      (newline)
-      (insert line-text))))
+    (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))
 
 
-(bind-key "C-c p" 'duplicate-line)
+    (add-hook 'expand-load-hook
+              (lambda ()
+                (add-hook 'expand-expand-hook 'indent-according-to-mode)
+                (add-hook 'expand-jump-hook 'indent-according-to-mode)))))
 #+END_SRC
 #+END_SRC
-
-Smarter move to the beginning of the line. That is, it first moves to
-the beginning of the line - and on second keypress it goes to the
-first character on line.
+** ace-jump-mode
+[2013-04-28 So 11:26]
+Quickly move around in buffers.
 #+BEGIN_SRC emacs-lisp :tangle yes
 #+BEGIN_SRC emacs-lisp :tangle yes
-(defun smarter-move-beginning-of-line (arg)
-  "Move point back to indentation of beginning of line.
-
-Move point to the first non-whitespace character on this line.
-If point is already there, move to the beginning of the line.
-Effectively toggle between the first non-whitespace character and
-the beginning of the line.
-
-If ARG is not nil or 1, move forward ARG - 1 lines first.  If
-point reaches the beginning or end of the buffer, stop there."
-  (interactive "^p")
-  (setq arg (or arg 1))
-
-  ;; Move lines first
-  (when (/= arg 1)
-    (let ((line-move-visual nil))
-      (forward-line (1- arg))))
-
-  (let ((orig-point (point)))
-    (back-to-indentation)
-    (when (= orig-point (point))
-      (move-beginning-of-line 1))))
-
-;; remap C-a to `smarter-move-beginning-of-line'
-(global-set-key [remap move-beginning-of-line]
-                'smarter-move-beginning-of-line)
-
+(use-package ace-jump-mode
+  :ensure ace-jump-mode
+  :commands ace-jump-mode
+  :bind ("H-SPC" . ace-jump-mode))
 #+END_SRC
 #+END_SRC
-
-Easily copy characters from the previous nonblank line, starting just
-above point. With a prefix argument, only copy ARG characters (never
-past EOL), no argument copies rest of line.
+** ace-window
+[2013-04-21 So 20:27]
+Use H-w to switch windows
 #+BEGIN_SRC emacs-lisp :tangle yes
 #+BEGIN_SRC emacs-lisp :tangle yes
-(require 'misc)
-(bind-key "H-y" 'copy-from-above-command)
+(use-package ace-window
+  :ensure ace-window
+  :commands ace-window
+  :bind ("H-w" . ace-window))
 #+END_SRC
 #+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.
 
 
-Open a new X Terminal pointing to the directory of the current
-buffers path.
+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
 #+BEGIN_SRC emacs-lisp :tangle yes
-(bind-key "H-t" 'jj-open-shell)
+(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
 #+END_SRC
-
-Align code
+** 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
 #+BEGIN_SRC emacs-lisp :tangle yes
-(bind-key "H-a" 'align-code)
+(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
 #+END_SRC
-
-Insert date
+** ascii
+[2014-05-21 Wed 00:33]
 #+BEGIN_SRC emacs-lisp :tangle yes
 #+BEGIN_SRC emacs-lisp :tangle yes
-(bind-key "C-c d" 'insert-date)
-#+END_SRC
+(use-package ascii
+  :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)))
 
 
-Another key for indenting
-#+BEGIN_SRC emacs-lisp :tangle yes
-(bind-key "H-i" 'indent-region)
+    (bind-key "C-c e A" 'ascii-toggle)))
 #+END_SRC
 #+END_SRC
-
-Clean all whitespace stuff
+** auctex
 #+BEGIN_SRC emacs-lisp :tangle yes
 #+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)
+(setq auto-mode-alist (cons '("\\.tex\\'" . latex-mode) auto-mode-alist))
+(setq TeX-auto-save t)
+(setq TeX-parse-self t)
+(setq TeX-PDF-mode t)
 #+END_SRC
 #+END_SRC
-**** Overwrite mode
-Usually you can press the *Ins*ert key, to get into overwrite mode. I
-don't like that, have broken much with it and so just forbid it by
-disabling that.
+** auto-complete mode
+[2013-04-27 Sa 16:33]
+And aren't we all lazy? I definitely am, and I like my emacs doing as
+much possible work for me as it can.
+So here, auto-complete-mode, which lets emacs do this, based on what I
+already had typed.
 #+BEGIN_SRC emacs-lisp :tangle yes
 #+BEGIN_SRC emacs-lisp :tangle yes
-(unbind-key "<insert>")
-(unbind-key "<kp-insert>")
-#+END_SRC
+(use-package auto-complete-config
+  :ensure auto-complete
+  :idle
+  (ac-config-default)
+  :config
+  (progn
+    ;; hook AC into completion-at-point
+    (defun sanityinc/auto-complete-at-point ()
+      (when (and (not (minibufferp))
+                 (fboundp 'auto-complete-mode)
+                 auto-complete-mode)
+        (auto-complete)))
+    (defun set-auto-complete-as-completion-at-point-function ()
+      (add-to-list 'completion-at-point-functions 'sanityinc/auto-complete-at-point))
+    ;; Exclude very large buffers from dabbrev
+    (defun sanityinc/dabbrev-friend-buffer (other-buffer)
+      (< (buffer-size other-buffer) (* 1 1024 1024)))
 
 
-*** Easily navigate sillyCased words
-#+BEGIN_SRC emacs-lisp :tangle yes
-(global-subword-mode 1)
-#+END_SRC
-*** Delete file of current buffer, then kill buffer
-[2014-06-14 Sat 23:03]
-#+BEGIN_SRC emacs-lisp :tangle yes
-(defun delete-current-buffer-file ()
-  "Removes file connected to current buffer and kills buffer."
-  (interactive)
-  (let ((filename (buffer-file-name))
-        (buffer (current-buffer))
-        (name (buffer-name)))
-    (if (not (and filename (file-exists-p filename)))
-        (ido-kill-buffer)
-      (when (yes-or-no-p "Are you sure you want to remove this file? ")
-        (delete-file filename)
-        (kill-buffer buffer)
-        (message "File '%s' successfully removed" filename)))))
+    (use-package pos-tip
+      :ensure t)
 
 
-(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)))))))
+    ;; 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)
 
 
-(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
+    (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)
 
 
-Searches and matches should ignore case.
-#+BEGIN_SRC emacs-lisp :tangle yes
-(setq-default case-fold-search t)
-#+END_SRC
+    (ac-flyspell-workaround)
 
 
-Which buffers to get rid off at midnight.
-#+BEGIN_SRC emacs-lisp :tangle yes
-(setq clean-buffer-list-kill-buffer-names (quote ("*Help*" "*Apropos*"
-                                                  "*Man " "*Buffer List*"
-                                                  "*Compile-Log*"
-                                                  "*info*" "*vc*"
-                                                  "*vc-diff*" "*diff*"
-                                                  "*Customize"
-                                                  "*tramp/" "*debug "
-                                                  "*magit" "*Calendar")))
-#+END_SRC
+    ;; use 't when auto-complete is disabled
+    (setq tab-always-indent 'complete)
+    (add-to-list 'completion-styles 'initials t)
 
 
-Don't display a cursor in non-selected windows.
-#+BEGIN_SRC emacs-lisp :tangle yes
-(setq-default cursor-in-non-selected-windows nil)
-#+END_SRC
+     ;; 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)
 
 
-What should be displayed in the mode-line for files with those types
-of line endings.
-#+BEGIN_SRC emacs-lisp :tangle yes
-(setq eol-mnemonic-dos "(DOS)")
-(setq eol-mnemonic-mac "(Mac)")
-#+END_SRC
+    (add-hook 'auto-complete-mode-hook 'set-auto-complete-as-completion-at-point-function)
 
 
-Much larger threshold for garbage collection prevents it to run too often.
-#+BEGIN_SRC emacs-lisp :tangle yes
-(setq gc-cons-threshold 48000000)
-#+END_SRC
+    ;; Exclude very large buffers from dabbrev
+    (setq dabbrev-friend-buffer-function 'sanityinc/dabbrev-friend-buffer)
 
 
-#+BEGIN_SRC emacs-lisp :tangle yes
-(setq max-lisp-eval-depth 1000)
-(setq max-specpdl-size 3000)
-#+END_SRC
+    (use-package ac-dabbrev
+      :ensure t)
 
 
-Unfill paragraph
-From https://raw.github.com/qdot/conf_emacs/master/emacs_conf.org
-#+BEGIN_SRC emacs-lisp :tangle yes
-(defun unfill-paragraph ()
-  "Takes a multi-line paragraph and makes it into a single line of text."
-  (interactive)
-  (let ((fill-column (point-max)))
-    (fill-paragraph nil)))
-(bind-key "H-u" 'unfill-paragraph)
-#+END_SRC
+    (set-default 'ac-sources
+                 '(ac-source-imenu
+                   ac-source-dictionary
+                   ac-source-words-in-buffer
+                   ac-source-words-in-same-mode-buffers
+    ;               ac-source-words-in-all-buffer
+                   ac-source-dabbrev))
 
 
-#+BEGIN_SRC emacs-lisp :tangle yes
-(setq-default indicate-empty-lines t)
-(setq sentence-end-double-space nil)
-#+END_SRC
+    (dolist (mode '(magit-log-edit-mode log-edit-mode org-mode text-mode haml-mode
+                                        sass-mode yaml-mode csv-mode espresso-mode haskell-mode
+                                        html-mode nxml-mode sh-mode smarty-mode clojure-mode
+                                        lisp-mode textile-mode markdown-mode tuareg-mode python-mode
+                                        js3-mode css-mode less-css-mode sql-mode ielm-mode))
+      (add-to-list 'ac-modes mode))
 
 
-Hilight annotations in comments, like FIXME/TODO/...
-#+BEGIN_SRC emacs-lisp :tangle yes
-(add-hook 'prog-mode-hook 'font-lock-comment-annotations)
-#+END_SRC
+    (add-hook 'latex-mode-hook 'auto-complete-mode)
+    (add-hook 'LaTeX-mode-hook 'auto-complete-mode)
+    (add-hook 'prog-mode-hook 'auto-complete-mode)
+    (add-hook 'org-mode-hook 'auto-complete-mode)))
 
 
-*** Browser
-#+BEGIN_SRC emacs-lisp :tangle yes
-(setq browse-url-browser-function (quote browse-url-generic))
-(setq browse-url-generic-program "/usr/bin/x-www-browser")
 #+END_SRC
 
 #+END_SRC
 
-*** When saving a script - make it executable
+** auto-revert
+When files change outside emacs for whatever reason I want emacs to deal
+with it. Not to have to revert buffers myself
 #+BEGIN_SRC emacs-lisp :tangle yes
 #+BEGIN_SRC emacs-lisp :tangle yes
-(add-hook 'after-save-hook 'executable-make-buffer-file-executable-if-script-p)
+(use-package autorevert
+  :commands auto-revert-mode
+  :diminish auto-revert-mode
+  :idle
+  (progn
+    (setq global-auto-revert-mode t)
+    (setq global-auto-revert-non-file-buffers t)
+    (global-auto-revert-mode)))
 #+END_SRC
 
 #+END_SRC
 
-*** Emacs Server
+** backups
+Emacs should keep backup copies of files I edit, but I do not want them
+to clutter up the filesystem everywhere. So I put them into one defined
+place, backup-directory, which even contains my username (for systems
+where =temporary-file-directory= is not inside my home).
 #+BEGIN_SRC emacs-lisp :tangle yes
 #+BEGIN_SRC emacs-lisp :tangle yes
-(use-package server
+(use-package backups-mode
+  :load-path "elisp/backups-mode"
+  :bind   (("\C-cv" . save-version)
+           ("\C-cb" . list-backups)
+           ("\C-ck" . kill-buffer-prompt)
+           ("\C-cw" . backup-walker-start))
   :init
   (progn
   :init
   (progn
-    (add-hook 'after-init-hook 'server-start)))
-#+END_SRC
+    (setq backup-directory jj-backup-directory)
+    ;(setq tramp-backup-directory (concat jj-backup-directory "/tramp"))
+    ;(if (not (file-exists-p tramp-backup-directory))
+    ;    (make-directory tramp-backup-directory))
+    ;(setq tramp-backup-directory-alist `((".*" . ,tramp-backup-directory)))
+    (setq backup-directory-alist `(("." . ,jj-backup-directory)))
+    (setq auto-save-list-file-prefix (concat jj-backup-directory ".auto-saves-"))
+    (setq auto-save-file-name-transforms `((".*" ,jj-backup-directory t)))
 
 
-** Customized variables
-[2013-05-02 Thu 22:14]
-The following contains a set of variables i may reasonably want to
-change on other systems - which don't affect the init file loading
-process. So I *can* use the customization interface for it...
-#+BEGIN_SRC emacs-lisp :tangle yes
-(defgroup ganneff nil
-  "Modify ganneffs settings"
-  :group 'environment)
+    (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)
 
 
-(defgroup ganneff-org-mode nil
-  "Ganneffs org-mode settings"
-  :tag "Ganneffs org-mode settings"
-  :group 'ganneff
-  :link '(custom-group-link "ganneff"))
+    (defadvice kill-buffer (around kill-buffer)
+      "Always save before killing a file buffer"
+      (when (and (buffer-modified-p)
+                 (buffer-file-name)
+                 (file-exists-p (buffer-file-name)))
+        (save-buffer))
+      ad-do-it)
+    (ad-activate 'kill-buffer)
 
 
-(defcustom bh/organization-task-id "d0db0d3c-f22e-42ff-a654-69524ff7cc91"
-  "ID of the organization task."
-  :tag "Organization Task ID"
-  :type 'string
-  :group 'ganneff-org-mode)
+    (defadvice save-buffers-kill-emacs (around save-buffers-kill-emacs)
+      "Always save before killing emacs"
+      (save-some-buffers t)
+      ad-do-it)
+    (ad-activate 'save-buffers-kill-emacs)
 
 
-(defcustom org-my-archive-expiry-days 2
-  "The number of days after which a completed task should be auto-archived.
-This can be 0 for immediate, or a floating point value."
-  :tag "Archive expiry days"
-  :type 'float
-  :group 'ganneff-org-mode)
-#+END_SRC
+    (defun kill-buffer-prompt ()
+      "Allows one to kill a buffer without saving it.
+This is necessary since once you start backups-mode all file based buffers
+are saved automatically when they are killed"
+      (interactive)
+      (if (and (buffer-modified-p) (buffer-file-name) (file-exists-p (buffer-file-name)) (y-or-n-p "Save buffer?"))
+          (save-buffer)
+        (set-buffer-modified-p nil))
+      (kill-buffer))
 
 
+    (setq backup-enable-predicate
+          (lambda (name)
+            (and (normal-backup-enable-predicate name)
+                 (not
+                  (let ((method (file-remote-p name 'method)))
+                    (when (stringp method)
+                      (member method '("su" "sudo"))))))))))
 
 
-** Compatibility
-[2013-05-21 Tue 23:22]
-Restore removed var alias, used by ruby-electric-brace and others
-#+BEGIN_SRC emacs-lisp :tangle yes
-(unless (boundp 'last-command-char)
-  (defvaralias 'last-command-char 'last-command-event))
 #+END_SRC
 #+END_SRC
-* Customized variables
-:PROPERTIES:
-:ID: 0102208d-fdf6-4928-9e40-7e341bd3aa3a
-:END:
-Of course I want to be able to use the customize interface, and some
-things can only be set via it (or so they say). I usually prefer to put
-things I keep for a long while into statements somewhere else, not just
-custom-set here, but we need it anyways.
-
+** browse-kill-ring
+[2014-12-11 Thu 11:31]
 #+BEGIN_SRC emacs-lisp :tangle yes
 #+BEGIN_SRC emacs-lisp :tangle yes
-(setq custom-file jj-custom-file)
-(safe-load custom-file)
+(use-package browse-kill-ring
+  :commands (browse-kill-ring browse-kill-ring-mode)
+  :bind ("M-y" . browse-kill-ring)
+  )
 #+END_SRC
 #+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)
 
 
-The source of this is:
-#+INCLUDE: "~/.emacs.d/config/customized.el" src emacs-lisp
+    ; 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
 
 
-* Extra modes and their configuration
-** abbrev
-A defined abbrev is a word which expands, if you insert it, into some
-different text. Abbrevs are defined by the user to expand in specific
-ways.
+** crontab-mode
+[2013-05-21 Tue 23:18]
 #+BEGIN_SRC emacs-lisp :tangle yes
 #+BEGIN_SRC emacs-lisp :tangle yes
-(use-package abbrev
-  :commands abbrev-mode
-  :diminish abbrev-mode
-  :idle
-  (hook-into-modes #'abbrev-mode '(text-mode-hook))
+(use-package crontab-mode
+  :ensure crontab-mode
+  :commands crontab-mode
+  :mode ("\\.?cron\\(tab\\)?\\'" . crontab-mode))
+#+END_SRC
+
+** css
+web-mode takes over, see [[*web-mode][web-mode]]
+#+BEGIN_SRC emacs-lisp :tangle no
+(use-package css-mode
+  :mode ("\\.css\\'" . css-mode)
+  :defer t
   :config
   (progn
   :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)))))
+  ;;; 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
 #+END_SRC
-** ace-jump-mode
-[2013-04-28 So 11:26]
-Quickly move around in buffers.
+
+** cua
+I know that this lets it look "more like windows", but I don't much care
+about its paste/copy/cut keybindings, the really nice part is the great
+support for rectangular regions, which I started to use a lot since I
+know this mode. The normal keybindings for those are just to useless.
 #+BEGIN_SRC emacs-lisp :tangle yes
 #+BEGIN_SRC emacs-lisp :tangle yes
-(use-package ace-jump-mode
-  :ensure ace-jump-mode
-  :commands ace-jump-mode
-  :bind ("H-SPC" . ace-jump-mode))
+(cua-mode t)
+(setq cua-enable-cua-keys (quote shift))
 #+END_SRC
 #+END_SRC
-** ace-window
-[2013-04-21 So 20:27]
-Use H-w to switch windows
+
+Luckily cua-mode easily supports this, with the following line I just
+get the CUA selection and rectangle stuff, not the keybindings. Yes,
+even though the above =cua-enable-cua-keys= setting would only enable
+them if the selection is done when the region was marked with a shifted
+movement keys.
 #+BEGIN_SRC emacs-lisp :tangle yes
 #+BEGIN_SRC emacs-lisp :tangle yes
-(use-package ace-window
-  :ensure ace-window
-  :commands ace-window
-  :bind ("H-w" . ace-window))
+(cua-selection-mode t)
 #+END_SRC
 #+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.
+** Debian related
 #+BEGIN_SRC emacs-lisp :tangle yes
 #+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)
-    ))
+(require 'dpkg-dev-el-loaddefs nil 'noerror)
+(require 'debian-el-loaddefs nil 'noerror)
+
+(setq debian-changelog-full-name "Joerg Jaspert")
+(setq debian-changelog-mailing-address "joerg@debian.org")
 #+END_SRC
 #+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.
+
+** diff-mode
 #+BEGIN_SRC emacs-lisp :tangle yes
 #+BEGIN_SRC emacs-lisp :tangle yes
-(use-package anzu
-  :ensure anzu
-  :diminish anzu-mode
-  :defer t
-  :idle
-  (progn
-    (global-anzu-mode 1))
+(use-package diff-mode
+  :commands diff-mode
+  :mode (("\\.diff" . diff-mode))
   :config
   :config
-  (progn
-    (setq anzu-search-threshold 1000)
-    (set-face-attribute 'anzu-mode-line nil :foreground "yellow" :weight 'bold)))
+  (use-package diff-mode-))
 #+END_SRC
 #+END_SRC
-** ascii
-[2014-05-21 Wed 00:33]
+
+
+** dired & co
 #+BEGIN_SRC emacs-lisp :tangle yes
 #+BEGIN_SRC emacs-lisp :tangle yes
-(use-package ascii
-  :commands (ascii-on ascii-toggle ascii-display)
-  :bind (("C-c e A" . ascii-toggle))
+(use-package dired
+  :commands (dired dired-other-window dired-other-frame dired-noselect
+                   dired-mode dired-jump)
+  :defines (dired-omit-regexp-orig)
   :init
   (progn
   :init
   (progn
-    (defun ascii-toggle ()
-      (interactive)
-      (defvar ascii-display nil)
-      (if ascii-display
-          (ascii-off)
-        (ascii-on)))
+    (setq diredp-hide-details-initially-flag nil))
+  :config
+  (progn
+    (setq dired-auto-revert-buffer (quote dired-directory-changed-p))
+    (setq dired-dwim-target t)
+    (setq dired-listing-switches "-alh")
+    (setq dired-listing-switches "-alXh --group-directories-first")
+    (setq dired-recursive-copies (quote top))
+    (setq dired-recursive-deletes (quote top))
+    (setq dired-guess-shell-alist-user
+          '(("\\.pdf\\'" "mupdf" "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")))
+
+    (bind-key "F" 'find-name-dired dired-mode-map)
+
+    (use-package dired+
+      :ensure dired+)
+
+    (use-package dired-x)
+
+    (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)))
+
+    (use-package runner
+      :ensure runner)
+
+    (defvar mark-files-cache (make-hash-table :test #'equal))
+
+    (defun mark-similar-versions (name)
+      (let ((pat name))
+        (if (string-match "^\\(.+?\\)-[0-9._-]+$" pat)
+            (setq pat (match-string 1 pat)))
+        (or (gethash pat mark-files-cache)
+            (ignore (puthash pat t mark-files-cache)))))
+
+    (defun dired-mark-similar-version ()
+      (interactive)
+      (setq mark-files-cache (make-hash-table :test #'equal))
+      (dired-mark-sexp '(mark-similar-versions name)))
+
+    (defun dired-package-initialize ()
+      (unless (featurep 'runner)
+        (bind-key "M-!" 'async-shell-command dired-mode-map)
+        (unbind-key "M-s f" dired-mode-map)
+
+        (defadvice dired-omit-startup (after diminish-dired-omit activate)
+          "Make sure to remove \"Omit\" from the modeline."
+          (diminish 'dired-omit-mode) dired-mode-map)
+
+        ;; Omit files that Git would ignore
+        (defun dired-omit-regexp ()
+          (let ((file (expand-file-name ".git"))
+                parent-dir)
+            (while (and (not (file-exists-p file))
+                        (progn
+                          (setq parent-dir
+                                (file-name-directory
+                                 (directory-file-name
+                                  (file-name-directory file))))
+                          ;; Give up if we are already at the root dir.
+                          (not (string= (file-name-directory file)
+                                        parent-dir))))
+              ;; Move up to the parent dir and try again.
+              (setq file (expand-file-name ".git" parent-dir)))
+            ;; If we found a change log in a parent, use that.
+            (if (file-exists-p file)
+                (let ((regexp (funcall dired-omit-regexp-orig))
+                      (omitted-files
+                       (shell-command-to-string "git clean -d -x -n")))
+                  (if (= 0 (length omitted-files))
+                      regexp
+                    (concat
+                     regexp
+                     (if (> (length regexp) 0)
+                         "\\|" "")
+                     "\\("
+                     (mapconcat
+                      #'(lambda (str)
+                          (concat
+                           "^"
+                           (regexp-quote
+                            (substring str 13
+                                       (if (= ?/ (aref str (1- (length str))))
+                                           (1- (length str))
+                                         nil)))
+                           "$"))
+                      (split-string omitted-files "\n" t)
+                      "\\|")
+                     "\\)")))
+              (funcall dired-omit-regexp-orig))))))
+
+    (add-hook 'dired-mode-hook 'dired-package-initialize)
+
+    (defun dired-double-jump (first-dir second-dir)
+      (interactive
+       (list (read-directory-name "First directory: "
+                                  (expand-file-name "~")
+                                  nil nil "/Downloads/")
+             (read-directory-name "Second directory: "
+                                  (expand-file-name "~")
+                                  nil nil "/")))
+      (dired first-dir)
+      (dired-other-window second-dir))
+    (bind-key "C-c J" 'dired-double-jump)
+
+    (defun dired-back-to-top ()
+      (interactive)
+      (goto-char (point-min))
+      (dired-next-line 4))
+
+    (define-key dired-mode-map
+      (vector 'remap 'beginning-of-buffer) 'dired-back-to-top)
+
+    (defun dired-jump-to-bottom ()
+      (interactive)
+      (goto-char (point-max))
+      (dired-next-line -1))
+
+    (define-key dired-mode-map
+      (vector 'remap 'end-of-buffer) 'dired-jump-to-bottom)))
 
 
-    (bind-key "C-c e A" 'ascii-toggle)))
-#+END_SRC
-** auctex
-#+BEGIN_SRC emacs-lisp :tangle yes
-(setq auto-mode-alist (cons '("\\.tex\\'" . latex-mode) auto-mode-alist))
-(setq TeX-auto-save t)
-(setq TeX-parse-self t)
-(setq TeX-PDF-mode t)
 #+END_SRC
 #+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.
+** 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
 #+BEGIN_SRC emacs-lisp :tangle yes
-(use-package auto-complete-config
-  :ensure auto-complete
-  :idle
-  (ac-config-default)
+(use-package discover-my-major
+  :ensure discover-my-major
+  :commands discover-my-major
+  :bind ("C-h C-m" . discover-my-major))
+#+END_SRC
+** easypg
+EasyPG is a GnuPG interface for Emacs.
+Bookmark: [[http://www.emacswiki.org/emacs/EasyPG][EmacsWiki: Easy PG]]
+#+BEGIN_SRC emacs-lisp :tangle yes
+(use-package epa-file
   :config
   (progn
   :config
   (progn
-    ;; hook AC into completion-at-point
-    (defun sanityinc/auto-complete-at-point ()
-      (when (and (not (minibufferp))
-                 (fboundp 'auto-complete-mode)
-                 auto-complete-mode)
-        (auto-complete)))
-    (defun set-auto-complete-as-completion-at-point-function ()
-      (add-to-list 'completion-at-point-functions 'sanityinc/auto-complete-at-point))
-    ;; Exclude very large buffers from dabbrev
-    (defun sanityinc/dabbrev-friend-buffer (other-buffer)
-      (< (buffer-size other-buffer) (* 1 1024 1024)))
+    (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 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
 
 
-    (use-package pos-tip
-      :ensure t)
+  :bind (("C-. = b" . ediff-buffers)
+         ("C-. = B" . ediff-buffers3)
+         ("C-. = =" . ediff-files)
+         ("C-. = f" . ediff-files)
+         ("C-. = F" . ediff-files3)
+         ("C-. = r" . ediff-revision)
+         ("C-. = p" . ediff-patch-file)
+         ("C-. = P" . ediff-patch-buffer)
+         ("C-. = l" . ediff-regions-linewise)
+         ("C-. = w" . ediff-regions-wordwise))
+  :config (progn
+            (setq ediff-window-setup-function 'ediff-setup-windows-plain)
+            (setq ediff-split-window-function 'split-window-horizontally)
+            )
+)
+#+END_SRC
+** emms
 
 
-    ;; custom keybindings to use tab, enter and up and down arrows
-    (bind-key "\t" 'ac-expand ac-complete-mode-map)
-    (bind-key "\r" 'ac-complete ac-complete-mode-map)
-    (bind-key "M-n" 'ac-next ac-complete-mode-map)
-    (bind-key "M-p" 'ac-previous ac-complete-mode-map)
-    (bind-key "C-s" 'ac-isearch ac-completing-map)
-    (bind-key "M-TAB" 'auto-complete ac-mode-map)
+EMMS is the Emacs Multimedia System.
+#+BEGIN_SRC emacs-lisp :tangle no
+(require 'emms-source-file)
+(require 'emms-source-playlist)
+(require 'emms-info)
+(require 'emms-cache)
+(require 'emms-playlist-mode)
+(require 'emms-playing-time)
+(require 'emms-player-mpd)
+(require 'emms-playlist-sort)
+(require 'emms-mark)
+(require 'emms-browser)
+(require 'emms-lyrics)
+(require 'emms-last-played)
+(require 'emms-score)
+(require 'emms-tag-editor)
+(require 'emms-history)
+(require 'emms-i18n)
 
 
-    (setq ac-comphist-file (expand-file-name "ac-comphist.dat" jj-cache-dir))
-    (setq ac-use-comphist t)
-    (setq ac-expand-on-auto-complete nil)
-    (setq ac-dwim t)
-    (setq ac-auto-start 3)
-    (setq ac-delay 0.3)
-    (setq ac-menu-height 15)
-    (setq ac-quick-help-delay 0.5)
-    (setq ac-use-fuzzy t)
+(setq emms-playlist-default-major-mode 'emms-playlist-mode)
+(add-to-list 'emms-track-initialize-functions 'emms-info-initialize-track)
+(emms-playing-time 1)
+(emms-lyrics 1)
+(add-hook 'emms-player-started-hook 'emms-last-played-update-current)
+;(add-hook 'emms-player-started-hook 'emms-player-mpd-sync-from-emms)
+(emms-score 1)
+(when (fboundp 'emms-cache) ; work around compiler warning
+  (emms-cache 1))
+(setq emms-score-default-score 3)
+
+(defun emms-mpd-init ()
+  "Connect Emms to mpd."
+  (interactive)
+  (emms-player-mpd-connect))
+
+;; players
+(require 'emms-player-mpd)
+(setq emms-player-mpd-server-name "localhost")
+(setq emms-player-mpd-server-port "6600")
+(add-to-list 'emms-info-functions 'emms-info-mpd)
+(add-to-list 'emms-player-list 'emms-player-mpd)
+(setq emms-volume-change-function 'emms-volume-mpd-change)
+(setq emms-player-mpd-sync-playlist t)
+
+(setq emms-source-file-default-directory "/var/lib/mpd/music")
+(setq emms-player-mpd-music-directory "/var/lib/mpd/music")
+(setq emms-info-auto-update t)
+(setq emms-lyrics-scroll-p t)
+(setq emms-lyrics-display-on-minibuffer t)
+(setq emms-lyrics-display-on-modeline nil)
+(setq emms-lyrics-dir "~/.emacs.d/var/lyrics")
+
+(setq emms-last-played-format-alist
+      '(((emms-last-played-seconds-today) . "%H:%M")
+        (604800                           . "%a %H:%M") ; this week
+        ((emms-last-played-seconds-month) . "%d.%m.%Y")
+        ((emms-last-played-seconds-year)  . "%d.%m.%Y")
+        (t                                . "Never played")))
+
+;; 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)))
+)
 
 
-    (ac-flyspell-workaround)
+(setq emms-track-description-function 'my-describe)
 
 
-    ;; use 't when auto-complete is disabled
-    (setq tab-always-indent 'complete)
-    (add-to-list 'completion-styles 'initials t)
+;; (global-set-key (kbd "C-<f9> t") 'emms-play-directory-tree)
+;; (global-set-key (kbd "H-<f9> e") 'emms-play-file)
+(global-set-key (kbd "H-<f9> <f9>") 'emms-mpd-init)
+(global-set-key (kbd "H-<f9> d") 'emms-play-dired)
+(global-set-key (kbd "H-<f9> x") 'emms-start)
+(global-set-key (kbd "H-<f9> v") 'emms-stop)
+(global-set-key (kbd "H-<f9> n") 'emms-next)
+(global-set-key (kbd "H-<f9> p") 'emms-previous)
+(global-set-key (kbd "H-<f9> o") 'emms-show)
+(global-set-key (kbd "H-<f9> h") 'emms-shuffle)
+(global-set-key (kbd "H-<f9> SPC") 'emms-pause)
+(global-set-key (kbd "H-<f9> a") 'emms-add-directory-tree)
+(global-set-key (kbd "H-<f9> b") 'emms-smart-browse)
+(global-set-key (kbd "H-<f9> l") 'emms-playlist-mode-go)
 
 
-     ;; Use 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)
+(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)
 
 
-    (add-hook 'auto-complete-mode-hook 'set-auto-complete-as-completion-at-point-function)
+(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)))
 
 
-    ;; Exclude very large buffers from dabbrev
-    (setq dabbrev-friend-buffer-function 'sanityinc/dabbrev-friend-buffer)
+(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)
 
 
-    (use-package ac-dabbrev
-      :ensure t)
+(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)
 
 
-    (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))
+(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)
 
 
-    (dolist (mode '(magit-log-edit-mode log-edit-mode org-mode text-mode haml-mode
-                                        sass-mode yaml-mode csv-mode espresso-mode haskell-mode
-                                        html-mode nxml-mode sh-mode smarty-mode clojure-mode
-                                        lisp-mode textile-mode markdown-mode tuareg-mode python-mode
-                                        js3-mode css-mode less-css-mode sql-mode ielm-mode))
-      (add-to-list 'ac-modes mode))
+(setq emms-playlist-buffer-name "*EMMS Playlist*"
+      emms-playlist-mode-open-playlists 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)))
+;; Faces
+(if (window-system)
+    ((lambda ()
+       (set-face-attribute
+        'emms-browser-artist-face nil
+        :family "Arno Pro")
+       )
+))
 
 
-#+END_SRC
+(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)
 
 
-** auto-revert
-When files change outside emacs for whatever reason I want emacs to deal
-with it. Not to have to revert buffers myself
-#+BEGIN_SRC emacs-lisp :tangle yes
-(use-package autorevert
-  :commands auto-revert-mode
-  :diminish auto-revert-mode
-  :idle
-  (progn
-    (setq global-auto-revert-mode t)
-    (setq global-auto-revert-non-file-buffers t)
-    (global-auto-revert-mode)))
 #+END_SRC
 #+END_SRC
-
-** backups
-Emacs should keep backup copies of files I edit, but I do not want them
-to clutter up the filesystem everywhere. So I put them into one defined
-place, backup-directory, which even contains my username (for systems
-where =temporary-file-directory= is not inside my home).
-#+BEGIN_SRC emacs-lisp :tangle yes
-(use-package backups-mode
-  :load-path "elisp/backups-mode"
-  :bind   (("\C-cv" . save-version)
-           ("\C-cb" . list-backups)
-           ("\C-ck" . kill-buffer-prompt)
-           ("\C-cw" . backup-walker-start))
+** Emacs shell
+Basic settings for emacs integrated shell
+#+BEGIN_SRC emacs-lisp :tangle no
+(use-package eshell
+  :defer t
+  :commands eshell
   :init
   (progn
   :init
   (progn
-    (setq backup-directory jj-backup-directory)
-    ;(setq tramp-backup-directory (concat jj-backup-directory "/tramp"))
-    ;(if (not (file-exists-p tramp-backup-directory))
-    ;    (make-directory tramp-backup-directory))
-    ;(setq tramp-backup-directory-alist `((".*" . ,tramp-backup-directory)))
-    (setq backup-directory-alist `(("." . ,jj-backup-directory)))
-    (setq auto-save-list-file-prefix (concat jj-backup-directory ".auto-saves-"))
-    (setq auto-save-file-name-transforms `((".*" ,jj-backup-directory t)))
+    (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)
 
 
-    (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)
+    (use-package f
+      :ensure f)
+    (use-package 'em-cmpl)
+    (use-package 'em-prompt)
+    (use-package 'em-term)
 
 
-    (defadvice kill-buffer (around kill-buffer)
-      "Always save before killing a file buffer"
-      (when (and (buffer-modified-p)
-                 (buffer-file-name)
-                 (file-exists-p (buffer-file-name)))
-        (save-buffer))
-      ad-do-it)
-    (ad-activate 'kill-buffer)
+    (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\\)/\\'")
 
 
-    (defadvice save-buffers-kill-emacs (around save-buffers-kill-emacs)
-      "Always save before killing emacs"
-      (save-some-buffers t)
-      ad-do-it)
-    (ad-activate 'save-buffers-kill-emacs)
+    (setenv "PAGER" "cat")
+    (setq eshell-visual-commands
+          '("less" "tmux" "htop" "top" "bash" "zsh" "tail"))
+    (setq eshell-visual-subcommands
+          '(("git" "log" "l" "diff" "show")))
 
 
-    (defun kill-buffer-prompt ()
-      "Allows one to kill a buffer without saving it.
-This is necessary since once you start backups-mode all file based buffers
-are saved automatically when they are killed"
-      (interactive)
-      (if (and (buffer-modified-p) (buffer-file-name) (file-exists-p (buffer-file-name)) (y-or-n-p "Save buffer?"))
-          (save-buffer)
-        (set-buffer-modified-p nil))
-      (kill-buffer))
+    (add-to-list 'eshell-command-completions-alist
+                 '("gunzip" "gz\\'"))
+    (add-to-list 'eshell-command-completions-alist
+                 '("tar" "\\(\\.tar|\\.tgz\\|\\.tar\\.gz\\)\\'"))
 
 
-    (setq backup-enable-predicate
-          (lambda (name)
-            (and (normal-backup-enable-predicate name)
-                 (not
-                  (let ((method (file-remote-p name 'method)))
-                    (when (stringp method)
-                      (member method '("su" "sudo"))))))))))
+    (when (not (functionp 'eshell/rgrep))
+      (defun eshell/rgrep (&rest args)
+        "Use Emacs grep facility instead of calling external grep."
+        (eshell-grep "rgrep" args t)))
 
 
-#+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)
+    ;(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"))
+         " ")))
 
 
-    ; 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))))
+    (use-package eshell-prompt-extras
+      :ensure t
+      :init
+      (progn
+        (setq eshell-highlight-prompt nil
+              ;; epe-git-dirty-char "Ϟ"
+              epe-git-dirty-char "*"
+              eshell-prompt-function 'epe-theme-dakrone)))
 
 
-#+END_SRC
+    (defun eshell/magit ()
+      "Function to open magit-status for the current directory"
+      (interactive)
+      (magit-status default-directory)
+      nil)
 
 
-** crontab-mode
-[2013-05-21 Tue 23:18]
-#+BEGIN_SRC emacs-lisp :tangle yes
-(use-package crontab-mode
-  :ensure crontab-mode
-  :commands crontab-mode
-  :mode ("\\.?cron\\(tab\\)?\\'" . crontab-mode))
-#+END_SRC
+    (setq eshell-prompt-function 'eshell/my-prompt)
+    (setq eshell-highlight-prompt nil)
+    (setq eshell-prompt-regexp "^[^#$\n]+[#$] ")))
 
 
-** css
-web-mode takes over, see [[*web-mode][web-mode]]
-#+BEGIN_SRC emacs-lisp :tangle no
-(use-package css-mode
-  :mode ("\\.css\\'" . css-mode)
-  :defer t
-  :config
-  (progn
-  ;;; CSS flymake
-    (use-package flymake-css
-      :ensure flymake-css
-      :config
-      (progn
-        (defun maybe-flymake-css-load ()
-          "Activate flymake-css as necessary, but not in derived modes."
-          (when (eq major-mode 'css-mode)
-            (flymake-css-load)))
-        (add-hook 'css-mode-hook 'maybe-flymake-css-load)))
-    ;;; Auto-complete CSS keywords
-    (eval-after-load 'auto-complete
-      '(progn
-         (dolist (hook '(css-mode-hook sass-mode-hook scss-mode-hook))
-           (add-hook hook 'ac-css-mode-setup))))))
 #+END_SRC
 
 #+END_SRC
 
-** cua
-I know that this lets it look "more like windows", but I don't much care
-about its paste/copy/cut keybindings, the really nice part is the great
-support for rectangular regions, which I started to use a lot since I
-know this mode. The normal keybindings for those are just to useless.
+*** Isearch related
+Incremental search is great, but annoyingly you need to type whatever
+you want. If you want to search for just the next (or previous)
+occurence of what is at your cursor position use the following.
+*C-x* will insert the current word while *M-up* and *M-down* will just
+jump to the next/previous occurence of it.
 #+BEGIN_SRC emacs-lisp :tangle yes
 #+BEGIN_SRC emacs-lisp :tangle yes
-(cua-mode t)
-(setq cua-enable-cua-keys (quote shift))
+(bind-key "C-x" 'sacha/isearch-yank-current-word isearch-mode-map)
+(bind-key* "<M-up>" 'sacha/search-word-backward)
+(bind-key* "<M-down>" 'sacha/search-word-forward)
 #+END_SRC
 
 #+END_SRC
 
-Luckily cua-mode easily supports this, with the following line I just
-get the CUA selection and rectangle stuff, not the keybindings. Yes,
-even though the above =cua-enable-cua-keys= setting would only enable
-them if the selection is done when the region was marked with a shifted
-movement keys.
+*** Frame configuration
+I want to see the buffername and its size, not the host I am on in my
+frame title.
 #+BEGIN_SRC emacs-lisp :tangle yes
 #+BEGIN_SRC emacs-lisp :tangle yes
-(cua-selection-mode t)
+(setq frame-title-format "%b (%i)")
 #+END_SRC
 
 #+END_SRC
 
-** Debian related
+*** Protect some buffers
+I don't want some buffers to be killed, **scratch** for example.
+In the past I had a long function that just recreated them, but the
+=keep-buffers= package is easier.
 #+BEGIN_SRC emacs-lisp :tangle yes
 #+BEGIN_SRC emacs-lisp :tangle yes
-(require 'dpkg-dev-el-loaddefs nil 'noerror)
-(require 'debian-el-loaddefs nil 'noerror)
-
-(setq debian-changelog-full-name "Joerg Jaspert")
-(setq debian-changelog-mailing-address "joerg@debian.org")
+(use-package keep-buffers
+  :init
+  (progn
+    (keep-buffers-mode 1)
+    (push '("\\`*scratch" . erase) keep-buffers-protected-alist)
+    (push '("\\`*Org Agenda" . nil) keep-buffers-protected-alist)
+    (push '("\\`*Group" . nil) keep-buffers-protected-alist)
+    ))
 #+END_SRC
 
 #+END_SRC
 
-** diff-mode
+*** yes-or-no-p
+Emas usually wants you to type /yes/ or /no/ fully. What a mess, I am
+lazy.
 #+BEGIN_SRC emacs-lisp :tangle yes
 #+BEGIN_SRC emacs-lisp :tangle yes
-(use-package diff-mode
-  :commands diff-mode
-  :mode (("\\.diff" . diff-mode))
-  :config
-  (use-package diff-mode-))
+(defalias 'yes-or-no-p 'y-or-n-p)
 #+END_SRC
 
 #+END_SRC
 
+*** Language/i18n stuff
+In this day and age, UTF-8 is the way to go.
+#+BEGIN_SRC emacs-lisp :tangle yes
+(set-language-environment 'utf-8)
+(set-default-coding-systems 'utf-8)
+(set-terminal-coding-system 'utf-8)
+(set-keyboard-coding-system 'utf-8)
+(set-clipboard-coding-system 'utf-8)
+(prefer-coding-system 'utf-8)
+(set-charset-priority 'unicode)
+(setq default-process-coding-system '(utf-8-unix . utf-8-unix))
+(when (display-graphic-p)
+  (setq x-select-request-type '(UTF8_STRING COMPOUND_TEXT TEXT STRING)))
+#+END_SRC
 
 
-** dired & co
+*** 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
 #+BEGIN_SRC emacs-lisp :tangle yes
-(use-package dired
-  :commands (dired dired-other-window dired-other-frame dired-noselect
-                   dired-mode dired-jump)
-  :defines (dired-omit-regexp-orig)
+(use-package mic-paren
   :init
   :init
-  (progn
-    (setq diredp-hide-details-initially-flag nil))
-  :config
-  (progn
-    (setq dired-auto-revert-buffer (quote dired-directory-changed-p))
-    (setq dired-dwim-target t)
-    (setq dired-listing-switches "-alh")
-    (setq dired-recursive-copies (quote top))
-    (setq dired-recursive-deletes (quote top))
-    (bind-key "F" 'find-name-dired dired-mode-map)
-
-    (defvar mark-files-cache (make-hash-table :test #'equal))
-
-    (defun mark-similar-versions (name)
-      (let ((pat name))
-        (if (string-match "^\\(.+?\\)-[0-9._-]+$" pat)
-            (setq pat (match-string 1 pat)))
-        (or (gethash pat mark-files-cache)
-            (ignore (puthash pat t mark-files-cache)))))
-
-    (defun dired-mark-similar-version ()
-      (interactive)
-      (setq mark-files-cache (make-hash-table :test #'equal))
-      (dired-mark-sexp '(mark-similar-versions name)))
-
-    (use-package dired+
-      :ensure dired+)
+  (paren-activate))
+#+END_SRC
+*** Kill other buffers
+While many editors allow you to close "all the other files, not the one
+you are in", emacs doesn't have this... Except, now it will.
+(Update 30.05.2014: Not used ever, deactivated)
+#+BEGIN_SRC emacs-lisp :tangle no
+(bind-key "C-c k" 'prelude-kill-other-buffers)
+#+END_SRC
+*** Scrolling
+Default scrolling behaviour in emacs is a bit annoying, who wants to
+jump half-windows?
+#+BEGIN_SRC emacs-lisp :tangle yes
+(setq scroll-margin 0)
+(setq scroll-conservatively 100000)
+(setq scroll-up-aggressively 0.0)
+(setq scroll-down-aggressively 0.0)
+(setq scroll-preserve-screen-position t)
+#+END_SRC
 
 
-    (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")))
+*** Copy/Paste with X
+[2013-04-09 Di 23:31]
+The default how emacs handles cutting/pasting with the primary selection
+changed in emacs24. I am used to the old way, so get it back.
+#+BEGIN_SRC emacs-lisp :tangle yes
+(setq 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
+(unbind-key "C-z")
+(unbind-key "C-x C-z")
+#+END_SRC
 
 
-    (use-package dired-single
-      :ensure dired-single
-      :init
-      (progn
-        (bind-key "<return>" 'dired-single-buffer dired-mode-map)
-        (bind-key "<mouse-1>" 'dired-single-buffer-mouse dired-mode-map)
-        (bind-key "^"
-                  (function
-           (lambda nil (interactive) (dired-single-buffer ".."))) dired-mode-map )))
+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)))
 
 
-    (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)))
+(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
 
 
-    (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)))
+Default of *C-k* is to kill from the point to the end of line. If
+'kill-whole-line' (see [[id:0a1560d9-7e55-47ab-be52-b3a8b8eea4aa][the kill-whole-line part in "General stuff"]]) is
+set, including newline. But to kill the entire line, one still needs a
+*C-a* in front of it. So I change it, by defining a function to do just this for
+me. Lazyness++.
+#+BEGIN_SRC emacs-lisp :tangle no
+(defun kill-entire-line ()
+  "Kill this entire line (including newline), regardless of where point is within the line."
+  (interactive)
+  (beginning-of-line)
+  (kill-line)
+  (back-to-indentation))
 
 
-    (defun dired-package-initialize ()
-      (unless (featurep 'runner)
-        (use-package dired-x)
-        (use-package runner
-          :ensure runner)
+(bind-key* "C-k" 'kill-entire-line)
+(global-set-key [remap kill-whole-line] 'kill-entire-line)
+#+END_SRC
 
 
-        (bind-key "M-!" 'async-shell-command dired-mode-map)
-        (unbind-key "M-s f" dired-mode-map)
+And the same is true when I'm in org-mode, which has an own kill function...
+(the keybinding happens later, after org-mode is loaded fully)
+#+BEGIN_SRC emacs-lisp :tangle no
+(defun jj-org-kill-line (&optional arg)
+  "Kill the entire line, regardless of where point is within the line, org-mode-version"
+  (interactive "P")
+  (beginning-of-line)
+  (org-kill-line arg)
+  (back-to-indentation)
+  )
+#+END_SRC
 
 
-        (defadvice dired-omit-startup (after diminish-dired-omit activate)
-          "Make sure to remove \"Omit\" from the modeline."
-          (diminish 'dired-omit-mode) dired-mode-map)
+I really hate tabs, so I don't want any indentation to try using them.
+And in case a project really needs them, I can change it just for that
+file/project, but luckily none of those I work in is as broken.
+#+BEGIN_SRC emacs-lisp :tangle yes
+(setq-default indent-tabs-mode nil)
+#+END_SRC
 
 
-        ;; Omit files that Git would ignore
-        (defun dired-omit-regexp ()
-          (let ((file (expand-file-name ".git"))
-                parent-dir)
-            (while (and (not (file-exists-p file))
-                        (progn
-                          (setq parent-dir
-                                (file-name-directory
-                                 (directory-file-name
-                                  (file-name-directory file))))
-                          ;; Give up if we are already at the root dir.
-                          (not (string= (file-name-directory file)
-                                        parent-dir))))
-              ;; Move up to the parent dir and try again.
-              (setq file (expand-file-name ".git" parent-dir)))
-            ;; If we found a change log in a parent, use that.
-            (if (file-exists-p file)
-                (let ((regexp (funcall dired-omit-regexp-orig))
-                      (omitted-files
-                       (shell-command-to-string "git clean -d -x -n")))
-                  (if (= 0 (length omitted-files))
-                      regexp
-                    (concat
-                     regexp
-                     (if (> (length regexp) 0)
-                         "\\|" "")
-                     "\\("
-                     (mapconcat
-                      #'(lambda (str)
-                          (concat
-                           "^"
-                           (regexp-quote
-                            (substring str 13
-                                       (if (= ?/ (aref str (1- (length str))))
-                                           (1- (length str))
-                                         nil)))
-                           "$"))
-                      (split-string omitted-files "\n" t)
-                      "\\|")
-                     "\\)")))
-              (funcall dired-omit-regexp-orig))))))
+Make the % key jump to the matching {}[]() if on another, like vi, see [[id:b6e6cf73-9802-4a7b-bd65-fdb6f9745319][the function]]
+#+BEGIN_SRC emacs-lisp :tangle yes
+(bind-key* "M-5" 'match-paren)
+#+END_SRC
 
 
-    (add-hook 'dired-mode-hook 'dired-package-initialize)
+Instead of the default "mark-defun" I want a more readline-like setting.
+#+BEGIN_SRC emacs-lisp :tangle yes
+(bind-key "C-M-h" 'backward-kill-word)
+#+END_SRC
 
 
-    (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)
+Align whatever with a regexp.
+#+BEGIN_SRC emacs-lisp :tangle yes
+(bind-key "C-x \\" 'align-regexp)
+#+END_SRC
 
 
-    (defun dired-back-to-top ()
-      (interactive)
-      (goto-char (point-min))
-      (dired-next-line 4))
+Font size changes
+#+BEGIN_SRC emacs-lisp :tangle yes
+(bind-key "C-+" 'text-scale-increase)
+(bind-key "C--" 'text-scale-decrease)
+#+END_SRC
 
 
-    (define-key dired-mode-map
-      (vector 'remap 'beginning-of-buffer) 'dired-back-to-top)
+Regexes are too useful, so use the regex search by default.
+#+begin_src emacs-lisp
+(bind-key "C-s"   'isearch-forward-regexp)
+(bind-key "C-r"   'isearch-backward-regexp)
+(bind-key "C-M-s" 'isearch-forward)
+(bind-key "C-M-r" 'isearch-backward)
+#+end_src
 
 
-    (defun dired-jump-to-bottom ()
-      (interactive)
-      (goto-char (point-max))
-      (dired-next-line -1))
+Rgrep is infinitely useful in multi-file projects.
+#+begin_src emacs-lisp
+(bind-key "C-x C-g" 'rgrep)
+#+end_src
 
 
-    (define-key dired-mode-map
-      (vector 'remap 'end-of-buffer) 'dired-jump-to-bottom)))
+Easy way to move a line up - or down. Simpler than dealing with C-x C-t
+AKA transpose lines.
+#+BEGIN_SRC emacs-lisp :tangle yes
+(bind-key "<M-S-up>"  'move-line-up)
+(bind-key "<M-S-down>" 'move-line-down)
+#+END_SRC
 
 
+"Pull" lines up, join them
+#+BEGIN_SRC emacs-lisp :tangle yes
+(defun join-line-or-lines-in-region ()
+  "Join this line or the lines in the selected region.
+Joins single lines in reverse order to the default, ie. pulls the next one up."
+  (interactive)
+  (cond ((region-active-p)
+         (let ((min (line-number-at-pos (region-beginning))))
+           (goto-char (region-end))
+           (while (> (line-number-at-pos) min)
+             (join-line ))))
+        (t (let ((current-prefix-arg '(4)))
+             (call-interactively 'join-line)))))
+(bind-key "M-j" 'join-line-or-lines-in-region)
 #+END_SRC
 #+END_SRC
-** discover-my-major
-[2014-06-01 Sun 23:32]
-Discover key bindings and their meaning for the current Emacs major mode.
+
+When I press Enter I almost always want to go to the right indentation on the next line.
 #+BEGIN_SRC emacs-lisp :tangle yes
 #+BEGIN_SRC emacs-lisp :tangle yes
-(use-package discover-my-major
-  :ensure discover-my-major
-  :commands discover-my-major
-  :bind ("C-h C-m" . discover-my-major))
+(bind-key "RET" 'newline-and-indent)
 #+END_SRC
 #+END_SRC
-** easypg
-EasyPG is a GnuPG interface for Emacs.
-Bookmark: [[http://www.emacswiki.org/emacs/EasyPG][EmacsWiki: Easy PG]]
+
+Easier undo, and i don't need suspend-frame
 #+BEGIN_SRC emacs-lisp :tangle yes
 #+BEGIN_SRC emacs-lisp :tangle yes
-(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)
-    ))
+(bind-key "C-z" 'undo)
 #+END_SRC
 #+END_SRC
-** ediff
-[2013-04-21 So 20:36]
-ediff - don't start another frame
+
+Window switching, go backwards. (C-x o goes to the next window)
 #+BEGIN_SRC emacs-lisp :tangle yes
 #+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-key "C-x O" (lambda ()
+                    (interactive)
+                    (other-window -1)))
+#+END_SRC
 
 
-  :bind (("C-. = b" . ediff-buffers)
-         ("C-. = B" . ediff-buffers3)
-         ("C-. = =" . ediff-files)
-         ("C-. = f" . ediff-files)
-         ("C-. = F" . ediff-files3)
-         ("C-. = r" . ediff-revision)
-         ("C-. = p" . ediff-patch-file)
-         ("C-. = P" . ediff-patch-buffer)
-         ("C-. = l" . ediff-regions-linewise)
-         ("C-. = w" . ediff-regions-wordwise))
-  :config (progn
-            (setq ediff-window-setup-function 'ediff-setup-windows-plain)
-            (setq ediff-split-window-function 'split-window-horizontally)
-            )
-)
+Edit file as root
+#+BEGIN_SRC emacs-lisp :tangle yes
+(bind-key "C-x C-r" 'prelude-sudo-edit)
 #+END_SRC
 #+END_SRC
-** emms
-EMMS is the Emacs Multimedia System.
-#+BEGIN_SRC emacs-lisp :tangle no
-(require 'emms-source-file)
-(require 'emms-source-playlist)
-(require 'emms-info)
-(require 'emms-cache)
-(require 'emms-playlist-mode)
-(require 'emms-playing-time)
-(require 'emms-player-mpd)
-(require 'emms-playlist-sort)
-(require 'emms-mark)
-(require 'emms-browser)
-(require 'emms-lyrics)
-(require 'emms-last-played)
-(require 'emms-score)
-(require 'emms-tag-editor)
-(require 'emms-history)
-(require 'emms-i18n)
 
 
-(setq emms-playlist-default-major-mode 'emms-playlist-mode)
-(add-to-list 'emms-track-initialize-functions 'emms-info-initialize-track)
-(emms-playing-time 1)
-(emms-lyrics 1)
-(add-hook 'emms-player-started-hook 'emms-last-played-update-current)
-;(add-hook 'emms-player-started-hook 'emms-player-mpd-sync-from-emms)
-(emms-score 1)
-(when (fboundp 'emms-cache) ; work around compiler warning
-  (emms-cache 1))
-(setq emms-score-default-score 3)
+M-space is bound to just-one-space, which is great for programming. What
+it does is remove all spaces around the cursor, except for one. But to
+be really useful, it also should include newlines. It doesn’t do this by
+default. Rather, you have to call it with a negative argument. Sure
+not, bad Emacs.
+#+BEGIN_SRC emacs-lisp :tangle yes
+(bind-key "M-SPC" 'just-one-space-with-newline)
+#+END_SRC
+
+Count which commands I use how often.
+#+BEGIN_SRC emacs-lisp :tangle yes
+(use-package keyfreq
+  :ensure keyfreq
+  :init
+  (progn
+    (setq keyfreq-file (expand-file-name "keyfreq" jj-cache-dir))
+    (setq keyfreq-file-lock (expand-file-name "keyfreq.lock" jj-cache-dir))
+    (keyfreq-mode 1)
+    (keyfreq-autosave-mode 1)))
+#+END_SRC
 
 
-(defun emms-mpd-init ()
-  "Connect Emms to mpd."
+Duplicate current line
+#+BEGIN_SRC emacs-lisp :tangle yes
+(defun duplicate-line ()
+  "Insert a copy of the current line after the current line."
   (interactive)
   (interactive)
-  (emms-player-mpd-connect))
+  (save-excursion
+    (let ((line-text (buffer-substring-no-properties
+                      (line-beginning-position)
+                      (line-end-position))))
+      (move-end-of-line 1)
+      (newline)
+      (insert line-text))))
 
 
-;; players
-(require 'emms-player-mpd)
-(setq emms-player-mpd-server-name "localhost")
-(setq emms-player-mpd-server-port "6600")
-(add-to-list 'emms-info-functions 'emms-info-mpd)
-(add-to-list 'emms-player-list 'emms-player-mpd)
-(setq emms-volume-change-function 'emms-volume-mpd-change)
-(setq emms-player-mpd-sync-playlist t)
+(bind-key "C-c p" 'duplicate-line)
+#+END_SRC
 
 
-(setq emms-source-file-default-directory "/var/lib/mpd/music")
-(setq emms-player-mpd-music-directory "/var/lib/mpd/music")
-(setq emms-info-auto-update t)
-(setq emms-lyrics-scroll-p t)
-(setq emms-lyrics-display-on-minibuffer t)
-(setq emms-lyrics-display-on-modeline nil)
-(setq emms-lyrics-dir "~/.emacs.d/var/lyrics")
+Smarter move to the beginning of the line. That is, it first moves to
+the beginning of the line - and on second keypress it goes to the
+first character on line.
+#+BEGIN_SRC emacs-lisp :tangle yes
+(defun smarter-move-beginning-of-line (arg)
+  "Move point back to indentation of beginning of line.
 
 
-(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")))
+Move point to the first non-whitespace character on this line.
+If point is already there, move to the beginning of the line.
+Effectively toggle between the first non-whitespace character and
+the beginning of the line.
 
 
-;; 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)))
-)
+If ARG is not nil or 1, move forward ARG - 1 lines first.  If
+point reaches the beginning or end of the buffer, stop there."
+  (interactive "^p")
+  (setq arg (or arg 1))
 
 
-(setq emms-track-description-function 'my-describe)
+  ;; Move lines first
+  (when (/= arg 1)
+    (let ((line-move-visual nil))
+      (forward-line (1- arg))))
 
 
-;; (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)
+  (let ((orig-point (point)))
+    (back-to-indentation)
+    (when (= orig-point (point))
+      (move-beginning-of-line 1))))
 
 
-(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)
+;; remap C-a to `smarter-move-beginning-of-line'
+(global-set-key [remap move-beginning-of-line]
+                'smarter-move-beginning-of-line)
 
 
-(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)))
+#+END_SRC
 
 
-(global-set-key (kbd "H-<f9> s u") 'emms-score-up-playing)
-(global-set-key (kbd "H-<f9> s d") 'emms-score-down-playing)
-(global-set-key (kbd "H-<f9> s o") 'emms-score-show-playing)
-(global-set-key (kbd "H-<f9> s s") 'emms-score-set-playing)
+Easily copy characters from the previous nonblank line, starting just
+above point. With a prefix argument, only copy ARG characters (never
+past EOL), no argument copies rest of line.
+#+BEGIN_SRC emacs-lisp :tangle yes
+(require 'misc)
+(bind-key "H-y" 'copy-from-above-command)
+#+END_SRC
 
 
-(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)
+Open a new X Terminal pointing to the directory of the current
+buffers path.
+#+BEGIN_SRC emacs-lisp :tangle yes
+(bind-key "H-t" 'jj-open-shell)
+#+END_SRC
 
 
-(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)
+Align code
+#+BEGIN_SRC emacs-lisp :tangle yes
+(bind-key "H-a" 'align-code)
+#+END_SRC
 
 
-(setq emms-playlist-buffer-name "*EMMS Playlist*"
-      emms-playlist-mode-open-playlists t)
+Insert date
+#+BEGIN_SRC emacs-lisp :tangle yes
+(bind-key "C-c d" 'insert-date)
+#+END_SRC
 
 
-;; Faces
-(if (window-system)
-    ((lambda ()
-       (set-face-attribute
-        'emms-browser-artist-face nil
-        :family "Arno Pro")
-       )
-))
+Another key for indenting
+#+BEGIN_SRC emacs-lisp :tangle yes
+(bind-key "H-i" 'indent-region)
+#+END_SRC
 
 
-(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)
+Clean all whitespace stuff
+#+BEGIN_SRC emacs-lisp :tangle yes
+(bind-key "H-w" 'whitespace-cleanup)
+#+END_SRC
+
+Comment/Uncomment
+#+BEGIN_SRC emacs-lisp :tangle yes
+(bind-key "H-c" 'comment-dwim)
+#+END_SRC
+
+Show keystrokes in progress
+#+BEGIN_SRC emacs-lisp :tangle yes
+(setq echo-keystrokes 0.1)
+#+END_SRC
+**** Overwrite mode
+Usually you can press the *Ins*ert key, to get into overwrite mode. I
+don't like that, have broken much with it and so just forbid it by
+disabling that.
+#+BEGIN_SRC emacs-lisp :tangle yes
+(unbind-key "<insert>")
+(unbind-key "<kp-insert>")
+#+END_SRC
+
+*** Easily navigate sillyCased words
+#+BEGIN_SRC emacs-lisp :tangle yes
+(global-subword-mode 1)
+#+END_SRC
+*** Delete file of current buffer, then kill buffer
+[2014-06-14 Sat 23:03]
+#+BEGIN_SRC emacs-lisp :tangle yes
+(defun delete-current-buffer-file ()
+  "Removes file connected to current buffer and kills buffer."
+  (interactive)
+  (let ((filename (buffer-file-name))
+        (buffer (current-buffer))
+        (name (buffer-name)))
+    (if (not (and filename (file-exists-p filename)))
+        (ido-kill-buffer)
+      (when (yes-or-no-p "Are you sure you want to remove this file? ")
+        (delete-file filename)
+        (kill-buffer buffer)
+        (message "File '%s' successfully removed" filename)))))
+
+(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
 #+END_SRC
+
 ** ethan-wspace
 [2014-06-01 Sun 15:00]
 Proper whitespace handling
 ** ethan-wspace
 [2014-06-01 Sun 15:00]
 Proper whitespace handling
@@ -4119,6 +4158,7 @@ files. This list is is automatically saved across Emacs sessions.
 (use-package recentf
   :if (not noninteractive)
   :bind ("C-x C-r" . recentf-open-files)
 (use-package recentf
   :if (not noninteractive)
   :bind ("C-x C-r" . recentf-open-files)
+  :defer t
   :init
   (progn
     (recentf-mode 1)
   :init
   (progn
     (recentf-mode 1)