RobertAdesamConfig

Download

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;
;;; Emacs init file by
;;; Robert Adesam, robert@adesam.se
;;; http://www.adesam.se/robert/
;;;
;;; This is my init file for Emacs 22, 23, and 24 on MacOSX, Linux,
;;; and Windows/Cygwin
;;;
;;; TODO: Solaris
;;;
;;; N.B. Alot of this is reused from other Emacs users that have
;;; published their init-files on the Internet. Thank you! :)
;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;
;;; $Revision:: 578              $: Revision of last commit
;;; $Date:: 2011-06-29 08:46:19 #$: Date of last commit
;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Load-path, exec-path, info-path
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;; load-path
(setq load-path (cons "~/.emacs.d" load-path))

(if (eq system-type 'darwin)
    (setq exec-path
          (append 
           '("/Applications/Firefox3.app/Contents/MacOS"
             "/usr/local/bin"
             "/opt/local/bin")
           exec-path)))

;; I only want my info-pages
(setq Info-default-directory-list (quote ("~/.emacs.d/info"))
      Info-directory-list (quote ("~/.emacs.d/info")))

;; Setting PATH... why... my Emacs does not seem to inherit PATH from
;; .MacOSX/environment.plist, ~/.bash_profile, nor /etc/bashrc on my Mac :(
(if (eq system-type 'darwin)
    (setenv "PATH" "/usr/local/bin:/opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin"))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Windows/Cygwin
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;; Emacs on Windows 7, M-x version output:
;;   GNU Emacs 24.0.50.1 (i386-mingw-nt6.1.7600)
;;   of 2011-01-17 on 3249CTO
;;
;; N.B. executed
;;
;;   setx HOME c:\cygwin\home\robert
;;
;; in cmd.exe to set the HOME environment variable

;; Adding cygwin stuff
(if (eq system-type 'windows-nt)
    (progn
      (setenv "PATH" 
 	      (concat 
 	       "c:\\cygwin\\usr\\local\\bin" ";"
 	       "c:\\cygwin\\usr\\bin" ";"
 	       "c:\\cygwin\\bin" ";"
 	       (getenv "PATH")))
      (setq exec-path (cons "c:/cygwin/bin/" exec-path))
      ;; Adding cygwin mounts
      (require 'cygwin-mount)
      (cygwin-mount-activate)
      ;; Adding cygwin bash shell
      (setq shell-file-name "c:/cygwin/bin/bash")
      (setenv "SHELL" shell-file-name)
      (setq explicit-shell-file-name shell-file-name)
      (setq ediff-shell shell-file-name)
      (setq explicit-shell-args '("--login" "-i"))
      (setq w32-quote-process-args ?\") ;"
      ))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Load local packages
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;; I install quite alot of local Emacs packages,
;; maybe they should be installed elsewhere...
;; in ~/.emacs.d?
(let ((start-dir 
       (cond
        ((eq system-type 'windows-nt)
         "c:/cygwin/usr/local/share/emacs/site-lisp/site-start.d")
        ((eq system-type 'darwin)
         "/usr/local/share/emacs/site-lisp/site-start.d")
        ((eq system-type 'gnu/linux)
         "/usr/local/share/emacs/site-lisp/site-start.d"))))      
  (if (file-exists-p start-dir)
      (mapc 'load (directory-files start-dir t "\\.el\\'"))))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Server
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;; Only on Windows-NT Emacs
(if (eq system-type 'windows-nt)
    (server-start))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Environment
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;; Some things I do not want...
(setq inhibit-startup-echo-area-message "robert"
      inhibit-startup-screen t
      initial-scratch-message nil)
(menu-bar-mode -1)
(tool-bar-mode -1)
(if window-system
    (progn
      (set-scroll-bar-mode nil)
      (tooltip-mode nil)))

(blink-cursor-mode -1)
(setq vc-handled-backends nil)

;; ...other things I do
(column-number-mode t)
(global-font-lock-mode t)
(transient-mark-mode t)
(setq mark-even-if-inactive t)
(auto-compression-mode t)
(setq display-time-format " %R, %d %b v%V "
      display-time-load-average-threshold 1)
(display-time-mode)
(setq read-file-name-completion-ignore-case t)

;; Frames, colours etc
;; TODO: these should be system-name dependent, not system-type
(setq default-frame-alist 
      (cond
       ((string= system-name "SKRUTT") ; windows 7 on 10" netbook @home
        '((scroll-bar-width . 2) 
          (foreground-color . "gray15")
          (background-color . "antiquewhite1")
          (cursor-color . "gray30")
          (left-fringe . 5)
          (right-fringe . 5)
          (width . 98) 
          (height . 35)
          (left . 200)))
       ((eq system-type 'darwin) ; MacOS X 10.5.x on Mac Mini @work
        '((scroll-bar-width . 2) 
          (foreground-color . "gray15")
          (background-color . "antiquewhite1")
          (cursor-color . "gray30")
          (left-fringe . 3)
          (right-fringe . 3)
          (width . 141) 
          (height . 60)
          (left . 400)))          
       ((eq system-type 'gnu/linux) ; Mandriva Linux 2010.0 on 14" ThinkPad T60 @work
        '((height . 80)
          (width . 103)
          (left . 2)
          (scroll-bar-width . 2)
          (left-fringe . 5)
          (right-fringe . 5)))))

;; Faces
(if (eq system-type 'gnu/linux)
    (custom-set-faces
     '(default
       ((t (:inherit nil
            :stipple nil
            :background "antiquewhite2"
            :foreground "Black"
            :inverse-video nil
            :box nil
            :strike-through nil
            :overline nil
            :underline nil
            :slant normal
            :weight normal
            :height 90
            :width normal
            :foundry "unknown"
            :family "DejaVu Sans Mono"))))
     '(org-column
       ((t (:inherit default
            :background "grey90"
            :height 90
            :family "DejaVu Sans Mono"))))))

;; This is needed when running Emacs 23, vm-mail otherwise crashes
;; emacs -nw when setting frame name, Fatal Error (10). Reported, see
;; http://debbugs.gnu.org/cgi/bugreport.cgi?bug=4765
(if window-system (set-frame-name 
                   ;; everybody loves emacs :)
                   ;; (concat "∀x(person(x)→∃y(emacs(y)∧♥(x,y)))")
                   ;; emacs is loved by everybody :)
                   (concat "∃x∀y(emacs(x)∧(person(y)→♥(y,x)))")
                   ))

;; Character encoding
(if (eq system-type 'darwin)
    (progn
      (prefer-coding-system 'utf-8-unix)
      (set-default-coding-systems 'utf-8-unix)
      (if (< emacs-major-version 23)
          (set-keyboard-coding-system 'utf-8))
      (set-clipboard-coding-system 'utf-8)
      (set-terminal-coding-system 'utf-8)))
(if (or (eq system-type 'gnu/linux)
        (eq system-type 'windows-nt))
    (progn
      (prefer-coding-system 'utf-8-unix)
      (load-library "iso-transl")))

(define-coding-system-alias 'utf-8-emacs 'utf-8) ; needed by bbdb...

;; Fullscreen, does not work on my Emacs for Mac... yet...
;; (cond 
;;  ((eq system-type 'darwin) 
;;   (defun fullscreen (&optional f)
;;     (interactive)
;;     (set-frame-parameter f 'fullscreen
;;                          (if (frame-parameter f 'fullscreen) nil 'fullboth))))
;;   ((eq system-type 'gnu/linux)
;;    (require 'fullscreen)))
;; (add-hook 'after-make-frame-functions 'fullscreen)

;; Text
(setq sentence-end-double-space nil)

;; Misc
(setq-default tab-width 2 indent-tabs-mode nil)
(setq initial-major-mode (quote org-mode)) ; move to org-mode section?
(setq password-cache-expiry 7200)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Persona
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(setq user-full-name    "Robert Adesam"
      user-mail-address "robert.adesam@gu.se")

;; Function for inserting my son's first text 
;; written with Emacs. He was only 8 months old 
;; when producing this master piece.
;; I am a very proud father! :)
(defun alexanders-first-emacs-text ()
  (interactive)
  (insert " , ..lölökojjoinnnbhm,mmm,7hij,jj,.ölmetz in y5t
yy8byb89tryb85yb8rn9b4n8b9trbtbbtbjkp
¨pöööj09hu6u b5bitntintin4hghhe"))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Calendar/Diary
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(setq diary-file 
      (cond
       ((eq system-type 'windows-nt)
        "c:/Users/robert/My Dropbox/gtd/diary")
       ((eq system-type 'darwin)
        "~/gtd/diary")
       ((eq system-type 'gnu/linux)
        "~/gtd/diary")))

(setq calendar-date-style 'iso
      diary-show-holidays-flag nil
      calendar-week-start-day 1
      calendar-mark-diary-entries-flag t)

;; TODO: Fix function calling python-script for syncing with Google
;; calendar

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Printing
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(setq ps-paper-type 'a4
      ps-line-number nil
      ps-line-number-step 3
      ps-n-up-printing 1
      ps-header-lines 0)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Global keys
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;; When using Emacs version > 22 on darwin
(if (and (> emacs-major-version 22)
         (eq system-type 'darwin))
    (progn 
      (setq mac-command-modifier 'meta)
      (setq mac-option-modifier nil)))

;; Global keyboard tweaks
(global-set-key [f9] "[")
(global-set-key [f10] "]")
(global-set-key [f11] "{")
(global-set-key [f12] "}")
(global-set-key [f5] 'fullscreen)
(global-set-key "\C-xf" 'find-file) ; i always hit the wrong key-combo
(global-set-key "\C-xm" 'vm-mail)
(global-set-key (kbd "C-c a") 'org-agenda)
(global-set-key "\C-cr" 'org-capture)
(global-set-key "\C-cg" 'ra/gtd)
(global-set-key "\C-cn" 'ra/note)
(global-set-key "\C-cw" 'ra/review)

;; Wheel mouse
(defun up-slightly () (interactive) (scroll-up 5))
(defun down-slightly () (interactive) (scroll-down 5))
(global-set-key [mouse-4] 'down-slightly)
(global-set-key [mouse-5] 'up-slightly)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Filename extensions
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(setq auto-mode-alist
      (append
       '(("\\.ale$" . ale-prolog-mode) ;; file.ale loads ale-prolog-mode
         ("\\.pl$" . prolog-mode)      ;; file.pl loads prolog-mode
         ("\\.dcg$" . prolog-mode)     ;; file.dcg loads prolog-mode
         ("\\.\\(cgi\\|pe?rl\\)" . cperl-mode)
         ("\\.vm$" . emacs-lisp-mode)
         ("\\.cl$" . lisp-mode)
         ("\\.script$" . fst-mode)
         ("\\.x?html\\...$" . nxhtml-mode)
         ("environment" . shell-script-mode)
         ("alias" . shell-script-mode)
         ("path" . shell-script-mode)
         ("cshrc.final" . shell-script-mode)
         ("\\.xml$" . nxml-mode)
         ("\\.xsl$" . nxml-mode)
         ("cms\\.it\\.gu\\.se.*\\.txt$" . nxhtml-mumamo-mode)
         ("www\\.blogger\\.com.*\\.txt$" . nxhtml-mumamo-mode)
         ("\\.org$" . org-mode)
         ("\\.org.old$" . org-mode)
         ("\\.sorg$" . org-mode)
         ("\\.pho$" . mbrola-mode)) 
       auto-mode-alist))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Email
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;; I use VM, please check my .vm file for additional settings.

(setq read-mail-command 'vm)

;; smtp settings
(if (eq system-type 'windows-nt)
    (progn
      (setq mail-archive-file-name "m:/mail/SENT class="string">"
            sendmail-program "c:/cygwin/usr/sbin/msmtp.exe"
            send-mail-function 'sendmail-send-it
            mail-host-address "gu.se"))
  (progn
    (setq mail-archive-file-name "~/mail/SENT"
          send-mail-function 'smtpmail-send-it
          message-send-mail-function 'smtpmail-send-it
          ;; smtp to smtpgw.gu.se
          smtpmail-starttls-credentials
          '(("smtpgw.gu.se" 587 nil nil))
          smtpmail-auth-credentials
          '(("smtpgw.gu.se" 587 "USERNAME" nil))
          smtpmail-default-smtp-server "smtpgw.gu.se"
          smtpmail-smtp-server "smtpgw.gu.se"
          smtpmail-smtp-service 587
          smtpmail-sendto-domain "gslt.hum.gu.se"
          smtpmail-debug-info t)))

(require 'smtpmail)

;; smtp to google via smtpmail
;; (setq smtpmail-starttls-credentials
;;       '(("smtp.gmail.com" 587 nil nil))
;;       smtpmail-auth-credentials
;;       '(("smtp.gmail.com" 587 "USERNAME" nil))
;;       smtpmail-default-smtp-server "smtp.gmail.com"
;;       smtpmail-smtp-server "smtp.gmail.com"
;;       smtpmail-smtp-service 587
;;       smtpmail-debug-info t)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; GNUS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;; should be in ~/.gnus.el? is usenet dying?

(setq gnus-select-method 
      '(nntp "oravannahka.helsinki.fi"))

(setq gnus-secondary-select-methods
      '((nntp "news.gmane.org")))

(setq gnus-posting-styles
      '((".*"
         (name "Robert Adesam")
         (address "robert.adesam@gu.se")
         (organization "University of Gothenburg")
         (signature-file "~/.signature.gnus")))) ; one less row

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Supercite
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(require 'filladapt)
(autoload 'sc-cite-original     "supercite" "Supercite 3.1" t)
(autoload 'sc-submit-bug-report "supercite" "Supercite 3.1" t)
(add-hook 'mail-citation-hook 'sc-cite-original)
(add-hook 'sc-load-hook 
          (cond
           ((eq system-type 'darwin)
            'sc-setup-filladapt)
           ((eq system-type 'windows-nt)
            'sc-setup-filladapt)
           ((eq system-type 'gnu/linux)
               (lambda ()
                 (filladapt-mode 1)))))
(setq message-cite-function 'sc-cite-original
      news-reply-header-hook nil
      sc-citation-leader ""
      sc-preferred-attribution-list 
      '("sc-lastchoice"
        "x-attribution"
        "sc-consult"
        "initials"
        "firstname"
        "lastname")
      sc-electric-references-p t	; allows me to select header n,p,RET
      sc-cite-region-limit t		  ; no default citing to avoid filling
      sc-nested-citation-p nil
      sc-auto-fill-region-p nil
      sc-blank-lines-after-headers nil
      sc-attrib-selection-list
      '(("sc-from-address" ((".*" . (bbdb/sc-consult-attr (sc-mail-field "sc-from-address"))))))
      sc-mail-glom-frame
      '((begin                        (setq sc-mail-headers-start (point)))
        ("^x-attribution:[ \t]+.*$"   (sc-mail-fetch-field t) nil t)
        ("^\\S +:.*$"                 (sc-mail-fetch-field) nil t)
        ("^$"                         (progn (bbdb/sc-default)
                                             (list 'abort '(step . 0))))
        ("^[ \t]+"                    (sc-mail-append-field))
        (sc-mail-warn-if-non-rfc822-p (sc-mail-error-in-mail-field))
        (end                          (setq sc-mail-headers-end (point))))
      )

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; bbdb
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(require 'bbdb)
(bbdb-initialize 'vm)
(setq bbdb-file
      (cond
       ((eq system-type 'windows-nt)
        "c:/cygwin/home/robert/mail/.database.bbdb")
       ((eq system-type 'darwin)
        "~/mail/.database.bbdb")
       ((eq system-type 'gnu/linux)
        "~/mail/.database.bbdb"))
      bbdb-readonly-p nil
      bbdb-send-mail-style 'vm
      bbdb-offer-save 'automatic
      bbdb-use-pop-up nil
      bbdb-completion-display-record nil
      bbdb/mail-auto-create-p 'bbdb-ignore-most-messages-hook
      bbdb-change-hook 'bbdb-timestamp-hook
      bbdb-auto-notes-alist
      '(("Subject" (".*" last-subj 0 t))
        ("From" ("@filosofi.gu.se" company "University of Gothenburg, Department of Philosopy, Linguistics, and Theory of Science"))
        ("From" ("@gslt.hum.gu.se" company "University of Gothenburg, Department of Philosopy, Linguistics, and Theory of Science, Swedish National Graduate School of Language Technology"))
        ("From" ("@flov.gu.se" company "University of Gothenburg, Department of Philosopy, Linguistics, and Theory of Science"))
        ("From" ("@ling.gu.se" company "University of Gothenburg, Department of Philosopy, Linguistics, and Theory of Science"))
        ("From" ("@cling.gu.se" company "University of Gothenburg, Educational Programme in Language Technology, Department of Philosopy, Linguistics, and Theory of Science"))
        ("From" ("@cs.chalmers.se" company "Chalmers University of Technology, Department of Computer Science and Engineering "))
        ("From" ("@sics.se" company "SICS"))
        ("From" ("@svenska.gu.se" company "University of Gothenburg, Department of Swedish Language"))
        ("Organization" (".*" company 0 t)))
      bbdb-notice-hook 'bbdb-auto-notes-hook
      bbdb-ignore-most-messages-alist
      '(("To" . "cl4rande")
        ("To" . "robert")
        ("To" . "robert\.andersson")
        ("To" . "robert\.adesam")
        ("To" . "ra@c?ling")
        ("Cc" . "cl4rande")
        ("Cc" . "ra@c?ling")))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; NXML and NXHTML
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;; Use as external editor when
(setq as-external-alist 
      '(("/itsalltext/.*wiki" as-external-for-wiki)
        ("www\\.blogger\\.com.*\\.txt" as-external-its-all-text-default)
        (as-external-its-all-text-regexp as-external-its-all-text-default))
      nxml-slash-auto-complete-flag t)

;; mumamo, like mumin
(add-hook 'nxhtml-mumamo-mode-hook
          (lambda ()
            (setq nxhtml-validation-header-if-mumamo 1)
;;            (nxhtml-validation-header-mode 1)
            (rng-validate-mode nil)
            (mumamo-post-command)))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; LaTeX
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(setq TeX-PDF-mode t
      font-latex-title-fontify 'color      ; this gets rid of
      font-latex-title-fontity 'color      ; the large fonts
      font-latex-fontify-sectioning 'color ; in sections etc
      TeX-output-view-style
      (cond 
       ((eq system-type 'darwin) 
        (quote 
         (("^pdf$" "." "open -a preview %s.pdf")
          ("^html?$" "." "open %o"))))
       ((eq system-type 'windows-nt)
        (quote
         (("^pdf$" "." "\"C:/Program Files/SumatraPDF/SumatraPDF.exe\" %o")
          ("^html?$" "." "start %o"))))
       ((eq system-type 'gnu/linux)
        (quote
         (("^pdf$" "." "okular %s.pdf")
          ("^html?$" "." "open %o"))))))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; GPG
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(require 'epa-setup)
(setq epg-gpg-program "gpg") ; why?

;; hack to setenv GnuPG info in Emacs 23 on Mac,
;; TODO: need alternative solution

;; (setq ra/gpg-agent-info-file "~/.gpg-agent-info")
;; (defun ra/gpg-agent-info-from-file (file)
;;   "Reads the GnuPG agent info file and returns a list"
;;   (with-temp-buffer
;;     (insert-file-contents file)
;;     (split-string (buffer-string) "\n" t)))
;; (defun ra/gpg-agent-info (file)
;;   "Sets environment variables in the GnuPG agent info file"
;;   (mapcar '(lambda (gpg-info-pair) 
;;              (setenv (nth 0 gpg-info-pair) (nth 1 gpg-info-pair)))
;;            (mapcar '(lambda (gpg-info-row)
;;                       (split-string gpg-info-row "=" t))
;;                    (ra/gpg-agent-info-from-file file))))
;; (if (and (eq system-type 'darwin)
;;          (file-readable-p ra/gpg-agent-info-file))
;;     (ra/gpg-agent-info ra/gpg-agent-info-file)
;;   )

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Mairix Search
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(require 'mairix)
(setq mairix-file-path "~/mail"
      mairix-mail-program (quote vm)
      mairix-search-file "search")

;; Redefined 20110518
(defun mairix-call-mairix (query file threads)
  "Call Mairix with QUERY and output FILE.
If FILE is nil, use default.  If THREADS is non-nil, also return
whole threads.  Function returns t if messages were found."
  (let* ((commandsplit (split-string mairix-command))
         (args (cons (car commandsplit)
                     `(nil ,(get-buffer-create mairix-output-buffer) nil)))
         rval)
    (with-current-buffer mairix-output-buffer
      (erase-buffer))
    (when (> (length commandsplit) 1)
      (setq args (append args (cdr commandsplit))))
    (when threads
      (setq args (append args '("-t"))))
    (when (stringp query)
      (setq query (split-string query)))
    (setq mairix-last-search (list (mapconcat 'identity query " ")
                                   file threads))
    (when (not file)
      (setq file mairix-search-file))
    (setq file
          (concat
           (file-name-as-directory
            (expand-file-name
             mairix-file-path))
           file))
    ;; Filter to prune away the c:/cygwin part from file added by
    ;; expand-file-name on Windows-NT Emacs 23.2. See blog post on URL
    ;; http://robert-adesam.blogspot.com/2011/05/mairix-on-windows-nt-emacs.html
    ;; for more info.
    (if (eq system-type 'windows-nt)
        (setq file
              (replace-regexp-in-string "^c:/cygwin class="string">" "" file)))
    (setq rval
          (apply 'call-process
                 (append args (list "-o" file) query)))
    (if (zerop rval)
        (with-current-buffer mairix-output-buffer
          (goto-char (point-min))
          (re-search-forward "^Matched.*messages")
          (message (match-string 0)))
      (if (and (= rval 1)
               (with-current-buffer mairix-output-buffer
                 (goto-char (point-min))
                 (looking-at "^Matched 0 messages")))
          (message "No messages found")
        (error "Error running Mairix.  See buffer %s for details"
               mairix-output-buffer)))
    (zerop rval)))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Org-mode and remember
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(require 'org-install)

;; functions for special org-files
(defun ra/gtd ()
   (interactive)
   (find-file 
    (cond
     ((eq system-type 'windows-nt)
      "c:/Users/robert/My Dropbox/gtd/tasks.org")
     ((eq system-type 'darwin)
      "~/gtd/tasks.org")
     ((eq system-type 'gnu/linux)
      "~/gtd/tasks.org")))
   (delete-other-windows))
(defun ra/note ()
  (interactive)
   (find-file
    (cond
     ((eq system-type 'windows-nt)
      "c:/Users/robert/My Dropbox/gtd/notes.org")
     ((eq system-type 'darwin)
      "~/gtd/notes.org")
     ((eq system-type 'gnu/linux)
      "~/gtd/notes.org")))
   (delete-other-windows))
(defun ra/review ()
   (interactive)
   (find-file
    (cond
     ((eq system-type 'windows-nt)
      "c:/Users/robert/My Dropbox/gtd/review.org")
     ((eq system-type 'darwin)
      "~/gtd/review.org")
     ((eq system-type 'gnu/linux)
      "~/gtd/review.org")))
   (delete-other-windows))
(defun ra/order ()
  (interactive)
  (find-file "~/Documents/admin/orders.org")
  (delete-other-windows))
(defun ra/gtd-inbox ()
  (interactive)
  (find-file
   (cond
     ((eq system-type 'windows-nt)
      "c:/Users/robert/My Dropbox/gtd/inbox.org")
     ((eq system-type 'darwin)
      "~/gtd/inbox.org")
     ((eq system-type 'gnu/linux)
      "~/gtd/inbox.org")))
  (delete-other-windows))

;; main org directory
(setq org-directory
      (cond
       ((eq system-type 'windows-nt)
        "c:/Users/robert/My Dropbox/gtd")
       ((eq system-type 'darwin)
        "~/gtd")
       ((eq system-type 'gnu/linux)
        "~/gtd")))

;; misc setup
(setq org-modules
      '(org-bbdb org-bibtex org-crypt)
      ;; how to archive
      org-archive-location "archive/%s.old::* Archive"
      ;; logging
      org-log-done nil ; using the logbook instead
      org-log-into-drawer "LOGBOOK"
      org-clock-into-drawer t
      ;; refiling
      org-refile-targets
      '(("someday.org" :level . 1)
        ("inbox.org" :level . 1)
        ("tasks.org" :level . 1)
        ("projects.org" :maxlevel . 2))
      ;; setup todo keywords and efforts
      org-todo-keywords 
      '("TODO(t!)" "NEXT(n!)" "WAITING(w@/!)" "|" "CANCELLED(c@)" "DEFERRED(m@)" "DONE(d!)")
      org-effort-property "effort"
      org-global-properties 
      '(("effort_ALL" . "0:10 0:30 1:00 2:00 3:00 4:00 5:00 6:00 8:00"))
      ;; global tags
      org-tag-alist
      '(("@home" . ?h)
        ("@office" . ?o)
        ("@phone" . ?p)
        ("@cms" . ?w)
        ("@computer" . ?c)
        ("@errands" . ?e)
        ("@bvc" . ?b)
        ("@ltlunch" . ?l)
        ("@2020" . ?2)
        ("someday" . ?s)
        ("@gul" . ?g)
        ("flov" . ?f))
      ;; blank lines
      org-cycle-separator-lines 2
      org-blank-before-new-entry
      '((heading)
        (plain-list-item))
      ;; links
      org-link-mailto-program '(vm-mail "%a" "%s")
      org-email-link-description-format "Email %c: %.50s"
      org-link-frame-setup
      '((vm . vm-visit-folder)
        (gnus . gnus)
        (file . find-file-other-window)))

;; agenda setup
(setq org-agenda-files
      ;; add notes.org?
      (cond
       ((eq system-type 'windows-nt)
        (list
         "c:/Users/robert/My Dropbox/gtd/inbox.org"
         "c:/Users/robert/My Dropbox/gtd/tasks.org"
         "c:/Users/robert/My Dropbox/gtd/projects.org"))
       ((eq system-type 'darwin)
        (list
         "~/gtd/inbox.org"
         "~/gtd/tasks.org"
         "~/gtd/projects.org"))
       ((eq system-type 'gnu/linux)
        (list
         "~/gtd/inbox.org"
         "~/gtd/tasks.org"
         "~/gtd/projects.org"))))

(setq org-agenda-include-diary t
      org-agenda-include-all-todo t
      org-columns-default-format "%60ITEM %TODO %TAGS %6effort(EFFORT){:} class="string">"
      org-tags-column -90)

;; custom agenda commands
(setq org-agenda-custom-commands
      '(("i" "Inbox entries" tags "CATEGORY=\"Stuff\"")))

;; higiligt the cursor row in agenda view
(add-hook 'org-agenda-mode-hook 
          (lambda ()
            (hl-line-mode t)
            (local-set-key (kbd "r") 'org-agenda-refile)
            (local-set-key (kbd "R") 'org-agenda-redo)))

;; adding shortcuts
(add-hook 'org-mode-hook 
          (lambda () 
            (auto-fill-mode 1)
            (local-set-key (kbd "C-c t") 'org-todo)
            (local-set-key (kbd "C-c e") 'org-set-effort)
            (local-set-key (kbd "C-c i") 'ra/gtd-inbox)
            (local-set-key (kbd "C-c C-r") 'org-decrypt-entry)))

;; publish web pages
(require 'org-publish)
(setq org-publish-project-alist
      '(("org-web"
         :base-directory "~/web"
         :base-extension "org"
         :publishing-directory "/Volumes/robert/.www"
         :recursive t
         :publishing-function org-publish-org-to-html
         :headline-levels 4
         :auto-preamble t)
        ("org-web-static"
         :base-directory "~/web"
         :base-extension "css\\|js\\|png\\|jpg\\|jpeg\\|gif\\|pdf\\|mp3\\|ogg\\|swf"
         :publishing-directory "/Volumes/robert/.www"
         :recursive t
         :publishing-function org-publish-attachment)
        ("web" :components ("org-web" "org-web-static"))))

;; latex export
(setq org-export-latex-classes
      '(("article"
         "\\documentclass{article}
\\usepackage[utf8x]{inputenc}
\\usepackage{graphicx}
\\usepackage{longtable}
\\usepackage{hyperref}
\\usepackage[swedish]{babel}"
         ("\\section{%s}" . "\\section*{%s}")
         ("\\subsection{%s}" . "\\subsection*{%s}")
         ("\\subsubsection{%s}" . "\\subsubsection*{%s}")
         ("\\paragraph{%s}" . "\\paragraph*{%s}")
         ("\\subparagraph{%s}" . "\\subparagraph*{%s}"))))

;; remember-mode is since org-mode version 7 replaced by org-capture
(setq org-default-notes-file (concat org-directory "/inbox.org"))
(setq org-capture-templates
      '(("y" "Task" entry
         (file+headline "inbox.org" "Inbox")
         "* TODO %^{description} %^g%^{effort}p\n  :LOGBOOK:\n  - State \"TODO\"       from \"\"           %U\n  :END:\n\n  %?%i \n  :%a: class="string">")
        ("t" "Task woL" entry
         (file+headline "inbox.org" "Inbox")
         "* TODO %^{description} %^g%^{effort}p\n  :LOGBOOK:\n  - State \"TODO\"       from \"\"           %U\n  :END:\n\n  %?%i \n")
        ("s" "Someday" entry
         (file+headline "inbox.org" "Inbox")
         "* %^{description} :someday:%^g%^{effort}p\n  :PROPERTIES:\n  :added:    %U\n  :END:\n\n  %?%i \n")))

;; We also want to be able to encrypt subtrees in org-mode, requires
;; the epa-setup package
(require 'org-crypt)
(org-crypt-use-before-save-magic)
(setq org-crypt-key "93A4BE9DEAB7218E")

;; Org-babel
(require 'org-babel-init)

;; Load babel support for Emacs lisp
(require 'org-babel-emacs-lisp)

;; Load helper functions etc
(org-babel-load-library-of-babel)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Org-VM-Mairix
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;; Add mairix as new link type in org
(org-add-link-type "mairix" 'ra/org-vm-mairix-open)
(add-hook 'org-store-link-functions 'ra/org-vm-store-mairix-link)

;; Store link as mairix search for message ID
;; Most from org-vm-store-link in org-vm.el, stripped and modded
(defun ra/org-vm-store-mairix-link ()
  "Store a link to the current VM message as a Mairix search for
  its Message ID." 
  (when
      (and (or (eq major-mode 'vm-summary-mode)
               (eq major-mode 'vm-presentation-mode))
           (save-window-excursion
             (vm-select-folder-buffer) buffer-file-name))
    (and (eq major-mode 'vm-presentation-mode)
         (vm-summarize))
    (vm-follow-summary-cursor)
    (save-excursion
      (vm-select-folder-buffer)
      (let* (;; Collect properties
             (message (car vm-message-pointer))
             (subject (vm-su-subject message))
             (from (vm-get-header-contents message "From"))
             (to (vm-get-header-contents message "To"))
             (message-id (vm-su-message-id message))
             (link (org-make-link 
                    "mairix: class="string">"
                    (format "m:%s class="string">"
                            (org-remove-angle-brackets message-id)))))
        ;; TODO: Store even more properties so
        ;; org-email-link-description-format could be used in full
        (org-store-link-props :from from
                              :to to
                              :subject subject
                              :link link)
        (org-add-link-props :description (org-email-link-description))
        ;; Save mail folder and update the mairix db
        (vm-save-folder)
        (mairix-update-database) ; Make sure mairix-synchronous-update
                                 ; is nil, default, so we do not have
                                 ; to wait
        ;; TODO: Suppress message from
        ;; mairix-sentinel-mairix-update-finished
        link))))

;; Open the mairix link, making use of mairix.el to make the search
;; and display the results
(defun ra/org-vm-mairix-open (msearch)
  "Search for messages with mairix, and display them in a VM
  folder. This requires a proper mairix.el setup."
  (mairix-search msearch t))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; SQL-mode
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(setq sql-sqlite-program "sqlite3")

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; No more debug on error
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(setq debug-on-error nil)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Temp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;; while working on the mailmove project
(setq auto-mode-alist
      (append
       '(("\\.gu.se$" . org-mode)
         ) auto-mode-alist))