Skip to content

Instantly share code, notes, and snippets.

@pce1991
Created February 5, 2021 00:07
Show Gist options
  • Select an option

  • Save pce1991/8fa6409d27fa72a97f3491104a6ea33b to your computer and use it in GitHub Desktop.

Select an option

Save pce1991/8fa6409d27fa72a97f3491104a6ea33b to your computer and use it in GitHub Desktop.

Revisions

  1. pce1991 created this gist Feb 5, 2021.
    872 changes: 872 additions & 0 deletions .emacs windows 7
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,872 @@
    (require 'misc)

    (setq user-full-name "Patrick Collin Eye")

    (set-frame-parameter nil 'fullscreen 'fullboth)
    (add-to-list 'default-frame-alist '(fullscreen . maximized))

    (setq backup-directory-alist
    `((".*" . ,temporary-file-directory)))
    (setq auto-save-file-name-transforms
    `((".*" ,temporary-file-directory t)))


    (if (fboundp 'scroll-bar-mode) (scroll-bar-mode -1))
    (if (fboundp 'tool-bar-mode) (tool-bar-mode -1))
    (if (fboundp 'menu-bar-mode) (menu-bar-mode -1))
    (setq inhibit-startup-message t)
    (setq column-number-mode t)
    (setq inhibit-splash-screen t
    initial-scratch-message nil
    initial-major-mode 'org-mode)

    (delete-selection-mode t)
    (transient-mark-mode t)
    (setq x-select-enable-clipboard t)

    (if (eq (length (window-list)) 1)
    (progn
    (split-window-right)
    (balance-windows)))

    (require 'cl)

    (setq package-archives '(("gnu" . "http://elpa.gnu.org/packages/")
    ("marmalade" . "https://marmalade-repo.org/packages/")
    ("melpa" . "http://melpa.milkbox.net/packages/")))

    (load "package")
    (package-initialize)

    (setq-default indent-tabs-mode nil)
    (setq sentence-end-double-space nil)

    (setq electric-pair-pairs '(
    (?\" . ?\")
    (?\{ . ?\})
    ))

    (blink-cursor-mode 0)

    (setq redisplay-dont-pause t)

    (global-auto-revert-mode 1)

    (defun set-window-undedicated-p (window flag)
    "Never set window dedicated."
    flag)

    (advice-add 'set-window-dedicated-p :override #'set-window-undedicated-p)

    (defadvice pop-to-buffer (before cancel-other-window first)
    (ad-set-arg 1 nil))

    (ad-activate 'pop-to-buffer)

    ;; Toggle window dedication
    (defun toggle-window-dedicated ()
    "Toggle whether the current active window is dedicated or not"
    (interactive)
    (message
    (if (let (window (get-buffer-window (current-buffer)))
    (set-window-dedicated-p window
    (not (window-dedicated-p window))))
    "Window '%s' is dedicated"
    "Window '%s' is normal")
    (current-buffer)))

    (global-hl-line-mode t)

    (defvar my-cpp-other-file-alist
    '(("\\.cpp\\'" (".h"))
    ("\\.c\\'" (".h"))
    ("\\.h\\'" (".c" ".cpp"))
    ("\\.vert\\'" (".frag"))
    ("\\.frag\\'" (".vert"))
    ))

    (setq-default ff-other-file-alist 'my-cpp-other-file-alist)

    (add-hook 'c-initialization-hook (lambda ()
    (define-key c-mode-base-map [(meta o)] 'ff-get-other-file)))


    (add-hook 'c-mode-hook 'electric-pair-mode)
    (add-hook 'c-mode-hook 'hs-minor-mode)

    (add-hook 'c++-mode-hook 'electric-pair-mode)
    (add-to-list 'auto-mode-alist '("\\.h\\'" . c++-mode))
    (add-to-list 'auto-mode-alist '("\\.vert\\'" . c++-mode))
    (add-to-list 'auto-mode-alist '("\\.frag\\'" . c++-mode))
    (add-to-list 'auto-mode-alist '("\\.geom\\'" . c++-mode))
    (add-to-list 'auto-mode-alist '("\\.glsl\\'" . c++-mode))
    (add-to-list 'auto-mode-alist '("\\.hlsl\\'" . c++-mode))


    (defun is-letter(c)
    (if (or (and (>= c 65) (<= c 90)) (and (>= c 97) (<= c 122)))
    t
    f))

    (defun is-numeral(c)
    (if (and (>= c 48) (<= c 57))
    t
    f))

    (defun my-forward-word ()
    ;; get the thing at the point
    ;; get its bounds
    ;; move cursor to get the next thing in bounds
    ;;
    (interactive)

    (let (curr)
    (setq curr (buffer-substring-no-properties (point) (+ (point) 1)))
    (message "between self %s" curr)

    (if (string= curr " ")
    (let (end start string)
    (message "was space")
    (skip-chars-forward " ")
    (setq end (point))
    (skip-chars-backward " ")
    (setq start (point))
    (goto-char end)))

    (setq curr (buffer-substring-no-properties (point) (+ (point) 1)))

    (defvar c nil)
    (setq c (string-to-char curr))

    (cond ((or (is-alpha c)
    (is-numeral c))
    (let (end start string)
    (skip-chars-forward "_a-z0-9")
    (setq end (point))
    (skip-chars-backward "_a-z0-9")
    (setq start (point))

    (setq string (buffer-substring-no-properties start end))
    (message "%s" string)

    ;; TODO: goto the start of the next word

    (goto-char end)))

    ;; pointers
    ((char-equal c ?-)

    ;; punctuation
    ((or (char-equal c ?\( )
    (char-equal c ?\) )
    (char-equal c ?\[ )
    (char-equal c ?\] )
    (char-equal c ?{ )
    (char-equal c ?} )
    (char-equal c ?+ )
    (char-equal c ?+ )
    ))
    )


    ))



    ;; if we're on a space then we want to get the end and go there
    ;; (let (end start string)
    ;; (skip-chars-forward "_a-z0-9")
    ;; (setq end (point))
    ;; (skip-chars-backward "_a-z0-9")
    ;; (setq start (point))

    ;; (setq string (buffer-substring-no-properties start end))
    ;; (message "%s", string)

    ;; (goto-char end)
    ;; )
    )

    (defun xx ()
    "print current word."
    (interactive)
    (message "current %s" (current-word))
    (message "word %s" (thing-at-point 'word))
    (message "symbol %s" (thing-at-point 'symbol))
    (message "punct %s" (thing-at-point 'punctuation))
    (message "delim %s" (thing-at-point 'delimiter))
    (message "open %s" (thing-at-point 'open))
    (message "close %s" (thing-at-point 'close))

    )

    (which-function-mode t)

    (defvar eye/packages '(ace-window
    avy
    csharp-mode
    ivy
    org
    swiper)
    "Default packages")


    (defun eye/packages-installed-p ()
    (loop for pkg in eye/packages
    when (not (package-installed-p pkg)) do (return nil)
    finally (return t)))

    (unless (eye/packages-installed-p)
    (message "%s" "Refreshing package database...")
    (package-refresh-contents)
    (dolist (pkg eye/packages)
    (when (not (package-installed-p pkg))
    (package-install pkg))))

    (set-language-environment "UTF-8")
    (setq slime-net-coding-system 'utf-8-unix)

    (show-paren-mode 1)
    (setq show-paren-delay 0)

    (global-linum-mode 1)
    ;(add-hook 'prog-mode-hook 'subword-mode)
    ;;(global-subword-mode 1)
    (global-subword-mode 1)

    (add-hook 'comint-output-filter-functions
    'comint-watch-for-password-prompt)

    (put 'erase-buffer 'disabled nil)

    (defalias 'yes-or-no-p 'y-or-n-p)

    (setq-default mode-line-format '("%e" mode-line-front-space
    ;; Standard info about the current buffer
    mode-line-frame-identification
    mode-line-buffer-identification " " mode-line-position
    " "
    mode-line-misc-info
    ;; And the modes, which I don't really care for anyway
    " " mode-line-modes mode-line-end-spaces))

    (custom-set-variables
    '(global-linum-mode t)
    '(linum-delay t)
    '(linum-eager nil)
    '(windmove-wrap-around t))

    (require 'linum)

    (defcustom linum-disabled-modes-list '(eshell-mode erc-mode org-mode wl-summary-mode compilation-mode text-mode dired-mode twittering-mode)
    "* List of modes disabled when global linum mode is on"
    :type '(repeat (sexp :tag "Major mode"))
    :tag " Major modes where linum is disabled: "
    :group 'linum)

    (defcustom linum-disable-starred-buffers 't
    "* Disable buffers that have stars in them like *Gnu Emacs*"
    :type 'boolean
    :group 'linum)

    (defun linum-on ()
    "* When linum is running globally, disable line number in modes defined in `linum-disabled-modes-list'. Changed by linum-off. Also turns off numbering in starred modes like *scratch*"
    (unless (or (minibufferp) (member major-mode linum-disabled-modes-list)
    (string-match "*" (buffer-name)))
    (linum-mode 1)))
    (provide 'linum-off)

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;;C STUFF
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    (setq-default c-basic-offset 2)
    ;indent switch statements
    (add-hook 'c-mode-common-hook
    (lambda () (c-set-offset 'case-label '+)))

    (defvar pce-project-run-fn nil)

    (defun pce-define-project (name directory compile-fn run-fn)
    (let ((class-variables (list (cons nil (list (cons 'pce-project-directory directory)
    (cons 'pce-project-compile-fn compile-fn)
    (cons 'pce-project-run-fn run-fn))))))
    (dir-locals-set-class-variables name class-variables))

    (add-to-list 'safe-local-variable-values (cons 'pce-project-directory directory))
    (add-to-list 'safe-local-variable-values (cons 'pce-project-compile-fn compile-fn))
    (add-to-list 'safe-local-variable-values (cons 'pce-project-run-fn run-fn))
    (dir-locals-set-directory-class directory name))


    ;; TODO: just do this stuff with structs so its more clear and direct,
    ;; I want to be able to toggle between "gameonly" and the game+platform

    (defun pce-compile-project ()
    (interactive)
    (if (get-buffer "*compilation*")
    (kill-buffer "*compilation*"))

    (if (and pce-project-directory pce-project-compile-fn)
    (let ((working-directory default-directory)
    (prev-compile-command compile-command))
    (cd pce-project-directory)
    (setq compilation-read-command nil)
    (setq compile-command (funcall pce-project-compile-fn pce-project-directory))

    (call-interactively 'compile)

    (setq compile-command prev-compile-command)
    (cd working-directory))))

    (defun pce-run-project ()
    (interactive)
    (if pce-project-run-fn
    (funcall pce-project-run-fn pce-project-directory nil)))

    (defun pce-run-project-debug ()
    (interactive)
    (if pce-project-run-fn
    (funcall pce-project-run-fn pce-project-directory t)))

    (setq compilation-skip-threshold 2)

    ;ORG MODE
    (require 'org)
    (setq org-log-done t)
    (setq org-startup-truncated nil)

    (add-hook 'org-mode-hook (lambda () (visual-line-mode 1) (line-move-visual 1)))

    (setq create-lockfiles nil)

    ;;(setq avy-keys '(?a ?o ?e ?u ?h ?t ?n ?s ?i))
    ;; https://github.com/abo-abo/avy/wiki/defcustom
    (setq avy-keys '(?1 ?2 ?3 ?4 ?5))

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;;BINDINGS BINDINGS BINDINGS BIDINGS
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    ;;(define-key key-translation-map [?\C-h] [?\C-?])
    ;;(global-set-key [(hyper h)] 'help-command)

    (defun beginning-of-line-custom ()
    (interactive)
    (let ((oldpos (point)))
    (back-to-indentation)
    (and (= oldpos (point))
    (beginning-of-line))))


    (defun isearch-yank-regexp (regexp)
    "Pull REGEXP into search regexp."
    (let ((isearch-regexp nil)) ;; Dynamic binding of global.
    (isearch-yank-string regexp))
    (isearch-search-and-update))

    (defun project-grep ()
    (interactive)
    (let ((working-directory default-directory))
    (cd pce-project-directory)
    (call-interactively 'grep-find)
    (cd working-directory)))

    (defun date ()
    (interactive)
    (format-time-string "%d.%m.%Y"))

    (defun timestamp ()
    (interactive)
    (format-time-string "%Y-%m-%dT%H:%M:%S"))

    (defun pce-todo ()
    (interactive)
    (insert (concat "@pce: ")))

    ;; customize for C
    (setq punctuation '("(" ")"
    "{" "}"
    "[" "]"
    ","
    "."
    "!"
    "->"
    "&&"
    "||"
    "&"
    "*"
    ))

    (defun forward-punct ()
    (interactive)
    (search-forward-regexp punctuation-regex))

    (defun backward-punct ()
    (interactive)
    (search-backward-regexp punctuation-regex))

    (defun next-punct ()
    (interactive)
    (forward-punct)
    (forward-punct)
    (backward-punct))

    (defun previous-punct ()
    (interactive)
    (backward-punct)
    (backward-punct)
    (forward-punct))

    (defun jump-to-next-brace ()
    (interactive)
    (avy-goto-char-in-line ?\{)
    )

    ;; BUG: doesnt handle whitespaces well
    (defun align-whitespace (start end)
    "Align columns by whitespace"
    (interactive "r")
    (align-regexp start end
    "\\(\\s-*\\)\\s-" 1 0 t))

    (setq punctuation-regex (regexp-opt punctuation))

    (defun backward-whitespace (arg)
    "Move point to the beginning of the current sequence of whitespace characters."
    (interactive "^p")
    (forward-whitespace (- arg)))

    (defvar my-keys-minor-mode-map
    (let ((map (make-sparse-keymap)))

    ;; RIGHT HAND
    ;; TOP
    (define-key map (kbd "C-x C-g") 'ff-find-other-file)
    (define-key map (kbd "C-f") 'goto-line)
    (define-key map (kbd "M-f") 'project-grep)
    (define-key map (kbd "M-g") 'avy-goto-line)
    (define-key map (kbd "M-c") 'capitalize-backwards)
    (define-key map (kbd "C-r") 'repeat)
    (define-key map (kbd "M-r") 'replace-string)
    (define-key map (kbd "M-R") 'query-replace)
    ;; MID
    (define-key map (kbd "C-s") 'forward-char)
    (define-key map (kbd "M-s") 'forward-word)
    ;;(define-key map (kbd "M-s") 'move-forward-word-begin)

    (define-key map (kbd "C-S-h") 'backward-whitespace)
    (define-key map (kbd "C-S-s") 'forward-whitespace)

    (define-key map (kbd "M-q") 'fill-paragraph)

    (define-key map (kbd "C-n") 'next-line)
    (define-key map (kbd "M-n") 'forward-paragraph)
    ;;(define-key map (kbd "C-M-n") 'gud-next)
    (define-key map (kbd "C-x C-n") 'next-error)


    (define-key map (kbd "C-x C-b") 'gud-break)
    (define-key map (kbd "C-x C-c") 'pce-todo)

    (define-key map (kbd "C-t") 'previous-line)
    (define-key map (kbd "M-t") 'backward-paragraph)
    (define-key map (kbd "C-M-t") 'avy-goto-line-above)
    (define-key map (kbd "C-x C-t") 'previous-error)


    (define-key map (kbd "C-h") 'backward-char)
    (define-key map (kbd "M-h") 'backward-word)
    ;;BOTTOM
    (define-key map (kbd "C-b") 'switch-to-buffer)
    (define-key map (kbd "M-b") 'transpose-words)
    (define-key map (kbd "M-l") 'transpose-lines)
    ;; THUMB

    (keyboard-translate ?\C-m ?\H-m)
    (define-key map [?\H-m] 'comment-region)
    (define-key map (kbd "M-m") 'uncomment-region)

    (define-key map (kbd "C-<return>") 'switch-to-buffer)


    ;; LEFT HAND
    ;; TOP
    (define-key map (kbd "C-p") 'other-window)
    (define-key map (kbd "M-p") 'ace-window)
    (define-key map (kbd "C-M-p") 'switch-to-buffer)

    ;; MID
    (define-key map (kbd "C-a") 'beginning-of-line-custom)

    (define-key map (kbd "M-o") nil)
    (define-key map (kbd "C-o") 'isearch-backward)
    (define-key map (kbd "C-M-o") 'swiper)
    (define-key isearch-mode-map "\C-o" 'isearch-repeat-backward)

    ;;(define-key map (kbd "C-e") 'avy-goto-char-2-below)
    (define-key map (kbd "M-e") nil)
    (define-key map (kbd "C-e") 'isearch-forward)
    (define-key map (kbd "C-M-e") 'swiper)
    (define-key isearch-mode-map "\C-e" 'isearch-repeat-forward)

    (define-key map (kbd "C-u") 'end-of-line)
    (define-key map (kbd "M-u") 'forward-sentence) ;; gets rebound to c-end-of-statement after c-mode activated
    (define-key map (kbd "C-M-u") 'end-of-defun)
    (define-key map (kbd "C-M-a") 'beginning-of-defun)
    (keyboard-translate ?\C-i ?\H-i)
    (global-set-key [?\H-i] 'universal-argument)

    ;; BOTTOM
    (define-key map (kbd "C-z") 'avy-goto-char-in-line)
    (define-key map (kbd "M-z") 'avy-goto-word-1)

    (define-key map (kbd "C-k") 'zap-to-char)
    (define-key map (kbd "M-k") 'kill-line)

    (define-key map (kbd "C-j") 'forward-sexp)
    (define-key map (kbd "M-j") 'backward-sexp)

    (define-key map (kbd "C-q") 'undo)
    (define-key map (kbd "C-x C-q") 'undo)

    (define-key map (kbd "M-RET") 'indent-new-comment-line)

    ;; need all and previous...
    ;; how often do I need to do this instead of just string replace?
    (define-key map (kbd "M-SPC") 'mark-next-like-this)

    map)
    "my-keys-minor-mode keymap.")

    (define-minor-mode my-keys-minor-mode
    "A minor mode so that my key settings override annoying major modes."
    :global t
    :init-value t
    :lighter "my-keys")

    ;; I want a minor mode to have different bindings depending on the major-mode
    (defun my-c-mode-hook ()
    (let ((oldmap (cdr (assoc 'my-keys minor-mode-map-alist)))
    (newmap (make-sparse-keymap)))
    (set-keymap-parent newmap oldmap)
    (define-key newmap (kbd "M-u") 'c-end-of-statement)
    (set-syntax-table c-mode-syntax-table)
    (make-local-variable 'minor-mode-overriding-map-alist)
    (push `(my-keys . ,newmap) minor-mode-overriding-map-alist)))

    (add-hook 'c-mode-common-hook 'my-c-mode-hook)

    (add-hook 'minibuffer-setup-hook
    (lambda () (my-keys-minor-mode -1)
    (define-key ivy-minibuffer-map (kbd "C-t") 'ivy-previous-line)
    (define-key ivy-minibuffer-map (kbd "M-o") 'swiper-avy)
    (define-key ivy-minibuffer-map (kbd "M-e") 'swiper-avy)
    (define-key ivy-minibuffer-map (kbd "TAB") 'ivy-alt-done)))

    (add-hook 'minibuffer-exit-hook (lambda () (my-keys-minor-mode 1)))

    (ivy-mode 1)

    (defun c-bindings ()
    (define-key my-keys-minor-mode-map (kbd "M-u") 'c-end-of-statement))

    (my-keys-minor-mode 1)
    (add-hook 'c-mode-common-hook 'c-bindings)

    (define-minor-mode gud-minor-mode-map
    :init-value t)

    (defun untabify-buffer ()
    (interactive)
    (untabify (point-min) (point-max)))

    (defun indent-buffer ()
    (interactive)
    (indent-region (point-min) (point-max)))

    (defun cleanup-buffer ()
    "Perform a bunch of operations on the whitespace content of a buffer."
    (interactive)
    (indent-buffer)
    (untabify-buffer)
    (delete-trailing-whitespace))

    (defun cleanup-region (beg end)
    "Remove tmux artifacts from region."
    (interactive "r")
    (dolist (re '("\\\\│\·*\n" "\W*│\·*"))
    (replace-regexp re "" nil beg end)))

    (global-set-key (kbd "C-x M-t") 'cleanup-region)
    (global-set-key (kbd "C-c n") 'cleanup-buffer)

    (global-set-key (kbd "M-q") (fill-paragraph))
    (setq-default fill-column 90)

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;;LISP STUFF
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    (defun uncomment-sexp (&optional n)
    "Uncomment a sexp around point."
    (interactive "P")
    (let* ((initial-point (point-marker))
    (p)
    (end (save-excursion
    (when (elt (syntax-ppss) 4)
    (re-search-backward comment-start-skip
    (line-beginning-position)
    t))
    (setq p (point-marker))
    (comment-forward (point-max))
    (point-marker)))
    (beg (save-excursion
    (forward-line 0)
    (while (= end (save-excursion
    (comment-forward (point-max))
    (point)))
    (forward-line -1))
    (goto-char (line-end-position))
    (re-search-backward comment-start-skip
    (line-beginning-position)
    t)
    (while (looking-at-p comment-start-skip)
    (forward-char -1))
    (point-marker))))
    (unless (= beg end)
    (uncomment-region beg end)
    (goto-char p)
    ;; Indentify the "top-level" sexp inside the comment.
    (while (and (ignore-errors (backward-up-list) t)
    (>= (point) beg))
    (skip-chars-backward (rx (syntax expression-prefix)))
    (setq p (point-marker)))
    ;; Re-comment everything before it.
    (ignore-errors
    (comment-region beg p))
    ;; And everything after it.
    (goto-char p)
    (forward-sexp (or n 1))
    (skip-chars-forward "\r\n[:blank:]")
    (if (< (point) end)
    (ignore-errors
    (comment-region (point) end))
    ;; If this is a closing delimiter, pull it up.
    (goto-char end)
    (skip-chars-forward "\r\n[:blank:]")
    (when (= 5 (car (syntax-after (point))))
    (delete-indentation))))
    ;; Without a prefix, it's more useful to leave point where
    ;; it was.
    (unless n
    (goto-char initial-point))))

    (defun comment-sexp--raw ()
    "Comment the sexp at point or ahead of point."
    (pcase (or (bounds-of-thing-at-point 'sexp)
    (save-excursion
    (skip-chars-forward "\r\n[:blank:]")
    (bounds-of-thing-at-point 'sexp)))
    (`(,l . ,r)
    (goto-char r)
    (skip-chars-forward "\r\n[:blank:]")
    (save-excursion
    (comment-region l r))
    (skip-chars-forward "\r\n[:blank:]"))))

    (defun comment-or-uncomment-sexp (&optional n)
    "Comment the sexp at point and move past it.
    If already inside (or before) a comment, uncomment instead.
    With a prefix argument N, (un)comment that many sexps."
    (interactive "P")
    (if (or (elt (syntax-ppss) 4)
    (< (save-excursion
    (skip-chars-forward "\r\n[:blank:]")
    (point))
    (save-excursion
    (comment-forward 1)
    (point))))
    (uncomment-sexp n)
    (dotimes (_ (or n 1))
    (comment-sexp--raw))))

    (global-set-key (kbd "C-;") #'comment-or-uncomment-sexp)

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;; CUSTOM FUNCTIONS
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    (defun reverse-words (beg end)
    "Reverse the order of words in region."
    (interactive "*r")
    (apply
    'insert
    (reverse
    (split-string
    (delete-and-extract-region beg end) "\\b"))))

    (defun reverse-chars (beg end)
    "Reverse the order of words in region."
    (interactive "*r")
    (apply
    'insert
    (reverse
    (string-to-list (delete-and-extract-region beg end)))))

    (defun save-macro (name)
    "save a macro. Take a name as argument
    and save the last defined macro under
    this name at the end of your .emacs"
    (interactive "SName of the macro :") ; ask for the name of the macro
    (kmacro-name-last-macro name) ; use this name for the macro
    (find-file user-init-file) ; open ~/.emacs or other user init file
    (goto-char (point-max)) ; go to the end of the .emacs
    (newline) ; insert a newline
    (insert-kbd-macro name) ; copy the macro
    (newline) ; insert a newline
    (switch-to-buffer nil)) ; return to the initial buffer


    (defun capitalize-backwards ()
    (interactive)
    (backward-subword 1)
    ;(backward-word 1)
    (capitalize-word 1))

    ;;; Ideally it'd do all this without actually opening the buffers so that I could just continue with my work
    (defun save-word ()
    "Will look up the current word in gcide, will save it and add a link to the org dictionary."
    (interactive)
    (let ((word (current-word)))
    (dictionary-search word)
    (write-file (concat "~/writing/dictionary/" word))
    (kill-buffer word)
    (find-file "~/writing/dictionary/dictionary.org")
    (end-of-buffer)
    (org-insert-link (concat "~/writing/dictionary/" word)
    (concat "~/writing/dictionary/" word)
    (capitalize word))
    (write-file "~/writing/dictionary/dictionary.org")
    (kill-buffer "dictionary.org")))

    (defun search-tags-org ()
    (interactive)
    ;; search the whole document for every # and list what follows in a buffer along with count
    ;; When one is selected jump between instances of it.
    )

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;; OS SPECIFIC
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    (defun pce-compile-etcetera-linux (directory)
    (concat "time python2 " directory "/build.py"))

    (defun pce-run-etcetera-linux (directory debug)
    (let ((exec-relative-path "build/etcetera_linux"))
    (if debug
    (progn
    (gdb (concat "gdb --quiet -i=mi -cd ~/etcetera " "./build/etcetera_linux")))
    (progn
    (async-shell-command "~/etcetera/build/etcetera_linux")))))

    (defun pce-compile-etcetera-windows (directory)
    ;;(concat "Call \"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Auxiliary\\Build\\vcvarsall.bat\" x64 & python " directory "\\build.py game"))
    (concat "Call \"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Auxiliary\\Build\\vcvarsall.bat\" x64 & python " directory "\\build.py gameonly"))
    ;;(concat "Call \"C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\VC\\vcvarsall.bat\" x64 & python " directory "\\build.py gameonly"))

    (defun pce-run-etcetera-windows (directory debug)
    (let ((exec-relative-path "build/etcetera_win"))
    (async-shell-command "C:\\Users\\pce\\svn\\etcetera\\build\\etcetera_win")))


    ;; (custom-set-faces
    ;; '(default ((t (:background "Black" :foreground "#97db93" :weight
    ;; normal :height 100 :width normal))))
    ;; '(error ((t (:foreground "Red" :weight bold))))
    ;; '(font-lock-builtin-face ((t (:foreground "#bf55ff"))))
    ;; '(font-lock-comment-face ((t (:foreground "gray50"))))
    ;; '(font-lock-constant-face ((t (:foreground "#70fff8"))))
    ;; '(font-lock-function-name-face ((t (:foreground "#00a0ff"))))
    ;; '(font-lock-keyword-face ((t (:foreground "#BB83D1"))))
    ;; '(font-lock-negation-char-face ((t (:foreground "#ff0923"))))
    ;; '(font-lock-string-face ((t (:foreground "White"))))
    ;; '(font-lock-type-face ((t (:foreground "#5992CD"))))
    ;; '(font-lock-variable-name-face ((t (:foreground "#FCFF79"))))
    ;; '(font-lock-which-func-face ((t (:foreground "Yellow"))))
    ;; '(highlight ((t (:background "gray20"))))
    ;; '(region ((t (:background "gray40"))))
    ;; '(which-func ((t (:foreground "#0000FF")))))


    (custom-set-faces
    '(default ((t (:background "#1a1a1a" :foreground "#89C2DD" :weight
    normal :height 100 :width normal))))
    '(error ((t (:foreground "#ff3030" :weight bold))))
    '(font-lock-builtin-face ((t (:foreground "#97ff93"))))

    '(font-lock-comment-face ((t (:foreground "gray50"))))

    '(font-lock-constant-face ((t (:foreground "#97ff93"))))

    '(font-lock-function-name-face ((t (:foreground "#00a0ff"))))

    ;; if/for/switch statements
    ;;'(font-lock-keyword-face ((t (:foreground "#70fff8"))))
    '(font-lock-keyword-face ((t (:foreground "#cc99d1"))))

    '(font-lock-negation-char-face ((t (:foreground "#ff3030"))))

    '(font-lock-string-face ((t (:foreground "White"))))

    '(font-lock-type-face ((t (:foreground "#fcd628"))))
    ;;'(font-lock-type-face ((t (:foreground "#dbd02c"))))

    '(font-lock-variable-name-face ((t (:foreground "#FBF079"))))
    ;; '(font-lock-variable-name-face ((t (:foreground "#97db93"))))

    '(font-lock-which-func-face ((t (:foreground "Yellow"))))

    '(highlight ((t (:background "gray20"))))

    '(region ((t (:background "gray40"))))

    '(which-func ((t (:foreground "#0000FF")))))


    (cond ((eq system-type 'gnu/linux)

    (set-face-attribute 'default nil :family "Meslo LG S" :height 100)

    (global-set-key (kbd "C-x m") 'pce-compile-project)
    (global-set-key (kbd "C-x C-r") 'pce-run-project-debug)
    (pce-define-project 'etcetera "~/etcetera" 'pce-compile-etcetera-linux 'pce-run-etcetera-linux)
    (cd "~/"))

    ((eq system-type 'windows-nt)

    (setq ring-bell-function 'ignore)

    (set-face-attribute 'default
    nil :family "Consolas" :height 120)
    ;;(set-face-attribute 'default nil :family "Inconsolata" :height 120)

    (global-set-key (kbd "C-x m") 'pce-compile-project)
    (global-set-key (kbd "C-x C-r") 'pce-run-project)
    (pce-define-project 'etcetera "C:\\Users\\pce\\svn\\etcetera" 'pce-compile-etcetera-windows 'pce-run-etcetera-windows))

    ((eq system-type 'darwin)

    (set-face-attribute 'default nil :family "Menlo" :height 100)
    (cd "C:\\Users\\pce")))
    (put 'upcase-region 'disabled nil)