;; init.el Time-stamp: <2014-06-28 17:56:43 (djcb)>
;; Copyright (C) 1996-2014  Dirk-Jan C. Binnema.

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
;; include paths / dirs
(add-to-list 'load-path (expand-file-name "~/.emacs.d/init"))
(add-to-list 'load-path (expand-file-name "~/.emacs.d/site-lisp"))
(add-to-list 'load-path (expand-file-name "~/.emacs.d/site-lisp/themes"))
(add-to-list 'custom-theme-load-path
             (expand-file-name "~/.emacs.d/site-lisp/themes/"))

(defvar djcb-current-theme nil "The current theme")
(defconst djcb-cache-dir (expand-file-name "~/.emacs.d/cache/")
  "dir with volatile data")
(defconst djcb-data-dir  (expand-file-name "~/.emacs.d/data/")
  "dir for user data")
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
;; general settings
(menu-bar-mode -1)                       ;; show the menu...
(display-time-mode -1)                   ;; don't need time
(tool-bar-mode -1)
(blink-cursor-mode 0)

(setq
  next-line-add-newlines nil             ;; don't add newlines autom'ly when
  require-final-newline t)               ;; end files with a newline
  
(file-name-shadow-mode t)                ;; be smart about filenames in mbuf
(setq use-file-dialog nil)               ;; never show the dialog

(setq-default
  cursor-type '(hbar . 2)                 ;; normal cursor, a double-"_"
  cursor-in-non-selected-windows 'hollow) ;; hollow cursor when non-selected

(scroll-bar-mode -1)
(set-fringe-mode '(1 .  1))              ;; emacs 22+
(delete-selection-mode t)                ;; delete selection upon keypress

(setq search-highlight t                 ;; highlight when searching...
      query-replace-highlight t)             ;; ...and replacing
(fset 'yes-or-no-p 'y-or-n-p)            ;; enable y/n answers to yes/no

(setq
 confirm-nonexistent-file-or-buffer nil  ;; not needed
 completion-ignore-case t                ;; ignore case when completing...
 read-file-name-completion-ignore-case t) ;; ...filenames too

(setq inhibit-startup-message t              ;; don't show ...
      inhibit-startup-echo-area-message t    ;; ... startup messages
      initial-scratch-message
      ";; I am your editor. Please describe your program.\n")

;; attempt to unbreak compose-key
(setenv "XMODIFIERS" "@im=none")
(setenv "GTK_IM_MODULE" "xim")

;; some stuff to allow
(put 'downcase-region 'disabled nil)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; general keybindings
(global-set-key (kbd "<f12>")                                ;; switch to ...
  (lambda()(interactive)                                     ;; ... *scratch*
    (switch-to-buffer (get-buffer-create "*scratch*"))))
 
(global-set-key (kbd "<C-prior>")                  ;; -> buffer start
 (lambda()(interactive)(goto-char(point-min))))
(global-set-key (kbd "<C-next>")                   ;; -> buffer end
  (lambda()(interactive)(goto-char(point-max))))

;; these are useful also outside programming modes
(global-set-key (kbd "C-<f7>") 'compile)                     ;; compile
(global-set-key (kbd "C-<f8>") 'comment-or-uncomment-region) ;; (un)comment
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
;; minibuffer
(setq
 enable-recursive-minibuffers nil      ;;  don't allow mb cmds in the mb
 max-mini-window-height 3              ;;  max 3 lines
 minibuffer-scroll-window t            ;;  C-M-v scrolls....
 resize-mini-windows t)
 
(icomplete-mode t)                     ;; completion in minibuffer
(setq
 icomplete-prospects-height 2          ;; don't spam my minibuffer
 icomplete-compute-delay 0)            ;; don't wait
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; mode-line / frame
(setq frame-title-format '( "%b" " [" (:eval mode-name) "]"))
(require 'djcb-modeline nil 'noerror)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; hl-line: highlight the current line
(require 'hl-line)
(global-hl-line-mode nil) ;; turn it on for all modes by default
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;  
;; http://www.emacswiki.org/cgi-bin/wiki/ShowParenMode
(require 'paren)
(show-paren-mode t)
(setq show-paren-style 'parentheses)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;  
;; i want cua's rectangle-selection mode
(cua-selection-mode 1)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;  

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
;; hippie-expand
(global-set-key (kbd "M-/") 'hippie-expand)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
;; abbrevs (abbreviations)
(setq abbrev-file-name                 ;; tell emacs where to read abbrev
  (concat djcb-data-dir "abbrev_defs")) ;; definitions from...
(abbrev-mode t)                        ;; enable abbrevs (abbreviations) ...
(setq default-abbrev-mode t            ;; turn it on
  save-abbrevs t)                      ;; don't ask
(when (file-exists-p abbrev-file-name)
  (quietly-read-abbrev-file))          ;;  don't tell
(require 'djcb-abbrevs nil 'noerror)   ;; load our custom abbrevs
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
;; opacity / font size
(defun djcb-opacity-modify (&optional dec)
  "modify the transparency of the emacs frame; if DEC i t,
    decrease the transparency, otherwise increase it in 10%-steps"
  (let* ((alpha-or-nil (frame-parameter nil 'alpha)) ; nil before setting
          (oldalpha (if alpha-or-nil alpha-or-nil 100))
          (newalpha (if dec (- oldalpha 5) (+ oldalpha 5))))
    (when (and (>= newalpha frame-alpha-lower-limit) (<= newalpha 100))
      (modify-frame-parameters nil (list (cons 'alpha newalpha))))))

(global-set-key (kbd "C-8") '(lambda()(interactive)(djcb-opacity-modify)))
(global-set-key (kbd "C-9") '(lambda()(interactive)(djcb-opacity-modify t)))
(global-set-key (kbd "C-0")
  '(lambda()(interactive) (modify-frame-parameters nil `((alpha . 100)))))

;; font size
(global-set-key (kbd "C-+") 'text-scale-increase)
(global-set-key (kbd "C--") 'text-scale-decrease)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
;; bookmarks
;;    ‘C-x r m’ – set a bookmark at the current location (e.g. in a file)
;;    ‘C-x r b’ – jump to a bookmark
;;    ‘C-x r l’ – list your bookmarks
;;    ‘M-x bookmark-delete’ – delete a bookmark by name
(setq
  bookmark-default-file (concat djcb-cache-dir "bookmarks")
  bookmark-save-flag 1) ;; autosave each change
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
;; packages
(setq package-archives
  '(("ELPA"       . "http://tromey.com/elpa/")
     ("gnu"       . "http://elpa.gnu.org/packages/")
     ("sunrise"   . "http://joseito.republika.pl/sunrise-commander/")
     ("marmalade" . "http://marmalade-repo.org/packages/")
     ;;("melpa"      . "http://melpa.milkbox.net/packages/")
     ))
(setq package-user-dir (expand-file-name "~/.emacs.d/elpa"))
(package-initialize)

(global-set-key (kbd "C-c p")
  (lambda () (interactive)
    (let ((buf (get-buffer "*Packages*")))
      (if buf
        (switch-to-buffer buf)
        (package-list-packages)))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
;; ido
(require 'djcb-ido)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
;; w3m / browsing settings
(setq w3m-init-file (concat user-emacs-directory "init/djcb-w3m.el")
  browse-url-browser-function (quote browse-url-generic) 
  browse-url-generic-program "firefox"
  browse-url-generic-args '("-P" "default" "-new-tab")
  url-configuration-directory (concat djcb-cache-dir "url"))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; helm -- locate a file using helm (aka anything) locate
(when (require 'helm nil 'noerror)
  (require 'helm-buffers)
  (require 'helm-locate)
  (require 'helm-bookmark)
  (require 'helm-files)
  (setq
    helm-boring-buffer-regexp-list '("^diary$")
    helm-boring-file-regexp-list
    '("\\.git$" "\\.hg$" "\\.svn$"  "^\\."  "\\.$"
       "\\.\\.$" "\\.Plo$" "\\.lo$"  "_source.*"
       "_8h.*"  "\\.CVS$" "\\._darcs$"  "\\.la$"
       "\\.o$" "~$"  "^#.*")
    helm-buffer-max-length 20
    helm-idle-delay 2.0
    helm-find-files-show-icons t
    helm-quick-update t
    helm-candidate-number-limit 20
    helm-use-standard-keys nil
    helm-locate-case-fold-search t
    helm-locate-command "locate -e -b %s -r %s")
 
  (global-set-key (kbd "C-x b")
    (lambda () (interactive)
      (ignore-errors
        (helm :prompt "Location:"
          :sources '( helm-source-buffers-list
                      helm-source-locate
                      helm-source-bookmarks
                      helm-source-recentf
                      helm-source-files-in-current-dir))))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; searching / replace
;; uppercase meanse regexp
(global-set-key (kbd "S-C-S") 'isearch-forward-regexp)
(global-set-key (kbd "S-C-R") 'isearch-backward-regexp)
;; also: M-% --> query-replace, C-M-% --> query-replace-regexp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
;; time-stamps 
(setq ;; when there's "Time-stamp: <>" in the first 10 lines of the file
  time-stamp-active t        ; do enable time-stamps
  time-stamp-line-limit 10   ; check first 10 buffer lines for Time-stamp: <>
  time-stamp-format "%04y-%02m-%02d %02H:%02M:%02S (%u)") ; date format
(add-hook 'write-file-hooks 'time-stamp) ; update when saving
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; magit -- marius' magic git mode
(autoload 'magit-status "magit" "Magit status." t)
(global-set-key (kbd "C-<f6>") 'magit-status) ;; magit
(add-hook 'magit-log-edit-mode-hook
  (lambda ()
    (set-fill-column 72)))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; dired/dired-x/sunrise-commander
(setq
  dired-omit-files-p t
  dired-omit-files "^\\.?#\\|^\\." ;; omit /all/ dot-files in dired
  dired-listing-switches "-l -a --dired --group-directories-first -h -G"
  dired-no-confirm '(byte-compile chgrp chmod chown
                      copy delete load move symlink))
(require 'sunrise-commander nil 'noerror)
;; dired-x is include in emacs, but not loaded by default
(add-hook 'dired-load-hook (lambda () (load "dired-x")))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ace-jump;; http://www.emacswiki.org/emacs/AceJump
(when (require 'ace-jump-mode nil 'noerror)
  ;; (define-key global-map (kbd "C-c SPC") 'ace-jump-mode)
  ;; (define-key global-map (kbd "<pause>") 'ace-jump-mode)
  (define-key global-map (kbd "<M-return>") 'ace-jump-mode))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Tex/LaTeX->AUCTeX
(when (load "auctex.el" nil t t)
  (add-hook 'LaTeX-mode-hook
       (lambda()
         (add-to-list 'TeX-command-list
           '("XeLaTeX" "%`xelatex%(mode)%' %t" TeX-run-TeX nil t))
         (setq TeX-command-default "XeLaTeX")
         (setq TeX-save-query nil)
         (setq TeX-show-compilation t))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; general programming
(defun djcb-gtags-create-or-update ()
  "Create or update the GNU-Global tag file"
  (interactive
  (if (zerop (call-process "global" nil nil nil "-p"))
    ;; case 1: tag file exists: update
    (progn
      (shell-command "global -u -q 2>/dev/null")
      (message "Tagfile updated"))
    ;; case 2: no tag file yet: create it
    (when (yes-or-no-p "Create tagfile?")
      (let ((olddir default-directory)
             (default-directory
               (read-directory-name
                 "gtags: top of source tree:" default-directory)))
        (shell-command "gtags -i -q 2>/dev/null")
        (message "Created tagfile"))))))

(add-hook 'prog-mode-hook
  (lambda ()   
          
    ;; ggtags
    (when (require 'ggtags nil 'noerror)                ; enable gnu-global
      (ggtags-mode t)
      (local-set-key (kbd "C-c .") 'ggtags-grep)
      (local-set-key (kbd "M-,")   'ggtags-find-reference)
      (when (fboundp 'djcb-gtags-create-or-update)
        (djcb-gtags-create-or-update)))         ; auto-update tags
    ;; rainbow
    (when (require 'rainbow-delimiters nil 'noerror)
      (rainbow-delimiters-mode))
    
    ;; yasnippet mode
    (defvar djcb-yas-loaded nil)
    (when (require 'yasnippet nil 'noerror)
      (unless djcb-yas-loaded
        (yas-reload-all)
        (setq djcb-yas-loaded t))
      (yas-minor-mode-on))
    (require 'gtk-doc nil 'noerror)
     ;;))
    (setq linum-format " %04d ")
    ;; some handy key bindings
    (local-set-key (kbd "RET") 'newline-and-indent)))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; c/c++-programming
(defconst djcb-c-style
  '("linux"))
(c-add-style "djcb-c-style" djcb-c-style)
(defconst djcb-c++-style
  '("djcb-c-style"
     (c-offsets-alist . ((innamespace . [0])))))
(c-add-style "djcb-c++-style" djcb-c++-style)

(when (require 'ansi-color nil 'noerror)
  (defun stante-colorize-compilation-buffer ()
    "Colorize a compilation mode buffer.
Taken from http://stackoverflow.com/a/3072831/355252."
    (interactive)
    (when (eq major-mode 'compilation-mode)
      (let ((inhibit-read-only t))
        (ansi-color-apply-on-region (point-min) (point-max)))) 
    (add-hook 'compilation-filter-hook
      #'stante-colorize-compilation-buffer)))

;; Show the current function name in the header line
(which-function-mode)
 (setq-default header-line-format
              '((which-func-mode ("" which-func-format " "))))
(setq mode-line-misc-info
      ;; We remove Which Function Mode from the mode line, because it's mostly
      ;; invisible here anyway.
      (assq-delete-all 'which-func-mode mode-line-misc-info))
 
(defun djcb-c-mode ()
  "My c-mode settings"
  (font-lock-add-keywords nil                   ; add some extra
    '(("\\<\\(FIXME\\|TODO\\|XXX+\\|BUG\\|NOTE\\)" ; colorful
        1 font-lock-warning-face prepend)))     ; keywords
  (font-lock-add-keywords nil                   ;
    '(("\\<\\(__FUNCTION__\\|__LINE__\\)"       ;
        1 font-lock-preprocessor-face prepend)))
  
  ;; list these as pseudo comment symbols, so they don't stand out
  (font-lock-add-keywords nil                            
    '(("\\<\\(g_debug\\|g_warning\\|g_message\\|g_error\\)"
        1 font-lock-builtin-face prepend)))    
  (font-lock-add-keywords nil                            
    '(("\\<\\(g_return_if_fail\\|g_return_val_if_fail\\)"
        1 font-lock-builtin-face prepend)))     ;
  (font-lock-add-keywords nil                            
    '(("\\<\\(g_return_if_reached\\|g_return_val_if_reached\\)"
        1 font-lock-builtin-face prepend)))
  (font-lock-add-keywords nil                            
    '(("\\<\\(TRUE\\|FALSE\\|G_SOURCE_CONTINUE\\|G_SOURCE_REMOVE\\)"
        1 font-lock-constant-face prepend)))
    
  (setq
    c-auto-newline nil                  ;; auto-newline is annoying
    c-syntactic-indentation t           ;; indent smartly
    c-hungry-delete-key t               ;; eat as much as possible
    c-indent-tabs-mode nil              ;; use spaces, not tabs
    c-tab-always-indent t
    backward-delete-function nil)       ;; don't expand tabs w deleting
   
  ;; doxymacs
  (when (require 'doxymacs nil 'noerror)        ; enable doxygen
    (doxymacs-mode t)                           ;
    (doxymacs-font-lock))                       ;
  
  (add-to-list 'c-cleanup-list 'compact-empty-funcall)
  (add-to-list 'c-cleanup-list 'brace-else-brace)
  (add-to-list 'c-cleanup-list 'brace-elseif-brace)
  (add-to-list 'c-cleanup-list 'brace-catch-brace)
  (add-to-list 'c-cleanup-list 'defun-close-semi)
  (add-to-list 'c-cleanup-list 'list-close-comma)
  (add-to-list 'c-cleanup-list 'scope-operator)

   ;; keybindings
  (local-set-key (kbd "RET")        'c-context-line-break)
  (local-set-key (kbd "C-c <up>")   'previous-error)
  (local-set-key (kbd "C-c <down>") 'next-error)
  (local-set-key (kbd "C-c o")      'ff-find-other-file)
  (local-set-key (kbd "C-h C-g")    'gtk-lookup-symbol)
  (local-set-key (kbd "<M-return>") 'align-current)

  (setq whitespace-line-column 80))

(add-hook 'c-mode-hook
  (lambda ()
    (c-set-style "djcb-c-style")))
(add-hook 'c++-mode-hook
  (lambda ()
    (c-set-style "djcb-c++-style")
    (setq whitespace-line-column 100)))

(add-hook 'c-mode-common-hook 'djcb-c-mode) ; run before all c-modes
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 




;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; lisp/scheme-programming
(add-hook 'emacs-lisp-mode-hook
  (lambda ()
    "My settings for emacs-lisp mode."
    (setq emacs-lisp-docstring-fill-column 67)
    (setq mode-name "el")
    (local-set-key (kbd "C-<f7>") ;; overrides global C-f7 (compile)
      '(lambda()(interactive)
         (let ((debug-on-error t))
           (eval-buffer)
           (message "buffer evaluated"))))
    (setq lisp-indent-offset 2) ; indent with two spaces, enough for lisp
    (font-lock-add-keywords nil '(("^[^\n]\\{100\\}\\(.*\\)$"
                                    1 font-lock-warning-face prepend)))
    (font-lock-add-keywords nil
      '(("\\<\\(FIXME\\|TODO\\|XXX+\\|BUG\\|NOTE\\)"
          1 font-lock-warning-face prepend)))
    (font-lock-add-keywords nil
      '(("\\<\\(add-hook\\|setq\\)"
         1 font-lock-keyword-face prepend)))))

;; scheme / geiser
(add-hook 'scheme-mode-hook
  (lambda ()
    (interactive)
    (when (require 'geiser-install nil 'noerror)
      (setq
        geiser-impl-installed-implementations '(guile)
        geiser-active-implementations '(guile)
        geiser-guile-init-file "~/.guile"
        geiser-repl-history-filename
        (concat djcb-cache-dir "geiser-history")))
    (require 'quack nil 'noerror)
    (geiser-mode)))

;; paredit
(defun djcb-paredit ()
  (when (require 'paredit nil 'noerror)
    (paredit-mode t)))
(add-hook 'lisp-mode-hook    'djcb-paredit)
(add-hook 'scheme-mode-hook  'djcb-paredit)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; makefiles
(add-hook 'makefile-mode-hook
  (lambda()
    (setq whitespace-style '(face trailing tabs))
    (whitespace-mode)))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;compilation
;; http://www.emacswiki.org/cgi-bin/wiki/ModeCompile
(setq
  compilation-scroll-output 'first-error      ;; scroll until first error
  compilation-read-command nil                ;; don't need enter
  compilation-window-height 12                ;; keep it readable
  compilation-auto-jump-to-first-error t      ;; jump to first error auto
  compilation-auto-jump-to-next-error t)      ;; jump to next error

;; http://stackoverflow.com/questions/11043004/emacs-compile-buffer-auto-close
(defun bury-compile-buffer-if-successful (buf str)
  "Bury a compilation buffer if succeeded without warnings "
  (if (and
        (string-match "compilation" (buffer-name buf))
        (string-match "finished" str)
        (not (with-current-buffer buf
               (save-excursion
                 (goto-char (point-min))
                 (search-forward "warning" nil t)))))
    (run-with-timer 5 nil
      (lambda (b)
        (with-selected-window (get-buffer-window b)
          (kill-buffer-and-window))) buf)))
(add-hook 'compilation-finish-functions 'bury-compile-buffer-if-successful)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
;; load when started with --org
;; ie. all my 'productivity' stuff -- mu4e and org
(add-to-list 'command-line-functions
  (lambda ()
    (when (string= "--org" argi)
      (require 'djcb-mu4e)
      (require 'djcb-org)
      (global-set-key (kbd "C-c a") 'org-agenda)
      ;; org-mode / productivity
      (global-set-key (kbd "<f6>")
        (lambda (&optional arg)
          "Keyboard macro."
          (interactive "p")
          (kmacro-exec-ring-item (quote ("aa" 0 "%d")) arg)))
      (fset 'next-actions "\C-cacn")
      (global-set-key (kbd "<f7>") 'next-actions) 
      (fset 'next-actions-not-at-home "\C-cacn/-h")
      (global-set-key (kbd "<s-f7>") 'next-actions-not-at-home)
      (fset 'todo "\C-cact")
      (global-set-key (kbd "<S-f7>")'todo) 
      (global-set-key (kbd "<f8>")  'org-capture)     ;; capture
      (global-set-key (kbd "<f5>")  'mu4e)
      ;; for the chrome edit-with-emacs
      (when (require 'edit-server nil t)
        (edit-server-start))      
      (server-start)
      (load-theme 'deeper-blue t nil)
      (mu4e))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
;; erc -- load when started with --erc ;; all the details are djcb-erc.el
(add-to-list 'command-line-functions
  (lambda ()
    (when (string= "--erc" argi)
      (require 'djcb-sauron)
      (require 'djcb-erc)
      (global-set-key (kbd "C-c s") 'sauron-toggle-hide-show)
      (global-set-key (kbd "C-c t") 'sauron-clear)
      (load-theme 'tango-dark t nil)
      (djcb-irc))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;  

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; use some theme
(when (require 'dream-theme nil 'noerror)
  (load-theme 'dream t nil))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;