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

Joel Grunbaum
2022-01-12 4c7de90983f2a7be726d3a2919d5aefa4aef0065
config.org
@@ -1,14 +1,20 @@
#+TITLE: My Emacs configuration
#  LocalWords:  poppler mingw emacs eq nt gnuplot setenv mapconcat el cond minibuffer pdf color Smartparens smartparens yas aindent whitespace eldoc ielm ibuffer hippie pscp pos Spaceline spaceline powerline spacemacs seperator dir Yasnippet yasnippet flycheck magit fullscreen CEDET askifnotset semanticdb EDE ede gdb srefactor analyzer eval cdb autosetup ghostscript math unicode reftex bibtex TeXcount texcount str latin rkt PlantUML plantuml autoload alist matlab verilog ds vh src fontify natively fortran dvipng plist xcolor EXWM Zenburn setq zenburn defun dolist init config DejaVu ispell aspell flyspell kbd recentf sexp ov bg listp defadvice progn prog keyfreq autosave dabbrev hl gc linum linux utf RET ARG arg configs backends contribs AucTex tex auctex LaTeX url htmlize linter backend writegood ggtags gtags dired eshell asm cd dwim VHDL defvar ctags vhdl concat sp html awk defalias cedet mips IPython ein contrib pandoc dokuwiki EMMS MPD emms toc favicon href css stylesheet async dataLayer gtag js UA sitelinks br Github postamble isso center disqus onclick Disqus javascript dsq createElement getElementsByTagName xml urlset xmlns curr loc
#  LocalWords:  poppler mingw emacs eq nt gnuplot setenv mapconcat el cond minibuffer pdf color Smartparens smartparens yas aindent whitespace eldoc ielm ibuffer hippie pscp pos Spaceline spaceline powerline spacemacs seperator dir Yasnippet yasnippet flycheck magit fullscreen CEDET askifnotset semanticdb EDE ede gdb srefactor analyzer eval cdb autosetup ghostscript math unicode reftex bibtex TeXcount texcount str latin rkt PlantUML plantuml autoload alist matlab verilog ds vh src fontify natively fortran dvipng plist xcolor EXWM Zenburn setq zenburn defun dolist init config DejaVu ispell aspell flyspell kbd recentf sexp ov bg listp defadvice progn prog keyfreq autosave dabbrev hl gc linum linux utf RET ARG arg configs backends contribs AucTex tex auctex LaTeX url htmlize linter backend writegood ggtags gtags dired eshell asm cd dwim VHDL defvar ctags vhdl concat sp html awk defalias cedet mips IPython ein contrib pandoc dokuwiki EMMS MPD emms toc favicon href css stylesheet async dataLayer gtag js UA sitelinks br Github postamble isso center disqus onclick Disqus javascript dsq createElement getElementsByTagName xml urlset xmlns curr loc RSS elfeed
* COMMENT Windows dependencies
Dependencies needed for Aspell, poppler PDF-tools, compilers and ghost-script provided by mingw64 in windows.
* OS dependencies
Windows and Mac have some interesting paths when starting emacs which needs to be fixed.
Using mingw64 in windows and general path in mac.
#+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)))
  (cond ((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)))
        ((eq system-type 'darwin)
         (use-package exec-path-from-shell
           :config
           (exec-path-from-shell-initialize))
         (setq default-directory "~/")))
