mirror of https://github.com/Chizi123/.emacs.d.git

Chizi123
2019-03-31 99094967352217035d1598cfd81a8dac32caa873
config.org
@@ -1,779 +1,794 @@
#+TITLE: My Emacs configuration
* Windows dependencies
Dependencies needed for Aspell, poppler PDF-tools, compilers and ghost-script provided by mingw64
#+BEGIN_SRC emacs-lisp
  (when (eq system-type 'windows-nt)
    (add-to-list 'exec-path "C:/msys64/usr/bin")
    (add-to-list 'exec-path "C:/msys64/mingw64/bin")
    (add-to-list 'exec-path "c:/Program Files/gnuplot")
    (setenv "PATH" (mapconcat #'identity exec-path path-separator)))
#+END_SRC
* Aesthetic changes
** Zenburn theme
#+BEGIN_SRC emacs-lisp
  (use-package zenburn-theme
    :ensure t
    :config
    (load-theme 'zenburn t))
#+END_SRC
** Default font
#+BEGIN_SRC emacs-lisp
(set-default-font "DejaVu Sans Mono-10")
#+END_SRC
* Writing requirements
** Spellchecking
#+BEGIN_SRC emacs-lisp
  (require 'ispell)
  (setq-default ispell-program-name "aspell")
  (add-hook 'latex-mode-hook 'flyspell-mode)
  (add-hook 'latex-mode-hook 'flyspell-buffer)
  (add-hook 'org-mode-hook 'flyspell-mode)
  (add-hook 'org-mode-hook 'flyspell-buffer)
#+END_SRC
** Switch-window
Helps to change windows easily when many are open at once
#+BEGIN_SRC emacs-lisp
(use-package switch-window
  :ensure t
  :config
    (setq switch-window-input-style 'minibuffer)
    (setq switch-window-increase 4)
    (setq switch-window-threshold 2)
    (setq switch-window-shortcut-style 'qwerty)
    (setq switch-window-qwerty-shortcuts
        '("a" "s" "d" "f" "j" "k" "l" "i" "o"))
  :bind
    ([remap other-window] . switch-window))
#+END_SRC
** Go to new window when opened
#+BEGIN_SRC emacs-lisp
  (defun split-and-follow-horizontally ()
    (interactive)
    (split-window-below)
    (balance-windows)
    (other-window 1))
  (global-set-key (kbd "C-x 2") 'split-and-follow-horizontally)
  (defun split-and-follow-vertically ()
    (interactive)
    (split-window-right)
    (balance-windows)
    (other-window 1))
  (global-set-key (kbd "C-x 3") 'split-and-follow-vertically)
#+END_SRC
** PDF-tools
#+BEGIN_SRC emacs-lisp
(use-package pdf-tools
  :ensure t
  :config
  (pdf-tools-install))
#+END_SRC
* Helm and Projectile
** Helm core
#+BEGIN_SRC emacs-lisp
(use-package helm-config
  :ensure helm
  :bind (("M-x" . helm-M-x)
    ("C-x C-f" . helm-find-files)
    ("M-y" . helm-show-kill-ring)
    ("C-x b" . helm-mini)
    ("C-c h o" . helm-occur))
  :config
  (setq helm-M-x-fuzzy-match t)
  (setq helm-buffers-fuzzy-matching t
   helm-recentf-fuzzy-match    t)
  (setq helm-split-window-in-side-p           t ; open helm buffer inside current window, not occupy whole other window
   helm-move-to-line-cycle-in-source     t ; move to end or beginning of source when reaching top or bottom of source.
   helm-ff-search-library-in-sexp        t ; search for library in `require' and `declare-function' sexp.
   helm-scroll-amount                    8 ; scroll 8 lines other window using M-<next>/M-<prior>
   helm-ff-file-name-history-use-recentf t
   helm-echo-input-in-header-line t)
  (defun spacemacs//helm-hide-minibuffer-maybe ()
    "Hide minibuffer in Helm session if we use the header line as input field."
    (when (with-helm-buffer helm-echo-input-in-header-line)
      (let ((ov (make-overlay (point-min) (point-max) nil nil t)))
   (overlay-put ov 'window (selected-window))
   (overlay-put ov 'face
                     (let ((bg-color (face-background 'default nil)))
                       `(:background ,bg-color :foreground ,bg-color)))
   (setq-local cursor-type nil))))
  (add-hook 'helm-minibuffer-set-up-hook
            'spacemacs//helm-hide-minibuffer-maybe)
  (helm-mode 1))
#+END_SRC
** Projectile
*** Enable it
 #+BEGIN_SRC emacs-lisp
   (use-package projectile
     :ensure t
     :bind ("C-c p" . projectile-command-map)
     :diminish projectile-mode
     :config
     (projectile-global-mode)
     (setq projectile-completion-system 'helm)
     (when (eq system-type 'windows-nt)
       (setq projectile-indexing-method 'alien)))
 #+END_SRC
*** Let it compile things
 #+BEGIN_SRC emacs-lisp
   (global-set-key (kbd "<f5>") 'projectile-compile-project)
 #+END_SRC
*** Enable communication with helm
#+BEGIN_SRC emacs-lisp
(use-package helm-projectile
  :ensure t
  :config
  (helm-projectile-on))
#+END_SRC
* Small tweaks
** Remove startup screen
#+BEGIN_SRC emacs-lisp
(setq inhibit-startup-message t)
#+END_SRC
** Disable bell
Bloody bell dings every time you hit a key too much
#+BEGIN_SRC emacs-lisp
(setq ring-bell-function 'ignore)
#+END_SRC
** Pretty symbols
Why not? They make it look nice
#+BEGIN_SRC emacs-lisp
  (when window-system
    (use-package pretty-mode
      :ensure t
      :diminish t
      :config
      (global-pretty-mode)))
#+END_SRC
** find file other window
Lets it accept more than one file. Works recursively.
#+BEGIN_SRC emacs-lisp
(defadvice find-file-other-window (around find-files activate)
  (if (listp filename)
      (loop for f in filename do (find-file-other-window f wildcards))
    ad-do-it))
#+END_SRC
** Which key
Helps to explain keybindings if you get lost
#+BEGIN_SRC emacs-lisp
  (use-package which-key
    :ensure t
    :diminish which-key-mode
    :config
    (which-key-mode))
#+END_SRC
** Go to this file
#+BEGIN_SRC emacs-lisp
(defun config-visit ()
  (interactive)
  (find-file "~/.emacs.d/config.org"))
(global-set-key (kbd "C-c e d") 'config-visit)
#+END_SRC
** Go to init.el
#+BEGIN_SRC emacs-lisp
  (defun init-visit ()
    (interactive)
    (find-file "~/.emacs.d/init.el"))
  (global-set-key (kbd "C-c e i") 'init-visit)
#+END_SRC
** Reload configuration
#+BEGIN_SRC emacs-lisp
(defun config-reload ()
  "Reloads ~/.emacs.d/config.org at run time"
  (interactive)
  (org-babel-load-file (expand-file-name "~/.emacs.d/config.org")))
(global-set-key (kbd "C-c e r") 'config-reload)
#+END_SRC
** Smartparens
Matches brackets automatically
#+BEGIN_SRC emacs-lisp
(use-package smartparens
  :ensure t
  :diminish smartparens-mode
  :config
  (progn
    (require 'smartparens-config)
    (smartparens-global-mode 1)))
#+END_SRC
** Rainbow
Its a little gimmicky but its still cool
#+BEGIN_SRC emacs-lisp
  (use-package rainbow-mode
    :ensure t
    :diminish rainbow-mode
    :init
    (add-hook 'prog-mode-hook 'rainbow-mode))
#+END_SRC
** Rainbow delimiters
A bit more useful than above.
Colours the brackets so that they stand out more.
#+BEGIN_SRC emacs-lisp
  (use-package rainbow-delimiters
    :ensure t
    :init
      (add-hook 'prog-mode-hook #'rainbow-delimiters-mode))
#+END_SRC
** clean-aindent-mode
Removes unnecessary white space
#+BEGIN_SRC emacs-lisp
(use-package clean-aindent-mode
  :ensure t
  :hook prog-mode)
#+END_SRC
Shows trailing white space
#+BEGIN_SRC emacs-lisp
(add-hook 'prog-mode-hook (lambda () (interactive) (setq show-trailing-whitespace 1)))
#+END_SRC
** whitespace mode
Reveals whitespace characters
#+BEGIN_SRC emacs-lisp
(global-set-key (kbd "C-c w") 'whitespace-mode)
(add-hook 'diff-mode-hook (lambda ()
                            (setq-local whitespace-style
                                        '(face
                                          tabs
                                          tab-mark
                                          spaces
                                          space-mark
                                          trailing
                                          indentation::space
                                          indentation::tab
                                          newline
                                          newline-mark))
                            (whitespace-mode 1)))
#+END_SRC
** eldoc
#+BEGIN_SRC emacs-lisp
  (add-hook 'emacs-lisp-mode-hook 'eldoc-mode)
  (add-hook 'lisp-interaction-mode-hook 'eldoc-mode)
  (add-hook 'ielm-mode-hook 'eldoc-mode)
#+END_SRC
** key-freq
collects interesting statistics
#+BEGIN_SRC emacs-lisp
(use-package keyfreq
  :ensure t
  :config
  (keyfreq-mode 1)
  (keyfreq-autosave-mode 1))
#+END_SRC
** undo-tree
A more advanced undo mechanism
#+BEGIN_SRC emacs-lisp
(use-package undo-tree
  :ensure t
  :diminish undo-tree-mode
  :config
  (global-undo-tree-mode))
#+END_SRC
** volatile highlights
Colour the material just copied
#+BEGIN_SRC emacs-lisp
(use-package volatile-highlights
  :ensure t
  :diminish volatile-highlights-mode
  :config
  (volatile-highlights-mode t))
#+END_SRC
** Workgroups
Open the pages when you quit
#+BEGIN_SRC emacs-lisp
  ;; (use-package workgroups2
  ;;   :ensure t
  ;;   :diminish workgroups-mode
  ;;   :config
  ;;   (workgroups-mode 1))
#+END_SRC
** ibuffer
#+BEGIN_SRC emacs-lisp
(global-set-key (kbd "C-x C-b") 'ibuffer)
(setq ibuffer-use-other-window t)
#+END_SRC
** hippie expand
#+BEGIN_SRC emacs-lisp
(global-set-key (kbd "M-/") 'hippie-expand) ;; replace dabbrev-expand
(setq
 hippie-expand-try-functions-list
 '(try-expand-dabbrev ;; Try to expand word "dynamically", searching the current buffer.
   try-expand-dabbrev-all-buffers ;; Try to expand word "dynamically", searching all other buffers.
   try-expand-dabbrev-from-kill ;; Try to expand word "dynamically", searching the kill ring.
   try-complete-file-name-partially ;; Try to complete text as a file name, as many characters as unique.
   try-complete-file-name ;; Try to complete text as a file name.
   try-expand-all-abbrevs ;; Try to expand word before point according to all abbrev tables.
   try-expand-list ;; Try to complete the current line to an entire line in the buffer.
   try-expand-line ;; Try to complete the current line to an entire line in the buffer.
   try-complete-lisp-symbol-partially ;; Try to complete as an Emacs Lisp symbol, as many characters as unique.
   try-complete-lisp-symbol) ;; Try to complete word as an Emacs Lisp symbol.
 )
#+END_SRC
** Highlight line
#+BEGIN_SRC emacs-lisp
(global-hl-line-mode)
#+END_SRC
** Line numbers
#+BEGIN_SRC emacs-lisp
(add-hook 'prog-mode-hook 'linum-mode)
#+END_SRC
** Garbage collection
starts garbage collection every 100MB
#+BEGIN_SRC emacs-lisp
(setq gc-cons-threshold 100000000)
#+END_SRC
** Kill ring
Changes the kill ring size to 5000.
#+BEGIN_SRC emacs-lisp
  (setq global-mark-ring-max 5000
   mark-ring-max 5000
   mode-require-final-newline t
   kill-ring-max 5000
   kill-whole-line t)
#+END_SRC
** Coding style
#+BEGIN_SRC emacs-lisp
(setq c-default-style "linux")
#+END_SRC
** Coding system
#+BEGIN_SRC emacs-lisp
(set-terminal-coding-system 'utf-8)
(set-keyboard-coding-system 'utf-8)
(set-language-environment "UTF-8")
(prefer-coding-system 'utf-8)
(setq-default indent-tabs-mode t)
(delete-selection-mode)
(global-set-key (kbd "RET") 'newline-and-indent)
#+END_SRC
** Move to beginning of line ignoring whitespace
Move point back to indentation of beginning of line.
Move point to the first non-whitespace character on this line.
If point is already there, move to the beginning of the line.
Effectively toggle between the first non-whitespace character and
the beginning of the line.
If ARG is not nil or 1, move forward ARG - 1 lines first. If
point reaches the beginning or end of the buffer, stop there.
#+BEGIN_SRC emacs-lisp
(defun prelude-move-beginning-of-line (arg)
  (interactive "^p")
  (setq arg (or arg 1))
  ;; Move lines first
  (when (/= arg 1)
    (let ((line-move-visual nil))
      (forward-line (1- arg))))
  (let ((orig-point (point)))
    (back-to-indentation)
    (when (= orig-point (point))
      (move-beginning-of-line 1))))
(global-set-key (kbd "C-a") 'prelude-move-beginning-of-line)
#+END_SRC
** Indent region or buffer
#+BEGIN_SRC emacs-lisp
(defun indent-region-or-buffer ()
  "Indent a region if selected, otherwise the whole buffer."
  (interactive)
  (unless (member major-mode prelude-indent-sensitive-modes)
    (save-excursion
      (if (region-active-p)
          (progn
            (indent-region (region-beginning) (region-end))
            (message "Indented selected region."))
        (progn
          (indent-buffer)
          (message "Indented buffer.")))
      (whitespace-cleanup))))
(global-set-key (kbd "C-c i") 'indent-region-or-buffer)
#+END_SRC
** Tramp
#+BEGIN_SRC emacs-lisp
  (when (eq system-type 'windows-nt)
    (setq tramp-default-method "pscp"))
  (setq password-cache-expiry nil)
#+END_SRC
* Mode line tweaks
Diminish is used but is included in init.el such that it can be used throughout this document
** Spaceline
A little easier to read than the default emacs mode line
#+BEGIN_SRC emacs-lisp
  (use-package spaceline
    :ensure t
    :config
    (require 'spaceline-config)
    (setq spaceline-buffer-encoding-abbrev-p t)
    (setq spaceline-line-column-p t)
    (setq spaceline-line-p t)
    (setq powerline-default-separator (quote arrow))
    (spaceline-spacemacs-theme))
#+END_SRC
** No separator
#+BEGIN_SRC emacs-lisp
(setq powerline-default-seperator nil)
#+END_SRC
* Programming tweaks
** Yasnippet
#+BEGIN_SRC emacs-lisp
    (use-package yasnippet
      :ensure t
      :diminish yas-minor-mode
      :config
      (use-package yasnippet-snippets
   :ensure t)
      (yas-reload-all)
      (yas-global-mode 1))
#+END_SRC
** flycheck
#+BEGIN_SRC emacs-lisp
(use-package flycheck
  :ensure t)
#+END_SRC
*** flycheck-pos-tip
#+BEGIN_SRC emacs-lisp
(use-package flycheck-pos-tip
  :ensure t
  :after flycheck
  :config
  (flycheck-pos-tip-mode))
#+END_SRC
** Company
Company is auto-complete for emacs
#+BEGIN_SRC emacs-lisp
  (use-package company
    :ensure t
    :diminish company-mode
    :config
    (global-company-mode)
    (setq company-idle-delay 0)
    (setq company-minimum-prefix-length 3))
#+END_SRC
** Magit
#+BEGIN_SRC emacs-lisp
  (use-package magit
    :ensure t
    :commands magit-get-top-dir
    :bind ("C-x g" . magit-status)
    :init
    (progn
      ;; make magit status go full-screen but remember previous window
      ;; settings
      ;; from: http://whattheemacsd.com/setup-magit.el-01.html
      (defadvice magit-status (around magit-fullscreen activate)
        (window-configuration-to-register :magit-fullscreen)
        ad-do-it
        (delete-other-windows))
      ;; Close popup when committing - this stops the commit window
      ;; hanging around
      ;; From: http://git.io/rPBE0Q
      (defadvice git-commit-commit (after delete-window activate)
        (delete-window))
      (defadvice git-commit-abort (after delete-window activate)
        (delete-window))
      :config
      (progn
        ;; restore previously hidden windows
        (defadvice magit-quit-window (around magit-restore-screen activate)
          (let ((current-mode major-mode))
            ad-do-it
            ;; we only want to jump to register when the last seen buffer
            ;; was a magit-status buffer.
            (when (eq 'magit-status-mode current-mode)
              (jump-to-register :magit-fullscreen)))))
      ;; magit settings
      (setq
       ;; don't put "origin-" in front of new branch names by default
       magit-default-tracking-name-function 'magit-default-tracking-name-branch-only
       ;; open magit status in same window as current buffer
       magit-status-buffer-switch-function 'switch-to-buffer
       ;; highlight word/letter changes in hunk diffs
       magit-diff-refine-hunk t
       ;; ask me if I want to include a revision when rewriting
       magit-rewrite-inclusive 'ask
       ;; ask me to save buffers
       magit-save-some-buffers t
       ;; pop the process buffer if we're taking a while to complete
       magit-process-popup-time 10
       ;; ask me if I want a tracking upstream
       magit-set-upstream-on-push 'askifnotset
       )))
#+END_SRC
** CEDET
*** semantic
#+BEGIN_SRC emacs-lisp
(use-package semantic
  :config
  (global-semanticdb-minor-mode 1)
  (global-semantic-idle-scheduler-mode 1)
  (global-semantic-idle-summary-mode 1)
  (semantic-mode 1))
#+END_SRC
*** EDE
#+BEGIN_SRC emacs-lisp
(use-package ede
  :config
  (global-ede-mode t))
#+END_SRC
*** gdb-many-windows
#+BEGIN_SRC emacs-lisp
(setq
 ;; use gdb-many-windows by default
 gdb-many-windows t
 ;; Non-nil means display source file containing the main routine at startup
 gdb-show-main t)
#+END_SRC
*** Semantic refactor
#+BEGIN_SRC emacs-lisp
(use-package srefactor
  :ensure t
  :bind (("M-RET o" . 'srefactor-lisp-one-line)
    ("M-RET m" . 'srefactor-lisp-format-sexp)
    ("M-RET d" . 'srefactor-lisp-format-defun)
    ("M-RET b" . 'srefactor-lisp-format-buffer)
    :map c-mode-base-map
         ("M-RET" . 'srefactor-refactor-at-point)
         :map c++-mode-map
         ("M-RET" . 'srefactor-refactor-at-point)))
#+END_SRC
** Language specific configs
*** C/C++
**** yasnippet
#+BEGIN_SRC emacs-lisp
(add-hook 'c++-mode-hook 'yas-minor-mode)
(add-hook 'c-mode-hook 'yas-minor-mode)
#+END_SRC
**** flycheck clang
#+BEGIN_SRC emacs-lisp
(use-package flycheck-clang-analyzer
  :ensure t
  :config
  (with-eval-after-load 'flycheck
    (require 'flycheck-clang-analyzer)
     (flycheck-clang-analyzer-setup)))
#+END_SRC
**** company
#+BEGIN_SRC emacs-lisp
    (use-package company-c-headers
        :ensure tk
        :after company
        :config
        (add-hook 'c++-mode-hook 'company-mode)
        (add-hook 'c-mode-hook 'company-mode))
    (use-package company-irony
      :ensure t
      :config
      (add-to-list 'company-backends '(company-c-headers
                                       company-dabbrev-code
                                       company-irony)))
    (use-package irony
      :ensure t
      :config
      (setq w32-pipe-read-delay 0)
      (add-hook 'c++-mode-hook 'irony-mode)
      (add-hook 'c-mode-hook 'irony-mode)
      (add-hook 'irony-mode-hook 'irony-cdb-autosetup-compile-options))
#+END_SRC
*** emacs-lisp
**** eldoc
#+BEGIN_SRC emacs-lisp
(add-hook 'emacs-lisp-mode-hook 'eldoc-mode)
#+END_SRC
**** yasnippet
#+BEGIN_SRC emacs-lisp
(add-hook 'emacs-lisp-mode-hook 'yas-minor-mode)
#+END_SRC
**** company
#+BEGIN_SRC emacs-lisp
(add-hook 'emacs-lisp-mode-hook 'company-mode)
(use-package slime
  :ensure t
  :config
  (setq inferior-lisp-program "/usr/bin/sbcl")
  (setq slime-contribs '(slime-fancy)))
(use-package slime-company
  :ensure t
  :init
    (require 'company)
    (slime-setup '(slime-fancy slime-company)))
#+END_SRC
*** x86
**** x86-lookup
#+BEGIN_SRC emacs-lisp
(use-package x86-lookup
  :ensure t
  :init
  (setq x86-lookup-pdf "D:/Coding/x86-instructions.pdf")
  :bind ("C-h x" . x86-lookup))
#+END_SRC
*** Latex
**** AucTex
#+BEGIN_SRC emacs-lisp
(use-package tex
  :ensure auctex
  :config
  (setq TeX-auto-save t)
  (setq TeX-parse-self t)
  (setq doc-view-ghostscript-program "c:/msys64/mingw64/bin/gswin32c.exe")
  (setq preview-gs-command "c:/msys64/mingw64/bin/gs.exe"))
#+END_SRC
**** Company
#+BEGIN_SRC emacs-lisp
  (use-package company-math
    :ensure t
    :after company
    :config
    (add-to-list 'company-backends 'company-math-symbols-unicode))
  (use-package company-reftex
    :ensure t
    :after company
    :config
    (add-to-list 'company-backends 'company-reftex))
  (use-package company-auctex
    :ensure t
    :after company
    :config
    (company-auctex-init))
  (use-package company-bibtex
    :ensure t
    :after company
    (add-to-list 'company-backends 'company-bibtex))
#+END_SRC
**** Preview pane
#+BEGIN_SRC emacs-lisp
(use-package latex-preview-pane
  :ensure t
  :config
  (latex-preview-pane-enable))
#+END_SRC
**** TeXcount
     Word counts in latex
     #+BEGIN_SRC emacs-lisp
       (when (eq system-type 'windows-nt)
         (add-to-list 'exec-path "c:/Users/joelg/TeXcount_3_1_1")
         (setenv "PATH" (mapconcat #'identity exec-path path-separator)))
       (defun texcount ()
         (interactive)
         (let*
             ( (this-file (buffer-file-name))
               (enc-str (symbol-name buffer-file-coding-system))
               (enc-opt
                (cond
                 ((string-match "utf-8" enc-str) "-utf8")
                 ((string-match "latin" enc-str) "-latin1")
                 ("-encoding=guess")
                 ) )
               (word-count
                (with-output-to-string
                  (with-current-buffer standard-output
                    (call-process "texcount" nil t nil "-0" enc-opt this-file)
                    ) ) ) )
           (message word-count)
           ) )
       (add-hook 'LaTeX-mode-hook (lambda () (define-key LaTeX-mode-map (kbd "C-c c") 'texcount)))
       (add-hook 'latex-mode-hook (lambda () (define-key latex-mode-map (kbd "C-c c") 'texcount)))
     #+END_SRC
*** PlantUML
#+BEGIN_SRC emacs-lisp
(use-package plantuml-mode
  :ensure t
  :init
  (setq plantuml-jar-path "c:/ProgramData/chocolatey/lib/plantuml/tools/plantuml.jar"))
#+END_SRC
*** Matlab
**** Matlab mode
#+BEGIN_SRC emacs-lisp
  (use-package matlab-mode
    :ensure t
    :config
    (autoload 'matlab-mode "matlab" "Matlab Editing Mode" t)
    (add-to-list
     'auto-mode-alist
     '("\\.m$" . matlab-mode))
    (setq matlab-indent-function t))
#+END_SRC
*** Racket
**** Major mode
#+BEGIN_SRC emacs-lisp
  (when (eq system-type 'windows-nt)
    (add-to-list 'exec-path "c:/Program Files/Racket")
    (setenv "PATH" (mapconcat #'identity exec-path path-separator)))
  (use-package racket-mode
      :ensure t
      :config
      (autoload 'racket-mode "Racket" "Racket Editing Mode" t)
      (add-to-list
       'auto-mode-alist
       '("\\.rkt$" . matlab-mode))
      (setq matlab-indent-function t))
#+END_SRC
* Org mode
** Up to date org
#+BEGIN_SRC emacs-lisp
    (use-package org
      :ensure t
      :pin org)
#+END_SRC
** Small tweaks
#+BEGIN_SRC emacs-lisp
(setq org-src-fontify-natively t)
(setq org-src-tab-acts-natively t)
(setq org-confirm-babel-evaluate nil)
(setq org-export-with-smart-quotes t)
(setq org-src-window-setup 'current-window)
(add-hook 'org-mode-hook 'org-indent-mode)
(diminish 'org-indent-mode)
(diminish 'visual-line-mode)
#+END_SRC
** Line wrapping
#+BEGIN_SRC emacs-lisp
  (add-hook 'org-mode-hook
         '(lambda ()
       (visual-line-mode 1)))
#+END_SRC
** org-bullets
#+BEGIN_SRC emacs-lisp
(use-package org-bullets
  :ensure t
  :config
    (add-hook 'org-mode-hook (lambda () (org-bullets-mode))))
#+END_SRC
** Org Babel
*** Languages
Add C to org babel supported languages
#+BEGIN_SRC emacs-lisp
  (org-babel-do-load-languages 'org-babel-load-languages '((emacs-lisp . t)
                                                           (C . t)
                                                           (python . t)
                                                           (latex . t)
                                                           (scheme . t)
                                                           (gnuplot . t)
                                                           (matlab . t)
                                                           (plantuml . t)
                                                           (fortran . t)
                                                           (java . t)))
#+END_SRC
#+TITLE: My Emacs configuration
* Windows dependencies
Dependencies needed for Aspell, poppler PDF-tools, compilers and ghost-script provided by mingw64
#+BEGIN_SRC emacs-lisp
  (when (eq system-type 'windows-nt)
    (add-to-list 'exec-path "C:/msys64/usr/bin")
    (add-to-list 'exec-path "C:/msys64/mingw64/bin")
    (add-to-list 'exec-path "c:/Program Files/gnuplot")
    (setenv "PATH" (mapconcat #'identity exec-path path-separator)))
#+END_SRC
* Aesthetic changes
** Zenburn theme
#+BEGIN_SRC emacs-lisp
  (use-package zenburn-theme
    :ensure t
    :config
    (load-theme 'zenburn t))
#+END_SRC
** Default font
#+BEGIN_SRC emacs-lisp
  (set-frame-font "DejaVu Sans Mono" nil t)
#+END_SRC
** Remove menu bar, toolbar, but keep scroll bar
#+BEGIN_SRC emacs-lisp
  (menu-bar-mode 0)
  (tool-bar-mode 0)
  (scroll-bar-mode 1)
#+END_SRC
* Writing requirements
** Spellchecking
#+BEGIN_SRC emacs-lisp
  (require 'ispell)
  (setq-default ispell-program-name "aspell")
  (setq-default ispell-local-dictionary "en_AU")
  (add-hook 'latex-mode-hook 'flyspell-mode)
  (add-hook 'latex-mode-hook 'flyspell-buffer)
  (add-hook 'org-mode-hook 'flyspell-mode)
  (add-hook 'org-mode-hook 'flyspell-buffer)
#+END_SRC
** Switch-window
Helps to change windows easily when many are open at once
#+BEGIN_SRC emacs-lisp
(use-package switch-window
  :ensure t
  :config
    (setq switch-window-input-style 'minibuffer)
    (setq switch-window-increase 4)
    (setq switch-window-threshold 2)
    (setq switch-window-shortcut-style 'qwerty)
    (setq switch-window-qwerty-shortcuts
        '("a" "s" "d" "f" "j" "k" "l" "i" "o"))
  :bind
    ([remap other-window] . switch-window))
#+END_SRC
** Go to new window when opened
#+BEGIN_SRC emacs-lisp
  (defun split-and-follow-horizontally ()
    (interactive)
    (split-window-below)
    (balance-windows)
    (other-window 1))
  (global-set-key (kbd "C-x 2") 'split-and-follow-horizontally)
  (defun split-and-follow-vertically ()
    (interactive)
    (split-window-right)
    (balance-windows)
    (other-window 1))
  (global-set-key (kbd "C-x 3") 'split-and-follow-vertically)
#+END_SRC
** PDF-tools
#+BEGIN_SRC emacs-lisp
(use-package pdf-tools
  :ensure t
  :config
  (pdf-tools-install))
#+END_SRC
* Helm and Projectile
** Helm core
#+BEGIN_SRC emacs-lisp
  (use-package helm-config
    :ensure helm
    :bind (("M-x" . helm-M-x)
           ("C-x C-f" . helm-find-files)
           ("M-y" . helm-show-kill-ring)
           ("C-x b" . helm-mini)
           ("C-c h o" . helm-occur))
    :config
    (setq helm-M-x-fuzzy-match t)
    (setq helm-buffers-fuzzy-matching t
          helm-recentf-fuzzy-match    t)
    (setq helm-split-window-in-side-p           t ; open helm buffer inside current window, not occupy whole other window
          helm-move-to-line-cycle-in-source     t ; move to end or beginning of source when reaching top or bottom of source.
          helm-ff-search-library-in-sexp        t ; search for library in `require' and `declare-function' sexp.
          helm-scroll-amount                    8 ; scroll 8 lines other window using M-<next>/M-<prior>
          helm-ff-file-name-history-use-recentf t
          helm-echo-input-in-header-line t)
    (defun spacemacs//helm-hide-minibuffer-maybe ()
      "Hide minibuffer in Helm session if we use the header line as input field."
      (when (with-helm-buffer helm-echo-input-in-header-line)
        (let ((ov (make-overlay (point-min) (point-max) nil nil t)))
          (overlay-put ov 'window (selected-window))
          (overlay-put ov 'face
                       (let ((bg-color (face-background 'default nil)))
                         `(:background ,bg-color :foreground ,bg-color)))
          (setq-local cursor-type nil))))
    (add-hook 'helm-minibuffer-set-up-hook
              'spacemacs//helm-hide-minibuffer-maybe)
    (helm-mode 1))
#+END_SRC
** Projectile
*** Enable it
 #+BEGIN_SRC emacs-lisp
   (use-package projectile
     :ensure t
     :bind ("C-c p" . projectile-command-map)
     :diminish projectile-mode
     :config
     (projectile-global-mode)
     (setq projectile-completion-system 'helm)
     (when (eq system-type 'windows-nt)
       (setq projectile-indexing-method 'alien)))
 #+END_SRC
*** Let it compile things
 #+BEGIN_SRC emacs-lisp
   (global-set-key (kbd "<f5>") 'projectile-compile-project)
 #+END_SRC
*** Enable communication with helm
#+BEGIN_SRC emacs-lisp
(use-package helm-projectile
  :ensure t
  :config
  (helm-projectile-on))
#+END_SRC
* Small tweaks
** Remove startup screen
#+BEGIN_SRC emacs-lisp
(setq inhibit-startup-message t)
#+END_SRC
** Disable bell
Bloody bell dings every time you hit a key too much
#+BEGIN_SRC emacs-lisp
(setq ring-bell-function 'ignore)
#+END_SRC
** Pretty symbols
Why not? They make it look nice
#+BEGIN_SRC emacs-lisp
  (when window-system
    (use-package pretty-mode
      :ensure t
      :diminish t
      :config
      (global-pretty-mode)))
#+END_SRC
** find file other window
Lets it accept more than one file. Works recursively.
#+BEGIN_SRC emacs-lisp
(defadvice find-file-other-window (around find-files activate)
  (if (listp filename)
      (loop for f in filename do (find-file-other-window f wildcards))
    ad-do-it))
#+END_SRC
** Which key
Helps to explain keybindings if you get lost
#+BEGIN_SRC emacs-lisp
  (use-package which-key
    :ensure t
    :diminish which-key-mode
    :config
    (which-key-mode))
#+END_SRC
** Go to this file
#+BEGIN_SRC emacs-lisp
(defun config-visit ()
  (interactive)
  (find-file "~/.emacs.d/config.org"))
(global-set-key (kbd "C-c e d") 'config-visit)
#+END_SRC
** Go to init.el
#+BEGIN_SRC emacs-lisp
  (defun init-visit ()
    (interactive)
    (find-file "~/.emacs.d/init.el"))
  (global-set-key (kbd "C-c e i") 'init-visit)
#+END_SRC
** Reload configuration
#+BEGIN_SRC emacs-lisp
(defun config-reload ()
  "Reloads ~/.emacs.d/config.org at run time"
  (interactive)
  (org-babel-load-file (expand-file-name "~/.emacs.d/config.org")))
(global-set-key (kbd "C-c e r") 'config-reload)
#+END_SRC
** Smartparens
Matches brackets automatically
#+BEGIN_SRC emacs-lisp
(use-package smartparens
  :ensure t
  :diminish smartparens-mode
  :config
  (progn
    (require 'smartparens-config)
    (smartparens-global-mode 1)))
#+END_SRC
** Rainbow
Its a little gimmicky but its still cool
#+BEGIN_SRC emacs-lisp
  (use-package rainbow-mode
    :ensure t
    :diminish rainbow-mode
    :init
    (add-hook 'prog-mode-hook 'rainbow-mode))
#+END_SRC
** Rainbow delimiters
A bit more useful than above.
Colours the brackets so that they stand out more.
#+BEGIN_SRC emacs-lisp
  (use-package rainbow-delimiters
    :ensure t
    :init
      (add-hook 'prog-mode-hook #'rainbow-delimiters-mode))
#+END_SRC
** clean-aindent-mode
Removes unnecessary white space
#+BEGIN_SRC emacs-lisp
(use-package clean-aindent-mode
  :ensure t
  :hook prog-mode)
#+END_SRC
Shows trailing white space
#+BEGIN_SRC emacs-lisp
(add-hook 'prog-mode-hook (lambda () (interactive) (setq show-trailing-whitespace 1)))
#+END_SRC
** whitespace mode
Reveals whitespace characters
#+BEGIN_SRC emacs-lisp
(global-set-key (kbd "C-c w") 'whitespace-mode)
(add-hook 'diff-mode-hook (lambda ()
                            (setq-local whitespace-style
                                        '(face
                                          tabs
                                          tab-mark
                                          spaces
                                          space-mark
                                          trailing
                                          indentation::space
                                          indentation::tab
                                          newline
                                          newline-mark))
                            (whitespace-mode 1)))
#+END_SRC
** eldoc
#+BEGIN_SRC emacs-lisp
  (add-hook 'emacs-lisp-mode-hook 'eldoc-mode)
  (add-hook 'lisp-interaction-mode-hook 'eldoc-mode)
  (add-hook 'ielm-mode-hook 'eldoc-mode)
#+END_SRC
** key-freq
collects interesting statistics
#+BEGIN_SRC emacs-lisp
(use-package keyfreq
  :ensure t
  :config
  (keyfreq-mode 1)
  (keyfreq-autosave-mode 1))
#+END_SRC
** undo-tree
A more advanced undo mechanism
#+BEGIN_SRC emacs-lisp
(use-package undo-tree
  :ensure t
  :diminish undo-tree-mode
  :config
  (global-undo-tree-mode))
#+END_SRC
** volatile highlights
Colour the material just copied
#+BEGIN_SRC emacs-lisp
(use-package volatile-highlights
  :ensure t
  :diminish volatile-highlights-mode
  :config
  (volatile-highlights-mode t))
#+END_SRC
** Workgroups
Open the pages when you quit
#+BEGIN_SRC emacs-lisp
  ;; (use-package workgroups2
  ;;   :ensure t
  ;;   :diminish workgroups-mode
  ;;   :config
  ;;   (workgroups-mode 1))
#+END_SRC
** ibuffer
#+BEGIN_SRC emacs-lisp
(global-set-key (kbd "C-x C-b") 'ibuffer)
(setq ibuffer-use-other-window t)
#+END_SRC
** hippie expand
#+BEGIN_SRC emacs-lisp
(global-set-key (kbd "M-/") 'hippie-expand) ;; replace dabbrev-expand
(setq
 hippie-expand-try-functions-list
 '(try-expand-dabbrev ;; Try to expand word "dynamically", searching the current buffer.
   try-expand-dabbrev-all-buffers ;; Try to expand word "dynamically", searching all other buffers.
   try-expand-dabbrev-from-kill ;; Try to expand word "dynamically", searching the kill ring.
   try-complete-file-name-partially ;; Try to complete text as a file name, as many characters as unique.
   try-complete-file-name ;; Try to complete text as a file name.
   try-expand-all-abbrevs ;; Try to expand word before point according to all abbrev tables.
   try-expand-list ;; Try to complete the current line to an entire line in the buffer.
   try-expand-line ;; Try to complete the current line to an entire line in the buffer.
   try-complete-lisp-symbol-partially ;; Try to complete as an Emacs Lisp symbol, as many characters as unique.
   try-complete-lisp-symbol) ;; Try to complete word as an Emacs Lisp symbol.
 )
#+END_SRC
** Highlight line
#+BEGIN_SRC emacs-lisp
(global-hl-line-mode)
#+END_SRC
** Line numbers
#+BEGIN_SRC emacs-lisp
(add-hook 'prog-mode-hook 'linum-mode)
#+END_SRC
** Garbage collection
starts garbage collection every 100MB
#+BEGIN_SRC emacs-lisp
(setq gc-cons-threshold 100000000)
#+END_SRC
** Kill ring
Changes the kill ring size to 5000.
#+BEGIN_SRC emacs-lisp
  (setq global-mark-ring-max 5000
   mark-ring-max 5000
   mode-require-final-newline t
   kill-ring-max 5000
   kill-whole-line t)
#+END_SRC
** Coding style
#+BEGIN_SRC emacs-lisp
(setq c-default-style "linux")
#+END_SRC
** Coding system
#+BEGIN_SRC emacs-lisp
(set-terminal-coding-system 'utf-8)
(set-keyboard-coding-system 'utf-8)
(set-language-environment "UTF-8")
(prefer-coding-system 'utf-8)
(setq-default indent-tabs-mode t)
(delete-selection-mode)
(global-set-key (kbd "RET") 'newline-and-indent)
#+END_SRC
** Move to beginning of line ignoring whitespace
Move point back to indentation of beginning of line.
Move point to the first non-whitespace character on this line.
If point is already there, move to the beginning of the line.
Effectively toggle between the first non-whitespace character and
the beginning of the line.
If ARG is not nil or 1, move forward ARG - 1 lines first. If
point reaches the beginning or end of the buffer, stop there.
#+BEGIN_SRC emacs-lisp
(defun prelude-move-beginning-of-line (arg)
  (interactive "^p")
  (setq arg (or arg 1))
  ;; Move lines first
  (when (/= arg 1)
    (let ((line-move-visual nil))
      (forward-line (1- arg))))
  (let ((orig-point (point)))
    (back-to-indentation)
    (when (= orig-point (point))
      (move-beginning-of-line 1))))
(global-set-key (kbd "C-a") 'prelude-move-beginning-of-line)
#+END_SRC
** Indent region or buffer
#+BEGIN_SRC emacs-lisp
(defun indent-region-or-buffer ()
  "Indent a region if selected, otherwise the whole buffer."
  (interactive)
  (unless (member major-mode prelude-indent-sensitive-modes)
    (save-excursion
      (if (region-active-p)
          (progn
            (indent-region (region-beginning) (region-end))
            (message "Indented selected region."))
        (progn
          (indent-buffer)
          (message "Indented buffer.")))
      (whitespace-cleanup))))
(global-set-key (kbd "C-c i") 'indent-region-or-buffer)
#+END_SRC
** Tramp
#+BEGIN_SRC emacs-lisp
  (when (eq system-type 'windows-nt)
    (setq tramp-default-method "pscp"))
  (setq password-cache-expiry nil)
#+END_SRC
* Mode line tweaks
Diminish is used but is included in init.el such that it can be used throughout this document
** Spaceline
A little easier to read than the default emacs mode line
#+BEGIN_SRC emacs-lisp
  (use-package spaceline
    :ensure t
    :config
    (require 'spaceline-config)
    (setq spaceline-buffer-encoding-abbrev-p t)
    (setq spaceline-line-column-p t)
    (setq spaceline-line-p t)
    (setq powerline-default-separator (quote arrow))
    (spaceline-spacemacs-theme))
#+END_SRC
** No separator
#+BEGIN_SRC emacs-lisp
(setq powerline-default-seperator nil)
#+END_SRC
* Programming tweaks
** Yasnippet
#+BEGIN_SRC emacs-lisp
    (use-package yasnippet
      :ensure t
      :diminish yas-minor-mode
      :config
      (use-package yasnippet-snippets
   :ensure t)
      (yas-reload-all)
      (yas-global-mode 1))
#+END_SRC
** flycheck
#+BEGIN_SRC emacs-lisp
(use-package flycheck
  :ensure t)
#+END_SRC
*** flycheck-pos-tip
#+BEGIN_SRC emacs-lisp
(use-package flycheck-pos-tip
  :ensure t
  :after flycheck
  :config
  (flycheck-pos-tip-mode))
#+END_SRC
** Company
Company is auto-complete for emacs
#+BEGIN_SRC emacs-lisp
  (use-package company
    :ensure t
    :diminish company-mode
    :config
    (global-company-mode)
    (setq company-idle-delay 0)
    (setq company-minimum-prefix-length 3))
#+END_SRC
** Magit
#+BEGIN_SRC emacs-lisp
  (use-package magit
    :ensure t
    :commands magit-get-top-dir
    :bind ("C-x g" . magit-status)
    :init
    (progn
      ;; make magit status go full-screen but remember previous window
      ;; settings
      ;; from: http://whattheemacsd.com/setup-magit.el-01.html
      (defadvice magit-status (around magit-fullscreen activate)
        (window-configuration-to-register :magit-fullscreen)
        ad-do-it
        (delete-other-windows))
      ;; Close popup when committing - this stops the commit window
      ;; hanging around
      ;; From: http://git.io/rPBE0Q
      (defadvice git-commit-commit (after delete-window activate)
        (delete-window))
      (defadvice git-commit-abort (after delete-window activate)
        (delete-window))
      :config
      (progn
        ;; restore previously hidden windows
        (defadvice magit-quit-window (around magit-restore-screen activate)
          (let ((current-mode major-mode))
            ad-do-it
            ;; we only want to jump to register when the last seen buffer
            ;; was a magit-status buffer.
            (when (eq 'magit-status-mode current-mode)
              (jump-to-register :magit-fullscreen)))))
      ;; magit settings
      (setq
       ;; don't put "origin-" in front of new branch names by default
       magit-default-tracking-name-function 'magit-default-tracking-name-branch-only
       ;; open magit status in same window as current buffer
       magit-status-buffer-switch-function 'switch-to-buffer
       ;; highlight word/letter changes in hunk diffs
       magit-diff-refine-hunk t
       ;; ask me if I want to include a revision when rewriting
       magit-rewrite-inclusive 'ask
       ;; ask me to save buffers
       magit-save-some-buffers t
       ;; pop the process buffer if we're taking a while to complete
       magit-process-popup-time 10
       ;; ask me if I want a tracking upstream
       magit-set-upstream-on-push 'askifnotset
       )))
#+END_SRC
** CEDET
*** semantic
#+BEGIN_SRC emacs-lisp
  (use-package semantic
    :config
    (global-semanticdb-minor-mode 1)
    (global-semantic-idle-scheduler-mode 1)
    (global-semantic-idle-summary-mode 1)
    (semantic-mode 1))
#+END_SRC
*** EDE
#+BEGIN_SRC emacs-lisp
(use-package ede
  :config
  (global-ede-mode t))
#+END_SRC
*** gdb-many-windows
#+BEGIN_SRC emacs-lisp
(setq
 ;; use gdb-many-windows by default
 gdb-many-windows t
 ;; Non-nil means display source file containing the main routine at startup
 gdb-show-main t)
#+END_SRC
*** Semantic refactor
#+BEGIN_SRC emacs-lisp
(use-package srefactor
  :ensure t
  :bind (("M-RET o" . 'srefactor-lisp-one-line)
    ("M-RET m" . 'srefactor-lisp-format-sexp)
    ("M-RET d" . 'srefactor-lisp-format-defun)
    ("M-RET b" . 'srefactor-lisp-format-buffer)
    :map c-mode-base-map
         ("M-RET" . 'srefactor-refactor-at-point)
         :map c++-mode-map
         ("M-RET" . 'srefactor-refactor-at-point)))
#+END_SRC
** Language specific configs
*** C/C++
**** yasnippet
#+BEGIN_SRC emacs-lisp
(add-hook 'c++-mode-hook 'yas-minor-mode)
(add-hook 'c-mode-hook 'yas-minor-mode)
#+END_SRC
**** flycheck clang
#+BEGIN_SRC emacs-lisp
(use-package flycheck-clang-analyzer
  :ensure t
  :config
  (with-eval-after-load 'flycheck
    (require 'flycheck-clang-analyzer)
     (flycheck-clang-analyzer-setup)))
#+END_SRC
**** company
#+BEGIN_SRC emacs-lisp
  (use-package company-c-headers
      :ensure t
      :after company
      :config
      (add-hook 'c++-mode-hook 'company-mode)
      (add-hook 'c-mode-hook 'company-mode))
  (use-package company-irony
    :ensure t
    :config
    (add-to-list 'company-backends '(company-c-headers
                                     company-dabbrev-code
                                     company-irony)))
  (use-package irony
    :ensure t
    :init
    (setq w32-pipe-read-delay 0)
    (setq irony-server-w32-pipe-buffer-size (* 64 1024))
    (add-hook 'c++-mode-hook 'irony-mode)
    (add-hook 'c-mode-hook 'irony-mode)
    (add-hook 'irony-mode-hook 'irony-cdb-autosetup-compile-options)
    (add-hook 'irony-mode-hook 'irony-cdb-autosetup-compile-options))
#+END_SRC
*** emacs-lisp
**** eldoc
#+BEGIN_SRC emacs-lisp
(add-hook 'emacs-lisp-mode-hook 'eldoc-mode)
#+END_SRC
**** yasnippet
#+BEGIN_SRC emacs-lisp
(add-hook 'emacs-lisp-mode-hook 'yas-minor-mode)
#+END_SRC
**** company
#+BEGIN_SRC emacs-lisp
(add-hook 'emacs-lisp-mode-hook 'company-mode)
(use-package slime
  :ensure t
  :config
  (setq inferior-lisp-program "/usr/bin/sbcl")
  (setq slime-contribs '(slime-fancy)))
(use-package slime-company
  :ensure t
  :init
    (require 'company)
    (slime-setup '(slime-fancy slime-company)))
#+END_SRC
*** x86
**** x86-lookup
#+BEGIN_SRC emacs-lisp
(use-package x86-lookup
  :ensure t
  :init
  (setq x86-lookup-pdf "D:/Coding/x86-instructions.pdf")
  :bind ("C-h x" . x86-lookup))
#+END_SRC
*** Latex
**** AucTex
#+BEGIN_SRC emacs-lisp
(use-package tex
  :ensure auctex
  :config
  (setq TeX-auto-save t)
  (setq TeX-parse-self t)
  (setq doc-view-ghostscript-program "c:/msys64/mingw64/bin/gswin32c.exe")
  (setq preview-gs-command "c:/msys64/mingw64/bin/gs.exe"))
#+END_SRC
**** Company
#+BEGIN_SRC emacs-lisp
  (use-package company-math
    :ensure t
    :after company
    :config
    (add-to-list 'company-backends 'company-math-symbols-unicode))
  (use-package company-reftex
    :ensure t
    :after company
    :config
    (add-to-list 'company-backends 'company-reftex))
  (use-package company-auctex
    :ensure t
    :after company
    :config
    (company-auctex-init))
  (use-package company-bibtex
    :ensure t
    :after company
    (add-to-list 'company-backends 'company-bibtex))
#+END_SRC
**** Preview pane
#+BEGIN_SRC emacs-lisp
(use-package latex-preview-pane
  :ensure t
  :config
  (latex-preview-pane-enable))
#+END_SRC
**** TeXcount
     Word counts in latex
     #+BEGIN_SRC emacs-lisp
       (when (eq system-type 'windows-nt)
         (add-to-list 'exec-path "c:/Users/joelg/TeXcount_3_1_1")
         (setenv "PATH" (mapconcat #'identity exec-path path-separator)))
       (defun texcount ()
         (interactive)
         (let*
             ( (this-file (buffer-file-name))
               (enc-str (symbol-name buffer-file-coding-system))
               (enc-opt
                (cond
                 ((string-match "utf-8" enc-str) "-utf8")
                 ((string-match "latin" enc-str) "-latin1")
                 ("-encoding=guess")
                 ) )
               (word-count
                (with-output-to-string
                  (with-current-buffer standard-output
                    (call-process "texcount" nil t nil "-0" enc-opt this-file)
                    ) ) ) )
           (message word-count)
           ) )
       (add-hook 'LaTeX-mode-hook (lambda () (define-key LaTeX-mode-map (kbd "C-c c") 'texcount)))
       (add-hook 'latex-mode-hook (lambda () (define-key latex-mode-map (kbd "C-c c") 'texcount)))
     #+END_SRC
*** PlantUML
#+BEGIN_SRC emacs-lisp
(use-package plantuml-mode
  :ensure t
  :init
  (setq plantuml-jar-path "c:/ProgramData/chocolatey/lib/plantuml/tools/plantuml.jar"))
#+END_SRC
*** Racket
**** Major mode
#+BEGIN_SRC emacs-lisp
  (when (eq system-type 'windows-nt)
    (add-to-list 'exec-path "c:/Program Files/Racket")
    (setenv "PATH" (mapconcat #'identity exec-path path-separator)))
  (use-package racket-mode
      :ensure t
      :config
      (autoload 'racket-mode "Racket" "Racket Editing Mode" t)
      (add-to-list
       'auto-mode-alist
       '("\\.rkt$" . matlab-mode))
      (setq matlab-indent-function t))
#+END_SRC
*** Verilog
Add updated version and integrate it with Emacs.
#+BEGIN_SRC emacs-lisp
  (add-to-list 'load-path "~/.emacs.d/elpa/verilog-mode-20190324/verilog-mode.el")
  (require 'verilog-mode)
  (autoload 'verilog-mode "verilog-mode" "Verilog mode" t )
  (add-to-list 'auto-mode-alist '("\\.[ds]?vh?\\'" . verilog-mode))
#+END_SRC
* Org mode
** Up to date org
#+BEGIN_SRC emacs-lisp
    (use-package org
      :ensure t
      :pin org)
#+END_SRC
** Small tweaks
#+BEGIN_SRC emacs-lisp
(setq org-src-fontify-natively t)
(setq org-src-tab-acts-natively t)
(setq org-confirm-babel-evaluate nil)
(setq org-export-with-smart-quotes t)
(setq org-src-window-setup 'current-window)
(add-hook 'org-mode-hook 'org-indent-mode)
(diminish 'org-indent-mode)
(diminish 'visual-line-mode)
#+END_SRC
** Line wrapping
#+BEGIN_SRC emacs-lisp
  (add-hook 'org-mode-hook
         '(lambda ()
       (visual-line-mode 1)))
#+END_SRC
** org-bullets
#+BEGIN_SRC emacs-lisp
(use-package org-bullets
  :ensure t
  :config
    (add-hook 'org-mode-hook (lambda () (org-bullets-mode))))
#+END_SRC
** Org Babel
*** Languages
Add C to org babel supported languages
#+BEGIN_SRC emacs-lisp
  (org-babel-do-load-languages 'org-babel-load-languages '((emacs-lisp . t)
                                                           (C . t)
                                                           (python . t)
                                                           (latex . t)
                                                           (scheme . t)
                                                           (gnuplot . t)
                                                           (matlab . t)
                                                           (plantuml . t)
                                                           (fortran . t)
                                                           (java . t)))
#+END_SRC
** Latex preview fragments match colour
Make the previews match theme colour of Emacs.
#+BEGIN_SRC emacs-lisp
  (let ((dvipng--plist (alist-get 'dvipng org-preview-latex-process-alist)))
    (plist-put dvipng--plist :use-xcolor t)
    (plist-put dvipng--plist :image-converter '("dvipng -D %D -T tight -o %O %f")))
#+END_SRC