From 5324d5fcbf8e365dc774795ceeedf1cac9d0b4bb Mon Sep 17 00:00:00 2001
From: Joel Grunbaum <joelgrun@gmail.com>
Date: Wed, 22 Dec 2021 07:39:02 +0000
Subject: [PATCH] Added a more general git hook prompt and gerrit compatibality

---
 config.org |  586 ++++++++++++++++++++++++++++++++++++++-------------------
 1 files changed, 388 insertions(+), 198 deletions(-)

diff --git a/config.org b/config.org
index 0ea7887..faced63 100644
--- a/config.org
+++ b/config.org
@@ -1,14 +1,21 @@
 #+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 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
+           :ensure t
+           :config
+           (exec-path-from-shell-initialize))
+         (setq default-directory "~/")))
 #+END_SRC
 
 * Aesthetic changes
@@ -79,12 +86,12 @@
   (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.
@@ -93,6 +100,7 @@
 #+BEGIN_SRC emacs-lisp
   (use-package exwm
     :ensure t
+    :defer t
     :config
     (require 'exwm-config)
     (exwm-config-default))
@@ -106,14 +114,24 @@
   (require 'ispell)
   (setq-default ispell-program-name "aspell")
   (setq-default ispell-local-dictionary "en_AU")
+  (add-hook 'tex-mode-hook 'flyspell-mode)
   (add-hook 'latex-mode-hook 'flyspell-mode)
+  (add-hook 'TeX-mode-hook 'flyspell-mode)
+  (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)
   (diminish 'flyspell-mode)
 
 #+END_SRC
-
+** Language Tool
+Language tool is an open source grammar checker.
+#+BEGIN_SRC emacs-lisp
+  (use-package langtool
+    :ensure t
+    :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
@@ -152,9 +170,9 @@
 Helpful pdf viewer.
 #+BEGIN_SRC emacs-lisp
   (use-package pdf-tools
-	:ensure t
-	:config
-	(pdf-tools-install 1))
+    :ensure t
+    :config
+    (pdf-tools-install 1))
 #+END_SRC
 
 ** COMMENT Writegood-mode
@@ -374,12 +392,12 @@
 ** 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
+    :ensure t
+    :diminish t
+    :if window-system
+    :config
+    (global-pretty-mode))
 #+END_SRC
 
 ** COMMENT Find file other window
@@ -458,8 +476,7 @@
 #+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
@@ -601,16 +618,28 @@
 #+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
+      :ensure t
+      :config
+      (smart-tabs-insinuate 'c 'c++ 'java 'javascript 'cperl 'python 'ruby
+                            'nxml))
 #+END_SRC
 
 ** Move to beginning of line ignoring whitespace
@@ -666,9 +695,15 @@
 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
+    :ensure t
+    :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
@@ -677,6 +712,35 @@
   (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
+    :ensure t
+    :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
+    :ensure t
+    :config
+    (minimap-mode))
+#+END_SRC
+
+** Highlight indentation
+Vertical demarcations for indent levels
+#+BEGIN_SRC emacs-lisp
+  (use-package highlight-indentation
+    :ensure t
+    :hook (prog-mode . highlight-indentation-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
@@ -718,10 +782,11 @@
     :ensure t
     :diminish yas-minor-mode
     :config
-    (use-package yasnippet-snippets
-      :ensure t)
-    (yas-reload-all)
     (yas-global-mode 1))
+
+  (use-package yasnippet-snippets
+    :ensure t
+    :after yasnippet)
 #+END_SRC
 
 ** Flycheck
@@ -742,7 +807,6 @@
   :config
   (flycheck-pos-tip-mode))
 #+END_SRC
-
 ** Company
 Company is auto-complete for Emacs.
 Uses various backends, more of which are added later.
@@ -753,7 +817,43 @@
     :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
+    :ensure t
+    :hook (((c-mode
+             c++-mode
+             tex-mode
+             latex-mode
+             TeX-mode
+             LaTeX-mode
+             rust-mode
+             sh-mode
+             ;; verilog-mode
+             go-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
+    :ensure t
+    :commands lsp-ui-mode)
+
+  (use-package helm-lsp
+    :ensure t
+    :commands helm-lsp-workspace-symbol)
 #+END_SRC
 
 ** Version control
@@ -762,69 +862,103 @@
 #+BEGIN_SRC emacs-lisp
   (vc-mode)
 #+END_SRC
+
 ** Magit
 Emacs git client.
 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
-    (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
+    (use-package magit
+      :ensure t
+      :commands magit-get-top-dir
+      :bind ("C-x g" . magit-status)
+      :init
       (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)))))
+        ;; 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))
 
-      ;; 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
-       )))
+        ;; 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
+
+*** 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
+*** 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
+    :ensure t)
 #+END_SRC
 
 ** CEDET
 *** 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)
