add puppet mode, align code and some local elisp files
[emacs.git] / .emacs.d / initjj.org
index 174a1f6..c957154 100644 (file)
@@ -1,4 +1,168 @@
-* 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.
+
+
+
+** Steve Purcell
+[2013-05-21 Tue 23:30]
+* 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 +172,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 +187,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 +195,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 +203,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 +211,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 +220,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 +228,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 +236,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 +244,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 +252,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 +260,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 +268,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 +276,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 +284,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 +294,22 @@ 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
 
+** Macro
+A small wrapper around =eval-after-load=, taken from [[http://milkbox.net/note/single-file-master-emacs-configuration/][Single File Master Emacs Configuration : milkbox]]
+#+BEGIN_SRC emacs-lisp :tangle yes
+(defmacro after (mode &rest body)
+  "`eval-after-load' MODE evaluate BODY."
+  (declare (indent defun))
+  `(eval-after-load ,mode
+     '(progn ,@body)))
+#+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 +319,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 +331,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 +357,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
 (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