update config
authorJoerg Jaspert <joerg@debian.org>
Sun, 12 May 2013 10:11:39 +0000 (12:11 +0200)
committerJoerg Jaspert <joerg@debian.org>
Sun, 12 May 2013 10:11:39 +0000 (12:11 +0200)
.emacs.d/config/emacs.org
.emacs.d/elisp/local/ganneff-org.el
.emacs.d/elisp/org-templates/level-0.org
.emacs.d/init.el
.emacs.d/initjj.org

index b1a82f4..837b57b 100644 (file)
@@ -2,168 +2,9 @@
 #+DESCRIPTION: My current Emacs configuration
 #+KEYWORDS:    org-mode Emacs configuration
 #+STARTUP:     align fold nodlcheck hidestars oddeven lognotestate
-#+DATE:        %Y-%m-%d
 #+SETUPFILE:   ~/.emacs.d/elisp/org-templates/level-0.org
 #+LATEX_CMD:   xelatex
 
-* Notes for people looking at this using a webbrowser
-My whole emacs config is done using [[http://orgmode.org/][org-mode]] files, with a little magic
-in ~/.emacs.d/init.el to have it readable for emacs.
-
-I publish them using the [[http://orgmode.org/manual/HTML-export.html#HTML-export][HTML export feature]] of org-mode, combined with
-a javascript [[http://orgmode.org/worg/code/org-info-js/][called org-info.js]] which lets you navigate my config
-similar to what org-mode allows you in Emacs.
-
-Basic navigation is =n= for next, =p= for previous, =l= will give you
-a direct link to the point you are at and the key =?= will show you a
-help with all keyboard shortcuts. You might also want to try pressing
-=m= followed by a series of =F=.
-
-If you have Javascript disabled you only miss the nice navigation, you
-will see the whole file at once.
-
-
-* Copyright notice(s)
-My config is made up of stuff I wrote myself - and lots of stuff I
-copied from all around the net. I try to list all of the original
-authors here, but this config is a living thing for more than a decade
-now, so there are things where I just don't know anymore where it might
-be from.
-
-If you find something that you are the author off and I forgot to
-mention you don't hesitate to tell me and I will fix that oversight.
-
-** My own stuff
-----------
-#+BEGIN_QUOTE
-Copyright © 200x-2012 Joerg Jaspert <joerg@ganneff.de>
-
-My code in this document is free software: you can redistribute it
-and/or modify it under the terms of the [[http://www.gnu.org/licenses/old-licenses/gpl-2.0.html][GNU General Public License]]
-as published by the Free Software Foundation, version 2.0.
-
-My writing here is subject to the  [[http://creativecommons.org/licenses/by-nc-sa/3.0/][CC —
-Attribution-NonCommercial-ShareAlike 3.0 Unported — CC BY-NC-SA 3.0]]
-license.
-#+END_QUOTE
-----------
-
-** Sacha Chua
-I copied various functions and snippets from [[http://sachachua.com/blog/category/emacs/][Sacha Chuas blog]] (worth a
-read). Her copyright/license notice:
-
-----------
-#+BEGIN_QUOTE
-Copyright © 2001-2012 Sacha Chua (sacha@sachachua.com).
-
-Please feel free to reuse content under a [[http://creativecommons.org/licenses/by-nc-sa/3.0/][Creative Commons —
-Attribution-NonCommercial-ShareAlike Unported — CC BY-NC-SA]] license
-unless otherwise noted.
-#+END_QUOTE
-----------
-
-Functions copied from her start with /sacha//.
-
-** Bernt Hansen
-Much of my org-mode setup is copied from [[http://doc.norang.ca/org-mode.html][Bernt Hansens org-mode
-page]]. His license statement:
-
-----------
-#+BEGIN_QUOTE
-Copyright (C)  2012  Bernt Hansen.
-
-Permission is granted to copy, distribute and/or modify this document
-under the terms of the GNU Free Documentation License, Version 1.3
-or any later version published by the Free Software Foundation;
-with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
-
-Code in this document is free software: you can redistribute it
-and/or modify it under the terms of the GNU General Public
-License as published by the Free Software Foundation, either
-version 3 of the License, or (at your option) any later version.
-
-This code is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-#+END_QUOTE
-----------
-
-Functions copied from him start with /bh//.
-
-** Roland Mas
-I copied a few functions for my [[file:gnus.org][gnus]] setup from [[http://roland.entierement.nu/blog/2010/09/08/gnus-dovecot-offlineimap-search-a-howto.html][his blog]] that enable me to
-use notmuch and gnus together. His license statement:
-
-----------
-#+BEGIN_QUOTE
-[[http://creativecommons.org/licenses/by-nc-sa/2.0/fr/][Creative Commons — Attribution - Pas d'Utilisation
-Commerciale - Partage dans les Mêmes Conditions 2.0 France — CC BY-NC-SA
-2.0]] Sauf indication contraire, le contenu de ce site est mis à
-disposition sous un contrat Creative Commons.
-#+END_QUOTE
-----------
-
-In case you are as good in french as I am, that should be equal to:
-----------
-#+BEGIN_QUOTE
-Please feel free to reuse content under a [[http://creativecommons.org/licenses/by-nc-sa/2.0/][Creative Commons —
-Attribution-NonCommercial-ShareAlike Unported — CC BY-NC-SA]] license
-unless otherwise noted.
-#+END_QUOTE
-----------
-
-** Emacs Prelude
-#+BEGIN_QUOTE
-Prelude is an enhanced Emacs 24 configuration that should make your
-experience with Emacs both more pleasant and more powerful. Prelude
-alters a lot of the default settings, bundles a plethora of additional
-packages and adds its own core library to the mix. The final product
-offers an easy to use Emacs configuration for Emacs newcomers and lots
-of additional power for Emacs power users.
-#+END_QUOTE
-
-So much for their own advertisement, and while I agree it is a pretty
-nice configuration, I only like parts of it. Especially as I am forced
-to use older emacs too (prelude requires emacs24), and I also like to
-do stuff on my own...
-
-Anything copied from prelude should start with prelude-, and their
-license statement is:
-
-----------
-#+BEGIN_QUOTE
-Copyright © 2011-2013 Bozhidar Batsov
-
-Author: Bozhidar Batsov <bozhidar@batsov.com>
-URL: https://github.com/bbatsov/prelude
-This program is free software; you can redistribute it and/or
-modify it under the terms of the GNU General Public License
-as published by the Free Software Foundation; either version 3
-of the License, or (at your option) any later version.
-#+END_QUOTE
-----------
-
-You should be able to find a full list of contributors at
-[[https://github.com/bbatsov/prelude/graphs/contributors][their github]] pages.
-
-
-* Initial preparation
-To have my config here actually work, =emacs= needs a little help. For
-some reason it can't just read an =org-mode= based config on its own, tsk.
-
-Which means that the emacs initfile needs to have the magic. My init
-file is =~/.emacs.d/init.el=. I try to keep it as small as possible, yet
-it does have some entries.
-
-As I commented inside that file, I won't repeat stuff here, just read it
-below.
-
-#+INCLUDE: "~/.emacs.d/init.el" src emacs-lisp
-#+INCLUDE: "~/.emacs.d/initjj.org"
-
-
-
 * Basic config
 ** General functions
 :PROPERTIES:
@@ -240,20 +81,20 @@ that is already done in =init.el=.
 I also disliked the repeated /add-to-list/ lines, so I now just have
 one variable and go over that in a loop.
 #+BEGIN_SRC emacs-lisp
-  (defvar jj-elisp-subdirs '(local gnus icicle org/contrib tiny mo-git-blame cedet
-                             cedet/eieio ecb jdee/lisp sunrise multiple-cursors
-                             auto-complete yasnippet magit)
-    "List of subdirectories in jj-elisp-dir to add to load-path")
+(defvar jj-elisp-subdirs '(local gnus icicle org/contrib tiny mo-git-blame cedet
+                           cedet/eieio ecb jdee/lisp sunrise multiple-cursors
+                           auto-complete yasnippet magit)
+  "List of subdirectories in jj-elisp-dir to add to load-path")
 
-  (let (dirval)
-    (dolist (dirval jj-elisp-subdirs)
-      (let ((name (expand-file-name (symbol-name dirval) jj-elisp-dir)))
-        (when (file-exists-p name)
-            (add-to-list 'load-path name)))))
-  ;; For older emacsen we need an extra directory, which should be at
-  ;; THE END of the load path
-  (when (< emacs-major-version 24)
-    (add-to-list 'load-path (expand-file-name "emacs23" jj-elisp-dir) t))
+(let (dirval)
+  (dolist (dirval jj-elisp-subdirs)
+    (let ((name (expand-file-name (symbol-name dirval) jj-elisp-dir)))
+      (when (file-exists-p name)
+          (add-to-list 'load-path name)))))
+;; For older emacsen we need an extra directory, which should be at
+;; THE END of the load path
+(when (< emacs-major-version 24)
+  (add-to-list 'load-path (expand-file-name "emacs23" jj-elisp-dir) t))
 
 #+END_SRC
 
@@ -359,20 +200,21 @@ entirely liked it. Until I found solarized, which is now not only my
 emacs theme, but also for most of my other software too, especially my
 shell. Consistent look is great.
 #+BEGIN_SRC emacs-lisp
-  (if (boundp 'custom-theme-load-path)
-      (progn
-        (defun jj-init-theme ()
-          (interactive)
-          (if (eq jj-color-style 'dark )(load-theme 'solarized-dark t)
-            (load-theme 'solarized-light t))
-            (set-face-attribute 'org-date nil :underline nil)
-          )
-        (add-to-list 'custom-theme-load-path jj-theme-dir)
-        (add-hook 'after-init-hook 'jj-init-theme)
+(if (boundp 'custom-theme-load-path)
+    (progn
+      (defun jj-init-theme ()
+        (interactive)
+        (if (eq jj-color-style 'dark )(load-theme 'solarized-dark t)
+          (load-theme 'solarized-light t))
+          (set-face-attribute 'org-date nil :underline nil)
+          (message "Initializing theme solarized-dark")
         )
-    (message "Emacs version too old, using non-solarize theme")
-    (defvar custom-theme-load-path jj-theme-dir)
-    (require 'naquadah-theme))
+      (add-to-list 'custom-theme-load-path jj-theme-dir)
+      (add-hook 'after-init-hook 'jj-init-theme)
+      )
+  (message "Emacs version too old, using non-solarize theme")
+  (defvar custom-theme-load-path jj-theme-dir)
+  (require 'naquadah-theme))
 #+END_SRC
 
 Make the fringe (gutter) smaller, the argument is a width in pixels (the default is 8)
@@ -600,6 +442,8 @@ In this day and age, UTF-8 is the way to go.
 (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))
 #+END_SRC
 
 *** Hilight matching parentheses
@@ -1094,17 +938,11 @@ guess the default file/URL from text around the point.
 (ffap-bindings)
 #+END_SRC
 ** icicles
-[[http://article.gmane.org/gmane.emacs.orgmode/4574/match%3Dicicles][In case you never heard of it, Icicles is to ‘TAB’ completion what
+[[http://article.gmane.org/gmane.emacs.orgmode/4574/match%3Dicicles]["In case you never heard of it, Icicles is to ‘TAB’ completion what
 ‘TAB’ completion is to typing things manually every time.”]]
 #+BEGIN_SRC emacs-lisp
 (require 'icicles)
 (icy-mode 1)
-#+END_SRC
-
-And while I like icicles, I don't want it to interfere with my
-org-mode stuff.
-#+BEGIN_SRC emacs-lisp
-
 #+END_SRC
 ** uniquify
 Always have unique buffernames. See [[http://www.gnu.org/software/emacs/manual/html_node/emacs/Uniquify.html][Uniquify - GNU Emacs Manual]]
@@ -1318,95 +1156,897 @@ Instead of default /html-mode/ I use /html-helper-mode/.
 ** org                                                                :FIXME:
 *** General settings
 [2013-04-28 So 17:06]
+
 I use org-mode a lot and, having my config for this based on [[*Bernt%20Hansen][the config of Bernt Hansen]],
 it is quite extensive. Nevertheless, it starts out small, loading it.
-#+BEGIN_SRC emacs-lisp
+#+BEGIN_SRC emacs-lisp tangle:yes
 (require 'org)
 #+END_SRC
 
 My browsers (Conkeror, Iceweasel) can store links in org-mode. For
 that we need org-protocol.
-#+BEGIN_SRC emacs-lisp
+#+BEGIN_SRC emacs-lisp tangle:yes
 (require 'org-protocol)
 #+END_SRC
 
+*** Agenda
+
+My current =org-agenda-files= variable only includes a set of
+directories.
+#+BEGIN_SRC emacs-lisp tangle:yes
+(setq org-agenda-files (quote ("~/org/"
+                               "~/org/debian"
+                               "~/org/debconf"
+                               "~/org/spi"
+                               "~/org/nsb"
+                               )))
+(setq org-default-notes-file "~/org/notes.org")
+#+END_SRC
+=org-mode= manages the =org-agenda-files= variable automatically using
+=C-c [= and =C-c ]= to add and remove files respectively.  However,
+this replaces my directory list with a list of explicit filenames
+instead and is not what I want.  If this occurs then adding a new org
+file to any of the above directories will not contribute to my agenda
+and I will probably miss something important.
+
+I have disabled the =C-c [= and =C-c ]= keys in =org-mode-hook= to
+prevent messing up my list of directories in the =org-agenda-files=
+variable.  I just add and remove directories manually here.  Changing
+the list of directories in =org-agenda-files= happens very rarely
+since new files in existing directories are automatically picked up.
+
+#+BEGIN_SRC emacs-lisp tangle:yes
+;; Keep tasks with dates on the global todo lists
+(setq org-agenda-todo-ignore-with-date nil)
+
+;; Keep tasks with deadlines on the global todo lists
+(setq org-agenda-todo-ignore-deadlines nil)
+
+;; Keep tasks with scheduled dates on the global todo lists
+(setq org-agenda-todo-ignore-scheduled nil)
+
+;; Keep tasks with timestamps on the global todo lists
+(setq org-agenda-todo-ignore-timestamp nil)
+
+;; Remove completed deadline tasks from the agenda view
+(setq org-agenda-skip-deadline-if-done t)
+
+;; Remove completed scheduled tasks from the agenda view
+(setq org-agenda-skip-scheduled-if-done t)
+
+;; Remove completed items from search results
+(setq org-agenda-skip-timestamp-if-done t)
+
+;; Include agenda archive files when searching for things
+(setq org-agenda-text-search-extra-files (quote (agenda-archives)))
+
+;; Show all future entries for repeating tasks
+(setq org-agenda-repeating-timestamp-show-all t)
+
+;; Show all agenda dates - even if they are empty
+(setq org-agenda-show-all-dates t)
+
+;; Sorting order for tasks on the agenda
+(setq org-agenda-sorting-strategy
+      (quote ((agenda habit-down time-up user-defined-up priority-down effort-up category-keep)
+              (todo category-up priority-down effort-up)
+              (tags category-up priority-down effort-up)
+              (search category-up))))
+
+;; Start the weekly agenda on Monday
+(setq org-agenda-start-on-weekday 1)
+
+;; Enable display of the time grid so we can see the marker for the current time
+(setq org-agenda-time-grid (quote ((daily today remove-match)
+                                   #("----------------" 0 16 (org-heading t))
+                                   (0800 1000 1200 1400 1500 1700 1900 2100))))
+
+;; Display tags farther right
+(setq org-agenda-tags-column -102)
+
+; position the habit graph on the agenda to the right of the default
+(setq org-habit-graph-column 50)
+
+; turn habits back on
+(run-at-time "06:00" 86400 '(lambda () (setq org-habit-show-habits t)))
+
+;;
+;; Agenda sorting functions
+;;
+(setq org-agenda-cmp-user-defined 'bh/agenda-sort)
+
+
+(setq org-deadline-warning-days 30)
+
+;; Always hilight the current agenda line
+(add-hook 'org-agenda-mode-hook
+          '(lambda () (hl-line-mode 1))
+          'append)
+#+END_SRC
+
+#+BEGIN_SRC emacs-lisp tangle:yes
+(setq org-agenda-persistent-filter t)
+(add-hook 'org-agenda-mode-hook
+          '(lambda () (org-defkey org-agenda-mode-map "W" 'bh/widen))
+          'append)
+
+(add-hook 'org-agenda-mode-hook
+          '(lambda () (org-defkey org-agenda-mode-map "F" 'bh/restrict-to-file-or-follow))
+          'append)
+
+(add-hook 'org-agenda-mode-hook
+          '(lambda () (org-defkey org-agenda-mode-map "N" 'bh/narrow-to-subtree))
+          'append)
+
+(add-hook 'org-agenda-mode-hook
+          '(lambda () (org-defkey org-agenda-mode-map "U" 'bh/narrow-up-one-level))
+          'append)
+
+(add-hook 'org-agenda-mode-hook
+          '(lambda () (org-defkey org-agenda-mode-map "P" 'bh/narrow-to-project))
+          'append)
+
+; Rebuild the reminders everytime the agenda is displayed
+(add-hook 'org-finalize-agenda-hook 'bh/org-agenda-to-appt 'append)
+
+;(if (file-exists-p "~/org/refile.org")
+;    (add-hook 'after-init-hook 'bh/org-agenda-to-appt))
+
+; Activate appointments so we get notifications
+(appt-activate t)
+
+(setq org-agenda-log-mode-items (quote (closed clock state)))
+(if (> emacs-major-version 23)
+    (setq org-agenda-span 3)
+  (setq org-agenda-ndays 3))
+
+(setq org-agenda-show-all-dates t)
+(setq org-agenda-start-on-weekday nil)
+(setq org-deadline-warning-days 14)
+
+#+END_SRC
 *** Global keybindings.
-[2013-04-28 So 17:12]
-Start off by defining a series of keybindings. We also remove C-c [
-#+BEGIN_SRC emacs-lisp
-;; Disable C-c [ and C-c ] in org-mode
+Start off by defining a series of keybindings.
+
+Well, first we remove =C-c [= and =C-c ]=, as all agenda directories are
+setup manually, not by org-mode. Also turn off =C-c ;=, which
+comments headlines - a function never used.
+#+BEGIN_SRC emacs-lisp tangle:yes
 (add-hook 'org-mode-hook
           (lambda ()
-            ;; Undefine C-c [ and C-c ] since this breaks my
-            ;; org-agenda files when directories are included. It
-            ;; expands the files in the directories individually
             (org-defkey org-mode-map "\C-c["    'undefined)
-            (org-defkey org-mode-map "\C-c]"    'undefined))
+            (org-defkey org-mode-map "\C-c]"    'undefined)
+            (org-defkey org-mode-map "\C-c;"    'undefined))
           'append)
+#+END_SRC
 
+And now a largish set of keybindings...
+#+BEGIN_SRC emacs-lisp tangle:yes
 (global-set-key "\C-cl" 'org-store-link)
 (global-set-key "\C-ca" 'org-agenda)
 (global-set-key "\C-cb" 'org-iswitchb)
 (define-key mode-specific-map [?a] 'org-agenda)
 
+(global-set-key (kbd "<f12>")     'org-agenda)
+(global-set-key (kbd "<f5>")      'bh/org-todo)
+(global-set-key (kbd "<S-f5>")    'bh/widen)
+(global-set-key (kbd "<f7>")      'bh/set-truncate-lines)
+(global-set-key (kbd "<f8>")      'org-cycle-agenda-files)
 
-;; Custom Key Bindings
-(global-set-key (kbd "<f12>") 'org-agenda)
-(global-set-key (kbd "<f5>") 'bh/org-todo)
-(global-set-key (kbd "<S-f5>") 'bh/widen)
-(global-set-key (kbd "<f7>") 'bh/set-truncate-lines)
-(global-set-key (kbd "<f8>") 'org-cycle-agenda-files)
 (global-set-key (kbd "<f9> <f9>") 'bh/show-org-agenda)
-(global-set-key (kbd "<f9> c") 'calendar)
-(global-set-key (kbd "<f9> f") 'boxquote-insert-file)
-(global-set-key (kbd "<f9> h") 'bh/hide-other)
-(global-set-key (kbd "<f9> n") 'org-narrow-to-subtree)
-(global-set-key (kbd "<f9> w") 'widen)
-(global-set-key (kbd "<f9> u") 'bh/narrow-up-one-level)
-
-(global-set-key (kbd "<f9> I") 'bh/punch-in)
-(global-set-key (kbd "<f9> O") 'bh/punch-out)
-
-(global-set-key (kbd "<f9> r") 'boxquote-region)
-(global-set-key (kbd "<f9> s") 'bh/switch-to-scratch)
-
-(global-set-key (kbd "<f9> t") 'bh/insert-inactive-timestamp)
-(global-set-key (kbd "<f9> T") 'tabify)
-(global-set-key (kbd "<f9> U") 'untabify)
-
-(global-set-key (kbd "<f9> v") 'visible-mode)
-(global-set-key (kbd "<f9> SPC") 'bh/clock-in-last-task)
-(global-set-key (kbd "C-<f9>") 'previous-buffer)
-(global-set-key (kbd "M-<f9>") 'org-toggle-inline-images)
-(global-set-key (kbd "C-x n r") 'narrow-to-region)
-(global-set-key (kbd "C-<f10>") 'next-buffer)
-(global-set-key (kbd "<f11>") 'org-clock-goto)
-(global-set-key (kbd "C-<f11>") 'org-clock-in)
+(global-set-key (kbd "<f9> b")    'bbdb)
+(global-set-key (kbd "<f9> c")    'calendar)
+(global-set-key (kbd "<f9> f")    'boxquote-insert-file)
+(global-set-key (kbd "<f9> h")    'bh/hide-other)
+(global-set-key (kbd "<f9> n")    'org-narrow-to-subtree)
+(global-set-key (kbd "<f9> w")    'widen)
+(global-set-key (kbd "<f9> u")    'bh/narrow-up-one-level)
+(global-set-key (kbd "<f9> I")    'bh/punch-in)
+(global-set-key (kbd "<f9> O")    'bh/punch-out)
+(global-set-key (kbd "<f9> o")    'bh/make-org-scratch)
+(global-set-key (kbd "<f9> p")    'bh/phone-call)
+(global-set-key (kbd "<f9> r")    'boxquote-region)
+(global-set-key (kbd "<f9> s")    'bh/switch-to-scratch)
+(global-set-key (kbd "<f9> t")    'bh/insert-inactive-timestamp)
+(global-set-key (kbd "<f9> T")    'tabify)
+(global-set-key (kbd "<f9> U")    'untabify)
+(global-set-key (kbd "<f9> v")    'visible-mode)
+(global-set-key (kbd "<f9> SPC")  'bh/clock-in-last-task)
+(global-set-key (kbd "C-<f9>")    'previous-buffer)
+(global-set-key (kbd "C-<f10>")   'next-buffer)
+(global-set-key (kbd "M-<f9>")    'org-toggle-inline-images)
+(global-set-key (kbd "C-x n r")   'narrow-to-region)
+(global-set-key (kbd "<f11>")     'org-clock-goto)
+(global-set-key (kbd "C-<f11>")   'org-clock-in)
+(global-set-key (kbd "C-M-r")     'org-capture)
+(global-set-key (kbd "C-c r")     'org-capture)
 (global-set-key (kbd "C-s-<f12>") 'bh/save-then-publish)
-(global-set-key (kbd "C-M-r") 'org-capture)
-(global-set-key (kbd "C-c r") 'org-capture)
 
 (define-key org-mode-map [(control k)] 'jj-org-kill-line)
+#+END_SRC
 
+*** Tasks, States, Todo fun
 
+First we define the global todo keywords.
+#+BEGIN_SRC emacs-lisp tangle:yes
+(setq org-todo-keywords
+      (quote ((sequence "TODO(t)" "NEXT(n)" "|" "DONE(d@/!)")
+              (sequence "WAITING(w@/!)" "HOLD(h@/!)" "DELEGATED(g@/!)" "|" "CANCELLED(c@/!)" "PHONE"))))
+
+(setq org-todo-keyword-faces
+      (quote (("TODO" :foreground "red" :weight bold)
+              ("NEXT" :foreground "light blue" :weight bold)
+              ("DONE" :foreground "forest green" :weight bold)
+              ("WAITING" :foreground "orange" :weight bold)
+              ("HOLD" :foreground "orange" :weight bold)
+              ("DELEGATED" :foreground "yellow" :weight bold)
+              ("CANCELLED" :foreground "dark green" :weight bold)
+              ("PHONE" :foreground "dark green" :weight bold))))
+#+END_SRC
+
+**** Fast Todo Selection
+Fast todo selection allows changing from any task todo state to any
+other state directly by selecting the appropriate key from the fast
+todo selection key menu.
+#+BEGIN_SRC emacs-lisp tangle:yes
+(setq org-use-fast-todo-selection t)
+#+END_SRC
+Changing a task state is done with =C-c C-t KEY=
+
+where =KEY= is the appropriate fast todo state selection key as defined in =org-todo-keywords=.
+
+The setting
+#+BEGIN_SRC emacs-lisp tangle:yes
+(setq org-treat-S-cursor-todo-selection-as-state-change nil)
+#+END_SRC
+allows changing todo states with S-left and S-right skipping all of
+the normal processing when entering or leaving a todo state.  This
+cycles through the todo states but skips setting timestamps and
+entering notes which is very convenient when all you want to do is fix
+up the status of an entry.
+
+**** Todo State Triggers
+I have a few triggers that automatically assign tags to tasks based on
+state changes.  If a task moves to =CANCELLED= state then it gets a
+=CANCELLED= tag.  Moving a =CANCELLED= task back to =TODO= removes the
+=CANCELLED= tag.  These are used for filtering tasks in agenda views
+which I'll talk about later.
+
+The triggers break down to the following rules:
+
+- Moving a task to =CANCELLED= adds a =CANCELLED= tag
+- Moving a task to =WAITING= adds a =WAITING= tag
+- Moving a task to =HOLD= adds a =WAITING= tag
+- Moving a task to a done state removes a =WAITING= tag
+- Moving a task to =TODO= removes =WAITING= and =CANCELLED= tags
+- Moving a task to =NEXT= removes a =WAITING= tag
+- Moving a task to =DONE= removes =WAITING= and =CANCELLED= tags
+
+The tags are used to filter tasks in the agenda views conveniently.
+#+BEGIN_SRC emacs-lisp tangle:yes
+(setq org-todo-state-tags-triggers
+      (quote (("CANCELLED" ("CANCELLED" . t))
+              ("WAITING" ("WAITING" . t))
+              ("HOLD" ("WAITING" . t) ("HOLD" . t))
+              (done ("WAITING") ("HOLD"))
+              ("TODO" ("WAITING") ("CANCELLED") ("HOLD"))
+              ("NEXT" ("WAITING") ("CANCELLED") ("HOLD"))
+              ("DONE" ("WAITING") ("CANCELLED") ("HOLD")))))
+#+END_SRC
+
+*** Capturing new tasks
+Org capture replaces the old remember mode.
+#+BEGIN_SRC emacs-lisp tangle:yes
+(setq org-directory "~/org")
+(setq org-default-notes-file "~/org/refile.org")
+
+;; Capture templates for: TODO tasks, Notes, appointments, phone calls, and org-protocol
+;; see http://orgmode.org/manual/Template-elements.html
+(setq org-capture-templates
+      (quote (("t" "todo" entry (file "~/org/refile.org")
+               "* TODO %?\nAdded: %U\n"
+               :clock-in t :clock-resume t)
+              ("l" "linktodo" entry (file "~/org/refile.org")
+               "* TODO %?\nAdded: %U\n%a\n"
+               :clock-in t :clock-resume t)
+              ("r" "respond" entry (file "~/org/refile.org")
+               "* TODO Respond to %:from on %:subject\nSCHEDULED: %t\nAdded: %U\n%a\n"
+               :clock-in t :clock-resume t :immediate-finish t)
+              ("n" "note" entry (file "~/org/refile.org")
+               "* %? :NOTE:\nAdded: %U\n%a\n"
+               :clock-in t :clock-resume t)
+              ("d" "Delegated" entry (file "~/org/refile.org")
+               "* DELEGATED %?\nAdded: %U\n%a\n"
+               :clock-in t :clock-resume t)
+              ("j" "Journal" entry (file+datetree "~/org/diary.org")
+               "* %?\nAdded: %U\n"
+               :clock-in t :clock-resume t)
+              ("w" "org-protocol" entry (file "~/org/refile.org")
+               "* TODO Review %c\nAdded: %U\n"
+               :immediate-finish t)
+              ("p" "Phone call" entry (file "~/org/refile.org")
+               "* PHONE %? :PHONE:\nAdded: %U"
+               :clock-in t :clock-resume t)
+              ("f" "Firewall request" entry (file+headline "~/org/nsb/dlh.org" "Firewall")
+               "* TODO Firewall Reuqest, RT: %?\nAdded: %U"
+               :clock-in t :clock-resume t)
+              ("i" "Ticket" entry (file+headline "~/org/nsb/dlh.org" "RT Ticket")
+               "* TODO , RT: %?\nAdded: %U"
+               :clock-in t :clock-resume t)
+              ("x" "Bookmark link" entry (file "~/org/refile.org")
+               "* Bookmark: %c\n%i\nAdded: %U\n"
+               :immediate-finish t)
+              ("h" "Habit" entry (file "~/org/refile.org")
+               "* NEXT %?\n:PROPERTIES:\n:STYLE: habit\n:REPEAT_TO_STATE: NEXT\n:END:\nAdded: %U\nSCHEDULED: %(format-time-string \"<%Y-%m-%d %a .+1d/3d>\")\n")
+              )))
+#+END_SRC
+
+Capture mode now handles automatically clocking in and out of a
+capture task.  This all works out of the box now without special hooks.
+When I start a capture mode task the task is clocked in as specified
+by =:clock-in t= and when the task is filed with =C-c C-c= the clock
+resumes on the original clocking task.
+
+The quick clocking in and out of capture mode tasks (often it takes
+less than a minute to capture some new task details) can leave
+empty clock drawers in my tasks which aren't really useful.
+The following prevents this.
+#+BEGIN_SRC emacs-lisp tangle:yes
+(add-hook 'org-clock-out-hook 'bh/remove-empty-drawer-on-clock-out 'append)
+#+END_SRC
+
+*** Refiling
+All my newly captured entries end up in =refile.org= and want to be
+moved over to the right place. The following is the setup for it.
+#+BEGIN_SRC emacs-lisp tangle:yes
+; Targets include this file and any file contributing to the agenda - up to 9 levels deep
+(setq org-refile-targets (quote ((nil :maxlevel . 9)
+                                 (org-agenda-files :maxlevel . 9))))
+
+; Use full outline paths for refile targets - we file directly with IDO
+(setq org-refile-use-outline-path t)
+
+; Targets complete directly with IDO
+(setq org-outline-path-complete-in-steps nil)
+
+; Allow refile to create parent tasks with confirmation
+(setq org-refile-allow-creating-parent-nodes (quote confirm))
+
+; Use IDO for both buffer and file completion and ido-everywhere to t
+(setq org-completion-use-ido t)
+(setq org-completion-use-iswitchb nil)
+:; Use IDO for both buffer and file completion and ido-everywhere to t
+;(setq ido-everywhere t)
+;(setq ido-max-directory-size 100000)
+;(ido-mode (quote both))
+; Use the current window when visiting files and buffers with ido
+(setq ido-default-file-method 'selected-window)
+(setq ido-default-buffer-method 'selected-window)
+
+;;;; Refile settings
+(setq org-refile-target-verify-function 'bh/verify-refile-target)
+#+END_SRC
+
+*** Custom agenda
+Agenda view is the central place for org-mode interaction...
+#+BEGIN_SRC emacs-lisp tangle:yes
+;; Do not dim blocked tasks
+(setq org-agenda-dim-blocked-tasks nil)
+;; Compact the block agenda view
+(setq org-agenda-compact-blocks t)
+
+;; Custom agenda command definitions
+(setq org-agenda-custom-commands
+      (quote (("N" "Notes" tags "NOTE"
+               ((org-agenda-overriding-header "Notes")
+                (org-tags-match-list-sublevels t)))
+              ("h" "Habits" tags-todo "STYLE=\"habit\""
+               ((org-agenda-overriding-header "Habits")
+                (org-agenda-sorting-strategy
+                 '(todo-state-down effort-up category-keep))))
+              (" " "Agenda"
+               ((agenda "" nil)
+                (tags "REFILE"
+                      ((org-agenda-overriding-header "Tasks to Refile")
+                       (org-tags-match-list-sublevels nil)))
+                (tags-todo "-HOLD-CANCELLED/!"
+                           ((org-agenda-overriding-header "Projects")
+                            (org-agenda-skip-function 'bh/skip-non-projects)
+                            (org-agenda-sorting-strategy
+                             '(category-keep))))
+                (tags-todo "-CANCELLED/!"
+                           ((org-agenda-overriding-header "Stuck Projects")
+                            (org-agenda-skip-function 'bh/skip-non-stuck-projects)))
+                (tags-todo "-WAITING-CANCELLED/!NEXT"
+                           ((org-agenda-overriding-header "Next Tasks")
+                            (org-agenda-skip-function 'bh/skip-projects-and-habits-and-single-tasks)
+                            (org-agenda-todo-ignore-scheduled t)
+                            (org-agenda-todo-ignore-deadlines t)
+                            (org-agenda-todo-ignore-with-date t)
+                            (org-tags-match-list-sublevels t)
+                            (org-agenda-sorting-strategy
+                             '(todo-state-down effort-up category-keep))))
+                (tags-todo "-REFILE-CANCELLED/!-HOLD-WAITING"
+                           ((org-agenda-overriding-header "Tasks")
+                            (org-agenda-skip-function 'bh/skip-project-tasks-maybe)
+                            (org-agenda-todo-ignore-scheduled t)
+                            (org-agenda-todo-ignore-deadlines t)
+                            (org-agenda-todo-ignore-with-date t)
+                            (org-agenda-sorting-strategy
+                             '(category-keep))))
+                (tags-todo "-CANCELLED+WAITING/!"
+                           ((org-agenda-overriding-header "Waiting and Postponed Tasks")
+                            (org-agenda-skip-function 'bh/skip-stuck-projects)
+                            (org-tags-match-list-sublevels nil)
+                            (org-agenda-todo-ignore-scheduled 'future)
+                            (org-agenda-todo-ignore-deadlines 'future)))
+                (tags "-REFILE/"
+                      ((org-agenda-overriding-header "Tasks to Archive")
+                       (org-agenda-skip-function 'bh/skip-non-archivable-tasks)
+                       (org-tags-match-list-sublevels nil))))
+               nil)
+              ("r" "Tasks to Refile" tags "REFILE"
+               ((org-agenda-overriding-header "Tasks to Refile")
+                (org-tags-match-list-sublevels nil)))
+              ("#" "Stuck Projects" tags-todo "-CANCELLED/!"
+               ((org-agenda-overriding-header "Stuck Projects")
+                (org-agenda-skip-function 'bh/skip-non-stuck-projects)))
+              ("n" "Next Tasks" tags-todo "-WAITING-CANCELLED/!NEXT"
+               ((org-agenda-overriding-header "Next Tasks")
+                (org-agenda-skip-function 'bh/skip-projects-and-habits-and-single-tasks)
+                (org-agenda-todo-ignore-scheduled t)
+                (org-agenda-todo-ignore-deadlines t)
+                (org-agenda-todo-ignore-with-date t)
+                (org-tags-match-list-sublevels t)
+                (org-agenda-sorting-strategy
+                 '(todo-state-down effort-up category-keep))))
+              ("R" "Tasks" tags-todo "-REFILE-CANCELLED/!-HOLD-WAITING"
+               ((org-agenda-overriding-header "Tasks")
+                (org-agenda-skip-function 'bh/skip-project-tasks-maybe)
+                (org-agenda-sorting-strategy
+                 '(category-keep))))
+              ("p" "Projects" tags-todo "-HOLD-CANCELLED/!"
+               ((org-agenda-overriding-header "Projects")
+                (org-agenda-skip-function 'bh/skip-non-projects)
+                (org-agenda-sorting-strategy
+                 '(category-keep))))
+              ("w" "Waiting Tasks" tags-todo "-CANCELLED+WAITING/!"
+               ((org-agenda-overriding-header "Waiting and Postponed tasks"))
+               (org-tags-match-list-sublevels nil))
+              ("A" "Tasks to Archive" tags "-REFILE/"
+               ((org-agenda-overriding-header "Tasks to Archive")
+                (org-agenda-skip-function 'bh/skip-non-archivable-tasks)
+                (org-tags-match-list-sublevels nil))))))
+
+; Overwrite the current window with the agenda
+(setq org-agenda-window-setup 'current-window)
+
+#+END_SRC
+
+*** Time
+#+BEGIN_SRC emacs-lisp tangle:yes
+;;
+;; Resume clocking task when emacs is restarted
+(org-clock-persistence-insinuate)
+;;
+;; Show lot sof clocking history so it's easy to pick items off the C-F11 list
+(setq org-clock-history-length 36)
+;; Resume clocking task on clock-in if the clock is open
+(setq org-clock-in-resume t)
+;; Change tasks to NEXT when clocking in
+(setq org-clock-in-switch-to-state 'bh/clock-in-to-next)
+;; Separate drawers for clocking and logs
+(setq org-drawers (quote ("PROPERTIES" "LOGBOOK")))
+;; Save clock data and state changes and notes in the LOGBOOK drawer
+(setq org-clock-into-drawer t)
+;; Sometimes I change tasks I'm clocking quickly - this removes clocked tasks with 0:00 duration
+(setq org-clock-out-remove-zero-time-clocks t)
+;; Clock out when moving task to a done state
+(setq org-clock-out-when-done (quote ("DONE" "WAITING" "DELEGATED" "CANCELLED")))
+;; Save the running clock and all clock history when exiting Emacs, load it on startup
+(setq org-clock-persist t)
+;; Do not prompt to resume an active clock
+(setq org-clock-persist-query-resume nil)
+;; Enable auto clock resolution for finding open clocks
+(setq org-clock-auto-clock-resolution (quote when-no-clock-is-running))
+;; Include current clocking task in clock reports
+(setq org-clock-report-include-clocking-task t)
+
+; use discrete minute intervals (no rounding) increments
+(setq org-time-stamp-rounding-minutes (quote (1 1)))
+
+(add-hook 'org-clock-out-hook 'bh/clock-out-maybe 'append)
+
+(setq bh/keep-clock-running nil)
+
+(setq org-agenda-clock-consistency-checks
+      (quote (:max-duration "4:00"
+              :min-duration 0
+              :max-gap 0
+              :gap-ok-around ("4:00"))))
+
+#+END_SRC
+
+**** Setting a default clock task
+Per default the =** Organization= task in my tasks.org file receives
+misc clock time. This is the task I clock in on when I punch in at the
+start of my work day with =F9-I=.  Punching-in anywhere clocks in this
+Organization task as the default task.
+
+If I want to change the default clocking task I just visit the
+new task in any org buffer and clock it in with =C-u C-u C-c C-x
+C-i=.  Now this new task that collects miscellaneous clock
+minutes when the clock would normally stop.
+
+You can quickly clock in the default clocking task with =C-u C-c
+C-x C-i d=.  Another option is to repeatedly clock out so the
+clock moves up the project tree until you clock out the
+top-level task and the clock moves to the default task.
+
+**** Reporting
+#+BEGIN_SRC emacs-lisp tangle:yes
+;; Agenda clock report parameters
+(setq org-agenda-clockreport-parameter-plist
+      (quote (:link t :maxlevel 5 :fileskip0 t :compact t :narrow 80)))
+
+;; Agenda log mode items to display (closed and state changes by default)
+(setq org-agenda-log-mode-items (quote (closed state)))
+#+END_SRC
+**** Task estimates, column view
+Setup column view globally with the following headlines
+#+BEGIN_SRC emacs-lisp tangle:yes
+; Set default column view headings: Task Effort Clock_Summary
+(setq org-columns-default-format "%80ITEM(Task) %10Effort(Effort){:} %10CLOCKSUM")
+#+END_SRC
+Setup the estimate for effort values.
+#+BEGIN_SRC emacs-lisp tangle:yes
+; global Effort estimate values
+; global STYLE property values for completion
+(setq org-global-properties (quote (("Effort_ALL" . "0:15 0:30 0:45 1:00 2:00 3:00 4:00 5:00 6:00 0:00")
+                                    ("STYLE_ALL" . "habit"))))
+#+END_SRC
+
+*** Tags
+Tags are mostly used for filtering inside the agenda.
+#+BEGIN_SRC emacs-lisp tangle:yes
+; Tags with fast selection keys
+(setq org-tag-alist (quote ((:startgroup)
+                            ("@errand" . ?e)
+                            ("@office" . ?o)
+                            ("@home" . ?H)
+                            (:endgroup)
+                            ("PHONE" . ?p)
+                            ("WAITING" . ?w)
+                            ("HOLD" . ?h)
+                            ("PERSONAL" . ?P)
+                            ("WORK" . ?W)
+                            ("ORG" . ?O)
+                            ("PRIVATE" . ?N)
+                            ("crypt" . ?E)
+                            ("MARK" . ?M)
+                            ("NOTE" . ?n)
+                            ("CANCELLED" . ?c)
+                            ("FLAGGED" . ??))))
+
+; Allow setting single tags without the menu
+(setq org-fast-tag-selection-single-key (quote expert))
+
+; For tag searches ignore tasks with scheduled and deadline dates
+(setq org-agenda-tags-todo-honor-ignore-options t)
+#+END_SRC
+
+*** Archiving
+#+BEGIN_SRC emacs-lisp tangle:yes
+(setq org-archive-mark-done nil)
+(setq org-archive-location "%s_archive::* Archived Tasks")
+#+END_SRC
+
+*** org-babel
+#+BEGIN_SRC emacs-lisp tangle:yes
+(setq org-ditaa-jar-path "~/java/ditaa0_6b.jar")
+(setq org-plantuml-jar-path "~/java/plantuml.jar")
+
+(add-hook 'org-babel-after-execute-hook 'bh/display-inline-images 'append)
+
+; Make babel results blocks lowercase
+(setq org-babel-results-keyword "results")
+
+(org-babel-do-load-languages
+ (quote org-babel-load-languages)
+ (quote ((emacs-lisp . t)
+         (awk . t)
+         (css . t)
+         (makefile . t)
+         (perl . t)
+         (ruby . t)
+         (dot . t)
+         (ditaa . t)
+         (R . t)
+         (python . t)
+         (ruby . t)
+         (gnuplot . t)
+         (clojure . t)
+         (sh . t)
+         (ledger . t)
+         (org . t)
+         (plantuml . t)
+         (latex . t))))
+
+; Do not prompt to confirm evaluation
+; This may be dangerous - make sure you understand the consequences
+; of setting this -- see the docstring for details
+(setq org-confirm-babel-evaluate nil)
+
+; Use fundamental mode when editing plantuml blocks with C-c '
+(add-to-list 'org-src-lang-modes (quote ("plantuml" . fundamental)))
+#+END_SRC
+
+#+BEGIN_SRC emacs-lisp
+;; Don't have images visible on startup, breaks on console
+(setq org-startup-with-inline-images nil)
+#+END_SRC
+
+**** ditaa, graphviz, etc
+Those are all nice tools. Look at
+http://doc.norang.ca/org-mode.html#playingwithditaa for a nice intro
+to them.
+
+*** Publishing and exporting
+
+Org-mode can export to a variety of publishing formats including (but not limited to)
+
+- ASCII
+  (plain text - but not the original org-mode file)
+- HTML
+- LaTeX
+- Docbook
+  which enables getting to lots of other formats like ODF, XML, etc
+- PDF
+  via LaTeX or Docbook
+- iCal
+
+A new exporter created by Nicolas Goaziou was introduced in org 8.0.
+
+#+BEGIN_SRC emacs-lisp tangle:yes
+;; Explicitly load required exporters
+(require 'ox-html)
+(require 'ox-latex)
+(require 'ox-ascii)
+;; FIXME, check the following two
+;(require 'ox-icalendar)
+;(require 'ox-odt)
+
+; experimenting with docbook exports - not finished
+(setq org-export-docbook-xsl-fo-proc-command "fop %s %s")
+(setq org-export-docbook-xslt-proc-command "xsltproc --output %s /usr/share/xml/docbook/stylesheet/nwalsh/fo/docbook.xsl %s")
+
+;; define categories that should be excluded
+(setq org-export-exclude-category (list "google" "google"))
+(setq org-icalendar-use-scheduled '(todo-start event-if-todo))
+
+; Inline images in HTML instead of producting links to the image
+(setq org-html-inline-images t)
+; Do not use sub or superscripts - I currently don't need this functionality in my documents
+(setq org-export-with-sub-superscripts nil)
+
+(setq org-html-head-extra (concat
+                           "<link rel=\"stylesheet\" href=\"http://ganneff.de/stylesheet.css\" type=\"text/css\" />\n"
+                           ))
+(setq org-html-head-include-default-style nil)
+; Do not generate internal css formatting for HTML exports
+(setq org-export-htmlize-output-type (quote css))
+; Export with LaTeX fragments
+(setq org-export-with-LaTeX-fragments t)
+; Increase default number of headings to export
+(setq org-export-headline-levels 6)
+
+
+(setq org-publish-project-alist
+      '(
+        ("config-notes"
+         :base-directory "~/.emacs.d/"
+         :base-extension "org"
+         :publishing-directory "/develop/www/emacs"
+         :recursive t
+         :publishing-function org-html-publish-to-html
+         :headline-levels 4             ; Just the default for this project.
+         :auto-preamble t
+         )
+        ("config-static"
+         :base-directory "~/.emacs.d/"
+         :base-extension "css\\|js\\|png\\|jpg\\|gif\\|pdf\\|mp3\\|ogg\\|swf"
+         :publishing-directory "/develop/www/emacs"
+         :recursive t
+         :publishing-function org-publish-attachment
+         )
+        ("inherit-org-info-js"
+         :base-directory "/develop/vcs/org-info-js/"
+         :recursive t
+         :base-extension "js"
+         :publishing-directory "/develop/www/"
+         :publishing-function org-publish-attachment
+         )
+        ("config" :components ("inherit-org-info-js" "config-notes" "config-static")
+         )
+        )
+      )
+
+(setq org-export-with-timestamps nil)
+#+END_SRC
+
+**** Latex export
+
+#+BEGIN_SRC emacs-lisp tangle:yes
+(setq org-latex-to-pdf-process
+      '("xelatex -interaction nonstopmode %f"
+        "xelatex -interaction nonstopmode %f")) ;; for multiple passes
+(setq org-export-latex-listings 'minted)
+(setq org-latex-listings t)
+
+;; Originally taken from Bruno Tavernier: http://thread.gmane.org/gmane.emacs.orgmode/31150/focus=31432
+;; but adapted to use latexmk 4.20 or higher.
+(defun my-auto-tex-cmd ()
+  "When exporting from .org with latex, automatically run latex,
+     pdflatex, or xelatex as appropriate, using latexmk."
+  (let ((texcmd)))
+  ;; default command: oldstyle latex via dvi
+  (setq texcmd "latexmk -dvi -pdfps -quiet %f")
+  ;; pdflatex -> .pdf
+  (if (string-match "LATEX_CMD: pdflatex" (buffer-string))
+      (setq texcmd "latexmk -pdf -quiet %f"))
+  ;; xelatex -> .pdf
+  (if (string-match "LATEX_CMD: xelatex" (buffer-string))
+      (setq texcmd "latexmk -pdflatex='xelatex -shell-escape' -pdf -quiet %f"))
+  ;; LaTeX compilation command
+  (setq org-latex-to-pdf-process (list texcmd)))
+
+(add-hook 'org-export-latex-after-initial-vars-hook 'my-auto-tex-cmd)
+
+;; Specify default packages to be included in every tex file, whether pdflatex or xelatex
+(setq org-export-latex-packages-alist
+      '(("" "graphicx" t)
+        ("" "longtable" nil)
+        ("" "float" nil)
+        ("" "minted" nil)
+        ))
+
+(defun my-auto-tex-parameters ()
+      "Automatically select the tex packages to include."
+      ;; default packages for ordinary latex or pdflatex export
+      (setq org-export-latex-default-packages-alist
+            '(("AUTO" "inputenc" t)
+              ("T1"   "fontenc"   t)
+              (""     "fixltx2e"  nil)
+              (""     "wrapfig"   nil)
+              (""     "soul"      t)
+              (""     "textcomp"  t)
+              (""     "marvosym"  t)
+              (""     "wasysym"   t)
+              (""     "latexsym"  t)
+              (""     "amssymb"   t)
+              (""     "hyperref"  nil)))
+
+      ;; Packages to include when xelatex is used
+      (if (string-match "LATEX_CMD: xelatex" (buffer-string))
+          (setq org-export-latex-default-packages-alist
+                '(("" "fontspec" t)
+                  ("" "xunicode" t)
+                  ("" "url" t)
+                  ("" "rotating" t)
+                  ("german" "babel" t)
+                  ("babel" "csquotes" t)
+                  ("" "soul" t)
+                  ("xetex" "hyperref" nil)
+                  )))
+
+      (if (string-match "#+LATEX_CMD: xelatex" (buffer-string))
+          (setq org-export-latex-classes
+                (cons '("scrartcl"
+                        "\\documentclass[11pt,DIV=13,oneside]{scrartcl}"
+                        ("\\section{%s}" . "\\section*{%s}")
+                        ("\\subsection{%s}" . "\\subsection*{%s}")
+                        ("\\subsubsection{%s}" . "\\subsubsection*{%s}")
+                        ("\\paragraph{%s}" . "\\paragraph*{%s}")
+                        ("\\subparagraph{%s}" . "\\subparagraph*{%s}"))
+                      org-export-latex-classes))))
+
+(add-hook 'org-export-latex-after-initial-vars-hook 'my-auto-tex-parameters)
+#+END_SRC
+
+*** Prevent editing invisible text
+The following setting prevents accidentally editing hidden text when
+the point is inside a folded region.  This can happen if you are in
+the body of a heading and globally fold the org-file with =S-TAB=
+
+I find invisible edits (and undo's) hard to deal with so now I can't
+edit invisible text.  =C-c C-r= (org-reveal) will display where the
+point is if it is buried in invisible text to allow editing again.
+
+#+BEGIN_SRC emacs-lisp :tangle yes
+(setq org-catch-invisible-edits 'error)
+#+END_SRC
+
+*** Whatever
+#+BEGIN_SRC emacs-lisp :tangle yes
+;; disable the default org-mode stuck projects agenda view
+(setq org-stuck-projects (quote ("" nil nil "")))
+
+; force showing the next headline.
+(setq org-show-entry-below (quote ((default))))
+
+(setq org-show-following-heading t)
+(setq org-show-hierarchy-above t)
+(setq org-show-siblings (quote ((default))))
+
+(setq org-special-ctrl-a/e t)
+(setq org-special-ctrl-k t)
+(setq org-yank-adjusted-subtrees t)
+
+(setq org-table-export-default-format "orgtbl-to-csv")
+
+#+END_SRC
+
+The following setting adds alphabetical lists like
+  ,a. item one
+  ,b. item two
+
+#+BEGIN_SRC emacs-lisp tangle:yes
+(setq org-alphabetical-lists t)
+#+END_SRC
+
+#+BEGIN_SRC emacs-lisp :tangle yes
+(setq org-remove-highlights-with-change nil)
+
+(setq org-list-demote-modify-bullet (quote (("+" . "-")
+    ("*" . "-")
+    ("1." . "-")
+    ("1)" . "-"))))
+
+
+
+(add-hook 'org-insert-heading-hook 'bh/insert-heading-inactive-timestamp 'append)
+
+
+; If we leave Emacs running overnight - reset the appointments one minute after midnight
+(run-at-time "24:01" nil 'bh/org-agenda-to-appt)
+
+#+END_SRC
+
+
+#+BEGIN_SRC emacs-lisp tangle:yes
 ;; Enable abbrev-mode
 (add-hook 'org-mode-hook (lambda () (abbrev-mode 1)))
 (setq org-startup-indented t)
-(setq org-cycle-separator-lines 2)
+(setq org-startup-folded t)
+(setq org-cycle-separator-lines 0)
+#+END_SRC
 
-(setq org-reverse-note-order nil)
+I find extra blank lines in lists and headings a bit of a nuisance.
+To get a body after a list you need to include a blank line between
+the list entry and the body -- and indent the body appropriately.
+Most of my lists have no body detail so I like the look of collapsed
+lists with no blank lines better.
 
-(setq org-agenda-log-mode-items (quote (closed clock state)))
-(if (> emacs-major-version 23)
-    (setq org-agenda-span 7)
-  (setq org-agenda-ndays 7))
+The following setting prevents creating blank lines before headings
+but allows list items to adapt to existing blank lines around the items:
+#+BEGIN_SRC emacs-lisp tangle:yes
+(setq org-blank-before-new-entry (quote ((heading)
+                                         (plain-list-item . auto))))
+#+END_SRC
 
-(setq org-agenda-show-all-dates t)
-(setq org-agenda-start-on-weekday nil)
-(setq org-deadline-warning-days 14)
+#+BEGIN_SRC emacs-lisp tangle:yes
+(setq org-reverse-note-order nil)
 (setq org-default-notes-file "~/notes.org")
+#+END_SRC
+
+Enforce task blocking. Tasks can't go done when there is any subtask
+still open. Unless they have a property of =NOBLOCKING: t=
+#+BEGIN_SRC emacs-lisp tangle:yes
 (setq org-enforce-todo-checkbox-dependencies t)
 (setq org-enforce-todo-dependencies t)
+#+END_SRC
+
+#+BEGIN_SRC emacs-lisp tangle:yes
 (setq org-fast-tag-selection-single-key (quote expert))
 (setq org-footnote-auto-adjust t)
 (setq org-hide-block-startup t)
@@ -1422,6 +2062,7 @@ Start off by defining a series of keybindings. We also remove C-c [
 (setq org-insert-mode-line-in-empty-file t)
 (setq org-log-done (quote note))
 (setq org-log-into-drawer t)
+(setq org-log-state-notes-insert-after-drawers nil)
 (setq org-log-reschedule (quote time))
 (setq org-log-states-order-reversed t)
 (setq org-mobile-agendas (quote all))
@@ -1430,23 +2071,16 @@ Start off by defining a series of keybindings. We also remove C-c [
 (setq org-remember-store-without-prompt t)
 (setq org-return-follows-link t)
 (setq org-reverse-note-order t)
-(setq org-todo-keywords (quote ((sequence "TODO(t)" "NEXT(n)" "|" "DONE(d@/!)") (sequence "WAITING(w@/!)" "HOLD(h@/!)" "DELEGATED(g@/!)" "|" "CANCELLED(c@/!)" "PHONE"))))
 
 ; regularly save our org-mode buffers
 (run-at-time "00:59" 3600 'org-save-all-org-buffers)
 
 (setq org-log-done t)
-(setq org-agenda-files (quote ("~/org/"
-                               "~/org/debian"
-                               "~/org/debconf"
-                               "~/org/spi"
-                               "~/org/nsb"
-                               )))
-(setq org-default-notes-file "~/org/notes.org")
-;;*** disable priority handling
-(setq org-enable-priority-commands nil)
-(setq org-use-fast-todo-selection t)
-(setq org-treat-S-cursor-todo-selection-as-state-change nil)
+
+(setq org-enable-priority-commands t)
+(setq org-default-priority ?E)
+(setq org-lowest-priority ?E)
+
 
 #+END_SRC
 
@@ -1460,7 +2094,7 @@ are available at the beginning of a code block, the following key
 sequence =C-c C-v h= (bound to `=org-babel-describe-bindings=') will
 display a list of the code blocks commands and their related keys.
 
-#+BEGIN_SRC emacs-lisp
+#+BEGIN_SRC emacs-lisp tangle:yes
 (setq org-use-speed-commands t)
 (setq org-speed-commands-user (quote (("0" . ignore)
                                       ("1" . ignore)
@@ -1500,13 +2134,13 @@ display a list of the code blocks commands and their related keys.
                                       ("K" . ignore)
                                       ("L" . ignore)
                                       ("M" . ignore)
-                                      ("N" . bh/narrow-to-subtree)
-                                      ("P" . bh/narrow-to-project)
+                                      ("N" . bh/narrow-to-org-subtree)
+                                      ("P" . bh/narrow-to-org-project)
                                       ("Q" . ignore)
                                       ("R" . ignore)
                                       ("S" . ignore)
                                       ("T" . bh/org-todo)
-                                      ("U" . bh/narrow-up-one-level)
+                                      ("U" . bh/narrow-up-one-org-level)
                                       ("V" . ignore)
                                       ("W" . bh/widen)
                                       ("X" . ignore)
@@ -1518,49 +2152,10 @@ display a list of the code blocks commands and their related keys.
             (define-key org-agenda-mode-map "q" 'bury-buffer))
           'append)
 
-(setq org-todo-keyword-faces
-      (quote (("TODO" :foreground "red" :weight bold)
-              ("NEXT" :foreground "light blue" :weight bold)
-              ("DONE" :foreground "forest green" :weight bold)
-              ("WAITING" :foreground "orange" :weight bold)
-              ("HOLD" :foreground "orange" :weight bold)
-              ("DELEGATED" :foreground "yellow" :weight bold)
-              ("CANCELLED" :foreground "forest green" :weight bold)
-              ("PHONE" :foreground "forest green" :weight bold))))
-
-(setq org-todo-state-tags-triggers
-      (quote (("CANCELLED" ("CANCELLED" . t))
-              ("WAITING" ("WAITING" . t))
-              ("HOLD" ("WAITING" . t) ("HOLD" . t))
-              (done ("WAITING") ("HOLD"))
-              ("TODO" ("WAITING") ("CANCELLED") ("HOLD"))
-              ("NEXT" ("WAITING") ("CANCELLED") ("HOLD"))
-              ("DONE" ("WAITING") ("CANCELLED") ("HOLD")))))
-
-; Tags with fast selection keys
-(setq org-tag-alist (quote ((:startgroup)
-                            ("@errand" . ?e)
-                            ("@office" . ?o)
-                            ("@home" . ?H)
-                            (:endgroup)
-                            ("PHONE" . ?p)
-                            ("WAITING" . ?w)
-                            ("HOLD" . ?h)
-                            ("PERSONAL" . ?P)
-                            ("WORK" . ?W)
-                            ("ORG" . ?O)
-                            ("PRIVATE" . ?N)
-                            ("crypt" . ?E)
-                            ("MARK" . ?M)
-                            ("NOTE" . ?n)
-                            ("CANCELLED" . ?c)
-                            ("FLAGGED" . ??))))
-
-; Allow setting single tags without the menu
-(setq org-fast-tag-selection-single-key (quote expert))
-
-; Overwrite the current window with the agenda
-(setq org-agenda-window-setup 'current-window)
+(defvar bh/current-view-project nil)
+(add-hook 'org-agenda-mode-hook
+          '(lambda () (org-defkey org-agenda-mode-map "V" 'bh/view-next-project))
+          'append)
 #+END_SRC
 
 The following displays the contents of code blocks in Org-mode files
@@ -1569,484 +2164,31 @@ using the major-mode of the code.  It also changes the behavior of
 that reading and editing code form inside of your Org-mode files is
 much more like reading and editing of code using its major mode.
 
-#+BEGIN_SRC emacs-lisp
-  (setq org-src-fontify-natively t)
-  (setq org-src-tab-acts-natively t)
-
-  ; For tag searches ignore tasks with scheduled and deadline dates
-  (setq org-agenda-tags-todo-honor-ignore-options t)
-
-  ;;** org capture replaces remember mode
-  (setq org-directory "~/org")
-  (setq org-default-notes-file "~/org/refile.org")
-
-  ;; I use C-M-r to start capture mode
-  (global-set-key (kbd "C-M-r") 'org-capture)
-  ;; I use C-c r to start capture mode when using SSH from my Android phone
-  (global-set-key (kbd "C-c r") 'org-capture)
-
-  ;; Capture templates for: TODO tasks, Notes, appointments, phone calls, and org-protocol
-  ;; see http://orgmode.org/manual/Template-elements.html
-  (setq org-capture-templates
-        (quote (("t" "todo" entry (file "~/org/refile.org")
-                 "* TODO %?\nAdded: %U\n"
-                 :clock-in t :clock-resume t)
-                ("l" "linktodo" entry (file "~/org/refile.org")
-                 "* TODO %?\nAdded: %U\n%a\n"
-                 :clock-in t :clock-resume t)
-                ("r" "respond" entry (file "~/org/refile.org")
-                 "* TODO Respond to %:from on %:subject\nAdded: %U\n%a\n"
-                 :clock-in t :clock-resume t :immediate-finish t)
-                ("n" "note" entry (file "~/org/refile.org")
-                 "* %? :NOTE:\nAdded: %U\n%a\n"
-                 :clock-in t :clock-resume t)
-                ("d" "Delegated" entry (file "~/org/refile.org")
-                 "* DELEGATED %?\nAdded: %U\n%a\n"
-                 :clock-in t :clock-resume t)
-                ("j" "Journal" entry (file+datetree "~/org/diary.org")
-                 "* %?\nAdded: %U\n"
-                 :clock-in t :clock-resume t)
-                ("w" "org-protocol" entry (file "~/org/refile.org")
-                 "* TODO Review %c\nAdded: %U\n"
-                 :immediate-finish t)
-                ("p" "Phone call" entry (file "~/org/refile.org")
-                 "* PHONE %? :PHONE:\nAdded: %U"
-                 :clock-in t :clock-resume t)
-                ("f" "Firewall request" entry (file+headline "~/org/nsb/dlh.org" "Firewall")
-                 "* TODO Firewall Reuqest, RT: %?\nAdded: %U"
-                 :clock-in t :clock-resume t)
-                ("i" "Ticket" entry (file+headline "~/org/nsb/dlh.org" "RT Ticket")
-                 "* TODO , RT: %?\nAdded: %U"
-                 :clock-in t :clock-resume t)
-                ("x" "Bookmark link" entry (file "~/org/refile.org")
-                 "* Bookmark: %c\n%i\nAdded: %U\n"
-                 :immediate-finish t)
-                ("h" "Habit" entry (file "~/org/refile.org")
-                 "* NEXT %?\n:PROPERTIES:\n:STYLE: habit\n:REPEAT_TO_STATE: NEXT\n:END:\nAdded: %U\nSCHEDULED: %t .+1d/3d\n")
-                )))
-
-  ; Targets include this file and any file contributing to the agenda - up to 9 levels deep
-  (setq org-refile-targets (quote ((nil :maxlevel . 9)
-                                   (org-agenda-files :maxlevel . 9))))
-
-  ; Use full outline paths for refile targets - we file directly with IDO
-  (setq org-refile-use-outline-path t)
-
-  ; Targets complete directly with IDO
-  (setq org-outline-path-complete-in-steps nil)
-
-  ; Allow refile to create parent tasks with confirmation
-  (setq org-refile-allow-creating-parent-nodes (quote confirm))
-
-  ; Use IDO for both buffer and file completion and ido-everywhere to t
-  (setq org-completion-use-ido t)
-  (setq org-completion-use-iswitchb nil)
-
-  ;;;; Refile settings
-  (setq org-refile-target-verify-function 'bh/verify-refile-target)
-
-  ;; Do not dim blocked tasks
-  (setq org-agenda-dim-blocked-tasks nil)
-  ;; Compact the block agenda view
-  (setq org-agenda-compact-blocks t)
-
-
-  ;; disable the default org-mode stuck projects agenda view
-  (setq org-stuck-projects (quote ("" nil nil "")))
-
-  ; force showing the next headline.
-  (setq org-show-entry-below (quote ((default))))
-
-  (setq org-show-following-heading t)
-  (setq org-show-hierarchy-above t)
-  (setq org-show-siblings (quote ((default))))
-
-  (setq org-special-ctrl-a/e 'reversed)
-  (setq org-special-ctrl-k t)
-  (setq org-yank-adjusted-subtrees t)
-
-
-  ;; Always hilight the current agenda line
-  (add-hook 'org-agenda-mode-hook
-            '(lambda () (hl-line-mode 1))
-            'append)
-
-  ;; Keep tasks with dates on the global todo lists
-  (setq org-agenda-todo-ignore-with-date nil)
-
-  ;; Keep tasks with deadlines on the global todo lists
-  (setq org-agenda-todo-ignore-deadlines nil)
-
-  ;; Keep tasks with scheduled dates on the global todo lists
-  (setq org-agenda-todo-ignore-scheduled nil)
-
-  ;; Keep tasks with timestamps on the global todo lists
-  (setq org-agenda-todo-ignore-timestamp nil)
-
-  ;; Remove completed deadline tasks from the agenda view
-  (setq org-agenda-skip-deadline-if-done t)
-
-  ;; Remove completed scheduled tasks from the agenda view
-  (setq org-agenda-skip-scheduled-if-done t)
-
-  ;; Remove completed items from search results
-  (setq org-agenda-skip-timestamp-if-done t)
-
-  ;; Include agenda archive files when searching for things
-  (setq org-agenda-text-search-extra-files (quote (agenda-archives)))
-
-  ;; Show all future entries for repeating tasks
-  (setq org-agenda-repeating-timestamp-show-all t)
-
-  ;; Show all agenda dates - even if they are empty
-  (setq org-agenda-show-all-dates t)
-
-  ;; Sorting order for tasks on the agenda
-  (setq org-agenda-sorting-strategy
-        (quote ((agenda habit-down time-up user-defined-up priority-down effort-up category-keep)
-                (todo category-up priority-down effort-up)
-                (tags category-up priority-down effort-up)
-                (search category-up))))
-
-  ;; Start the weekly agenda on Monday
-  (setq org-agenda-start-on-weekday 1)
-
-  ;; Enable display of the time grid so we can see the marker for the current time
-  (setq org-agenda-time-grid (quote ((daily today remove-match)
-                                     #("----------------" 0 16 (org-heading t))
-                                     (0800 1000 1200 1400 1500 1700 1900 2100))))
-
-  ;; Display tags farther right
-  (setq org-agenda-tags-column -102)
-
-  ; position the habit graph on the agenda to the right of the default
-  (setq org-habit-graph-column 50)
-
-  ; turn habits back on
-  (run-at-time "06:00" 86400 '(lambda () (setq org-habit-show-habits t)))
-
-  ;;
-  ;; Agenda sorting functions
-  ;;
-  (setq org-agenda-cmp-user-defined 'bh/agenda-sort)
-
-
-  (setq org-deadline-warning-days 30)
-
-  (setq org-table-export-default-format "orgtbl-to-csv")
-
-  ;; Custom agenda command definitions
-  (setq org-agenda-custom-commands
-        (quote (("N" "Notes" tags "NOTE"
-                 ((org-agenda-overriding-header "Notes")
-                  (org-tags-match-list-sublevels t)))
-                ("h" "Habits" tags-todo "STYLE=\"habit\""
-                 ((org-agenda-overriding-header "Habits")
-                  (org-agenda-sorting-strategy
-                   '(todo-state-down effort-up category-keep))))
-                (" " "Agenda"
-                 ((agenda "" nil)
-                  (tags "REFILE"
-                        ((org-agenda-overriding-header "Tasks to Refile")
-                         (org-tags-match-list-sublevels nil)))
-                  (tags-todo "-HOLD-CANCELLED/!"
-                             ((org-agenda-overriding-header "Projects")
-                              (org-agenda-skip-function 'bh/skip-non-projects)
-                              (org-agenda-sorting-strategy
-                               '(category-keep))))
-                  (tags-todo "-CANCELLED/!"
-                             ((org-agenda-overriding-header "Stuck Projects")
-                              (org-agenda-skip-function 'bh/skip-non-stuck-projects)))
-                  (tags-todo "-WAITING-CANCELLED/!NEXT"
-                             ((org-agenda-overriding-header "Next Tasks")
-                              (org-agenda-skip-function 'bh/skip-projects-and-habits-and-single-tasks)
-                              (org-agenda-todo-ignore-scheduled t)
-                              (org-agenda-todo-ignore-deadlines t)
-                              (org-agenda-todo-ignore-with-date t)
-                              (org-tags-match-list-sublevels t)
-                              (org-agenda-sorting-strategy
-                               '(todo-state-down effort-up category-keep))))
-                  (tags-todo "-REFILE-CANCELLED/!-HOLD-WAITING"
-                             ((org-agenda-overriding-header "Tasks")
-                              (org-agenda-skip-function 'bh/skip-project-tasks-maybe)
-                              (org-agenda-todo-ignore-scheduled t)
-                              (org-agenda-todo-ignore-deadlines t)
-                              (org-agenda-todo-ignore-with-date t)
-                              (org-agenda-sorting-strategy
-                               '(category-keep))))
-                  (tags-todo "-CANCELLED/!WAITING|HOLD"
-                             ((org-agenda-overriding-header "Waiting and Postponed Tasks")
-                              (org-tags-match-list-sublevels nil)
-                              (org-agenda-todo-ignore-scheduled 'future)
-                              (org-agenda-todo-ignore-deadlines 'future)))
-                  (tags "-REFILE/"
-                        ((org-agenda-overriding-header "Tasks to Archive")
-                         (org-agenda-skip-function 'bh/skip-non-archivable-tasks)
-                         (org-tags-match-list-sublevels nil))))
-                 nil)
-                ("r" "Tasks to Refile" tags "REFILE"
-                 ((org-agenda-overriding-header "Tasks to Refile")
-                  (org-tags-match-list-sublevels nil)))
-                ("#" "Stuck Projects" tags-todo "-CANCELLED/!"
-                 ((org-agenda-overriding-header "Stuck Projects")
-                  (org-agenda-skip-function 'bh/skip-non-stuck-projects)))
-                ("n" "Next Tasks" tags-todo "-WAITING-CANCELLED/!NEXT"
-                 ((org-agenda-overriding-header "Next Tasks")
-                  (org-agenda-skip-function 'bh/skip-projects-and-habits-and-single-tasks)
-                  (org-agenda-todo-ignore-scheduled t)
-                  (org-agenda-todo-ignore-deadlines t)
-                  (org-agenda-todo-ignore-with-date t)
-                  (org-tags-match-list-sublevels t)
-                  (org-agenda-sorting-strategy
-                   '(todo-state-down effort-up category-keep))))
-                ("R" "Tasks" tags-todo "-REFILE-CANCELLED/!-HOLD-WAITING"
-                 ((org-agenda-overriding-header "Tasks")
-                  (org-agenda-skip-function 'bh/skip-project-tasks-maybe)
-                  (org-agenda-sorting-strategy
-                   '(category-keep))))
-                ("p" "Projects" tags-todo "-HOLD-CANCELLED/!"
-                 ((org-agenda-overriding-header "Projects")
-                  (org-agenda-skip-function 'bh/skip-non-projects)
-                  (org-agenda-sorting-strategy
-                   '(category-keep))))
-                ("w" "Waiting Tasks" tags-todo "-CANCELLED/!WAITING|HOLD"
-                 ((org-agenda-overriding-header "Waiting and Postponed tasks"))
-                 (org-tags-match-list-sublevels nil))
-                ("A" "Tasks to Archive" tags "-REFILE/"
-                 ((org-agenda-overriding-header "Tasks to Archive")
-                  (org-agenda-skip-function 'bh/skip-non-archivable-tasks)
-                  (org-tags-match-list-sublevels nil))))))
-
-  (setq org-archive-mark-done nil)
-  (setq org-archive-location "%s_archive::* Archived Tasks")
-
-  (setq org-startup-folded 'content)
-
-  (global-set-key (kbd "<f9> p") 'bh/phone-call)
-
-  (setq org-remove-highlights-with-change nil)
-
-  (setq org-list-demote-modify-bullet (quote (("+" . "-")
-      ("*" . "-")
-      ("1." . "-")
-      ("1)" . "-"))))
-
-  (setq org-agenda-persistent-filter t)
-
-
-  (add-hook 'org-clock-out-hook 'bh/remove-empty-drawer-on-clock-out 'append)
-  (add-hook 'org-insert-heading-hook 'bh/insert-heading-inactive-timestamp 'append)
-
-  (add-hook 'org-agenda-mode-hook
-            '(lambda () (org-defkey org-agenda-mode-map "W" 'bh/widen))
-            'append)
-
-  (add-hook 'org-agenda-mode-hook
-            '(lambda () (org-defkey org-agenda-mode-map "F" 'bh/restrict-to-file-or-follow))
-            'append)
-
-  (add-hook 'org-agenda-mode-hook
-            '(lambda () (org-defkey org-agenda-mode-map "N" 'bh/narrow-to-subtree))
-            'append)
-
-  (add-hook 'org-agenda-mode-hook
-            '(lambda () (org-defkey org-agenda-mode-map "U" 'bh/narrow-up-one-level))
-            'append)
-
-  (add-hook 'org-agenda-mode-hook
-            '(lambda () (org-defkey org-agenda-mode-map "P" 'bh/narrow-to-project))
-            'append)
-
-  ; Rebuild the reminders everytime the agenda is displayed
-  (add-hook 'org-finalize-agenda-hook 'bh/org-agenda-to-appt 'append)
-
-  ; This is at the end of my .emacs - so appointments are set up when Emacs starts
-  (if (file-exists-p "~/org/refile.org")
-      (bh/org-agenda-to-appt))
-
-
-  ; Activate appointments so we get notifications
-  (appt-activate t)
-
-  ; If we leave Emacs running overnight - reset the appointments one minute after midnight
-  (run-at-time "24:01" nil 'bh/org-agenda-to-appt)
-
-
-  ;;
-  ;; Resume clocking task when emacs is restarted
-  (org-clock-persistence-insinuate)
-  ;;
-  ;; Show lot sof clocking history so it's easy to pick items off the C-F11 list
-  (setq org-clock-history-length 36)
-  ;; Resume clocking task on clock-in if the clock is open
-  (setq org-clock-in-resume t)
-  ;; Change tasks to NEXT when clocking in
-  (setq org-clock-in-switch-to-state 'bh/clock-in-to-next)
-  ;; Separate drawers for clocking and logs
-  (setq org-drawers (quote ("PROPERTIES" "LOGBOOK")))
-  ;; Save clock data and state changes and notes in the LOGBOOK drawer
-  (setq org-clock-into-drawer t)
-  ;; Sometimes I change tasks I'm clocking quickly - this removes clocked tasks with 0:00 duration
-  (setq org-clock-out-remove-zero-time-clocks t)
-  ;; Clock out when moving task to a done state
-  (setq org-clock-out-when-done (quote ("DONE" "WAITING" "DELEGATED" "CANCELLED")))
-  ;; Save the running clock and all clock history when exiting Emacs, load it on startup
-  (setq org-clock-persist t)
-  ;; Do not prompt to resume an active clock
-  (setq org-clock-persist-query-resume nil)
-  ;; Enable auto clock resolution for finding open clocks
-  (setq org-clock-auto-clock-resolution (quote when-no-clock-is-running))
-  ;; Include current clocking task in clock reports
-  (setq org-clock-report-include-clocking-task t)
-
-  ; use discrete minute intervals (no rounding) increments
-  (setq org-time-stamp-rounding-minutes (quote (1 1)))
-
-  (setq bh/keep-clock-running nil)
-
-  (setq org-agenda-clock-consistency-checks
-        (quote (:max-duration "4:00"
-                :min-duration 0
-                :max-gap 0
-                :gap-ok-around ("4:00"))))
-
-  ;; Agenda clock report parameters
-  (setq org-agenda-clockreport-parameter-plist
-        (quote (:link t :maxlevel 5 :fileskip0 t :compact t :narrow 80)))
-
-  ; Set default column view headings: Task Effort Clock_Summary
-  (setq org-columns-default-format "%80ITEM(Task) %10Effort(Effort){:} %10CLOCKSUM")
-
-  ; global Effort estimate values
-  ; global STYLE property values for completion
-  (setq org-global-properties (quote (("Effort_ALL" . "0:15 0:30 0:45 1:00 2:00 3:00 4:00 5:00 6:00 0:00")
-                                      ("STYLE_ALL" . "habit"))))
-
-  ;; Agenda log mode items to display (closed and state changes by default)
-  (setq org-agenda-log-mode-items (quote (state)))
-
-  (add-hook 'org-clock-out-hook 'bh/clock-out-maybe 'append)
-
-  ;;; define categories that should be excluded
-  (setq org-export-exclude-category (list "google" "google"))
-  (setq org-icalendar-use-scheduled '(todo-start event-if-todo))
+#+BEGIN_SRC emacs-lisp tangle:yes
+(setq org-src-fontify-natively t)
+(setq org-src-tab-acts-natively t)
 #+END_SRC
 
-#+BEGIN_SRC emacs-lisp
-(setq org-publish-project-alist
-      '(
-        ("config-notes"
-         :base-directory "~/.emacs.d/config/"
-         :base-extension "org"
-         :publishing-directory "/develop/www/emacs"
-         :recursive t
-         :publishing-function org-publish-org-to-html
-         :headline-levels 4             ; Just the default for this project.
-         :auto-preamble t
-         )
-        ("config-static"
-         :base-directory "~/.emacs.d/config/"
-         :base-extension "css\\|js\\|png\\|jpg\\|gif\\|pdf\\|mp3\\|ogg\\|swf"
-         :publishing-directory "/develop/www/emacs"
-         :recursive t
-         :publishing-function org-publish-attachment
-         )
-        ("inherit-org-info-js"
-         :base-directory "/develop/vcs/org-info-js/"
-         :recursive t
-         :base-extension "js"
-         :publishing-directory "/develop/www/"
-         :publishing-function org-publish-attachment
-         )
-        ("config" :components ("inherit-org-info-js" "config-notes" "config-static")
-         )
-        )
-      )
-#+END_SRC
-#+BEGIN_SRC emacs-lisp
-  (setq org-latex-to-pdf-process
-        '("xelatex -interaction nonstopmode %f"
-          "xelatex -interaction nonstopmode %f")) ;; for multiple passes
-  #+END_SRC
-#+BEGIN_SRC emacs-lisp
-  (require 'org-latex)
-  (setq org-export-latex-listings 'minted)
-
-  ;; Originally taken from Bruno Tavernier: http://thread.gmane.org/gmane.emacs.orgmode/31150/focus=31432
-  ;; but adapted to use latexmk 4.20 or higher.
-  (defun my-auto-tex-cmd ()
-    "When exporting from .org with latex, automatically run latex,
-       pdflatex, or xelatex as appropriate, using latexmk."
-    (let ((texcmd)))
-    ;; default command: oldstyle latex via dvi
-    (setq texcmd "latexmk -dvi -pdfps -quiet %f")
-    ;; pdflatex -> .pdf
-    (if (string-match "LATEX_CMD: pdflatex" (buffer-string))
-        (setq texcmd "latexmk -pdf -quiet %f"))
-    ;; xelatex -> .pdf
-    (if (string-match "LATEX_CMD: xelatex" (buffer-string))
-        (setq texcmd "latexmk -pdflatex='xelatex -shell-escape' -pdf -quiet %f"))
-    ;; LaTeX compilation command
-    (setq org-latex-to-pdf-process (list texcmd)))
-
-  (add-hook 'org-export-latex-after-initial-vars-hook 'my-auto-tex-cmd)
-
-  ;; Specify default packages to be included in every tex file, whether pdflatex or xelatex
-  (setq org-export-latex-packages-alist
-        '(("" "graphicx" t)
-          ("" "longtable" nil)
-          ("" "float" nil)
-          ("" "minted" nil)
-          ))
-
-  (defun my-auto-tex-parameters ()
-        "Automatically select the tex packages to include."
-        ;; default packages for ordinary latex or pdflatex export
-        (setq org-export-latex-default-packages-alist
-              '(("AUTO" "inputenc" t)
-                ("T1"   "fontenc"   t)
-                (""     "fixltx2e"  nil)
-                (""     "wrapfig"   nil)
-                (""     "soul"      t)
-                (""     "textcomp"  t)
-                (""     "marvosym"  t)
-                (""     "wasysym"   t)
-                (""     "latexsym"  t)
-                (""     "amssymb"   t)
-                (""     "hyperref"  nil)))
-
-        ;; Packages to include when xelatex is used
-        (if (string-match "LATEX_CMD: xelatex" (buffer-string))
-            (setq org-export-latex-default-packages-alist
-                  '(("" "fontspec" t)
-                    ("" "xunicode" t)
-                    ("" "url" t)
-                    ("" "rotating" t)
-                    ("german" "babel" t)
-                    ("babel" "csquotes" t)
-                    ("" "soul" t)
-                    ("xetex" "hyperref" nil)
-                    )))
-
-        (if (string-match "#+LATEX_CMD: xelatex" (buffer-string))
-            (setq org-export-latex-classes
-                  (cons '("scrartcl"
-                          "\\documentclass[11pt,DIV=13,oneside]{scrartcl}"
-                          ("\\section{%s}" . "\\section*{%s}")
-                          ("\\subsection{%s}" . "\\subsection*{%s}")
-                          ("\\subsubsection{%s}" . "\\subsubsection*{%s}")
-                          ("\\paragraph{%s}" . "\\paragraph*{%s}")
-                          ("\\subparagraph{%s}" . "\\subparagraph*{%s}"))
-                        org-export-latex-classes))))
-
-  (add-hook 'org-export-latex-after-initial-vars-hook 'my-auto-tex-parameters)
+#+BEGIN_SRC emacs-lisp :tangle yes
+(setq org-src-preserve-indentation nil)
+(setq org-edit-src-content-indentation 0)
 #+END_SRC
-#+BEGIN_SRC emacs-lisp
+
+
+#+BEGIN_SRC emacs-lisp tangle:yes
 (setq org-attach-directory "~/org/data/")
 #+END_SRC
-#+BEGIN_SRC emacs-lisp
+#+BEGIN_SRC emacs-lisp tangle:yes
 (setq org-agenda-sticky t)
 #+END_SRC
+
+**** Checklist handling
+[2013-05-11 Sat 22:15]
+
+#+BEGIN_SRC emacs-lisp tangle:yes
+(require 'org-checklist)
+#+END_SRC
+
 ** transient mark
 For some reason I prefer this mode more than the way without. I want to
 see the marked region.
@@ -2390,3 +2532,6 @@ understand for me.
   (require 'flycheck)
   (add-hook 'after-init-hook #'global-flycheck-mode))
 #+END_SRC
+* Thats it
+And thats it for this file, control passes "back" to [[file:../initjj.org][initjj.org/el]]
+which then may load more files.
index 2671166..6a2cff2 100644 (file)
@@ -384,6 +384,25 @@ Callers of this function already widen the buffer view."
     (setq org-tags-match-list-sublevels nil))
   nil)
 
+;;;###autoload
+(defun bh/skip-stuck-projects ()
+  "Skip trees that are not stuck projects"
+  (save-restriction
+    (widen)
+    (let ((next-headline (save-excursion (or (outline-next-heading) (point-max)))))
+      (if (bh/is-project-p)
+          (let* ((subtree-end (save-excursion (org-end-of-subtree t)))
+                 (has-next ))
+            (save-excursion
+              (forward-line 1)
+              (while (and (not has-next) (< (point) subtree-end) (re-search-forward "^\\*+ NEXT " subtree-end t))
+                (unless (member "WAITING" (org-get-tags-at))
+                  (setq has-next t))))
+            (if has-next
+                nil
+              next-headline)) ; a stuck project, has subtasks but no next task
+        nil))))
+
 ;;;###autoload
 (defun bh/skip-non-stuck-projects ()
   "Skip trees that are not stuck projects"
@@ -700,9 +719,41 @@ so change the default 'F' binding in the agenda to allow both"
 
 
 
-
-
-
+;;;###autoload
+(defun bh/view-next-project ()
+  (interactive)
+  (unless (marker-position org-agenda-restrict-begin)
+    (goto-char (point-min))
+    (re-search-forward "^Projects$")
+    (setq bh/current-view-project (point)))
+  (bh/widen)
+  (goto-char bh/current-view-project)
+  (forward-visible-line 1)
+  (setq bh/current-view-project (point))
+  (if (org-get-at-bol 'org-hd-marker)
+      (bh/narrow-to-project)
+    (message "All projects viewed.")
+    (ding)))
+
+;;;###autoload
+(defun bh/display-inline-images ()
+  (condition-case nil
+      (org-display-inline-images)
+    (error nil)))
+
+; I'm lazy and don't want to remember the name of the project to publish when I modify
+; a file that is part of a project.  So this function saves the file, and publishes
+; the project that includes this file
+;
+; It's bound to C-S-F12 so I just edit and hit C-S-F12 when I'm done and move on to the next thing
+;;;###autoload
+(defun bh/save-then-publish (&optional force)
+  (interactive "P")
+  (save-buffer)
+  (org-save-all-org-buffers)
+  (let ((org-html-head-extra)
+        (org-html-validation-link "<a href=\"http://validator.w3.org/check?uri=referer\">Validate XHTML 1.0</a>"))
+    (org-publish-current-project force)))
 
 
 
index f6cb751..52bbbc0 100644 (file)
@@ -1,12 +1,10 @@
 #+AUTHOR:    Joerg Jaspert
 #+EMAIL:     joerg@ganneff.de
 #+LANGUAGE:  en, de
-#+OPTIONS:   H:3 num:t toc:t \n:nil @:t ::t |:t ^:t -:t f:t 
+#+OPTIONS:   H:2 num:t toc:t \n:nil @:t ::t |:t ^:t -:t f:t 
 #+OPTIONS:   todo:nil tasks:nil pri:nil *:t TeX:t LaTeX:nil skip:t d:nil tags:not-in-toc.
 #+OPTIONS:   author:t creator:t timestamp:t email:t
-#+INFOJS_OPT: view:info toc:nil ltoc:above mouse:underline buttons:nil
-#+INFOJS_OPT: path:../org-info.js
-#+INFOJS_OPT: home:http://ganneff.de/emacs/
+#+INFOJS_OPT: view:info toc:t ltoc:t mouse:underline buttons:nil path:http://ganneff.de/org-info.js home:http://ganneff.de/emacs/
 #+LINK_UP:
 #+LINK_HOME:
 #+STYLE:    <link rel="stylesheet" type="text/css" href="../stylesheet.css" />
index 63214b9..92ab868 100644 (file)
 (defvar emacs-load-start-time (current-time))
 
 ;; Set path to (my, recent) Org-Mode version
-(add-to-list 'load-path (concat jj-elisp-dir "/org/"))
+(add-to-list 'load-path (concat (file-name-directory (or load-file-name (buffer-file-name))) "elisp/org/"))
 
-;; As we use org-mode/org-babel/org-tangle to extract the real emacs
-;; config out of the org-mode files, we have to load that first.
+;; org-mode can load modules when it loads itself, lets tell it which ones we want.
 (setq org-modules (quote
                    (org-bbdb org-bibtex org-crypt org-docview org-gnus
                     org-id org-info org-jsinfo org-habit org-inlinetask
                     org-irc org-protocol org-w3m org-mouse org-checklist
                     org-notmuch icalendar)))
 
-(require 'org-install)
+;; And load org-mode
+(require 'org)
+;; Without this the whole config can't load
 (require 'ob-tangle)
+;; And finally, let org-babel do its work. All the rest of the emacs
+;; initialization comes from initjj.org
 (org-babel-load-file (expand-file-name "initjj.org" (file-name-directory (or load-file-name (buffer-file-name)))))
 
index 174a1f6..b8b606b 100644 (file)
@@ -1,4 +1,166 @@
-* Basic initialization (from initjj.org)
+#+TITLE:       initjj.org - Ganneffs emacs configuration
+#+DESCRIPTION: My current Emacs configuration
+#+KEYWORDS:    org-mode Emacs configuration
+#+STARTUP:     align fold nodlcheck hidestars oddeven lognotestate
+#+SETUPFILE:   ~/.emacs.d/elisp/org-templates/level-0.org
+#+LATEX_CMD:   xelatex
+
+* Notes for people looking at this using a webbrowser
+My whole emacs config is done using [[http://orgmode.org/][org-mode]] files, with a little magic
+in ~/.emacs.d/init.el to have it readable for emacs.
+
+I publish them using the [[http://orgmode.org/manual/HTML-export.html#HTML-export][HTML export feature]] of org-mode, combined with
+a javascript [[http://orgmode.org/worg/code/org-info-js/][called org-info.js]] which lets you navigate my config
+similar to what org-mode allows you in Emacs.
+
+Basic navigation is =n= for next, =p= for previous, =l= will give you
+a direct link to the point you are at and the key =?= will show you a
+help with all keyboard shortcuts. You might also want to try pressing
+=m= followed by a series of =F=.
+
+If you have Javascript disabled you only miss the nice navigation, you
+will see the whole file at once.
+
+* Copyright notice(s)
+My config is made up of stuff I wrote myself - and lots of stuff I
+copied from all around the net. I try to list all of the original
+authors here, but this config is a living thing for more than a decade
+now, so there are things where I just don't know anymore where it might
+be from.
+
+If you find something that you are the author off and I forgot to
+mention you don't hesitate to tell me and I will fix that oversight.
+
+** My own stuff
+----------
+#+BEGIN_QUOTE
+Copyright © 200x-2012 Joerg Jaspert <joerg@ganneff.de>
+
+My code in this document is free software: you can redistribute it
+and/or modify it under the terms of the [[http://www.gnu.org/licenses/old-licenses/gpl-2.0.html][GNU General Public License]]
+as published by the Free Software Foundation, version 2.0.
+
+My writing here is subject to the  [[http://creativecommons.org/licenses/by-nc-sa/3.0/][CC —
+Attribution-NonCommercial-ShareAlike 3.0 Unported — CC BY-NC-SA 3.0]]
+license.
+#+END_QUOTE
+----------
+
+** Sacha Chua
+I copied various functions and snippets from [[http://sachachua.com/blog/category/emacs/][Sacha Chuas blog]] (worth a
+read). Her copyright/license notice:
+
+----------
+#+BEGIN_QUOTE
+Copyright © 2001-2012 Sacha Chua (sacha@sachachua.com).
+
+Please feel free to reuse content under a [[http://creativecommons.org/licenses/by-nc-sa/3.0/][Creative Commons —
+Attribution-NonCommercial-ShareAlike Unported — CC BY-NC-SA]] license
+unless otherwise noted.
+#+END_QUOTE
+----------
+
+Functions copied from her start with /sacha//.
+
+** Bernt Hansen
+Much of my org-mode setup is copied from [[http://doc.norang.ca/org-mode.html][Bernt Hansens org-mode
+page]]. His license statement:
+
+----------
+#+BEGIN_QUOTE
+Copyright (C)  2012  Bernt Hansen.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3
+or any later version published by the Free Software Foundation;
+with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+
+Code in this document is free software: you can redistribute it
+and/or modify it under the terms of the GNU General Public
+License as published by the Free Software Foundation, either
+version 3 of the License, or (at your option) any later version.
+
+This code is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+#+END_QUOTE
+----------
+
+Functions copied from him start with /bh//.
+
+** Roland Mas
+I copied a few functions for my [[file:gnus.org][gnus]] setup from [[http://roland.entierement.nu/blog/2010/09/08/gnus-dovecot-offlineimap-search-a-howto.html][his blog]] that enable me to
+use notmuch and gnus together. His license statement:
+
+----------
+#+BEGIN_QUOTE
+[[http://creativecommons.org/licenses/by-nc-sa/2.0/fr/][Creative Commons — Attribution - Pas d'Utilisation
+Commerciale - Partage dans les Mêmes Conditions 2.0 France — CC BY-NC-SA
+2.0]] Sauf indication contraire, le contenu de ce site est mis à
+disposition sous un contrat Creative Commons.
+#+END_QUOTE
+----------
+
+In case you are as good in french as I am, that should be equal to:
+----------
+#+BEGIN_QUOTE
+Please feel free to reuse content under a [[http://creativecommons.org/licenses/by-nc-sa/2.0/][Creative Commons —
+Attribution-NonCommercial-ShareAlike Unported — CC BY-NC-SA]] license
+unless otherwise noted.
+#+END_QUOTE
+----------
+
+** Emacs Prelude
+#+BEGIN_QUOTE
+Prelude is an enhanced Emacs 24 configuration that should make your
+experience with Emacs both more pleasant and more powerful. Prelude
+alters a lot of the default settings, bundles a plethora of additional
+packages and adds its own core library to the mix. The final product
+offers an easy to use Emacs configuration for Emacs newcomers and lots
+of additional power for Emacs power users.
+#+END_QUOTE
+
+So much for their own advertisement, and while I agree it is a pretty
+nice configuration, I only like parts of it. Especially as I am forced
+to use older emacs too (prelude requires emacs24), and I also like to
+do stuff on my own...
+
+Anything copied from prelude should start with prelude-, and their
+license statement is:
+
+----------
+#+BEGIN_QUOTE
+Copyright © 2011-2013 Bozhidar Batsov
+
+Author: Bozhidar Batsov <bozhidar@batsov.com>
+URL: https://github.com/bbatsov/prelude
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation; either version 3
+of the License, or (at your option) any later version.
+#+END_QUOTE
+----------
+
+You should be able to find a full list of contributors at
+[[https://github.com/bbatsov/prelude/graphs/contributors][their github]] pages.
+
+
+
+* Initial preparation
+To have my config here actually work, =emacs= needs a little help. For
+some reason it can't just read an =org-mode= based config on its own, tsk.
+
+Which means that the emacs initfile needs to have the magic. My init
+file is =~/.emacs.d/init.el=. I try to keep it as small as possible, yet
+it does have some entries.
+
+As I commented inside that file, I won't repeat stuff here, just read it
+below.
+
+#+INCLUDE: "~/.emacs.d/init.el" src emacs-lisp
+
+* Basic initialization
 First of I want a set of variables defined, makes it easier to refer
 to common things later.
 
@@ -8,7 +170,7 @@ The variable /system-type/ from emacs isn't directly usable in my
 case. It contains gnu/linux and gnu/kfreebsd - which has extra /,
 which is just annoying when using them in a path entry.
 Hence we do a little creative redefinition for ourself.
-#+BEGIN_SRC emacs-lisp
+#+BEGIN_SRC emacs-lisp tangle:yes
 (defun jj-system-type ()
   "Return a string depending on the OS we use"
   (interactive)
@@ -23,7 +185,7 @@ Hence we do a little creative redefinition for ourself.
 *** jj-dir
 The base directory for all our emacs files. It is based on the
 directory where we load this file from.
-#+BEGIN_SRC emacs-lisp
+#+BEGIN_SRC emacs-lisp tangle:yes
 (defvar jj-dir (file-name-directory (or load-file-name (buffer-file-name)))
   "The master directory for Ganneffs emacs configuration and storage.
 Usually ~/.emacs.d/")
@@ -31,7 +193,7 @@ Usually ~/.emacs.d/")
 
 *** jj-config-dir
 In which directory do we store the rest of our config?
-#+BEGIN_SRC emacs-lisp
+#+BEGIN_SRC emacs-lisp tangle:yes
 (defvar jj-config-dir
   (expand-file-name "config" jj-dir)
   "Ganneffs main emacs configuration can be found here.")
@@ -39,7 +201,7 @@ In which directory do we store the rest of our config?
 
 *** jj-emacs-config
 Name of the main configuration file.
-#+BEGIN_SRC emacs-lisp
+#+BEGIN_SRC emacs-lisp tangle:yes
 (defvar jj-emacs-config
   (expand-file-name "emacs.org" jj-config-dir)
   "Ganneffs main emacs configuration file.")
@@ -47,7 +209,7 @@ Name of the main configuration file.
 
 *** jj-elisp-dir
 Where do I store packages for emacs.
-#+BEGIN_SRC emacs-lisp
+#+BEGIN_SRC emacs-lisp tangle:yes
 (defvar jj-elisp-dir
   (expand-file-name "elisp" jj-dir)
   "This directory stores subdirs for local packages in Ganneffs emacs config.")
@@ -56,7 +218,7 @@ Where do I store packages for emacs.
 *** jj-elisp-local-dir
 Some packages just come with a single file. I put them into this
 local directory instead of giving them an own one.
-#+BEGIN_SRC emacs-lisp
+#+BEGIN_SRC emacs-lisp tangle:yes
 (defvar jj-elisp-local-dir
   (expand-file-name "local" jj-elisp-dir)
   "This directory stores extra elisp files for Ganneffs emacs config.")
@@ -64,7 +226,7 @@ local directory instead of giving them an own one.
 
 *** jj-custom-file
 The customization interface of emacs stores its values in this file.
-#+BEGIN_SRC emacs-lisp
+#+BEGIN_SRC emacs-lisp tangle:yes
 (defvar jj-custom-file
   (expand-file-name "customized.el" jj-config-dir)
   "Changes from the customization interface in Ganneffs emacs config.")
@@ -72,7 +234,7 @@ The customization interface of emacs stores its values in this file.
 
 *** jj-cache-dir
 Similar to /var on a unix system, volatile data, cache files, ...
-#+BEGIN_SRC emacs-lisp
+#+BEGIN_SRC emacs-lisp tangle:yes
 (defvar jj-cache-dir
   (expand-file-name "cache" jj-dir)
   "This directory stores cache files and other volatile data.")
@@ -80,7 +242,7 @@ Similar to /var on a unix system, volatile data, cache files, ...
 
 *** jj-backup-directory
 Backup copies of files I edit are stored here.
-#+BEGIN_SRC emacs-lisp
+#+BEGIN_SRC emacs-lisp tangle:yes
 (defvar jj-backup-directory
   (expand-file-name (concat "emacs-autosave-" user-login-name) jj-cache-dir)
   "This directory stores backup files.")
@@ -88,7 +250,7 @@ Backup copies of files I edit are stored here.
 
 *** jj-theme-dir
 Where my theme files are stored.
-#+BEGIN_SRC emacs-lisp
+#+BEGIN_SRC emacs-lisp tangle:yes
 (defvar jj-theme-dir
   (expand-file-name "themes" jj-dir)
   "This directory stores theme files for Ganneffs emacs config")
@@ -96,7 +258,7 @@ Where my theme files are stored.
 
 *** jj-sys-config
 System dependent configuration information stored in here.
-#+BEGIN_SRC emacs-lisp
+#+BEGIN_SRC emacs-lisp tangle:yes
 (defvar jj-sys-config
   (expand-file-name (concat system-name ".org") jj-config-dir)
   "Ganneffs System/Host specific emacs configuration file.")
@@ -104,7 +266,7 @@ System dependent configuration information stored in here.
 
 *** jj-os-config
 Operating System dependent configuration information stored in here.
-#+BEGIN_SRC emacs-lisp
+#+BEGIN_SRC emacs-lisp tangle:yes
 (defvar jj-os-config
   (expand-file-name (concat (jj-system-type) ".org") jj-config-dir)
   "Ganneffs Operating system specific emacs configuration file.")
@@ -112,7 +274,7 @@ Operating System dependent configuration information stored in here.
 
 *** jj-user-config
 User dependent configuration stored in here.
-#+BEGIN_SRC emacs-lisp
+#+BEGIN_SRC emacs-lisp tangle:yes
 (defvar jj-user-config
   (expand-file-name (concat user-login-name ".org") jj-config-dir) 
   "Ganneffs username specific emacs configuration file.")
@@ -120,7 +282,7 @@ User dependent configuration stored in here.
 
 *** jj-ev-config
 Emacs version dependent configuration stored in here.
-#+BEGIN_SRC emacs-lisp
+#+BEGIN_SRC emacs-lisp tangle:yes
 (defvar jj-ev-config (expand-file-name
                       (concat "emacs"
                               (number-to-string emacs-major-version) ".org")
@@ -130,13 +292,13 @@ Emacs version dependent configuration stored in here.
 
 *** jj-color-style
 Which color scheme should be loaded? I prefer dark very much.
-#+BEGIN_SRC emacs-lisp
+#+BEGIN_SRC emacs-lisp tangle:yes
 (defvar jj-color-style 'dark "Which color scheme of solarized to select. Dark or Light")
 #+END_SRC
 
 ** Processing
 First we want to ensure that our cache and backup directories really exist.
-#+BEGIN_SRC emacs-lisp
+#+BEGIN_SRC emacs-lisp tangle:yes
 (if (not (file-exists-p jj-cache-dir))
     (make-directory jj-cache-dir))
 (if (not (file-exists-p jj-backup-directory))
@@ -146,7 +308,7 @@ First we want to ensure that our cache and backup directories really exist.
 Add our local elisp directory to the load path early, as it contains
 files we want to load during configuration processing, before the
 load-path gets set up for real.
-#+BEGIN_SRC emacs-lisp
+#+BEGIN_SRC emacs-lisp tangle:yes
 ;; Have use-package/bindkey in here wich are needed for startup
 (add-to-list 'load-path jj-elisp-local-dir)
 #+END_SRC
@@ -158,7 +320,7 @@ ensures that the generated elisp files get byte-compiled.
 As my configuration requires certain parts of the configuration to
 already be loaded when the byte-compilation happens, this is done
 using an /after-init-hook/.
-#+BEGIN_SRC emacs-lisp
+#+BEGIN_SRC emacs-lisp tangle:yes
 (defvar jj-init-files '() "Temporary list of files that need a byte-compile")
 (defun jj-byte-compile-init ()
   "Byte compile a list of files"
@@ -184,20 +346,35 @@ them."
     ))
 #+END_SRC
 
+** Extra files to load
+
 And finally we are going to load the various files.
-#+BEGIN_SRC emacs-lisp
-;; Now read my config
-;; Note that those files *can* include further files.
-;; The basic config is always loaded, no matter where we start emacs.
+
+*** Global emacs config, always loaded
+
+This file is loaded no matter what and exists on all machines my
+dotfiles are on. [[file:config/emacs.org][Main Emacs config]]
+#+BEGIN_SRC emacs-lisp tangle:yes tangle:yes
 (jj-compile-and-load jj-emacs-config)
+#+END_SRC
+
+*** Specific configurations
 
-;; All the others are optional. We try the order of os, system, user
-;; specific files and load them, should they be there
+The following may exist - or may not. Depending on the operating
+system, system type, username or emacs version I can load special
+configuration.
+#+BEGIN_SRC emacs-lisp tangle:yes
 (if (file-exists-p jj-os-config)   (jj-compile-and-load jj-os-config))
 (if (file-exists-p jj-sys-config)  (jj-compile-and-load jj-sys-config))
 (if (file-exists-p jj-user-config) (jj-compile-and-load jj-user-config))
 (if (file-exists-p jj-ev-config)   (jj-compile-and-load jj-ev-config))
+#+END_SRC
+
+*** Final steps
 
+And finally, we ensure that our function goes away, no reason to keep
+it. And then print out the time it took to start emacs.
+#+BEGIN_SRC emacs-lisp tangle:yes
 (makunbound 'jj-compile-and-load)
 
 ;; Lets get a message about startup time out