;; set loadpath for site lisp files
; (setq load-path (cons "~/.emacs.d/" load-path))

(require 'package)
(add-to-list 'package-archives
  '("melpa" . "http://melpa.milkbox.net/packages/") t)
(add-to-list 'package-archives
             '("marmalade" . "http://marmalade-repo.org/packages/"))
(package-initialize)

(defvar my-packages '(
                      haskell-mode
                      hippie-expand-haskell
;                      clojure-mode
;                      clojure-test-mode
;                      cider
                      flycheck
                      flycheck-color-mode-line
                      ido-ubiquitous
                      swbuff-x
                      cmake-mode
                      rfringe
                      flymake
                      flymake-easy
                      flymake-cursor
                      flymake-haskell-multi
                      flyspell-lazy
                      auctex
                      unfill
                      ))

(dolist (p my-packages)
  (when (not (package-installed-p p))
    (package-install p)))

;; do not show toolbar
(tool-bar-mode -1)
;; remove trailing spaces
(add-hook 'before-save-hook 'delete-trailing-whitespace)
;;
;; We dont't want a startup message
(setq-default inhibit-startup-message t)

;; get rid of tabs
(setq-default indent-tabs-mode nil)
(setq-default tab-width 2)
(standard-display-ascii ?\t "   ↦   ") ; show tabs with ^I

;; case insensitive search (should be default but is not for some reason)
(setq case-fold-search t)

;; completion in minibuffer
(ido-mode t)
(ido-ubiquitous-mode t)

;; Enable auto revert
(global-auto-revert-mode 1)

;; make pageDown etc move cursor to top and bottom
(setq scroll-error-top-bottom t)

;; Makes things a little bit more consistent.
(fset 'yes-or-no-p 'y-or-n-p)
;; hippie expand
;(global-set-key (kbd "<C-SPC>") (quote hippie-expand))
(global-set-key (kbd "<C-return>") (quote hippie-expand))

;; use always c++ mode on h files
(setq auto-mode-alist (append '(("\\.[Hh]$" . c++-mode)) auto-mode-alist ))



;; Desktop Session Management
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; using desktop with
; customization from http://stackoverflow.com/questions/847962/what-alternate-session-managers-are-available-for-emacs

(defvar my-desktop-session-dir
  (concat (getenv "HOME") "/.emacs.d/desktop-sessions/")
  "*Directory to save desktop sessions in")

(defvar my-desktop-session-name-hist nil
  "Desktop session name history")

(defun my-desktop-save (&optional name)
  "Save desktop with a name."
  (interactive)
  (unless name
    (setq name (my-desktop-get-session-name "Save session as: ")))
  (make-directory (concat my-desktop-session-dir name) t)
  (desktop-save (concat my-desktop-session-dir name) t))



(defun my-desktop-read (&optional name)
  "Read desktop with a name."
  (interactive)
  (unless name
    (setq name (my-desktop-get-session-name "Load session: ")))
  (desktop-read (concat my-desktop-session-dir name)))

(defun my-desktop-get-session-name (prompt)
  (completing-read prompt (and (file-exists-p my-desktop-session-dir)
                               (directory-files my-desktop-session-dir))
                   nil nil nil my-desktop-session-name-hist))

(global-set-key (kbd "<f2>") 'my-desktop-save)
(global-set-key (kbd "<f3>") 'my-desktop-read)
(desktop-save-mode 1)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


;; Buffer switching (swbuff-x)
;; exclude internal buffers
(setq-default swbuff-exclude-buffer-regexps '("^ " "^\*.*\*"))
;; go through buffers
(setq-default swbuff-clear-delay 0.7)
(global-set-key (kbd  "<f7>") 'swbuff-switch-to-next-buffer)
(global-set-key (kbd  "<S-f7>") 'swbuff-switch-to-previous-buffer)


(set-fringe-mode '( 4 . 6 ))
;;;;;;;;; FlyMake ;;;;;;;;;;;;;;;;;;;
;; (global-set-key [f3] 'flymake-goto-next-error)
;; (global-set-key [f4] 'flymake-display-err-menu-for-current-line)
(global-set-key "\C-cm" 'flymake-mode)
(global-set-key (kbd "<f4>") 'flymake-goto-next-error)

;(setq flymake-buildfile-dirs (list "cmake/" "./" "../"))
;(setq flymake-buildfile-dirs (list "./" "../"))
(setq flymake-no-changes-timeout 0.7)
(setq flymake-max-parallel-syntax-checks 4)
(setq flymake-run-in-place t)
;; This lets me say where my temp dir is.
; (setq temporary-file-directory "~/.emacs.d/tmp/")
(setq flymake-number-of-errors-to-display 4)

;; ;; Indent
; indent->C-M-\.
(global-set-key (kbd "C-c d") 'comment-region)
(global-set-key (kbd "C-c D") 'uncomment-region)


(global-set-key "\C-cf" 'flyspell-mode)
(global-set-key "\C-cF" 'flyspell-buffer)

;;;;;;;;;;;;;;;;;;;; Compilation ;;;;;;;;;;;;;;;;;;;;
(setq compilation-last-buffer nil)
; do not ask for save
(setq compilation-ask-about-save nil)
(defun compile-again (pfx)
  """Run the same compile as the last time.

If there was no last time, or there is a prefix argument, this acts like
M-x compile.
"""
 (interactive "p")
 (if compilation-ask-about-save (save-some-buffers) (save-some-buffers 1))
 (if (and (eq pfx 1)
          compilation-last-buffer)
     (progn
       (set-buffer compilation-last-buffer)
       (revert-buffer t t))
   (call-interactively 'compile)))

;; Compile
(global-set-key (kbd "<f5>") 'compile-again)
;; set makefile and specify targets
(global-set-key (kbd "C-c C") 'compile)
;; next error

(global-set-key (kbd "<f8>") 'next-error)

(global-set-key (kbd "<S-f4>") 'flycheck-next-error)

;(setq compilation-ask-about-save t)
;; make compiler in a new frame.
;(setq special-display-buffer-names
;      (cons "*compilation*" special-display-buffer-names))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


;;;;;;;;;;;;;;;;;;;; jump between parentheses ;;;;;;;;;;;;;;;;;;;;
;; Made by Joe Casadonte (joc)
(defun joc-bounce-sexp ()
  "Will bounce between matching parens just like % in vi"
  (interactive)
  (let ((prev-char (char-to-string (preceding-char)))
        (next-char (char-to-string (following-char))))
        (cond ((string-match "[[{(<]" next-char) (forward-sexp 1))

   ((string-match "[\]})>]" prev-char) (backward-sexp 1))
                  (t (error "%s" "Not on a paren, brace, or bracket")))))
(global-set-key (kbd "C-=") 'joc-bounce-sexp)
(show-paren-mode t)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;



