From 2488743abd583ffd3fccd2217d613ee4ccea665c Mon Sep 17 00:00:00 2001 From: Tom Willemse Date: Mon, 28 Sep 2015 23:03:06 +0200 Subject: Finish re-organizing init.org --- emacs/.emacs.d/init.org | 761 +++++++++++++++++++++++++----------------------- 1 file changed, 393 insertions(+), 368 deletions(-) (limited to 'emacs/.emacs.d/init.org') diff --git a/emacs/.emacs.d/init.org b/emacs/.emacs.d/init.org index 15636c1..50b801a 100644 --- a/emacs/.emacs.d/init.org +++ b/emacs/.emacs.d/init.org @@ -151,6 +151,103 @@ (with-eval-after-load ',feature ,@forms))) #+END_SRC +*** Turn off minor modes + + This macro creates a function that will turn off a minor mode that + passed to it. + + #+BEGIN_SRC emacs-lisp + (defmacro turn-off (func) + "Create a function that will turn off FUNC when called." + `(lambda () (eval (,func -1)))) + #+END_SRC + +*** Change settings + + Sometimes a mode just needs to change a certain setting to a + specific value. + + #+BEGIN_SRC emacs-lisp + (defmacro change-settings (&rest settings) + "Create a function that changes the value of NAME to VALUE." + `(lambda () (setq ,@settings))) + #+END_SRC + +*** Eval after init + + Some things can only really work after all other initialization + functions have completed. For example, any functions that require + any ELPA packages to be loaded, unless you want to load it in your + init manually (and have it loaded again later on after your config + has run). + + #+BEGIN_SRC emacs-lisp + (defmacro oni:eval-after-init (&rest body) + "Defer execution of BODY until after Emacs init." + (declare (indent 0)) + `(add-hook 'emacs-startup-hook #'(lambda () ,@body))) + #+END_SRC + +*** Whitespace only with tabs + + In some modes I want to see the tabs in a buffer. Though I don't + want to be overwhelmed by seeing all spaces and line endings. + + #+BEGIN_SRC emacs-lisp + (defvar whitespace-style) + + (defun oni:whitespace-only-tabs () + (setq-local whitespace-style '(face tabs)) + (whitespace-mode)) + #+END_SRC + +** Useful functions + + During your editing in Emacs you will undoubtedly find the need to + define your own editing functions or macros. Here are mine. + +*** Delete the contents of the string at point + + First we define the function. It was inspired by [[http://www.masteringemacs.org/][Mickey's post on + swapping quote symbols]], mostly copied even. First we check if we + are even in a string, and if not we throw an error, after that we + move back to the beginning of the string, store that point, go to + the end of the string (using =forward-sexp=) and then delete the + region between the two points (non-inclusive). + + #+BEGIN_SRC emacs-lisp + (defun oni:delete-string-contents () + (interactive) + + (unless (nth 3 (syntax-ppss)) + (error "You must be in a string for this command to work")) + + (save-excursion + (while (nth 3 (syntax-ppss)) (forward-char -1)) + + (let ((bos (point))) + (forward-sexp) + (delete-region (1+ bos) (1- (point)))))) + #+END_SRC + + Since for interactive functions it's kind of a pain to have to use + a personal "namespace" I prefer naming them regularly as if they're + just part of the environment. If ever Emacs comes up with a similar + function with the same name, I'd prefer using the built-in version. + + #+BEGIN_SRC emacs-lisp + (unless (fboundp 'delete-string-contents) + (defalias 'delete-string-contents 'oni:delete-string-contents)) + #+END_SRC + + Lastly, any function worth using often should probably be easily + accessible with a keybinding. In my case the {{{key(C-c i s)}}} is + inspired by the Vim keybindings like {{{key(ci")}}}. + + #+BEGIN_SRC emacs-lisp + (global-set-key (kbd "C-c i s") 'delete-string-contents) + #+END_SRC + * General customization These customizations don't belong with any specific mode. @@ -842,326 +939,248 @@ (setq elnode-do-init nil) #+END_SRC -* Minor mode customization - - Many minor modes also offer a bit of customization possibilities. +** js2 -** Robe + =js2-mode= isn't just an "improved" JavaScript mode, it's a full-on + JavaScript parser. It's easy to notice typo's and such when Emacs + can show you that a certain variable is or isn't declared. It does + come with some baggage, as it's not immediately clear how I can + specify which global names exist. For simple files it is fine to do + something like: - #+BEGIN_SRC emacs-lisp :tangle no - (depends-on "robe") + #+BEGIN_SRC js2 :tangle no + /*global $ Routes jQuery */ #+END_SRC - Robe is a Ruby completion and documentation lookup library. + Which will tell =js2-mode= that =$=, =Routes= and =jQuery= are known to be + define elsewhere. This doesn't work well for big lists of globals. -*** Adding completions to autocomplete +*** Add some known symbols for .conkerorrc/init.js to js2-mode - To add Robe completions to autocomplete whenever robe is started, - I use the =robe-mode-hook= to enable this so that it doesn't try to - get any completions when robe isn't running. + Conkeror has a lot of functions, and I don't like seeing them all as + unknowns. So add them to known symbols. + + *Note:* See my [[Vacuous defvar][note]] on vacuous defvar for this use of =defvar=. #+BEGIN_SRC emacs-lisp - (add-hook 'robe-mode-hook #'ac-robe-setup) + (defvar js2-additional-externs) + + (defun oni:js2-add-conkeror-symbols () + "Add known/used conkeror symbols to additional externs." + (when (string-suffix-p ".conkerorrc/init.js" (buffer-file-name)) + (setq js2-additional-externs + '( ;; Functions + "add_hook" "check_buffer" "co_return" "content_buffer" + "define_browser_object_class" "define_key" "define_webjump" + "dumpln" "get_current_profile" "get_home_directory" + "get_recent_conkeror_window" + "hints_minibuffer_annotation_mode" "interactive" "load_spec" + "load_spec_uri_string" "load_url_in_new_buffer" "make_file" + "make_uri" "mode_line_adder" + "open_download_buffer_automatically" "prefix_completer" + "read_browser_object" "register_user_stylesheet" + "remove_hook" "require" "send_http_request" "session_pref" + "shell_command_blind" "theme_load" + ;; Variables + "Cc" "Ci" "browser_object_history_url" "browser_object_links" + "buffer_count_widget" "buffer_icon_widget" "content_buffer" + "content_buffer_form_keymap" "content_buffer_normal_keymap" + "content_buffer_text_keymap" "content_policy_accept" + "content_policy_bytype" "content_policy_reject" "cwd" + "default_base_keymap" "default_global_keymap" + "downloads_status_widget" "external_content_handlers" + "hint_digits" "load_paths" "read_buffer_show_icons" + "read_url_handler_list" "session_auto_save_auto_load" + "theme_load_paths" "title_format_fn" "url_remoting_fn" + ;; Keyword argument + "$alternative" "$browser_object" "$completer" "$completions" + "$initial_value" "$options" "$prompt" "$sort_order" + "$use_bookmarks" "$use_history" "$use_webjumps")))) + + (add-hook 'js2-init-hook #'oni:js2-add-conkeror-symbols) #+END_SRC -* Some general-purpose functions and macros +** Eww - A configuration as big as mine is bound to have some functions and - macros that are used in many places. + I've been excited about the "Emacs Web Wowser" since I first read + about it on the mailing list. Previously I'd used some integration + with w3 which was ok, but it certainly didn't match up to a + fully-integrated Emacs application. -** Turn off + This application uses =shr= just like Gnus, so there is some overlap + here with reading Emails. - This macro creates a function that will turn off a minor mode that - passed to it. +*** Teach eww about tags - #+BEGIN_SRC emacs-lisp - (defmacro turn-off (func) - "Create a function that will turn off FUNC when called." - `(lambda () (eval (,func -1)))) - #+END_SRC + Strangely enough, ~eww~ doesn't seem to be aware of == HTML tags. + Luckily it's trivial to teach it. It does know about =
= HTML
+    tags, and basically I just want == tags to be treated almost as
+    =
= tags, so to do that we just have to define a =shr-tag-code=
+    function. I've copied the =shr-tag-pre= function and removed the calls
+    to =ensure-newline=, because == tags are inline tags.
 
-** Change setting
+    In order to remain a little future-proof, it should only be done if
+    it doesn't already exist.
 
-   Sometimes a mode just needs to change a certain setting to a
-   specific value.
+    *Note:* See my [[Vacuous defvar][note]] on vacuous defvar for this use of =defvar=.
 
-   #+BEGIN_SRC emacs-lisp
-     (defmacro change-settings (&rest settings)
-       "Create a function that changes the value of NAME to VALUE."
-       `(lambda () (setq ,@settings)))
-   #+END_SRC
+    *Note:* See my [[Function declarations][note]] on function declarations about the use of
+    =declare-function=.
 
-** Whitespace only with tabs
+    #+BEGIN_SRC emacs-lisp
+      (defvar shr-folding-mode)
+      (declare-function shr-indent "shr")
+      (declare-function shr-generic "shr")
 
-   In some modes I want to see the tabs in a buffer. Though I don't
-   want to be overwhelmed by seeing all spaces and line endings.
+      (with-eval-after-load 'shr
+        (unless (fboundp 'shr-tag-code)
+          (defun shr-tag-code (cont)
+            (let ((shr-folding-mode 'none))
+              (shr-indent)
+              (shr-generic cont)))))
+    #+END_SRC
 
-   #+BEGIN_SRC emacs-lisp
-     (defvar whitespace-style)
+*** Setup eww-lnum
 
-     (defun oni:whitespace-only-tabs ()
-       (setq-local whitespace-style '(face tabs))
-       (whitespace-mode))
-   #+END_SRC
+    #+BEGIN_SRC emacs-lisp :tangle no
+      (depends-on "eww-lnum")
+    #+END_SRC
 
-** Eval after init
+    As recommended in the [[https://github.com/m00natic/eww-lnum][README]], set the keys in the =eww-mode-map=.
 
-   Some things can only really work after all other initialization
-   functions have completed. For example, any functions that require
-   any ELPA packages to be loaded, unless you want to load it in your
-   init manually (and have it loaded again later on after your config
-   has run).
+    #+BEGIN_SRC emacs-lisp
+      (defvar eww-mode-map)
 
-   #+BEGIN_SRC emacs-lisp
-     (defmacro oni:eval-after-init (&rest body)
-       "Defer execution of BODY until after Emacs init."
-       (declare (indent 0))
-       `(add-hook 'emacs-startup-hook #'(lambda () ,@body)))
-   #+END_SRC
+      (with-eval-after-load 'eww
+        (define-key eww-mode-map "f" 'eww-lnum-follow)
+        (define-key eww-mode-map "F" 'eww-lnum-universal))
+    #+END_SRC
 
-* Add some known symbols for .conkerorrc/init.js to js2-mode
-
-  Conkeror has a lot of functions, and I don't like seeing them all as
-  unknowns. So add them to known symbols.
-
-  *Note:* See my [[Vacuous defvar][note]] on vacuous defvar for this use of =defvar=.
-
-  #+BEGIN_SRC emacs-lisp
-    (defvar js2-additional-externs)
-
-    (defun oni:js2-add-conkeror-symbols ()
-      "Add known/used conkeror symbols to additional externs."
-      (when (string-suffix-p ".conkerorrc/init.js" (buffer-file-name))
-        (setq js2-additional-externs
-              '( ;; Functions
-                "add_hook" "check_buffer" "co_return" "content_buffer"
-                "define_browser_object_class" "define_key" "define_webjump"
-                "dumpln" "get_current_profile" "get_home_directory"
-                "get_recent_conkeror_window"
-                "hints_minibuffer_annotation_mode" "interactive" "load_spec"
-                "load_spec_uri_string" "load_url_in_new_buffer" "make_file"
-                "make_uri" "mode_line_adder"
-                "open_download_buffer_automatically" "prefix_completer"
-                "read_browser_object" "register_user_stylesheet"
-                "remove_hook" "require" "send_http_request" "session_pref"
-                "shell_command_blind" "theme_load"
-                ;; Variables
-                "Cc" "Ci" "browser_object_history_url" "browser_object_links"
-                "buffer_count_widget" "buffer_icon_widget" "content_buffer"
-                "content_buffer_form_keymap" "content_buffer_normal_keymap"
-                "content_buffer_text_keymap" "content_policy_accept"
-                "content_policy_bytype" "content_policy_reject" "cwd"
-                "default_base_keymap" "default_global_keymap"
-                "downloads_status_widget" "external_content_handlers"
-                "hint_digits" "load_paths" "read_buffer_show_icons"
-                "read_url_handler_list" "session_auto_save_auto_load"
-                "theme_load_paths" "title_format_fn" "url_remoting_fn"
-                ;; Keyword argument
-                "$alternative" "$browser_object" "$completer" "$completions"
-                "$initial_value" "$options" "$prompt" "$sort_order"
-                "$use_bookmarks" "$use_history" "$use_webjumps"))))
-
-    (add-hook 'js2-init-hook #'oni:js2-add-conkeror-symbols)
-  #+END_SRC
+** Scheme
 
-* Teach eww about  tags
-
-  Strangely enough, ~eww~ doesn't seem to be aware of == HTML tags.
-  Luckily it's trivial to teach it. It does know about =
= HTML
-  tags, and basically I just want == tags to be treated almost as
-  =
= tags, so to do that we just have to define a =shr-tag-code=
-  function. I've copied the =shr-tag-pre= function and removed the calls
-  to =ensure-newline=, because == tags are inline tags.
-
-  In order to remain a little future-proof, it should only be done if
-  it doesn't already exist.
-
-  *Note:* See my [[Vacuous defvar][note]] on vacuous defvar for this use of =defvar=.
-
-  *Note:* See my [[Function declarations][note]] on function declarations about the use of
-  =declare-function=.
-
-  #+BEGIN_SRC emacs-lisp
-    (defvar shr-folding-mode)
-    (declare-function shr-indent "shr")
-    (declare-function shr-generic "shr")
-
-    (with-eval-after-load 'shr
-      (unless (fboundp 'shr-tag-code)
-        (defun shr-tag-code (cont)
-          (let ((shr-folding-mode 'none))
-            (shr-indent)
-            (shr-generic cont)))))
-  #+END_SRC
-
-* Use scheme-mode for scsh interpreted files
-
-  Set the major mode for files interpreted by scsh (for example, by
-  having ~#!/usr/local/bin/scsh~ at the top) to use =scheme-mode=.
-
-  #+BEGIN_SRC emacs-lisp
-    (add-to-list 'interpreter-mode-alist '("scsh" . scheme-mode))
-  #+END_SRC
-
-* Set default scheme implementation
-
-  Set the default implementation for geiser to guile so it doesn't ask
-  which implementation to use every time.
-
-  #+BEGIN_SRC emacs-lisp
-    (defvar geiser-default-implementation)
-
-    (with-eval-after-load 'geiser
-      (setq geiser-default-implementation 'guile))
-  #+END_SRC
-
-* Setup eww-lnum
-
-  As recommended in the [[https://github.com/m00natic/eww-lnum][README]], set the keys in the =eww-mode-map=.
-
-  #+BEGIN_SRC emacs-lisp
-    (defvar eww-mode-map)
-
-    (with-eval-after-load 'eww
-      (define-key eww-mode-map "f" 'eww-lnum-follow)
-      (define-key eww-mode-map "F" 'eww-lnum-universal))
-  #+END_SRC
-
-* Don't compile scss files
-
-  By default =scss-mode= tries compiling a file each time it's saved. I
-  don't have SCSS properly installed globally so this always fails,
-  highly annoying.
-
-  #+BEGIN_SRC emacs-lisp
-    (defvar scss-compile-at-save)
-
-    (with-eval-after-load 'scss-mode
-      (setq scss-compile-at-save nil))
-  #+END_SRC
-
-* Change listings in dired
+   I really like programming in Lisp. One of the more comfortable
+   Lisps is Scheme because most of the implementations I've worked
+   with are more like other compiled or interpreted languages, whereas
+   Common Lisp usually re-compiles on every load. Aside from that,
+   there are some neat programs written in some scheme dialects and of
+   course scsh is the most awesome shell scripting language ever
+   conceived.
 
-  The number of bytes a file is doesn't usually tell me much when it's
-  something like ~292837~. I prefer seeing just how many Kb or Mb a
-  certain file is. I also don't need to see the ~.~ and ~..~ directories
-  when I insert directories into the current dired buffer, as there is
-  a great chance that the current and parent directory are already
-  shown in the buffer.
+*** Use scheme-mode for scsh interpreted files
 
-  #+BEGIN_SRC emacs-lisp
-    (defvar dired-subdir-switches)
+    Set the major mode for files interpreted by scsh (for example, by
+    having ~#!/usr/local/bin/scsh~ at the top) to use =scheme-mode=.
 
-    (with-eval-after-load 'dired
-      (setq dired-listing-switches "-alh"
-            dired-subdir-switches "-Alh"))
-  #+END_SRC
+    #+BEGIN_SRC emacs-lisp
+      (add-to-list 'interpreter-mode-alist '("scsh" . scheme-mode))
+    #+END_SRC
 
-* Useful functions
+*** Set default scheme implementation
 
-  During your editing in Emacs you will undoubtedly find the need to
-  define your own editing functions or macros. Here are mine.
+    Set the default implementation for geiser to guile so it doesn't ask
+    which implementation to use every time.
 
-** Delete the contents of the string at point
+    #+BEGIN_SRC emacs-lisp
+      (stante-after geiser-impl
+        (setq geiser-default-implementation 'guile))
+    #+END_SRC
 
-   First we define the function. It was inspired by [[http://www.masteringemacs.org/][Mickey's post on
-   swapping quote symbols]], mostly copied even. First we check if we
-   are even in a string, and if not we throw an error, after that we
-   move back to the beginning of the string, store that point, go to
-   the end of the string (using =forward-sexp=) and then delete the
-   region between the two points (non-inclusive).
+** SCSS
 
-   #+BEGIN_SRC emacs-lisp
-     (defun oni:delete-string-contents ()
-       (interactive)
+   SCSS is a CSS preprocessor that makes writing CSS files much more
+   fun. Add autocompletion and some custom imenu function.
 
-       (unless (nth 3 (syntax-ppss))
-         (error "You must be in a string for this command to work"))
+   #+BEGIN_SRC emacs-lisp
+     (add-hook 'scss-mode-hook 'auto-complete-mode)
+     (add-hook 'scss-mode-hook 'scss-imenu-setup)
+   #+END_SRC
 
-       (save-excursion
-         (while (nth 3 (syntax-ppss)) (forward-char -1))
+** Dired
 
-         (let ((bos (point)))
-           (forward-sexp)
-           (delete-region (1+ bos) (1- (point))))))
-   #+END_SRC
+   Dired is an excellent file manager.
 
-   Since for interactive functions it's kind of a pain to have to use
-   a personal "namespace" I prefer naming them regularly as if they're
-   just part of the environment. If ever Emacs comes up with a similar
-   function with the same name, I'd prefer using the built-in version.
+*** Change listings in dired
 
-   #+BEGIN_SRC emacs-lisp
-     (unless (fboundp 'delete-string-contents)
-       (defalias 'delete-string-contents 'oni:delete-string-contents))
-   #+END_SRC
+    The number of bytes a file is doesn't usually tell me much when it's
+    something like ~292837~. I prefer seeing just how many Kb or Mb a
+    certain file is. I also don't need to see the ~.~ and ~..~ directories
+    when I insert directories into the current dired buffer, as there is
+    a great chance that the current and parent directory are already
+    shown in the buffer.
 
-   Lastly, any function worth using often should probably be easily
-   accessible with a keybinding. In my case the {{{key(C-c i s)}}} is
-   inspired by the Vim keybindings like {{{key(ci")}}}.
+    #+BEGIN_SRC emacs-lisp
+      (defvar dired-subdir-switches)
 
-   #+BEGIN_SRC emacs-lisp
-     (global-set-key (kbd "C-c i s") 'delete-string-contents)
-   #+END_SRC
+      (with-eval-after-load 'dired
+        (setq dired-listing-switches "-alh"
+              dired-subdir-switches "-Alh"))
+    #+END_SRC
 
-* Show eldoc when evaluating expressions
+** PHP
 
-  Thanks to [[http://endlessparentheses.com/sweet-new-features-in-24-4.html][this post]] it was brought to my attention that eldoc mode
-  can be enabled when evaluating expressions using {{{key(M-:)}}}.
+   I occasionally write PHP for work. Not usually in my free time, but
+   there are some open source PHP projects that I sometimes tinker
+   with.
 
-  I vaguely remember having had this before, I just don't know how or
-  why it stopped working.
+*** Show tabs and spaces in indent
 
-  #+BEGIN_SRC emacs-lisp
-    (add-hook 'eval-expression-minibuffer-setup-hook #'eldoc-mode)
-  #+END_SRC
+    I'm working with some WordPress plugins nowadays and their style
+    guide insists on using tabs, not spaces... I'd like to know that
+    I'm following this rule.
 
-* Remove whitespace when closing delimiters
+    #+BEGIN_SRC emacs-lisp
+      (add-hook 'php-mode-hook #'oni:whitespace-only-tabs)
+    #+END_SRC
 
-  In =electric-pair-mode=, skip over and delete white space if it stands
-  between the cursor and the closing delimiter.
+** Web
 
-  #+BEGIN_SRC emacs-lisp
-    (setq electric-pair-skip-whitespace 'chomp)
-  #+END_SRC
+   Web mode is good for files that contain a lot of HTML, CSS and
+   JavaScript together. Most other major modes or multi-major modes
+   don't quite do it.
 
-* Programming
+*** Turn off the fill column indicator
 
-  Emacs is a real programmer's editor, especially so because it's so
-  programmable itself. It also offers modes for a lot of programming
-  languages and 3rd-party packages offer even more.
+    ~web-mode~ has some quirks, such as not being able to handle the
+    fact that ~fci-mode~ puts a red line at the 80-column margin. This is
+    annoying to say the least.
 
-** SCSS
+    #+BEGIN_SRC emacs-lisp
+      (declare-function fci-mode "fci-mode")
+      (add-hook 'web-mode-hook (turn-off fci-mode))
+    #+END_SRC
 
-   - Enable auto-completion
+*** Show tabs in indentation
 
-     #+BEGIN_SRC emacs-lisp
-       (declare-function auto-complete-mode "auto-complete")
+    Just like in ~php-mode~ I want to see the tabs.
 
-       (add-hook 'scss-mode-hook #'auto-complete-mode)
-     #+END_SRC
+    #+BEGIN_SRC emacs-lisp
+      (add-hook 'web-mode-hook #'oni:whitespace-only-tabs)
+    #+END_SRC
 
-   - Enable imenu
+*** Use tabs for indentation
 
-     #+BEGIN_SRC emacs-lisp
-       (declare-function scss-imenu-setup "scss-imenu")
+    Set =indent-tabs-mode= for ~web-mode~ as well.
 
-       (add-hook 'scss-mode-hook #'scss-imenu-setup)
-     #+END_SRC
+    #+BEGIN_SRC emacs-lisp
+      (defvar web-mode-code-indent-offset)
+      (defvar web-mode-markup-indent-offset)
 
-** PHP
+      (add-hook 'web-mode-hook
+                (change-settings indent-tabs-mode t
+                                 web-mode-code-indent-offset 4
+                                 web-mode-markup-indent-offset 4))
+    #+END_SRC
 
-*** Show tabs and spaces in indent
+*** Use it for Embedded Ruby HTML files
 
-    I'm working with some WordPress plugins nowadays and their style
-    guide insists on using tabs, not spaces... I'd like to know that
-    I'm following this rule.
+    Use it for ~.html.erb~ files.
 
     #+BEGIN_SRC emacs-lisp
-      (add-hook 'php-mode-hook #'oni:whitespace-only-tabs)
+      (oni:eval-after-init
+        (add-to-list 'auto-mode-alist '("\\.html\\.erb$" . web-mode)))
     #+END_SRC
 
-*** Use web-mode for HTML-heavy files
+*** Use it for HTML-heavy PHP files
 
     I have to work with a lot of PHP and HTML interspersed. This makes
     a difficult case since ~php-mode~ very deliberately doesn't support
@@ -1182,63 +1201,149 @@
         (add-to-list 'auto-mode-alist '("\\.html\\.php$" . web-mode)))
     #+END_SRC
 
-** Web
+** PO mode
 
-   ~web-mode~ has some quirks, such as not being able to handle the
-   fact that ~fci-mode~ puts a red line at the 80-column margin. This is
-   annoying to say the least.
+   Autoload =po-mode=, because it didn't come with an autloads file or
+   cookie.
 
    #+BEGIN_SRC emacs-lisp
-     (declare-function fci-mode "fci-mode")
-     (add-hook 'web-mode-hook (turn-off fci-mode))
+     (autoload 'po-mode "po-mode" nil t)
    #+END_SRC
 
-   Just like in ~php-mode~ I want to see the tabs.
+   Automatically enable =po-mode= for files that end in =.po= or that have
+   a =.po= extension followed by others (such as =.po.erb=).
 
    #+BEGIN_SRC emacs-lisp
-     (add-hook 'web-mode-hook #'oni:whitespace-only-tabs)
+     (add-to-list 'auto-mode-alist '("\\.po\\'\\|\\.po\\." . po-mode))
    #+END_SRC
 
-   Set =indent-tabs-mode= for ~web-mode~ as well.
+** Magit
 
-   #+BEGIN_SRC emacs-lisp
-     (defvar web-mode-code-indent-offset)
-     (defvar web-mode-markup-indent-offset)
+   Recently Magit gained the annoying habit of producing a /huge/ warning
+   message whenever you don't tell it that you've already seen it. To
+   tell it you've already seen the message you need to specify the
+   following.
 
-     (add-hook 'web-mode-hook
-               (change-settings indent-tabs-mode t
-                                web-mode-code-indent-offset 4
-                                web-mode-markup-indent-offset 4))
+   #+BEGIN_SRC emacs-lisp
+     (eval-and-compile
+       (defvar magit-last-seen-setup-instructions "1.4.0"))
    #+END_SRC
 
-   Use it for ~.html.erb~ files.
+   I use a =defvar= here in order to keep the byte-compiler from
+   complaining about an undefined variable. It needs to be specified
+   before magit is loaded otherwise magit will keep complaining.
 
-   #+BEGIN_SRC emacs-lisp
-     (oni:eval-after-init
-       (add-to-list 'auto-mode-alist '("\\.html\\.erb$" . web-mode)))
+*** Project directory
+
+    I keep all my projects in =~/projects/=, so Magit shouldn't have to
+    look anywhere else.
+
+    #+NAME: magit-repo-dirs
+    #+BEGIN_SRC emacs-lisp :tangle no
+      (setq magit-repository-directories '("~/projects/"))
+    #+END_SRC
+
+*** Show fine differences
+
+    I like to see all the little differences in diffs that I can. They
+    really help reading diffs. I also just want to see them on all
+    diffs and not the selected one, which would make an unnecessary
+    amount of navigation required to properly read the diffs.
+
+    #+NAME: magit-diff-refine-hunk
+    #+BEGIN_SRC emacs-lisp :tangle no
+      (setq magit-diff-refine-hunk 'all)
+    #+END_SRC
+
+*** Delay setting
+
+    The settings in the previous sections should only be set after
+    Magit has loaded.
+
+   #+BEGIN_SRC emacs-lisp :noweb yes
+     (stante-after magit
+       <>
+       <>)
    #+END_SRC
 
-** PO mode
+* Minor mode customization
 
-   Autoload =po-mode=, because it didn't come with an autloads file or
-   cookie.
+  Many minor modes also offer a bit of customization possibilities.
 
-   #+BEGIN_SRC emacs-lisp
-     (autoload 'po-mode "po-mode" nil t)
+** Robe
+
+   #+BEGIN_SRC emacs-lisp :tangle no
+     (depends-on "robe")
    #+END_SRC
 
-   Automatically enable =po-mode= for files that end in =.po= or that have
-   a =.po= extension followed by others (such as =.po.erb=).
+   Robe is a Ruby completion and documentation lookup library.
+
+*** Adding completions to autocomplete
+
+    To add Robe completions to autocomplete whenever robe is started,
+    I use the =robe-mode-hook= to enable this so that it doesn't try to
+    get any completions when robe isn't running.
+
+    #+BEGIN_SRC emacs-lisp
+      (add-hook 'robe-mode-hook #'ac-robe-setup)
+    #+END_SRC
+
+** Eldoc
+
+   Seeing the arguments to a function whilst typing its name is
+   excellent.
+
+*** Show eldoc when evaluating expressions
+
+    Thanks to [[http://endlessparentheses.com/sweet-new-features-in-24-4.html][this post]] it was brought to my attention that eldoc mode
+    can be enabled when evaluating expressions using {{{key(M-:)}}}.
+
+    I vaguely remember having had this before, I just don't know how or
+    why it stopped working.
+
+    #+BEGIN_SRC emacs-lisp
+      (add-hook 'eval-expression-minibuffer-setup-hook #'eldoc-mode)
+    #+END_SRC
+
+** Electric pair
+
+   Electric pairing of delimiters is one of those features that is
+   just so essential to my feeling comfortable with an editor. Most of
+   the time I don't even use it, really. It's just that I'm so used to
+   having it and when I /do/ expect it to be there it is so frustrating
+   when it's not, or when it doesn't work properly.
+
+   This functionality, much like [[Electric indent]] isn't something I
+   want enabled in all modes, though for different reasons, and for a
+   time there was only the global =electric-pair-mode=. Again I'm very
+   happy that a local version was added.
+
+   The reason that I don't want it enabled for all modes is that some
+   modes (mostly Lisp-like language modes) have better alternatives.
+   But most non-Lisp-like language modes I really do need to have it.
 
    #+BEGIN_SRC emacs-lisp
-     (add-to-list 'auto-mode-alist '("\\.po\\'\\|\\.po\\." . po-mode))
+     (add-hook 'c-mode-hook #'electric-pair-local-mode)
+     (add-hook 'coffee-mode-hook #'electric-pair-local-mode)
+     (add-hook 'css-mode-hook #'electric-pair-local-mode)
+     (add-hook 'haml-mode-hook #'electric-pair-local-mode)
+     (add-hook 'java-mode-hook #'electric-pair-local-mode)
+     (add-hook 'js2-mode-hook #'electric-pair-local-mode)
+     (add-hook 'lua-mode-hook #'electric-pair-local-mode)
+     (add-hook 'python-mode-hook #'electric-pair-local-mode)
+     (add-hook 'ruby-mode-hook #'electric-pair-local-mode)
+     (add-hook 'scss-mode-hook #'electric-pair-local-mode)
+     (add-hook 'sh-mode-hook #'electric-pair-local-mode)
    #+END_SRC
 
-* Minor modes
+*** Remove whitespace when closing delimiters
+
+    In =electric-pair-mode=, skip over and delete white space if it stands
+    between the cursor and the closing delimiter.
 
-  Emacs offers a lot of minor modes and even more can be found in the
-  ELPA, MELPA and Marmalade repositories. These offer a lot of
-  customization possibilities and added features.
+    #+BEGIN_SRC emacs-lisp
+      (setq electric-pair-skip-whitespace 'chomp)
+    #+END_SRC
 
 ** Electric indent
 
@@ -1307,37 +1412,6 @@
       (add-hook 'electric-indent-local-mode-hook #'oni:switch-newline-keys)
     #+END_SRC
 
-** Electric pairing
-
-   Electric pairing of delimiters is one of those features that is
-   just so essential to my feeling comfortable with an editor. Most of
-   the time I don't even use it, really. It's just that I'm so used to
-   having it and when I /do/ expect it to be there it is so frustrating
-   when it's not, or when it doesn't work properly.
-
-   This functionality, much like [[Electric indent]] isn't something I
-   want enabled in all modes, though for different reasons, and for a
-   time there was only the global =electric-pair-mode=. Again I'm very
-   happy that a local version was added.
-
-   The reason that I don't want it enabled for all modes is that some
-   modes (mostly Lisp-like language modes) have better alternatives.
-   But most non-Lisp-like language modes I really do need to have it.
-
-   #+BEGIN_SRC emacs-lisp
-     (add-hook 'c-mode-hook #'electric-pair-local-mode)
-     (add-hook 'coffee-mode-hook #'electric-pair-local-mode)
-     (add-hook 'css-mode-hook #'electric-pair-local-mode)
-     (add-hook 'haml-mode-hook #'electric-pair-local-mode)
-     (add-hook 'java-mode-hook #'electric-pair-local-mode)
-     (add-hook 'js2-mode-hook #'electric-pair-local-mode)
-     (add-hook 'lua-mode-hook #'electric-pair-local-mode)
-     (add-hook 'python-mode-hook #'electric-pair-local-mode)
-     (add-hook 'ruby-mode-hook #'electric-pair-local-mode)
-     (add-hook 'scss-mode-hook #'electric-pair-local-mode)
-     (add-hook 'sh-mode-hook #'electric-pair-local-mode)
-   #+END_SRC
-
 ** Auto completion
 
    #+BEGIN_SRC emacs-lisp :tangle no
@@ -1516,55 +1590,6 @@
        <>)
    #+END_SRC
 
-* Magit
-
-  Recently Magit gained the annoying habit of producing a /huge/ warning
-  message whenever you don't tell it that you've already seen it. To
-  tell it you've already seen the message you need to specify the
-  following.
-
-  #+BEGIN_SRC emacs-lisp
-    (eval-and-compile
-      (defvar magit-last-seen-setup-instructions "1.4.0"))
-  #+END_SRC
-
-  I use a =defvar= here in order to keep the byte-compiler from
-  complaining about an undefined variable. It needs to be specified
-  before magit is loaded otherwise magit will keep complaining.
-
-** Project directory
-
-   I keep all my projects in =~/projects/=, so Magit shouldn't have to
-   look anywhere else.
-
-   #+NAME: magit-repo-dirs
-   #+BEGIN_SRC emacs-lisp :tangle no
-     (setq magit-repository-directories '("~/projects/"))
-   #+END_SRC
-
-** Show fine differences
-
-   I like to see all the little differences in diffs that I can. They
-   really help reading diffs. I also just want to see them on all
-   diffs and not the selected one, which would make an unnecessary
-   amount of navigation required to properly read the diffs.
-
-   #+NAME: magit-diff-refine-hunk
-   #+BEGIN_SRC emacs-lisp :tangle no
-     (setq magit-diff-refine-hunk 'all)
-   #+END_SRC
-
-** Delay setting
-
-   The settings in the previous sections should only be set after
-   Magit has loaded.
-
-  #+BEGIN_SRC emacs-lisp :noweb yes
-    (stante-after magit
-      <>
-      <>)
-  #+END_SRC
-
 * Final touches
 
   These options and calls need to come last so they don't interfere
-- 
cgit v1.2.3-54-g00ecf