@@ -869,25 +1003,37 @@
 
 ** 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
+    :ensure t
+    :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))))
+
+  (add-hook 'c-mode-hook 'setup-flycheck-project-path)
+  (add-hook 'c++-mode-hook 'setup-flycheck-project-path)
 #+END_SRC
 
-**** Company
+**** COMMENT Company
 Add header completion as well as Irony, which uses clang for suggestions.
 #+BEGIN_SRC emacs-lisp
   (use-package company-c-headers
@@ -897,32 +1043,53 @@
       (add-hook 'c++-mode-hook 'company-mode)
       (add-hook 'c-mode-hook 'company-mode))
 
-  (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))
+  ;; (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))
 
-  (use-package company-irony
-    :ensure t
-    :config
-    (add-to-list 'company-backends '(company-c-headers
-                                     company-dabbrev-code
-                                     company-irony)))
+  ;; (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}"))))
 
-**** COMMENT company
+      (use-package clang-format
+        :ensure t
+        :hook (c-mode-common . (set-clang-format-style)))
+
+      ;;   (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)
@@ -958,9 +1125,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
@@ -1001,11 +1168,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 ()
@@ -1037,10 +1204,13 @@
     :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")))
-    (setq planuml-default-exec-mode '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
@@ -1057,75 +1227,41 @@
       (autoload 'racket-mode "Racket" "Racket Editing Mode" t)
       (add-to-list
        'auto-mode-alist
-       '("\\.rkt$" . racket-mode))
-      (setq matlab-indent-function t))
+       '("\\.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
+    :ensure t
+    :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
@@ -1156,13 +1292,66 @@
     :ensure t)
 #+END_SRC
 
+*** Rust
+**** Major mode
+Get the major mode for rust files.
+#+BEGIN_SRC emacs-lisp
+  (use-package rust-mode
+    :ensure t
+    :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
+    :ensure t)
+#+END_SRC
+**** Cargo integration
+Integrate Cargo, rust's package manager.
+#+BEGIN_SRC emacs-lisp
+  (use-package cargo
+    :ensure t
+    :hook
+    (rust-mode . cargo-minor-mode))
+#+END_SRC
+**** Flycheck
+Linting with flycheck.
+#+BEGIN_SRC emacs-lisp
+  (use-package flycheck-rust
+    :ensure t
+    :config
+    (add-hook 'flycheck-mode-hook #'flycheck-rust-setup))
+#+END_SRC
+*** Go
+**** Major mode
+#+BEGIN_SRC emacs-lisp
+  (use-package go-mode
+    :ensure t
+    :config
+    (add-hook 'before-save-hook #'gofmt-before-save))
+#+END_SRC
+
+#+RESULTS:
+: t
+
+**** Flycheck
+#+BEGIN_SRC emacs-lisp
+  (use-package flycheck-golangci-lint
+    :ensure t
+    :config
+    (add-hook 'flycheck-mode-hook #'flycheck-golangci-lint-setup))
+#+END_SRC
+**** Company
+#+BEGIN_SRC emacs-lisp
+  (use-package company-go
+    :ensure t)
+#+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
@@ -1192,13 +1381,13 @@
                (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
+  (use-package org-superstar
     :ensure t
     :config
-    (add-hook 'org-mode-hook (lambda () (org-bullets-mode))))
+    (add-hook 'org-mode-hook (lambda () (org-superstar-mode 1))))
 #+END_SRC
 
 ** Org Babel
@@ -1214,7 +1403,6 @@
                                                              (scheme . t)
                                                              (gnuplot . t)
                                                              (matlab . t)
-                                                             (plantuml . t)
                                                              (fortran . t)
                                                              (java . t)
                                                              (plantuml . t)))
@@ -1246,6 +1434,7 @@
 ** 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)
@@ -1370,7 +1559,8 @@
 Allow org features to be exported to HTML for site.
 #+BEGIN_SRC emacs-lisp
   (use-package htmlize
-    :ensure t)
+    :ensure t
+    :defer t)
 #+END_SRC
 
 * Journaling

--
Gitblit v1.9.3