#+END_SRC
* Aesthetic changes
@@ -19,19 +25,17 @@
  (setq emacs-theme 'zenburn)
  (defun disable-all-themes ()
      (dolist (i custom-enabled-themes)
           (disable-theme i)))
    (dolist (i custom-enabled-themes)
      (disable-theme i)))
  (cond ((eq emacs-theme 'zenburn)
         (use-package zenburn-theme
           :ensure t
           :init
           (disable-all-themes)
           :config
           (load-theme 'zenburn t)))
        ((eq emacs-theme 'doom-one)
         (use-package doom-themes
           :ensure t
           :init
           (disable-all-themes)
           :config
@@ -42,18 +46,22 @@
           (doom-themes-org-config)))
        ((eq emacs-theme 'nord)
         (use-package nord-theme
           :ensure t
           :init
           (disable-all-themes)
           :config
           (load-theme 'nord t)))
        ((eq emacs-theme 'solarized)
         (use-package solarized-theme
           :ensure t
           :init
           (disable-all-themes)
           :config
           (load-theme 'solarized-dark t)))
        ((eq emacs-theme 'jetbrains-darcula)
         (use-package jetbrains-darcula-theme
           :init
           (disable-all-themes)
           :config
           (load-theme 'jetbrains-darcula t)))
        ((eq emacs-theme 'none)
         (disable-all-themes)))
#+END_SRC
@@ -72,19 +80,20 @@
  (set-face-italic 'font-lock-keyword-face t)
#+END_SRC
** Remove menu bar, toolbar, but keep scroll bar
** Remove menu bar, toolbar, and scroll bar
Make the emacs interface slightly nicer.
#+BEGIN_SRC emacs-lisp
  (menu-bar-mode 0)
  (tool-bar-mode 0)
  (scroll-bar-mode 1)
  (scroll-bar-mode 0)
#+END_SRC
* COMMENT EXWM
Emacs window manager.
Tiling window manager that runs in emacs.
Open external applications with =s-&=
#+BEGIN_SRC emacs-lisp
  (use-package exwm
    :ensure t
    :defer t
    :config
    (require 'exwm-config)
    (exwm-config-default))
@@ -95,29 +104,30 @@
Use aspell for spellchecking. 
Auto-enable in latex and org as they're the main writing modes.
#+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)
  (use-package flyspell
    :hook (tex-mode latex-mode TeX-mode LaTeX-mode org-mode)
    :diminish flyspell-mode
    :init (require 'ispell)
    :config
    (setq-default ispell-program-name "aspell")
    (setq-default ispell-local-dictionary "en_AU"))
#+END_SRC
** COMMENT Language Tool
Language tool is an open source grammar checker.
#+BEGIN_SRC emacs-lisp
  (use-package langtool
    :init
    (setq langtool-java-classpath "/usr/share/languagetool:/usr/share/java/languagetool/*"))
#+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)
  (use-package switch-window
    :config
    ;; (setq switch-window-input-style 'minibuffer)
    (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
    :bind
    ([remap other-window] . switch-window))
#+END_SRC
@@ -143,16 +153,14 @@
Helpful pdf viewer.
#+BEGIN_SRC emacs-lisp
  (use-package pdf-tools
   :ensure t
   :config
   (pdf-tools-install 1))
    :config
    (pdf-tools-install 1))
#+END_SRC
** COMMENT Writegood-mode
Supposedly should provide insight to writing quality.
#+BEGIN_SRC emacs-lisp
  (use-package writegood-mode
    :ensure t
    :hook (text-mode . writegood-mode))
#+END_SRC
@@ -160,23 +168,22 @@
** Helm core
Helm aids the user interface for emacs. Adds visual and auto-complete feedback for emacs commands.
#+BEGIN_SRC emacs-lisp
  (use-package helm-config
    :ensure helm
  (use-package 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
    (setq helm-mode-fuzzy-match                 t
          helm-completion-in-regionfuzzy-match  t
          helm-split-window-inside-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)
          helm-echo-input-in-header-line        t
          completion-styles                     '(flex))
    (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)
@@ -190,35 +197,38 @@
              'spacemacs//helm-hide-minibuffer-maybe)
    (helm-mode 1))
#+END_SRC
*** Helm git
Give helm git awareness.
#+BEGIN_SRC emacs-lisp
  (use-package helm-ls-git
    :bind (("C-x C-d" . helm-browse-project)))
#+END_SRC
** Projectile
Projectile is project management framework for emacs.
Helps in navigation and management of projects.
Identifies project layout from git.
*** 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
#+BEGIN_SRC emacs-lisp
  (use-package projectile
    :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
Shortcut for compilation.
 #+BEGIN_SRC emacs-lisp
   (global-set-key (kbd "<f5>") 'projectile-compile-project)
 #+END_SRC
#+BEGIN_SRC emacs-lisp
  (global-set-key (kbd "<f5>") 'projectile-compile-project)
#+END_SRC
*** Enable communication with helm
Use helm to manage project.
#+BEGIN_SRC emacs-lisp
  (use-package helm-projectile
    :ensure t
    :config
    (helm-projectile-on))
#+END_SRC
@@ -226,45 +236,43 @@
** COMMENT ggtags
Use GNU Global Tags. Can be useful for large projects.
#+BEGIN_SRC emacs-lisp
    (use-package ggtags
      :ensure t
      :bind (("C-c g s" . ggtags-find-other-symbol)
  (use-package ggtags
    :bind (("C-c g s" . ggtags-find-other-symbol)
           ("C-c g h" . ggtags-view-tag-history)
           ("C-c g r" . ggtags-find-reference)
           ("C-c g f" . ggtags-find-file)
           ("C-c g c" . ggtags-create-tags)
           ("C-c g u" . ggtags-update-tags))
      :config
      (add-hook 'c-mode-common-hook
    :config
    (add-hook 'c-mode-common-hook
              (lambda ()
                (when (derived-mode-p 'c-mode 'c++-mode 'java-mode)
                  (ggtags-mode 1))))
      )
    )
    (setq
     helm-gtags-ignore-case t
     helm-gtags-auto-update t
     helm-gtags-use-input-at-cursor t
     helm-gtags-pulse-at-cursor t
     helm-gtags-prefix-key "\C-c g"
     helm-gtags-suggested-key-mapping t
     )
  (setq
   helm-gtags-ignore-case t
   helm-gtags-auto-update t
   helm-gtags-use-input-at-cursor t
   helm-gtags-pulse-at-cursor t
   helm-gtags-prefix-key "\C-c g"
   helm-gtags-suggested-key-mapping t
   )
    (use-package helm-gtags
      :ensure t
      :config
      (add-hook 'dired-mode-hook 'helm-gtags-mode)
      (add-hook 'eshell-mode-hook 'helm-gtags-mode)
      (add-hook 'c-mode-hook 'helm-gtags-mode)
      (add-hook 'c++-mode-hook 'helm-gtags-mode)
      (add-hook 'asm-mode-hook 'helm-gtags-mode)
      (define-key helm-gtags-mode-map (kbd "C-c g a") 'helm-gtags-tags-in-this-function)
      (define-key helm-gtags-mode-map (kbd "C-j") 'helm-gtags-select)
      (define-key helm-gtags-mode-map (kbd "M-.") 'helm-gtags-dwim)
      (define-key helm-gtags-mode-map (kbd "M-,") 'helm-gtags-pop-stack)
      (define-key helm-gtags-mode-map (kbd "C-c <") 'helm-gtags-previous-history)
      (define-key helm-gtags-mode-map (kbd "C-c >") 'helm-gtags-next-history))
  (use-package helm-gtags
    :config
    (add-hook 'dired-mode-hook 'helm-gtags-mode)
    (add-hook 'eshell-mode-hook 'helm-gtags-mode)
    (add-hook 'c-mode-hook 'helm-gtags-mode)
    (add-hook 'c++-mode-hook 'helm-gtags-mode)
    (add-hook 'asm-mode-hook 'helm-gtags-mode)
    (define-key helm-gtags-mode-map (kbd "C-c g a") 'helm-gtags-tags-in-this-function)
    (define-key helm-gtags-mode-map (kbd "C-j") 'helm-gtags-select)
    (define-key helm-gtags-mode-map (kbd "M-.") 'helm-gtags-dwim)
    (define-key helm-gtags-mode-map (kbd "M-,") 'helm-gtags-pop-stack)
    (define-key helm-gtags-mode-map (kbd "C-c <") 'helm-gtags-previous-history)
    (define-key helm-gtags-mode-map (kbd "C-c >") 'helm-gtags-next-history))
#+END_SRC
** COMMENT Ctags
@@ -353,40 +361,38 @@
** Remove startup screen
Start on scratch buffer instead.
#+BEGIN_SRC emacs-lisp
(setq inhibit-startup-message t)
  (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)
  (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)))
  (use-package pretty-mode
    :diminish t
    :if window-system
    :config
    (global-pretty-mode))
#+END_SRC
** COMMENT 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))
  (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))
@@ -395,10 +401,10 @@
** Config shortcuts
*** 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)
  (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
@@ -411,18 +417,17 @@
*** 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)
  (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. Added "$" for latex in org mode.
#+BEGIN_SRC emacs-lisp
  (use-package smartparens
    :ensure t
    :diminish smartparens-mode
    :config
    (progn
@@ -437,7 +442,6 @@
Colours according to code after a "#", works with 3 and 6 character hex codes.
#+BEGIN_SRC emacs-lisp
  (use-package rainbow-mode
    :ensure t
    :diminish rainbow-mode
    :init
    (add-hook 'prog-mode-hook 'rainbow-mode))
@@ -448,47 +452,44 @@
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))
    :hook (prog-mode . rainbow-delimiters-mode))
#+END_SRC
** Following whitespace
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)))
  (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)))
  (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
Shows function arguments in echo area below mode line.
#+BEGIN_SRC emacs-lisp
  (diminish eldoc-mode)
  (diminish 'eldoc-mode)
  (add-hook 'emacs-lisp-mode-hook 'eldoc-mode)
  (add-hook 'lisp-interaction-mode-hook 'eldoc-mode)
  (add-hook 'ielm-mode-hook 'eldoc-mode)
@@ -498,11 +499,10 @@
Collects interesting statistics about key presses.
Use M-x keyfreq-show to show in emacs or M-x keyfreq-html to output
#+BEGIN_SRC emacs-lisp
(use-package keyfreq
  :ensure t
  :config
  (keyfreq-mode 1)
  (keyfreq-autosave-mode 1))
  (use-package keyfreq
    :config
    (keyfreq-mode 1)
    (keyfreq-autosave-mode 1))
#+END_SRC
** Undo tree
@@ -510,76 +510,74 @@
Supports branched undo history (thus the tree).
Pretty neat, if seldom used.
#+BEGIN_SRC emacs-lisp
(use-package undo-tree
  :ensure t
  :diminish undo-tree-mode
  :config
  (global-undo-tree-mode))
  (use-package undo-tree
    :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))
  (use-package volatile-highlights
    :diminish volatile-highlights-mode
    :config
    (volatile-highlights-mode t))
#+END_SRC
** ibuffer
View all open buffers in their own buffer rather in the temporary mini buffer.
#+BEGIN_SRC emacs-lisp
(global-set-key (kbd "C-x C-b") 'ibuffer)
(setq ibuffer-use-other-window t)
  (global-set-key (kbd "C-x C-b") 'ibuffer)
  (setq ibuffer-use-other-window t)
#+END_SRC
** Hippie expand
Seems cool, but I don't think I ever use this.
Meant to suggest completions to beginning of a word.
#+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.
 )
  (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
Very useful for finding where you are.
#+BEGIN_SRC emacs-lisp
(global-hl-line-mode)
  (global-hl-line-mode)
#+END_SRC
** Line numbers
Everyone needs line numbers when programming.
#+BEGIN_SRC emacs-lisp
(add-hook 'prog-mode-hook 'linum-mode)
  (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)
  (setq gc-cons-threshold (* 1024 1024 100))
#+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)
        mark-ring-max 5000
        mode-require-final-newline t
        kill-ring-max 5000
        kill-whole-line t)
#+END_SRC
** Coding style
@@ -587,21 +585,32 @@
K&R uses 4 space tabs.
#+BEGIN_SRC emacs-lisp
  (setq c-default-style '((java-mode . "java")
                         (awk-mode . "awk")
                         (other . "k&r")))
                          (awk-mode . "awk")
                          (other . "k&r")))
#+END_SRC
** Coding system
Cause we all love UTF8
Cause we all love UTF8.
#+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
            tab-width 4)
  (setq-default indent-tabs-mode nil
                tab-width 4
                c-basic-offset tab-width
                cperl-indent-level tab-width)
  (c-set-offset 'inline-open '0)
  (delete-selection-mode)
  (global-set-key (kbd "RET") 'newline-and-indent)
#+END_SRC
*** Smart tabs
Tabs for indentation, spaces for alignment
#+BEGIN_SRC emacs-lisp
  (use-package smart-tabs-mode
    :config
    (smart-tabs-insinuate 'c 'c++ 'java 'javascript 'cperl 'python 'ruby
                          'nxml))
#+END_SRC
** Move to beginning of line ignoring whitespace
@@ -616,50 +625,55 @@
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))
  (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))))
    ;; 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))))
    (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)
  (global-set-key (kbd "C-a") 'prelude-move-beginning-of-line)
#+END_SRC
** Indent region or buffer
Indent, slightly different to standard tab or C-M-\.
#+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)
  (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-region (region-beginning) (region-end))
            (message "Indented selected region."))
        (progn
          (indent-buffer)
          (message "Indented buffer.")))
      (whitespace-cleanup))))
            (indent-buffer)
            (message "Indented buffer.")))
        (whitespace-cleanup))))
(global-set-key (kbd "C-c i") 'indent-region-or-buffer)
  (global-set-key (kbd "C-c i") 'indent-region-or-buffer)
#+END_SRC
** Tramp
Remote editing mode.
Hate having to re-input passwords.
#+BEGIN_SRC emacs-lisp
  (when (eq system-type 'windows-nt)
    (setq tramp-default-method "pscp"))
  (setq password-cache-expiry nil)
  (use-package tramp
    :pin gnu
    :config
    ;; (setq tramp-default-method "ssh")
    (when (eq system-type 'windows-nt)
      (setq tramp-default-method "pscp"))
    (setq password-cache-expiry nil)
    (add-to-list 'tramp-remote-path 'tramp-own-remote-path))
#+END_SRC
** COMMENT Y or N instead of yes or no
@@ -668,27 +682,66 @@
  (defalias 'yes-or-no-p 'y-or-n-p)
#+END_SRC
** COMMENT Sublime-like minimap
Get a minimap preview of the file on the side like sublime text.
Want to make work but need to find a good way of doing so.
#+BEGIN_SRC emacs-lisp
  (use-package sublimity
    :config
    (require 'sublimity-scroll)
    (setq sublimity-scroll-weight 4
          sublimity-scroll-drift-length 3)
    (require 'sublimity-map)
    (setq sublimity-map-size 20
          sublimity-map-scale 0.3)
    (sublimity-map-set-delay nil)
    (sublimity-mode 1))
  (use-package minimap
    :config
    (minimap-mode))
#+END_SRC
** Highlight indentation
Vertical demarcations for indent levels
#+BEGIN_SRC emacs-lisp
  (use-package highlight-indentation
    :hook (prog-mode . highlight-indentation-mode))
#+END_SRC
** Auto revert mode
Update unchanged buffers if underlying file changes.
#+BEGIN_SRC emacs-lisp
  (global-auto-revert-mode)
#+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)
      (spaceline-helm-mode))
  (use-package spaceline
    :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)
    (spaceline-helm-mode))
#+END_SRC
*** Separator
Slightly nicer separator.
#+BEGIN_SRC emacs-lisp
(setq powerline-default-separator nil)
  (setq powerline-default-separator nil)
#+END_SRC
** Nyan mode
Use nyan cat as a reference for buffer progression.
#+BEGIN_SRC emacs-lisp
  (use-package nyan-mode
    :config
    (nyan-mode 1))
#+END_SRC
* Programming tweaks
@@ -697,20 +750,17 @@
Manually added snippets are in ~/.emacs.d/snippets/{mode}.
#+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
  (use-package yasnippet-snippets
    :after yasnippet)
#+END_SRC
** Flycheck
Basic linter. Works pretty well.
#+BEGIN_SRC emacs-lisp
  (use-package flycheck
    :ensure t
    :diminish flycheck-mode
    :config
    (global-flycheck-mode))
@@ -718,24 +768,62 @@
*** flycheck-pos-tip
Add suggestions at the cursor.
#+BEGIN_SRC emacs-lisp
(use-package flycheck-pos-tip
  :ensure t
  :after flycheck
  :config
  (flycheck-pos-tip-mode))
  (use-package flycheck-pos-tip
    :after flycheck
    :config
    (flycheck-pos-tip-mode))
#+END_SRC
** Company
Company is auto-complete for Emacs.
Uses various backends, more of which are added later.
#+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))
    (setq company-minimum-prefix-length 1))
#+END_SRC
** LSP Mode
Use LSP for completion suggestions.
Causes too much memory usage, need to debug.
Need to generate ~compile_flags~ for c/c++, can use ~bear~ but may need other tools.
#+BEGIN_SRC emacs-lisp
  (use-package lsp-mode
    :hook (((c-mode
             c++-mode
             tex-mode
             latex-mode
             TeX-mode
             LaTeX-mode
             rust-mode
             sh-mode
             ;; verilog-mode
             go-mode
             python-mode) . lsp))
    :init
    (setq lsp-keymap-prefix "C-c l")
    :commands lsp
    :config
    (add-hook 'lsp-mode-hook 'lsp-enable-which-key-integration)
    (setq read-process-output-max (* 1024 1024))
    (setq lsp-completion-provider :capf)
    (setq lsp-keep-workspace-alive 'nil)
    (add-to-list 'exec-path "~/.cargo/bin"))
  (use-package lsp-ui
    :commands lsp-ui-mode)
  (use-package helm-lsp
    :commands helm-lsp-workspace-symbol)
#+END_SRC
** Version control
Settings for emacs' own version control system.
*** Enable version control on the mode line
#+BEGIN_SRC emacs-lisp
  (vc-mode)
#+END_SRC
** Magit
@@ -743,7 +831,6 @@
Pretty good and offers fairly decent features.
#+BEGIN_SRC emacs-lisp
  (use-package magit
    :ensure t
    :commands magit-get-top-dir
    :bind ("C-x g" . magit-status)
    :init
@@ -792,15 +879,47 @@
       magit-process-popup-time 10
       ;; ask me if I want a tracking upstream
       magit-set-upstream-on-push 'askifnotset
       )))
       ))
    )
#+END_SRC
*** More general yes and no prompt
The default setting can miss some.
Don't redefine the regex in case this is too general.
#+BEGIN_SRC emacs-lisp
  ;;(when-let ((regex "[\[\(]]?\\([Yy]\\(es\\)?\\)[/|]\\([Nn]o?\\)[\]\)]")
  (defun magit-process-general-yn-prompt-hook (proc str)
    "Handle [y/n] prompts"
    (when-let ((beg (string-match "[\[\(]]?\\([Yy]\\(es\\)?\\)[/|]\\([Nn]o?\\)[\]\)]" str)))
      (let ;; ((max-mini-window-height 30))
          (process-send-string
           proc
           (downcase
            (concat
             (match-string
              (if (save-match-data
                    (magit-process-kill-on-abort proc
                      (y-or-n-p (substring str 0 beg)))) 1 2)
              str)
             "\n"))))))
  (add-hook 'magit-process-prompt-functions
            #'magit-process-general-yn-prompt-hook)
#+END_SRC
*** COMMENT Gerrit integration
Gerrit takes ~origin:refs/for/master~ as a destination.
Enable magit to work with its oddities.
#+BEGIN_SRC emacs-lisp
  (use-package magit-gerrit)
#+END_SRC
** CEDET
*** Semantic
*** COMMENT Semantic
Parser library for code, supports many other packages.
Allows emacs to be mode aware of what is being written.
Allows emacs to be more aware of what is being written.
#+BEGIN_SRC emacs-lisp
  (use-package semantic
    :hook (prog-mode . semantic-mode)
    :config
    (global-semanticdb-minor-mode 1)
    (global-semantic-idle-scheduler-mode 1)
@@ -812,9 +931,9 @@
Emacs Development Environment.
Can be used to manage and create build files for a project.
#+BEGIN_SRC emacs-lisp
(use-package ede
  :config
  (global-ede-mode t))
  (use-package ede
    :config
    (global-ede-mode t))
#+END_SRC
*** gdb-many-windows
@@ -822,9 +941,9 @@
Shows register contents, variable contents and others in addition to GDB shell.
Also shows source code while debugging.
#+BEGIN_SRC emacs-lisp
(setq
 gdb-many-windows t
 gdb-show-main t)
  (setq
   gdb-many-windows t
   gdb-show-main t)
#+END_SRC
*** COMMENT Semantic refactor
@@ -832,49 +951,70 @@
Should help to refactor file.
#+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)))
           ("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
** Tree sitter
Parser library.
Provides better syntax highlighting and some other neat features.
#+BEGIN_SRC emacs-lisp
  (use-package tree-sitter
    :diminish t)
  (use-package tree-sitter-langs
    :config
    (global-tree-sitter-mode)
    (add-hook 'tree-sitter-after-on-hook #'tree-sitter-hl-mode))
#+END_SRC
** Language specific configs
*** C/C++
**** COMMENT yasnippet
Enable yasnippet for C/C++.
#+BEGIN_SRC emacs-lisp
(add-hook 'c++-mode-hook 'yas-minor-mode)
(add-hook 'c-mode-hook 'yas-minor-mode)
#+END_SRC
**** Flycheck clang
**** Flycheck
***** Flycheck clang
Add the clang backend for linting.
#+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)))
  (use-package flycheck-clang-analyzer
    :after flycheck
    :config
    (with-eval-after-load 'flycheck
      (require 'flycheck-clang-analyzer)
      (flycheck-clang-analyzer-setup)))
#+END_SRC
***** Flycheck project root
Flycheck tends to fail finding the project root, giving errors about missing files.
This should remove them.
#+BEGIN_SRC emacs-lisp
  (defun setup-flycheck-project-path ()
    (let ((root (ignore-errors (projectile-project-root))))
      (when root
        (add-to-list
         (make-variable-buffer-local 'flycheck-clang-include-path)
         root)
        (add-to-list
         (make-variable-buffer-local 'flycheck-gcc-include-path)
         root))))
**** Company
  (add-hook 'c-mode-hook 'setup-flycheck-project-path)
  (add-hook 'c++-mode-hook 'setup-flycheck-project-path)
#+END_SRC
**** COMMENT Company
Add header completion as well as Irony, which uses clang for suggestions.
#+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))
    :after company
    :config
    (add-hook 'c++-mode-hook 'company-mode)
    (add-hook 'c-mode-hook 'company-mode))
#+END_SRC
**** COMMENT Irony
#+BEGIN_SRC emacs-lisp
  (use-package irony
    :ensure t
    :init
    (setq w32-pipe-read-delay 0)
    (setq irony-server-w32-pipe-buffer-size (* 64 1024))
@@ -884,34 +1024,51 @@
    (add-hook 'irony-mode-hook 'irony-cdb-autosetup-compile-options))
  (use-package company-irony
    :ensure t
    :after irony
    :config
    (add-to-list 'company-backends '(company-c-headers
                                     company-dabbrev-code
                                     company-irony)))
#+END_SRC
*** emacs-lisp
**** COMMENT yasnippet
Enable yasnippet.
**** Clang-format
Automatically format buffer on save.
#+BEGIN_SRC emacs-lisp
(add-hook 'emacs-lisp-mode-hook 'yas-minor-mode)
#+END_SRC
  (defun set-clang-format-style ()
    (if (file-exists-p (concat
                        (projectile-project-root)
                        ".clang-format"))
        (setq-local clang-format-style nil)
      (setq-local clang-format-style (concat "{BasedOnStyle: LLVM,"
                                             "IndentWidth: " (format "%s" tab-width) ","
                                             "UseTab: " (if (eq indent-tabs-mode nil)
                                                            "Never"
                                                          "AlignWithSpaces")
                                             ","
                                             "BreakBeforeBraces: Linux,"
                                             "AllowShortIfStatementsOnASingleLine: false,"
                                             "IndentCaseLabels: false}"))))
  (add-hook 'c-mode-common-hook 'set-clang-format-style)
  (use-package clang-format)
**** COMMENT company
  ;;   (defun clang-format-on-save ()
  ;;     (add-hook 'before-save-hook 'clang-format-buffer nil t))
  ;;   (add-hook 'c-mode-hook 'clang-format-on-save nil t)
  ;;   (add-hook 'c++-mode-hook 'clang-format-on-save nil t))
#+END_SRC
*** emacs-lisp
**** COMMENT Company
Add slime backend.
#+BEGIN_SRC emacs-lisp
(add-hook 'emacs-lisp-mode-hook 'company-mode)
  (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
    :config
    (setq inferior-lisp-program "/usr/bin/sbcl")
    (setq slime-contribs '(slime-fancy)))
(use-package slime-company
  :ensure t
  :init
  (use-package slime-company
    :init
    (require 'company)
    (slime-setup '(slime-fancy slime-company)))
#+END_SRC
@@ -920,11 +1077,10 @@
**** x86-lookup
Look up reference PDF. Use Intel manual.
#+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))
  (use-package x86-lookup
    :init
    (setq x86-lookup-pdf "D:/Coding/x86-instructions.pdf")
    :bind ("C-h x" . x86-lookup))
#+END_SRC
*** Latex
@@ -934,9 +1090,9 @@
  (use-package tex
    :ensure auctex
    :config
    (setq TeX-auto-save t)
    (setq TeX-parse-self t)
    (setq TeX-view-program-selection '((output-pdf "PDF Tools"))
    (setq TeX-auto-save t
          TeX-parse-self t
          TeX-view-program-selection '((output-pdf "PDF Tools"))
          TeX-source-correlate-start-server t)
    (add-hook 'TeX-after-compilation-finished-functions #'TeX-revert-document-buffer))
#+END_SRC
@@ -945,27 +1101,23 @@
Help company complete tex math and references.
#+BEGIN_SRC emacs-lisp
  (use-package company-math
    :ensure t
    :after company
    :config
    (add-to-list 'company-backends '(company-math-symbols-unicode company-math-symbols-latex
                                     company-latex-commands))
                                                                  company-latex-commands))
    (setq company-math-allow-latex-symbols-in-faces t))
  (use-package company-reftex
    :ensure t
    :after company
    :config
    (add-to-list 'company-backends 'company-reftex-citations))
  (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
@@ -977,11 +1129,11 @@
  (defun get-texcount-latest()
    (if (not(file-directory-p "~/.texcount"))
        (make-directory "~/.texcount"))
    (url-copy-file "https://app.uio.no/ifi/texcount/download.php?file=texcount_3_1_1.zip" "~/.texcount/texcount.zip" 1)
    (url-copy-file "https://app.uio.no/ifi/texcount/download.php?file=texcount_3_2_0_41.zip" "~/.texcount/texcount.zip" 1)
    (shell-command "unzip -o ~/.texcount/texcount.zip -d ~/.texcount")
    (add-to-list 'exec-path "~/.texcount/texcount.pl"))
  (if (not(file-exists-p "~/.texcount/texcount.pl"))
  (if (not(or (file-exists-p "~/.texcount/texcount.pl") (file-exists-p "/usr/bin/texcount")))
      (get-texcount-latest))
  (defun texcount ()
@@ -1010,12 +1162,15 @@
Sets the PlantUML path for the mode to generate models.
#+BEGIN_SRC emacs-lisp
  (use-package plantuml-mode
    :ensure t
    :init
    (cond ((eq system-type 'windows-nt)
           (setq plantuml-jar-path "c:/ProgramData/chocolatey/lib/plantuml/tools/plantuml.jar"))
           (when (file-exists-p "c:/ProgramData/chocolatey/lib/plantuml/tools/plantuml.jar")
             (setq plantuml-jar-path "c:/ProgramData/chocolatey/lib/plantuml/tools/plantuml.jar")
             (setq planuml-default-exec-mode 'jar)))
          ((eq system-type 'gnu/linux)
           (setq plantuml-jar-path "/usr/share/java/plantuml/plantuml.jar"))))
           (when (file-exists-p "/usr/share/java/plantuml/plantuml.jar")
             (setq plantuml-jar-path "/usr/share/java/plantuml/plantuml.jar")
             (setq planuml-default-exec-mode 'jar)))))
#+END_SRC
*** COMMENT Racket
@@ -1027,80 +1182,44 @@
    (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$" . racket-mode))
      (setq matlab-indent-function t))
    :config
    (autoload 'racket-mode "Racket" "Racket Editing Mode" t)
    (add-to-list
     'auto-mode-alist
     '("\\.rkt$" . racket-mode)))
#+END_SRC
*** COMMENT Verilog
*** Verilog
**** Get latest version
Pull the latest version from the web.
Use latest version from repositories.
#+BEGIN_SRC emacs-lisp
  (defun get-verilog-latest()
    (if (not(file-directory-p "~/.emacs.d/elpa/verilog-mode"))
        (make-directory "~/.emacs.d/elpa/verilog-mode"))
    (if (file-exists-p "~/.emacs.d/elpa/verilog-mode/verilog-mode.el")
        (delete-file "~/.emacs.d/elpa/verilog-mode/verilog-mode.el"))
    (url-copy-file "https://www.veripool.org/ftp/verilog-mode.el" "~/.emacs.d/elpa/verilog-mode/verilog-mode.el" 1))
  (use-package verilog-mode
    :pin gnu
    :config
    (autoload 'verilog-mode "verilog-mode" "Verilog mode" t )
    (add-to-list 'auto-mode-alist '("\\.[ds]?va?h?\\'" . verilog-mode))
    (setq-default verilog-align-ifelse t
                  verilog-auto-delete-trailing-whitespace t
                  verilog-auto-inst-param-value t
                  verilog-auto-lineup 'all
                  verilog-auto-newline nil
                  verilog-auto-save-policy nil
                  verilog-auto-template-warn-unused t
                  verilog-auto-endcomments nil
                  verilog-highlight-grouping-keywords t
                  verilog-highlight-modules t
                  verilog-tab-to-comment t
                  verilog-indent-begin-after-if nil
                  verilog-indent-lists nil
                  verilog-case-indent 4
                  verilog-cexp-indent 0
                  verilog-indent-level 4
                  verilog-indent-level-behavioral 4
                  verilog-indent-level-declaration 4
                  verilog-indent-level-directive 4
                  verilog-indent-level-module 4))
#+END_SRC
**** Integrate into emacs
Add updated version (based off auto-package-update) and integrate it with Emacs.
#+BEGIN_SRC emacs-lisp
    (defun verilog-read-file-as-string (file)
      "Read FILE contents."
      (when (file-exists-p file)
        (with-temp-buffer
          (insert-file-contents file)
          (buffer-string))))
    (defun verilog-write-string-to-file (file string)
      "Substitute FILE contents with STRING."
      (with-temp-buffer
        (insert string)
        (when (file-writable-p file)
          (write-region (point-min)
                        (point-max)
                        file))))
    (defun verilog-today-day ()
      (time-to-days (current-time)))
    (defun should-update-verilog-p ()
      "Return non-nil when an update is due."
      (and
       (or
        (not (file-exists-p "~/.emacs.d/.last-verilog-update-day"))
        (if (>= (/ (- (verilog-today-day) (verilog-read-last-update-day)) 7) 1)
            t
          nil))))
    (defun verilog-read-last-update-day ()
      "Read last update day."
      (string-to-number
       (verilog-read-file-as-string "~/.emacs.d/.last-verilog-update-day")))
    (defun verilog-write-current-day ()
      "Store current day."
      (verilog-write-string-to-file
       "~/.emacs.d/.last-verilog-update-day"
       (int-to-string (verilog-today-day))))
    (use-package verilog-mode
      :init
      (when (should-update-verilog-p)
          (get-verilog-latest)
          (verilog-write-current-day))
      (add-to-list 'load-path "~/.emacs.d/elpa/verilog-mode/verilog-mode.el")
      :config
      (autoload 'verilog-mode "verilog-mode" "Verilog mode" t )
      (add-to-list 'auto-mode-alist '("\\.[ds]?vh?\\'" . verilog-mode)))
#+END_SRC
*** COMMENT MATLAB
Mode for editing MATLAB m-files.
#+BEGIN_SRC emacs-lisp
@@ -1120,37 +1239,87 @@
For editing MIPS assembly.
#+BEGIN_SRC emacs-lisp
  (use-package mips-mode
    :ensure t
    :mode "\\.mips$")
#+END_SRC
*** COMMENT IPython notebooks
Allow emacs to view and use IPython notebooks
#+BEGIN_SRC emacs-lisp
  (use-package ein
    :ensure t)
  (use-package ein)
#+END_SRC
*** Rust
**** Major mode
Get the major mode for rust files.
#+BEGIN_SRC emacs-lisp
  (use-package rust-mode
    :config
    ;; style guide suggests spaces not tabs
    (add-hook 'rust-mode-hook (lambda () (setq indent-tabs-mode nil)))
    (setq rust-format-on-save t))
  (use-package toml-mode)
#+END_SRC
**** Cargo integration
Integrate Cargo, rust's package manager.
#+BEGIN_SRC emacs-lisp
  (use-package cargo
    :hook
    (rust-mode . cargo-minor-mode))
#+END_SRC
**** Flycheck
Linting with flycheck.
#+BEGIN_SRC emacs-lisp
  (use-package flycheck-rust
    :config
    (add-hook 'flycheck-mode-hook #'flycheck-rust-setup))
#+END_SRC
*** Go
**** Major mode
#+BEGIN_SRC emacs-lisp
  (use-package go-mode
    :config
    (add-hook 'before-save-hook #'gofmt-before-save))
#+END_SRC
**** Flycheck
#+BEGIN_SRC emacs-lisp
  (use-package flycheck-golangci-lint
    :config
    (add-hook 'flycheck-mode-hook #'flycheck-golangci-lint-setup))
#+END_SRC
**** Company
#+BEGIN_SRC emacs-lisp
  (use-package company-go)
#+END_SRC
*** Python
**** COMMENT LSP server
Use jedi, idk why.
#+BEGIN_SRC emacs-lisp
  (use-package lsp-jedi
    :config
    (add-to-list 'lsp-disabled-clients 'pyls)
    (add-to-list 'lsp-enabled-clients 'jedi))
#+END_SRC
* Org mode
** Up to date org
Pull the latest org mode from the repository, rather than the org which comes with emacs.
#+BEGIN_SRC emacs-lisp
    (use-package org
      :ensure org-plus-contrib
      :pin org)
  (use-package org
    :ensure org-contrib)
#+END_SRC
** Small tweaks
Small quality of life changes to org-mode.
#+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)
  (setq org-src-fontify-natively t
        org-src-tab-acts-natively t
        org-confirm-babel-evaluate nil
        org-export-with-smart-quotes t
        org-src-window-setup 'current-window)
  (add-hook 'org-mode-hook 'org-indent-mode)
  (diminish 'org-indent-mode)
  (diminish 'visual-line-mode)
#+END_SRC
*** Spell checking for code and latex
#+BEGIN_SRC emacs-lisp
@@ -1167,13 +1336,12 @@
               (visual-line-mode 1)))
#+END_SRC
** org-bullets
** Fancy org points
Use bullets of different colours and styles instead of the "\*\*\*" to denote indentation levels.
#+BEGIN_SRC emacs-lisp
  (use-package org-bullets
    :ensure t
  (use-package org-superstar
    :config
    (add-hook 'org-mode-hook (lambda () (org-bullets-mode))))
    (add-hook 'org-mode-hook (lambda () (org-superstar-mode 1))))
#+END_SRC
** Org Babel
@@ -1182,23 +1350,29 @@
*** Languages
Add a bunch of languages 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)
                                                             (plantuml . t)))
  (org-babel-do-load-languages 'org-babel-load-languages '((emacs-lisp . t)
                                                           (C . t)
                                                           (python . t)
                                                           (latex . t)
                                                           (scheme . t)
                                                           (gnuplot . t)
                                                           (matlab . t)
                                                           (fortran . t)
                                                           (java . t)
                                                           (plantuml . t)))
#+END_SRC
**** PlantUML path
Org uses its own path for some reason.
#+BEGIN_SRC emacs-lisp
  (setq org-plantuml-jar-path plantuml-jar-path)
#+END_SRC
*** Async export
Allow the editing of files while execution of blocks is occurring.
Needs :async tag in src header.
#+BEGIN_SRC emacs-lisp
  (use-package ob-async)
#+END_SRC
** Latex preview fragments match colour
@@ -1213,16 +1387,16 @@
** Org export additions
*** Pandoc
Call pandoc on org buffer from org export.
Need to add ~#+OPTIONS: H:99~ to enable large level header exports.
#+BEGIN_SRC emacs-lisp
  (use-package ox-pandoc
    :ensure t)
  (when (executable-find "pandoc")
    (use-package ox-pandoc))
#+END_SRC
*** COMMENT Dokuwiki Wiki
Allow export to dokuwiki markup from org.
#+BEGIN_SRC emacs-lisp
  (use-package ox-wk
    :ensure t)
  (use-package ox-wk)
#+END_SRC
* COMMENT EMMS
@@ -1246,7 +1420,6 @@
Copied and modified from the example configuration.
#+BEGIN_SRC emacs-lisp
  (use-package org-static-blog
    :ensure t
    :config
    (setq org-static-blog-publish-title "Joel's Site")
    (setq org-static-blog-publish-url "https://blog.joelg.cf/")
@@ -1337,17 +1510,17 @@
Allow org features to be exported to HTML for site.
#+BEGIN_SRC emacs-lisp
  (use-package htmlize
    :ensure t)
    :defer t)
#+END_SRC
* Journaling
* COMMENT Journaling
** Noteworthy entries
I write weekly journal entries recapping my week.
These files are in org mode.
This is inspired by org-static-blog.
#+BEGIN_SRC emacs-lisp
  (defun journal-create-new-post ()
      "Create a new entry, prompt for title and insert header"
    "Create a new entry, prompt for title and insert header"
    (interactive)
    (let ((title (read-string "Title: ")))
      (find-file (concat "~/Documents/Journal/entry/"
@@ -1363,33 +1536,19 @@
Use org-publish to collate entries into a single unit.
#+BEGIN_SRC emacs-lisp
  (setq org-publish-project-alist
               '(("Journal"
                 :base-directory "~/Documents/Journal/entry/"
                 :publishing-directory "~/Documents/Journal/out/"
                 :publishing-function org-html-publish-to-html
                 ;;:htmlized-source t
                 :section-numbers nil
                 :html-preamble t
                 :html-validation-link nil
        '(("Journal"
           :base-directory "~/Documents/Journal/entry/"
           :publishing-directory "~/Documents/Journal/out/"
           :publishing-function org-html-publish-to-html
           ;;:htmlized-source t
           :section-numbers nil
           :html-preamble t
           :html-validation-link nil
                 :auto-sitemap t
                 :sitemap-sort-files anti-chronologically
                 :sitemap-file-entry-format "%d - %t"
                 :sitemap-title "Home"
                 :sitemap-filename "index.html"
                 :sitemap-function org-publish-sitemap)))
           :auto-sitemap t
           :sitemap-sort-files anti-chronologically
           :sitemap-file-entry-format "%d - %t"
           :sitemap-title "Home"
           :sitemap-filename "index.html"
           :sitemap-function org-publish-sitemap)))
#+END_SRC
** COMMENT Daily
Using Org-Journal for daily journaling.
Package provides journaling support files for org mode.
#+BEGIN_SRC emacs-lisp
  (use-package org-journal
    :ensure t
    :custom
    (org-journal-dir "~/Documents/Journal/daily")
    (org-journal-date-format "%A, %d %B %Y")
    (org-journal-time-format "%I:%M %p")
    (org-journal-file-type "daily"))
#+END_SRC