;;;; Startup

;(package-initialize)

(setq gc-cons-threshold (* 500 100000))

(setq suggest-key-bindings nil)

(setq inhibit-splash-screen t
      inhibit-startup-echo-area-message t
      initial-scratch-message ""
      initial-major-mode 'text-mode)

(defun display-startup-echo-area-message ()
  (message ""))

;; Base

(setq ring-bell-function 'ignore) ; Disable beep & flash
(blink-cursor-mode 0)

;; No scroll bar
(when (boundp 'scroll-bar-mode)
  (scroll-bar-mode -1))

;; Title bar displays buffer
(setq frame-title-format "%b - Emacs")

;; Disable toolbar
(if (fboundp 'tool-bar-mode)
      (tool-bar-mode -1))

;; smoother scrolling
(setq scroll-margin 0
      scroll-conservatively 9999
      scroll-step 1)

;; Line settings and indicators
(setq visual-line-fringe-indicators '(left-curly-arrow right-curly-arrow))
(setq-default left-fringe-width nil)
(setq-default indicate-empty-lines t)

;; All yes or no prompts are y or n
(defalias 'yes-or-no-p 'y-or-n-p)

;; Never follow symlinks
(setq vc-follow-symlinks nil)

;;; Leave the OS clipboard alone (use evil's "+ and "* instead)
; Don't copy and paste to the clipboard
(setq select-enable-clipboard nil)
(setq x-select-enable-clipboard nil)
; Don't save to the clipboard on exit
(setq x-select-enable-clipboard-manager nil)

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

;; Save minibar history
(savehist-mode 1)
(setq savehist-additional-variables
      '(kill-ring search-ring regexp-search-ring))

;; Always show matching parens
(show-paren-mode t)

;; Save Window layout history
(winner-mode)

;; Backups (from https://stackoverflow.com/questions/151945/how-do-i-control-how-emacs-makes-backup-files/20824625#20824625)
(setq version-control t     ;; Use version numbers for backups.
      kept-new-versions 10  ;; Number of newest versions to keep.
      kept-old-versions 0   ;; Number of oldest versions to keep.
      delete-old-versions t ;; Don't ask to delete excess backup versions.
      backup-by-copying t)  ;; Copy all files, don't rename them.

(setq vc-make-backup-files t)   ;; Backup versioned files

;; Default and per-save backups go here:
(setq backup-directory-alist '(("" . "~/.emacs.d/backups/per-save")))

(defun force-backup-of-buffer ()
  ;; Make a special "per session" backup at the first save of each
  ;; emacs session.
  (when (not buffer-backed-up)
    ;; Override the default parameters for per-session backups.
    (let ((backup-directory-alist '(("" . "~/.emacs.d/backups/per-session")))
          (kept-new-versions 3))
      (backup-buffer)))
  ;; Make a "per save" backup on each save.  The first save results in
  ;; both a per-session and a per-save backup, to keep the numbering
  ;; of per-save backups consistent.
  (let ((buffer-backed-up nil))
    (backup-buffer)))

(add-hook 'before-save-hook  'force-backup-of-buffer)

;; Autosave files
(setq auto-save-file-name-transforms
          `((".*" , "~/.emacs.d/backups/auto-saves" t)))

;; remember cursor position
(toggle-save-place-globally)

;; Search all buffers
(defun grep-search-all-buffers (regexp)
  (interactive "sRegexp: ")
  (multi-occur-in-matching-buffers "." regexp t))

;; Tags
(defvar tags-generator (expand-file-name "ctags" user-emacs-directory))
;; TODO different tags things for Windows and Linux
(defun create-tags (dir-name)
  "Create tags file."
  (interactive "DDirectory: ")
  (shell-command
   (format "\"%s\" -f \"%s/TAGS\" -e -R %s"
           tags-generator (directory-file-name dir-name) (directory-file-name dir-name))))

(add-to-list 'load-path (expand-file-name "packages" user-emacs-directory))
(require 'packages)

;; Buffer-based completion
(global-set-key (kbd "C-SPC") 'dabbrev-completion)

(add-hook 'text-mode-hook (lambda () (setq show-trailing-whitespace t)))
(add-hook 'prog-mode-hook (lambda () (setq show-trailing-whitespace t)))

;;;; System-specific configs

(defun win-setup ()
    (add-to-list 'exec-path "C:/Program Files (x86)/Aspell/bin/")
    (setq ispell-program-name "aspell")

    ;; Add MinGW if it exists
    (if (file-directory-p "C:/MinGW/msys/1.0/bin")
      (setenv "PATH" (concat (getenv "PATH") "C:/MinGW/msys/1.0/bin")))
      ;; (add-to-list 'exec-path "C:/MinGW/msys/1.0/bin"))

    (setq tags-generator (concat tags-generator ".exe"))

    (defun cmd ()
      (interactive)
	(make-comint-in-buffer "cmd" nil "cmd" nil)
	(switch-to-buffer "*cmd*"))

    (setq default-directory "~/../../")

    (setq org-default-notes-file "~/../../Owncloud/org/organizer.org"))

(defun linux-setup ()
  (setq org-default-notes-file "~/Owncloud/org/organizer.org"))

(cond ((eq system-type 'windows-nt) (win-setup))
      ((eq system-type 'gnu/linux) (linux-setup))
      (t (message "")))


;;;; Default face customizations

(set-face-attribute 'default nil :height 120 :family "Ubuntu Mono")
(set-face-attribute 'evil-goggles-delete-face nil :inherit 'diff-removed)
(set-face-attribute 'evil-goggles-paste-face nil :inherit 'diff-added)
;(set-face-attribute 'evil-goggles-undo-redo-add-face nil :inherit 'diff-added)
;(set-face-attribute 'evil-goggles-undo-redo-change-face nil :inherit 'diff-changed)
;(set-face-attribute 'evil-goggles-undo-redo-remove-face nil :inherit 'diff-removed)
(set-face-attribute 'evil-goggles-yank-face nil :inherit 'diff-changed)
(set-face-attribute 'linum-relative-current-face nil :inherit 'linum :background "dim gray" :foreground "white" :underline nil)
(set-face-attribute 'mode-line-buffer-id-inactive nil :inherit 'mode-line-inactive)
(set-face-attribute 'show-paren-match nil :background "light gray" :foreground "#d33682" :weight 'bold)
(set-face-attribute 'fringe nil :background "#fafafa")


;;;; Custom

(defconst custom-file (expand-file-name "custom.el" user-emacs-directory))

;; if no custom file exists, write a default one
(unless (file-exists-p custom-file)
  (write-region "(custom-set-faces)
(custom-set-variables
 '(custom-enabled-themes (quote (material-light))))
" nil custom-file))
(load custom-file)

(setq gc-cons-threshold (* 800 100))