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

Joel Grunbaum
2020-10-18 0053450271e6282473be02d80653f3780c3df76d
commit | author | age
990949 1 #+TITLE: My Emacs configuration
5a75e4 2 #  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
8a38cc 3
6252df 4 * OS dependencies
JG 5 Windows and Mac have some interesting paths when starting emacs which needs to be fixed.
6 Using mingw64 in windows and general path in mac.
990949 7 #+BEGIN_SRC emacs-lisp
6252df 8   (cond ((eq system-type 'windows-nt)
JG 9          (add-to-list 'exec-path "C:/msys64/usr/bin")
10          (add-to-list 'exec-path "C:/msys64/mingw64/bin")
11          (add-to-list 'exec-path "c:/Program Files/gnuplot")
12          (setenv "PATH" (mapconcat #'identity exec-path path-separator)))
13         ((eq system-type 'darwin)
14          (use-package exec-path-from-shell
15            :ensure t
16            :config
17            (exec-path-from-shell-initialize))))
990949 18 #+END_SRC
C 19
20 * Aesthetic changes
0fcc09 21 ** Emacs theme
80d515 22 Theme switcher, using a cond allows loading of many preconfigured themes which can be switched between easily.
JG 23 Zenburn theme is my default.
990949 24 #+BEGIN_SRC emacs-lisp
0fcc09 25   (setq emacs-theme 'zenburn)
80d515 26
JG 27   (defun disable-all-themes ()
28       (dolist (i custom-enabled-themes)
29            (disable-theme i)))
412080 30
0fcc09 31   (cond ((eq emacs-theme 'zenburn)
C 32          (use-package zenburn-theme
33            :ensure t
412080 34            :init
C 35            (disable-all-themes)
0fcc09 36            :config
C 37            (load-theme 'zenburn t)))
38         ((eq emacs-theme 'doom-one)
39          (use-package doom-themes
40            :ensure t
412080 41            :init
C 42            (disable-all-themes)
0fcc09 43            :config
C 44            (setq doom-themes-enable-bolt t
45                  doom-themes-enable-italic t)
46            (load-theme 'doom-one t)
47            (doom-themes-visual-bell-config)
412080 48            (doom-themes-org-config)))
a428a2 49         ((eq emacs-theme 'nord)
JG 50          (use-package nord-theme
51            :ensure t
52            :init
53            (disable-all-themes)
54            :config
55            (load-theme 'nord t)))
b0ee5f 56         ((eq emacs-theme 'solarized)
JG 57          (use-package solarized-theme
58            :ensure t
59            :init
60            (disable-all-themes)
61            :config
62            (load-theme 'solarized-dark t)))
995f2c 63         ((eq emacs-theme 'jetbrains-darcula)
JG 64          (use-package jetbrains-darcula-theme
65            :ensure t
66            :init
67            (disable-all-themes)
68            :config
69            (load-theme 'jetbrains-darcula t)))
412080 70         ((eq emacs-theme 'none)
80d515 71          (disable-all-themes)))
990949 72 #+END_SRC
8a38cc 73
990949 74 ** Default font
80d515 75 Set default font and faces.
20e001 76 #+BEGIN_SRC emacs-lisp 
350884 77   (cond ((member "Dank Mono" (font-family-list))
JG 78          (set-frame-font "Dank Mono-11" nil t))
79         ((member "DejaVu Sans Mono" (font-family-list))
80          (set-frame-font "DejaVu Sans Mono" nil t))
81         ((member "Source Code Pro" (font-family-list))
82          (set-frame-font "Source Code Pro-10" nil t)))
83
20e001 84   (set-face-italic 'font-lock-comment-face t)
C 85   (set-face-italic 'font-lock-keyword-face t)
990949 86 #+END_SRC
8a38cc 87
990949 88 ** Remove menu bar, toolbar, but keep scroll bar
80d515 89 Make the emacs interface slightly nicer.
990949 90 #+BEGIN_SRC emacs-lisp
C 91   (menu-bar-mode 0)
92   (tool-bar-mode 0)
93   (scroll-bar-mode 1)
94 #+END_SRC
350884 95 * COMMENT EXWM
JG 96 Emacs window manager.
97 Tiling window manager that runs in emacs.
5a75e4 98 Open external applications with =s-&=
350884 99 #+BEGIN_SRC emacs-lisp
JG 100   (use-package exwm
101     :ensure t
102     :config
103     (require 'exwm-config)
104     (exwm-config-default))
105 #+END_SRC
990949 106
C 107 * Writing requirements
108 ** Spellchecking
80d515 109 Use aspell for spellchecking. 
JG 110 Auto-enable in latex and org as they're the main writing modes.
990949 111 #+BEGIN_SRC emacs-lisp
C 112   (require 'ispell)
113   (setq-default ispell-program-name "aspell")
114   (setq-default ispell-local-dictionary "en_AU")
f0bf38 115   (add-hook 'tex-mode-hook 'flyspell-mode)
990949 116   (add-hook 'latex-mode-hook 'flyspell-mode)
f0bf38 117   (add-hook 'TeX-mode-hook 'flyspell-mode)
JG 118   (add-hook 'LaTeX-mode-hook 'flyspell-mode)
0ba1ff 119   ;; (add-hook 'latex-mode-hook 'flyspell-buffer)
990949 120   (add-hook 'org-mode-hook 'flyspell-mode)
0ba1ff 121   ;; (add-hook 'org-mode-hook 'flyspell-buffer)
f1b53f 122   (diminish 'flyspell-mode)
a428a2 123
990949 124 #+END_SRC
C 125
126 ** Switch-window
80d515 127 Helps to change windows easily when many are open at once.
990949 128 #+BEGIN_SRC emacs-lisp
C 129 (use-package switch-window
130   :ensure t
131   :config
132     (setq switch-window-input-style 'minibuffer)
133     (setq switch-window-increase 4)
134     (setq switch-window-threshold 2)
135     (setq switch-window-shortcut-style 'qwerty)
136     (setq switch-window-qwerty-shortcuts
137         '("a" "s" "d" "f" "j" "k" "l" "i" "o"))
138   :bind
139     ([remap other-window] . switch-window))
140 #+END_SRC
8a38cc 141
990949 142 ** Go to new window when opened
80d515 143 Go to new window when its opened instead of staying with current one.
990949 144 #+BEGIN_SRC emacs-lisp
C 145   (defun split-and-follow-horizontally ()
146     (interactive)
147     (split-window-below)
148     (balance-windows)
149     (other-window 1))
150   (global-set-key (kbd "C-x 2") 'split-and-follow-horizontally)
151
152   (defun split-and-follow-vertically ()
153     (interactive)
154     (split-window-right)
155     (balance-windows)
156     (other-window 1))
157   (global-set-key (kbd "C-x 3") 'split-and-follow-vertically)
158 #+END_SRC
8a38cc 159
990949 160 ** PDF-tools
80d515 161 Helpful pdf viewer.
990949 162 #+BEGIN_SRC emacs-lisp
bf794a 163   (use-package pdf-tools
JG 164     :ensure t
165     :config
166     (pdf-tools-install 1))
990949 167 #+END_SRC
8a38cc 168
be9cff 169 ** COMMENT Writegood-mode
80d515 170 Supposedly should provide insight to writing quality.
49aa9f 171 #+BEGIN_SRC emacs-lisp
JG 172   (use-package writegood-mode
173     :ensure t
174     :hook (text-mode . writegood-mode))
175 #+END_SRC
176
990949 177 * Helm and Projectile
C 178 ** Helm core
80d515 179 Helm aids the user interface for emacs. Adds visual and auto-complete feedback for emacs commands.
990949 180 #+BEGIN_SRC emacs-lisp
C 181   (use-package helm-config
182     :ensure helm
183     :bind (("M-x" . helm-M-x)
184            ("C-x C-f" . helm-find-files)
185            ("M-y" . helm-show-kill-ring)
186            ("C-x b" . helm-mini)
187            ("C-c h o" . helm-occur))
188     :config
189     (setq helm-M-x-fuzzy-match t)
190     (setq helm-buffers-fuzzy-matching t
191           helm-recentf-fuzzy-match    t)
192     (setq helm-split-window-in-side-p           t ; open helm buffer inside current window, not occupy whole other window
193           helm-move-to-line-cycle-in-source     t ; move to end or beginning of source when reaching top or bottom of source.
194           helm-ff-search-library-in-sexp        t ; search for library in `require' and `declare-function' sexp.
195           helm-scroll-amount                    8 ; scroll 8 lines other window using M-<next>/M-<prior>
196           helm-ff-file-name-history-use-recentf t
197           helm-echo-input-in-header-line t)
198     (defun spacemacs//helm-hide-minibuffer-maybe ()
199       "Hide minibuffer in Helm session if we use the header line as input field."
200       (when (with-helm-buffer helm-echo-input-in-header-line)
201         (let ((ov (make-overlay (point-min) (point-max) nil nil t)))
202           (overlay-put ov 'window (selected-window))
203           (overlay-put ov 'face
204                        (let ((bg-color (face-background 'default nil)))
205                          `(:background ,bg-color :foreground ,bg-color)))
206           (setq-local cursor-type nil))))
207     (add-hook 'helm-minibuffer-set-up-hook
208               'spacemacs//helm-hide-minibuffer-maybe)
209     (helm-mode 1))
210 #+END_SRC
8a38cc 211
990949 212 ** Projectile
80d515 213 Projectile is project management framework for emacs.
JG 214 Helps in navigation and management of projects.
215 Identifies project layout from git.
990949 216 *** Enable it
C 217  #+BEGIN_SRC emacs-lisp
218    (use-package projectile
219      :ensure t
220      :bind ("C-c p" . projectile-command-map)
221      :diminish projectile-mode
222      :config
223      (projectile-global-mode)
224      (setq projectile-completion-system 'helm)
225      (when (eq system-type 'windows-nt)
226        (setq projectile-indexing-method 'alien)))
227  #+END_SRC
8a38cc 228
990949 229 *** Let it compile things
80d515 230 Shortcut for compilation.
990949 231  #+BEGIN_SRC emacs-lisp
C 232    (global-set-key (kbd "<f5>") 'projectile-compile-project)
233  #+END_SRC
8a38cc 234
990949 235 *** Enable communication with helm
80d515 236 Use helm to manage project.
990949 237 #+BEGIN_SRC emacs-lisp
baf326 238   (use-package helm-projectile
C 239     :ensure t
240     :config
241     (helm-projectile-on))
990949 242 #+END_SRC
8a38cc 243
be9cff 244 ** COMMENT ggtags
0ba1ff 245 Use GNU Global Tags. Can be useful for large projects.
bf794a 246 #+BEGIN_SRC emacs-lisp
JG 247     (use-package ggtags
248       :ensure t
249       :bind (("C-c g s" . ggtags-find-other-symbol)
250            ("C-c g h" . ggtags-view-tag-history)
251            ("C-c g r" . ggtags-find-reference)
252            ("C-c g f" . ggtags-find-file)
253            ("C-c g c" . ggtags-create-tags)
254            ("C-c g u" . ggtags-update-tags))
255       :config
256       (add-hook 'c-mode-common-hook
257               (lambda ()
258                 (when (derived-mode-p 'c-mode 'c++-mode 'java-mode)
259                   (ggtags-mode 1))))
260       )
261
262     (setq
263      helm-gtags-ignore-case t
264      helm-gtags-auto-update t
265      helm-gtags-use-input-at-cursor t
266      helm-gtags-pulse-at-cursor t
267      helm-gtags-prefix-key "\C-c g"
268      helm-gtags-suggested-key-mapping t
269      )
270
271     (use-package helm-gtags
272       :ensure t
273       :config
274       (add-hook 'dired-mode-hook 'helm-gtags-mode)
275       (add-hook 'eshell-mode-hook 'helm-gtags-mode)
276       (add-hook 'c-mode-hook 'helm-gtags-mode)
277       (add-hook 'c++-mode-hook 'helm-gtags-mode)
278       (add-hook 'asm-mode-hook 'helm-gtags-mode)
279     
280       (define-key helm-gtags-mode-map (kbd "C-c g a") 'helm-gtags-tags-in-this-function)
281       (define-key helm-gtags-mode-map (kbd "C-j") 'helm-gtags-select)
282       (define-key helm-gtags-mode-map (kbd "M-.") 'helm-gtags-dwim)
283       (define-key helm-gtags-mode-map (kbd "M-,") 'helm-gtags-pop-stack)
284       (define-key helm-gtags-mode-map (kbd "C-c <") 'helm-gtags-previous-history)
285       (define-key helm-gtags-mode-map (kbd "C-c >") 'helm-gtags-next-history))
286 #+END_SRC
287
be9cff 288 ** COMMENT Ctags
0ba1ff 289 Ctags is an older tagging program that supports more languages.
JG 290 Currently setup for VHDL as I had to work with a large existing VHDL code-base.
bf794a 291 #+BEGIN_SRC emacs-lisp
JG 292   (defvar ctags-command "ctags -e -R --languages=vhdl")
293
294   (defun ctags ()
295     (call-process-shell-command ctags-command nil "*Ctags*"))
296
297
298   (defun ctags-find-tags-file ()
299     "Recursively searches each parent directory for a file named
300                 TAGS and returns the path to that file or nil if a tags file is
301                 not found or if the buffer is not visiting a file."
302     (progn
303       (defun find-tags-file-r (path)
304         "Find the tags file from current to the parent directories."
305         (let* ((parent-directory (file-name-directory (directory-file-name path)))
306                (tags-file-name (concat (file-name-as-directory path) "TAGS")))
307           (cond
308            ((file-exists-p tags-file-name) (throw 'found tags-file-name))
309            ((string= "/TAGS" tags-file-name) nil)
310            (t (find-tags-file-r parent-directory)))))
311
312       (if (buffer-file-name)
313           (catch 'found
314             (find-tags-file-r (file-name-directory buffer-file-name)))
315         nil)))
316
317   (defun ctags-set-tags-file ()
318     "Uses `ctags-find-tags-file' to find a TAGS file. If found,
319                 set 'tags-file-name' with its path or set as nil."
320     (setq-default tags-file-name (ctags-find-tags-file)))
321
322   (defun ctags-create-tags-table ()
323     (interactive)
324     (let* ((current-directory default-directory)
325            (top-directory (read-directory-name
326                            "Top of source tree: " default-directory))
327            (file-name (concat (file-name-as-directory top-directory) "TAGS")))
328       (cd top-directory)
329       (if (not (= 0 (ctags)))
330           (message "Error creating %s!" file-name)
331         (setq-default tags-file-name file-name)
332         (message "Table %s created and configured." tags-file-name))
333       (cd current-directory)))
334
335   (defun ctags-update-tags-table ()
336     (interactive)
337     (let ((current-directory default-directory))
338       (if (not tags-file-name)
339           (message "Tags table not configured.")
340         (cd (file-name-directory tags-file-name))
341         (if (not (= 0 (ctags)))
342             (message "Error updating %s!" tags-file-name)
343           (message "Table %s updated." tags-file-name))
344         (cd current-directory))))
345
346   (defun ctags-create-or-update-tags-table ()
347     "Create or update a tags table with `ctags-command'."
348     (interactive)
349     (if (not (ctags-set-tags-file))
350         (ctags-create-tags-table)
351       (ctags-update-tags-table)))
352
353
354   (defun ctags-search ()
355     "A wrapper for `tags-search' that provide a default input."
356     (interactive)
357     (let* ((symbol-at-point (symbol-at-point))
358            (default (symbol-name symbol-at-point))
359            (input (read-from-minibuffer
360                    (if (symbol-at-point)
361                        (concat "Tags search (default " default "): ")
362                      "Tags search (regexp): "))))
363       (if (and (symbol-at-point) (string= input ""))
364           (tags-search default)
365         (if (string= input "")
366             (message "You must provide a regexp.")
367           (tags-search input)))))
368 #+END_SRC
369
990949 370 * Small tweaks
C 371 ** Remove startup screen
0ba1ff 372 Start on scratch buffer instead.
990949 373 #+BEGIN_SRC emacs-lisp
C 374 (setq inhibit-startup-message t)
375 #+END_SRC
8a38cc 376
990949 377 ** Disable bell
0ba1ff 378 Bloody bell dings every time you hit a key too much.
990949 379 #+BEGIN_SRC emacs-lisp
C 380 (setq ring-bell-function 'ignore)
381 #+END_SRC
8a38cc 382
990949 383 ** Pretty symbols
0ba1ff 384 Why not? They make it look nice.
990949 385 #+BEGIN_SRC emacs-lisp
C 386   (when window-system
387     (use-package pretty-mode
388       :ensure t
389       :diminish t
390       :config
391       (global-pretty-mode)))
392 #+END_SRC
8a38cc 393
0ba1ff 394 ** COMMENT Find file other window
990949 395 Lets it accept more than one file. Works recursively.
C 396 #+BEGIN_SRC emacs-lisp
397 (defadvice find-file-other-window (around find-files activate)
398   (if (listp filename)
399       (loop for f in filename do (find-file-other-window f wildcards))
400     ad-do-it))
401 #+END_SRC
8a38cc 402
990949 403 ** Which key
0ba1ff 404 Helps to explain keybindings if you get lost.
990949 405 #+BEGIN_SRC emacs-lisp
C 406   (use-package which-key
407     :ensure t
408     :diminish which-key-mode
409     :config
410     (which-key-mode))
411 #+END_SRC
8a38cc 412
bf794a 413 ** Config shortcuts
JG 414 *** Go to this file
990949 415 #+BEGIN_SRC emacs-lisp
C 416 (defun config-visit ()
417   (interactive)
418   (find-file "~/.emacs.d/config.org"))
419 (global-set-key (kbd "C-c e d") 'config-visit)
420 #+END_SRC
8a38cc 421
bf794a 422 *** Go to init.el
990949 423 #+BEGIN_SRC emacs-lisp
C 424   (defun init-visit ()
425     (interactive)
426     (find-file "~/.emacs.d/init.el"))
427   (global-set-key (kbd "C-c e i") 'init-visit)
428 #+END_SRC
8a38cc 429
bf794a 430 *** Reload configuration
990949 431 #+BEGIN_SRC emacs-lisp
C 432 (defun config-reload ()
433   "Reloads ~/.emacs.d/config.org at run time"
434   (interactive)
435   (org-babel-load-file (expand-file-name "~/.emacs.d/config.org")))
436 (global-set-key (kbd "C-c e r") 'config-reload)
437 #+END_SRC
8a38cc 438
990949 439 ** Smartparens
0ba1ff 440 Matches brackets automatically. Added "$" for latex in org mode.
990949 441 #+BEGIN_SRC emacs-lisp
0ba1ff 442   (use-package smartparens
JG 443     :ensure t
444     :diminish smartparens-mode
445     :config
446     (progn
447       (require 'smartparens-config)
448       (smartparens-global-mode 1))
449     (sp-with-modes 'org-mode
450       (sp-local-pair "$" "$")))
990949 451 #+END_SRC
8a38cc 452
0ba1ff 453 ** COMMENT Rainbow
JG 454 Its a little gimmicky but its still cool.
455 Colours according to code after a "#", works with 3 and 6 character hex codes.
990949 456 #+BEGIN_SRC emacs-lisp
C 457   (use-package rainbow-mode
458     :ensure t
459     :diminish rainbow-mode
460     :init
461     (add-hook 'prog-mode-hook 'rainbow-mode))
462 #+END_SRC
8a38cc 463
990949 464 ** Rainbow delimiters
C 465 A bit more useful than above.
466 Colours the brackets so that they stand out more.
467 #+BEGIN_SRC emacs-lisp
468   (use-package rainbow-delimiters
469     :ensure t
470     :init
471       (add-hook 'prog-mode-hook #'rainbow-delimiters-mode))
472 #+END_SRC
8a38cc 473
0ba1ff 474 ** Following whitespace
990949 475 Removes unnecessary white space
C 476 #+BEGIN_SRC emacs-lisp
0ba1ff 477   (use-package clean-aindent-mode
JG 478     :ensure t
479     :hook prog-mode)
990949 480 #+END_SRC
C 481 Shows trailing white space
482 #+BEGIN_SRC emacs-lisp
483 (add-hook 'prog-mode-hook (lambda () (interactive) (setq show-trailing-whitespace 1)))
484 #+END_SRC
8a38cc 485
0ba1ff 486 ** Whitespace mode
990949 487 Reveals whitespace characters
C 488 #+BEGIN_SRC emacs-lisp
489 (global-set-key (kbd "C-c w") 'whitespace-mode)
490 (add-hook 'diff-mode-hook (lambda ()
491                             (setq-local whitespace-style
492                                         '(face
493                                           tabs
494                                           tab-mark
495                                           spaces
496                                           space-mark
497                                           trailing
498                                           indentation::space
499                                           indentation::tab
500                                           newline
501                                           newline-mark))
502                             (whitespace-mode 1)))
503
504 #+END_SRC
8a38cc 505
990949 506 ** eldoc
0ba1ff 507 Shows function arguments in echo area below mode line.
990949 508 #+BEGIN_SRC emacs-lisp
f1b53f 509   (diminish 'eldoc-mode)
990949 510   (add-hook 'emacs-lisp-mode-hook 'eldoc-mode)
C 511   (add-hook 'lisp-interaction-mode-hook 'eldoc-mode)
512   (add-hook 'ielm-mode-hook 'eldoc-mode)
513 #+END_SRC
8a38cc 514
0ba1ff 515 ** Key frequency statistics
JG 516 Collects interesting statistics about key presses.
517 Use M-x keyfreq-show to show in emacs or M-x keyfreq-html to output
990949 518 #+BEGIN_SRC emacs-lisp
C 519 (use-package keyfreq
520   :ensure t
521   :config
522   (keyfreq-mode 1)
523   (keyfreq-autosave-mode 1))
524 #+END_SRC
8a38cc 525
0ba1ff 526 ** Undo tree
JG 527 A more advanced undo mechanism.
528 Supports branched undo history (thus the tree).
529 Pretty neat, if seldom used.
990949 530 #+BEGIN_SRC emacs-lisp
C 531 (use-package undo-tree
532   :ensure t
533   :diminish undo-tree-mode
534   :config
535   (global-undo-tree-mode))
536 #+END_SRC
8a38cc 537
0ba1ff 538 ** Volatile highlights
990949 539 Colour the material just copied
C 540 #+BEGIN_SRC emacs-lisp
541 (use-package volatile-highlights
542   :ensure t
543   :diminish volatile-highlights-mode
544   :config
545   (volatile-highlights-mode t))
546 #+END_SRC
8a38cc 547
990949 548 ** ibuffer
0ba1ff 549 View all open buffers in their own buffer rather in the temporary mini buffer.
990949 550 #+BEGIN_SRC emacs-lisp
C 551 (global-set-key (kbd "C-x C-b") 'ibuffer)
552 (setq ibuffer-use-other-window t)
553 #+END_SRC
8a38cc 554
0ba1ff 555 ** Hippie expand
JG 556 Seems cool, but I don't think I ever use this.
557 Meant to suggest completions to beginning of a word.
990949 558 #+BEGIN_SRC emacs-lisp
C 559 (global-set-key (kbd "M-/") 'hippie-expand) ;; replace dabbrev-expand
560 (setq
561  hippie-expand-try-functions-list
562  '(try-expand-dabbrev ;; Try to expand word "dynamically", searching the current buffer.
563    try-expand-dabbrev-all-buffers ;; Try to expand word "dynamically", searching all other buffers.
564    try-expand-dabbrev-from-kill ;; Try to expand word "dynamically", searching the kill ring.
565    try-complete-file-name-partially ;; Try to complete text as a file name, as many characters as unique.
566    try-complete-file-name ;; Try to complete text as a file name.
567    try-expand-all-abbrevs ;; Try to expand word before point according to all abbrev tables.
568    try-expand-list ;; Try to complete the current line to an entire line in the buffer.
569    try-expand-line ;; Try to complete the current line to an entire line in the buffer.
570    try-complete-lisp-symbol-partially ;; Try to complete as an Emacs Lisp symbol, as many characters as unique.
571    try-complete-lisp-symbol) ;; Try to complete word as an Emacs Lisp symbol.
572  )
573 #+END_SRC
8a38cc 574
990949 575 ** Highlight line
0ba1ff 576 Very useful for finding where you are.
990949 577 #+BEGIN_SRC emacs-lisp
C 578 (global-hl-line-mode)
579 #+END_SRC
8a38cc 580
990949 581 ** Line numbers
0ba1ff 582 Everyone needs line numbers when programming.
990949 583 #+BEGIN_SRC emacs-lisp
C 584 (add-hook 'prog-mode-hook 'linum-mode)
585 #+END_SRC
586
587 ** Garbage collection
0ba1ff 588 Starts garbage collection every 100MB.
990949 589 #+BEGIN_SRC emacs-lisp
C 590 (setq gc-cons-threshold 100000000)
591 #+END_SRC
592
593 ** Kill ring
594 Changes the kill ring size to 5000.
595 #+BEGIN_SRC emacs-lisp
596   (setq global-mark-ring-max 5000
597     mark-ring-max 5000
598     mode-require-final-newline t
599     kill-ring-max 5000
600     kill-whole-line t)
601 #+END_SRC
8a38cc 602
990949 603 ** Coding style
0ba1ff 604 Use java for java, awk for awk and K&R for everything else.
JG 605 K&R uses 4 space tabs.
990949 606 #+BEGIN_SRC emacs-lisp
bf794a 607   (setq c-default-style '((java-mode . "java")
JG 608                          (awk-mode . "awk")
609                          (other . "k&r")))
990949 610 #+END_SRC
C 611
612 ** Coding system
0ba1ff 613 Cause we all love UTF8
990949 614 #+BEGIN_SRC emacs-lisp
bf794a 615   (set-terminal-coding-system 'utf-8)
JG 616   (set-keyboard-coding-system 'utf-8)
617   (set-language-environment "UTF-8")
618   (prefer-coding-system 'utf-8)
619   (setq-default indent-tabs-mode t
620             tab-width 4)
621   (delete-selection-mode)
622   (global-set-key (kbd "RET") 'newline-and-indent)
990949 623 #+END_SRC
8a38cc 624
990949 625 ** Move to beginning of line ignoring whitespace
C 626 Move point back to indentation of beginning of line.
0ba1ff 627 Pretty good for getting to the start of what you actually wanted.
990949 628
C 629 Move point to the first non-whitespace character on this line.
630 If point is already there, move to the beginning of the line.
631 Effectively toggle between the first non-whitespace character and
632 the beginning of the line.
633
634 If ARG is not nil or 1, move forward ARG - 1 lines first. If
635 point reaches the beginning or end of the buffer, stop there.
636 #+BEGIN_SRC emacs-lisp
637 (defun prelude-move-beginning-of-line (arg)
638   (interactive "^p")
639   (setq arg (or arg 1))
640
641   ;; Move lines first
642   (when (/= arg 1)
643     (let ((line-move-visual nil))
644       (forward-line (1- arg))))
645
646   (let ((orig-point (point)))
647     (back-to-indentation)
648     (when (= orig-point (point))
649       (move-beginning-of-line 1))))
650
651 (global-set-key (kbd "C-a") 'prelude-move-beginning-of-line)
652 #+END_SRC
8a38cc 653
990949 654 ** Indent region or buffer
0ba1ff 655 Indent, slightly different to standard tab or C-M-\.
990949 656 #+BEGIN_SRC emacs-lisp
C 657 (defun indent-region-or-buffer ()
658   "Indent a region if selected, otherwise the whole buffer."
659   (interactive)
660   (unless (member major-mode prelude-indent-sensitive-modes)
661     (save-excursion
662       (if (region-active-p)
663           (progn
664             (indent-region (region-beginning) (region-end))
665             (message "Indented selected region."))
666         (progn
667           (indent-buffer)
668           (message "Indented buffer.")))
669       (whitespace-cleanup))))
670
671 (global-set-key (kbd "C-c i") 'indent-region-or-buffer)
672 #+END_SRC
8a38cc 673
990949 674 ** Tramp
0ba1ff 675 Remote editing mode.
JG 676 Hate having to re-input passwords.
990949 677 #+BEGIN_SRC emacs-lisp
C 678   (when (eq system-type 'windows-nt)
679     (setq tramp-default-method "pscp"))
680   (setq password-cache-expiry nil)
681 #+END_SRC
682
0ba1ff 683 ** COMMENT Y or N instead of yes or no
JG 684 Need not type out whole word.
685 #+BEGIN_SRC emacs-lisp
686   (defalias 'yes-or-no-p 'y-or-n-p)
687 #+END_SRC
688
06a72e 689 ** COMMENT Sublime-like minimap
JG 690 Get a minimap preview of the file on the side like sublime text.
691 Want to make work but need to find a good way of doing so.
692 #+BEGIN_SRC emacs-lisp
693   (use-package sublimity
694     :ensure t
695     :config
696     (require 'sublimity-scroll)
697     (setq sublimity-scroll-weight 4
698           sublimity-scroll-drift-length 3)
699     (require 'sublimity-map)
700     (setq sublimity-map-size 20
701           sublimity-map-scale 0.3)
702     (sublimity-map-set-delay nil)
703     (sublimity-mode 1))
704
705   (use-package minimap
706     :ensure t
707     :config
708     (minimap-mode))
709 #+END_SRC
710
990949 711 * Mode line tweaks
C 712 Diminish is used but is included in init.el such that it can be used throughout this document
713 ** Spaceline
0ba1ff 714 A little easier to read than the default emacs mode line.
990949 715 #+BEGIN_SRC emacs-lisp
412080 716     (use-package spaceline
C 717       :ensure t
718       :config
719       (require 'spaceline-config)
720       (setq spaceline-buffer-encoding-abbrev-p t)
721       (setq spaceline-line-column-p t)
722       (setq spaceline-line-p t)
723       (setq powerline-default-separator (quote arrow))
724       (spaceline-spacemacs-theme)
725       (spaceline-helm-mode))
990949 726 #+END_SRC
8a38cc 727
1005e3 728 *** Separator
JG 729 Slightly nicer separator.
730 #+BEGIN_SRC emacs-lisp
731 (setq powerline-default-separator nil)
732 #+END_SRC
733
0c962c 734 ** Nyan mode
JG 735 Use nyan cat as a reference for buffer progression.
736 #+BEGIN_SRC emacs-lisp
737   (use-package nyan-mode
738     :ensure t
739     :config
740     (nyan-mode 1))
741 #+END_SRC
742
990949 743 * Programming tweaks
C 744 ** Yasnippet
0ba1ff 745 Add snippets, pretty useful.
JG 746 Manually added snippets are in ~/.emacs.d/snippets/{mode}.
990949 747 #+BEGIN_SRC emacs-lisp
bf794a 748   (use-package yasnippet
JG 749     :ensure t
750     :diminish yas-minor-mode
751     :config
752     (use-package yasnippet-snippets
753       :ensure t)
754     (yas-reload-all)
755     (yas-global-mode 1))
990949 756 #+END_SRC
8a38cc 757
0ba1ff 758 ** Flycheck
JG 759 Basic linter. Works pretty well.
990949 760 #+BEGIN_SRC emacs-lisp
8a38cc 761   (use-package flycheck
C 762     :ensure t
763     :diminish flycheck-mode
764     :config
765     (global-flycheck-mode))
990949 766 #+END_SRC
0ba1ff 767 *** flycheck-pos-tip
JG 768 Add suggestions at the cursor.
990949 769 #+BEGIN_SRC emacs-lisp
C 770 (use-package flycheck-pos-tip
771   :ensure t
772   :after flycheck
773   :config
774   (flycheck-pos-tip-mode))
775 #+END_SRC
8a38cc 776
990949 777 ** Company
0ba1ff 778 Company is auto-complete for Emacs.
JG 779 Uses various backends, more of which are added later.
990949 780 #+BEGIN_SRC emacs-lisp
C 781   (use-package company
782     :ensure t
783     :diminish company-mode
784     :config
785     (global-company-mode)
786     (setq company-idle-delay 0)
787     (setq company-minimum-prefix-length 3))
788 #+END_SRC
8a38cc 789
c8124c 790 ** LSP Mode
JG 791 Use LSP for completion suggestions
792 #+BEGIN_SRC emacs-lisp
793   (use-package lsp-mode
794     :ensure t
795     :hook ((lsp-mode . lsp-enable-which-key-integration))
796     :init
797     (setq lsp-keymap-prefix "C-c l")
798     :commands lsp
799     :config
800     (setq read-process-output-max (* 1024 1024))
f0bf38 801     (setq lsp-completion-provider :capf)
JG 802     (add-to-list 'exec-path "~/.cargo/bin"))
c8124c 803
JG 804   (use-package lsp-ui
805     :ensure t
806     :commands lsp-ui-mode)
807
808   (use-package helm-lsp
809     :ensure t
810     :commands helm-lsp-workspace-symbol)
811 #+END_SRC
da7a13 812 ** Version control
JG 813 Settings for emacs' own version control system.
814 *** Enable version control on the mode line
815 #+BEGIN_SRC emacs-lisp
816   (vc-mode)
817 #+END_SRC
990949 818 ** Magit
0ba1ff 819 Emacs git client.
JG 820 Pretty good and offers fairly decent features.
990949 821 #+BEGIN_SRC emacs-lisp
C 822   (use-package magit
823     :ensure t
824     :commands magit-get-top-dir
825     :bind ("C-x g" . magit-status)
826     :init
827     (progn
828       ;; make magit status go full-screen but remember previous window
829       ;; settings
830       ;; from: http://whattheemacsd.com/setup-magit.el-01.html
831       (defadvice magit-status (around magit-fullscreen activate)
832         (window-configuration-to-register :magit-fullscreen)
833         ad-do-it
834         (delete-other-windows))
835
836       ;; Close popup when committing - this stops the commit window
837       ;; hanging around
838       ;; From: http://git.io/rPBE0Q
839       (defadvice git-commit-commit (after delete-window activate)
840         (delete-window))
841
842       (defadvice git-commit-abort (after delete-window activate)
843         (delete-window))
844
845       :config
846       (progn
847         ;; restore previously hidden windows
848         (defadvice magit-quit-window (around magit-restore-screen activate)
849           (let ((current-mode major-mode))
850             ad-do-it
851             ;; we only want to jump to register when the last seen buffer
852             ;; was a magit-status buffer.
853             (when (eq 'magit-status-mode current-mode)
854               (jump-to-register :magit-fullscreen)))))
855
856       ;; magit settings
857       (setq
858        ;; don't put "origin-" in front of new branch names by default
859        magit-default-tracking-name-function 'magit-default-tracking-name-branch-only
860        ;; open magit status in same window as current buffer
861        magit-status-buffer-switch-function 'switch-to-buffer
862        ;; highlight word/letter changes in hunk diffs
863        magit-diff-refine-hunk t
864        ;; ask me if I want to include a revision when rewriting
865        magit-rewrite-inclusive 'ask
866        ;; ask me to save buffers
867        magit-save-some-buffers t
868        ;; pop the process buffer if we're taking a while to complete
869        magit-process-popup-time 10
870        ;; ask me if I want a tracking upstream
871        magit-set-upstream-on-push 'askifnotset
872        )))
873 #+END_SRC
8a38cc 874
990949 875 ** CEDET
0ba1ff 876 *** Semantic
JG 877 Parser library for code, supports many other packages.
878 Allows emacs to be mode aware of what is being written.
990949 879 #+BEGIN_SRC emacs-lisp
C 880   (use-package semantic
881     :config
882     (global-semanticdb-minor-mode 1)
883     (global-semantic-idle-scheduler-mode 1)
884     (global-semantic-idle-summary-mode 1)
885     (semantic-mode 1))
886 #+END_SRC
8a38cc 887
a428a2 888 *** COMMENT EDE
0ba1ff 889 Emacs Development Environment.
JG 890 Can be used to manage and create build files for a project.
990949 891 #+BEGIN_SRC emacs-lisp
C 892 (use-package ede
893   :config
894   (global-ede-mode t))
895 #+END_SRC
8a38cc 896
990949 897 *** gdb-many-windows
0ba1ff 898 Enhances the use of GDB in emacs.
JG 899 Shows register contents, variable contents and others in addition to GDB shell.
900 Also shows source code while debugging.
990949 901 #+BEGIN_SRC emacs-lisp
C 902 (setq
903  gdb-many-windows t
904  gdb-show-main t)
905 #+END_SRC
8a38cc 906
0ba1ff 907 *** COMMENT Semantic refactor
JG 908 Trying to get this to work.
909 Should help to refactor file.
990949 910 #+BEGIN_SRC emacs-lisp
0ba1ff 911   (use-package srefactor
JG 912     :ensure t
913     :bind (("M-RET o" . 'srefactor-lisp-one-line)
914        ("M-RET m" . 'srefactor-lisp-format-sexp)
915        ("M-RET d" . 'srefactor-lisp-format-defun)
916        ("M-RET b" . 'srefactor-lisp-format-buffer)
917        :map c-mode-base-map
918             ("M-RET" . 'srefactor-refactor-at-point)
919             :map c++-mode-map
920             ("M-RET" . 'srefactor-refactor-at-point)))
990949 921 #+END_SRC
8a38cc 922
990949 923 ** Language specific configs
C 924 *** C/C++
0ba1ff 925 **** COMMENT yasnippet
JG 926 Enable yasnippet for C/C++.
990949 927 #+BEGIN_SRC emacs-lisp
C 928 (add-hook 'c++-mode-hook 'yas-minor-mode)
929 (add-hook 'c-mode-hook 'yas-minor-mode)
930 #+END_SRC
8a38cc 931
0ba1ff 932 **** Flycheck clang
JG 933 Add the clang backend for linting.
990949 934 #+BEGIN_SRC emacs-lisp
C 935 (use-package flycheck-clang-analyzer
936   :ensure t
937   :config
938   (with-eval-after-load 'flycheck
939     (require 'flycheck-clang-analyzer)
940      (flycheck-clang-analyzer-setup)))
941 #+END_SRC
8a38cc 942
0ba1ff 943 **** Company
JG 944 Add header completion as well as Irony, which uses clang for suggestions.
990949 945 #+BEGIN_SRC emacs-lisp
C 946   (use-package company-c-headers
947       :ensure t
948       :after company
949       :config
950       (add-hook 'c++-mode-hook 'company-mode)
951       (add-hook 'c-mode-hook 'company-mode))
952
953   (use-package irony
954     :ensure t
955     :init
956     (setq w32-pipe-read-delay 0)
957     (setq irony-server-w32-pipe-buffer-size (* 64 1024))
958     (add-hook 'c++-mode-hook 'irony-mode)
959     (add-hook 'c-mode-hook 'irony-mode)
960     (add-hook 'irony-mode-hook 'irony-cdb-autosetup-compile-options)
961     (add-hook 'irony-mode-hook 'irony-cdb-autosetup-compile-options))
0ba1ff 962
JG 963   (use-package company-irony
964     :ensure t
965     :config
966     (add-to-list 'company-backends '(company-c-headers
967                                      company-dabbrev-code
968                                      company-irony)))
990949 969 #+END_SRC
8a38cc 970
c8124c 971 **** LSP
JG 972 Allow completion with LSP.
973 #+BEGIN_SRC emacs-lisp
974 (add-hook 'c-mode-hook 'lsp)
975 (add-hook 'cpp-mode-hook 'lsp)
976 #+END_SRC
990949 977 *** emacs-lisp
0ba1ff 978 **** COMMENT yasnippet
JG 979 Enable yasnippet.
990949 980 #+BEGIN_SRC emacs-lisp
C 981 (add-hook 'emacs-lisp-mode-hook 'yas-minor-mode)
982 #+END_SRC
8a38cc 983
0ba1ff 984 **** COMMENT company
JG 985 Add slime backend.
990949 986 #+BEGIN_SRC emacs-lisp
C 987 (add-hook 'emacs-lisp-mode-hook 'company-mode)
988
989 (use-package slime
990   :ensure t
991   :config
992   (setq inferior-lisp-program "/usr/bin/sbcl")
993   (setq slime-contribs '(slime-fancy)))
994
995 (use-package slime-company
996   :ensure t
997   :init
998     (require 'company)
999     (slime-setup '(slime-fancy slime-company)))
1000 #+END_SRC
8a38cc 1001
bf794a 1002 *** COMMENT x86
990949 1003 **** x86-lookup
0ba1ff 1004 Look up reference PDF. Use Intel manual.
990949 1005 #+BEGIN_SRC emacs-lisp
C 1006 (use-package x86-lookup
1007   :ensure t
1008   :init
1009   (setq x86-lookup-pdf "D:/Coding/x86-instructions.pdf")
1010   :bind ("C-h x" . x86-lookup))
1011 #+END_SRC
8a38cc 1012
990949 1013 *** Latex
C 1014 **** AucTex
0ba1ff 1015 AucTex contains many additions to make tex editing good.
990949 1016 #+BEGIN_SRC emacs-lisp
20e001 1017   (use-package tex
C 1018     :ensure auctex
1019     :config
1020     (setq TeX-auto-save t)
1021     (setq TeX-parse-self t)
1022     (setq TeX-view-program-selection '((output-pdf "PDF Tools"))
1023           TeX-source-correlate-start-server t)
1024     (add-hook 'TeX-after-compilation-finished-functions #'TeX-revert-document-buffer))
990949 1025 #+END_SRC
8a38cc 1026
990949 1027 **** Company
0ba1ff 1028 Help company complete tex math and references.
990949 1029 #+BEGIN_SRC emacs-lisp
C 1030   (use-package company-math
1031     :ensure t
1032     :after company
1033     :config
1005e3 1034     (add-to-list 'company-backends '(company-math-symbols-unicode company-math-symbols-latex
0a6cd2 1035                                      company-latex-commands))
1005e3 1036     (setq company-math-allow-latex-symbols-in-faces t))
990949 1037
C 1038   (use-package company-reftex
1039     :ensure t
1040     :after company
1041     :config
1005e3 1042     (add-to-list 'company-backends 'company-reftex-citations))
990949 1043
C 1044   (use-package company-auctex
1045     :ensure t
1046     :after company
1047     :config
1048     (company-auctex-init))
1049
1050   (use-package company-bibtex
1051     :ensure t
1052     :after company
1053     (add-to-list 'company-backends 'company-bibtex))
1054 #+END_SRC
8a38cc 1055
bf794a 1056 **** TeXcount
0ba1ff 1057 Word counts in latex.
JG 1058 Uses a Perl script.
1059 #+BEGIN_SRC emacs-lisp
1060   (defun get-texcount-latest()
1061     (if (not(file-directory-p "~/.texcount"))
1062         (make-directory "~/.texcount"))
1063     (url-copy-file "https://app.uio.no/ifi/texcount/download.php?file=texcount_3_1_1.zip" "~/.texcount/texcount.zip" 1)
1064     (shell-command "unzip -o ~/.texcount/texcount.zip -d ~/.texcount")
1065     (add-to-list 'exec-path "~/.texcount/texcount.pl"))
20e001 1066
df1744 1067   (if (not(or (file-exists-p "~/.texcount/texcount.pl") (file-exists-p "/usr/bin/texcount")))
0ba1ff 1068       (get-texcount-latest))
990949 1069
0ba1ff 1070   (defun texcount ()
JG 1071     (interactive)
1072     (let*
1073         ( (this-file (buffer-file-name))
1074           (enc-str (symbol-name buffer-file-coding-system))
1075           (enc-opt
1076            (cond
1077             ((string-match "utf-8" enc-str) "-utf8")
1078             ((string-match "latin" enc-str) "-latin1")
1079             ("-encoding=guess")
1080             ) )
1081           (word-count
1082            (with-output-to-string
1083              (with-current-buffer standard-output
1084                (call-process "texcount" nil t nil "-0" enc-opt this-file)
1085                ) ) ) )
1086       (message word-count)
1087       ) )
1088   (add-hook 'LaTeX-mode-hook (lambda () (define-key LaTeX-mode-map (kbd "C-c c") 'texcount)))
1089   (add-hook 'latex-mode-hook (lambda () (define-key latex-mode-map (kbd "C-c c") 'texcount)))
1090 #+END_SRC
990949 1091
f0bf38 1092 **** LSP
JG 1093 Allow LSP completion
1094 #+BEGIN_SRC emacs-lisp
1095   (add-hook 'tex-mode-hook 'lsp)
1096   (add-hook 'latex-mode-hook 'lsp)
1097   (add-hook 'TeX-mode-hook 'lsp)
1098   (add-hook 'LaTeX-mode-hook 'lsp)
1099 #+END_SRC
990949 1100 *** PlantUML
0ba1ff 1101 Sets the PlantUML path for the mode to generate models.
990949 1102 #+BEGIN_SRC emacs-lisp
bf794a 1103   (use-package plantuml-mode
JG 1104     :ensure t
1105     :init
1106     (cond ((eq system-type 'windows-nt)
1107            (setq plantuml-jar-path "c:/ProgramData/chocolatey/lib/plantuml/tools/plantuml.jar"))
1108           ((eq system-type 'gnu/linux)
4659c3 1109            (setq plantuml-jar-path "/usr/share/java/plantuml/plantuml.jar")))
JG 1110     (setq planuml-default-exec-mode 'jar))
990949 1111 #+END_SRC
C 1112
bf794a 1113 *** COMMENT Racket
990949 1114 **** Major mode
0ba1ff 1115 Set racket path in windows and enable racket mode.
990949 1116 #+BEGIN_SRC emacs-lisp
C 1117   (when (eq system-type 'windows-nt)
1118     (add-to-list 'exec-path "c:/Program Files/Racket")
1119     (setenv "PATH" (mapconcat #'identity exec-path path-separator)))
1120
1121   (use-package racket-mode
1122       :ensure t
1123       :config
1124       (autoload 'racket-mode "Racket" "Racket Editing Mode" t)
1125       (add-to-list
1126        'auto-mode-alist
8a38cc 1127        '("\\.rkt$" . racket-mode))
990949 1128       (setq matlab-indent-function t))
C 1129 #+END_SRC
1130
0ba1ff 1131 *** COMMENT Verilog
baf326 1132 **** Get latest version
0ba1ff 1133 Pull the latest version from the web.
baf326 1134 #+BEGIN_SRC emacs-lisp
C 1135   (defun get-verilog-latest()
0864ff 1136     (if (not(file-directory-p "~/.emacs.d/elpa/verilog-mode"))
C 1137         (make-directory "~/.emacs.d/elpa/verilog-mode"))
1138     (if (file-exists-p "~/.emacs.d/elpa/verilog-mode/verilog-mode.el")
1139         (delete-file "~/.emacs.d/elpa/verilog-mode/verilog-mode.el"))
dc8eb0 1140     (url-copy-file "https://www.veripool.org/ftp/verilog-mode.el" "~/.emacs.d/elpa/verilog-mode/verilog-mode.el" 1))
baf326 1141 #+END_SRC
C 1142
1143 **** Integrate into emacs
0ba1ff 1144 Add updated version (based off auto-package-update) and integrate it with Emacs.
990949 1145 #+BEGIN_SRC emacs-lisp
c8124c 1146   (defun verilog-read-file-as-string (file)
JG 1147     "Read FILE contents."
1148     (when (file-exists-p file)
0864ff 1149       (with-temp-buffer
c8124c 1150         (insert-file-contents file)
JG 1151         (buffer-string))))
0864ff 1152
c8124c 1153   (defun verilog-write-string-to-file (file string)
JG 1154     "Substitute FILE contents with STRING."
1155     (with-temp-buffer
1156       (insert string)
1157       (when (file-writable-p file)
1158         (write-region (point-min)
1159                       (point-max)
1160                       file))))
0864ff 1161
c8124c 1162   (defun verilog-today-day ()
JG 1163     (time-to-days (current-time)))
0864ff 1164
c8124c 1165   (defun should-update-verilog-p ()
JG 1166     "Return non-nil when an update is due."
1167     (and
1168      (or
1169       (not (file-exists-p "~/.emacs.d/.last-verilog-update-day"))
1170       (if (>= (/ (- (verilog-today-day) (verilog-read-last-update-day)) 7) 1)
1171           t
1172         nil))))
0864ff 1173
c8124c 1174   (defun verilog-read-last-update-day ()
JG 1175     "Read last update day."
1176     (string-to-number
1177      (verilog-read-file-as-string "~/.emacs.d/.last-verilog-update-day")))
0864ff 1178
c8124c 1179   (defun verilog-write-current-day ()
JG 1180     "Store current day."
1181     (verilog-write-string-to-file
1182      "~/.emacs.d/.last-verilog-update-day"
1183      (int-to-string (verilog-today-day))))
1184
1185   (use-package verilog-mode
1186     :hook (verilog-mode . lsp)
1187     :init
1188     (when (should-update-verilog-p)
1189         (get-verilog-latest)
1190         (verilog-write-current-day))
1191     (add-to-list 'load-path "~/.emacs.d/elpa/verilog-mode/verilog-mode.el")
1192     :config
1193     (autoload 'verilog-mode "verilog-mode" "Verilog mode" t )
1194     (add-to-list 'auto-mode-alist '("\\.[ds]?vh?\\'" . verilog-mode)))
990949 1195 #+END_SRC
8a38cc 1196
0ba1ff 1197 *** COMMENT MATLAB
49aa9f 1198 Mode for editing MATLAB m-files.
JG 1199 #+BEGIN_SRC emacs-lisp
0ba1ff 1200   (use-package matlab
JG 1201     :ensure matlab-mode
1202     :config
1203     (autoload 'matlab-mode "matlab" "Matlab Editing Mode" t)
1204     (add-to-list
1205      'auto-mode-alist
1206      '("\\.m$" . matlab-mode))
1207     (setq matlab-indent-function t)
1208     (setq matlab-shell-command "matlab")
1209     (matlab-cedet-setup))
49aa9f 1210 #+END_SRC
JG 1211
0ba1ff 1212 *** COMMENT MIPS
JG 1213 For editing MIPS assembly.
49aa9f 1214 #+BEGIN_SRC emacs-lisp
JG 1215   (use-package mips-mode
1216     :ensure t
1217     :mode "\\.mips$")
1218 #+END_SRC
1219
0ba1ff 1220 *** COMMENT IPython notebooks
60454d 1221 Allow emacs to view and use IPython notebooks
JG 1222 #+BEGIN_SRC emacs-lisp
1223   (use-package ein
1224     :ensure t)
1225 #+END_SRC
1226
22b4cd 1227 *** Rust
JG 1228 **** Major mode
1229 Get the major mode for rust files.
1230 #+BEGIN_SRC emacs-lisp
1231   (use-package rust-mode
1232     :ensure t
c8124c 1233     :hook (rust-mode . lsp)
22b4cd 1234     :config
JG 1235     ;; style guide suggests spaces not tabs
1236     (add-hook 'rust-mode-hook (lambda () (setq indent-tabs-mode nil)))
1237     (setq rust-format-on-save t))
1238
1239   (use-package toml-mode
1240     :ensure t)
1241 #+END_SRC
1242 **** Cargo integration
1243 Integrate Cargo, rust's package manager.
1244 #+BEGIN_SRC emacs-lisp
1245   (use-package cargo
1246     :ensure t
1247     :hook
1248     (rust-mode . cargo-minor-mode))
1249 #+END_SRC
1250 **** Flycheck
1251 Linting with flycheck.
1252 #+BEGIN_SRC emacs-lisp
1253   (use-package flycheck-rust
1254     :ensure t
1255     :config
1256     (add-hook 'flyckeck-mode-hook #'flycheck-rust-setup))
1257 #+END_SRC
1258
1259 **** COMMENT Completion
1260 Code completion with racer.
1261 #+BEGIN_SRC emacs-lisp
1262   (use-package racer
1263     :ensure t
1264     :hook ((rust-mode . racer-mode)
1265            (racer-mode . (eldoc-mode company-mode)))
1266     :init
1267     (setq racer-command "~/.cargo/bin/racer"))
1268 #+END_SRC
c8124c 1269 *** Bash
JG 1270 **** LSP
1271 Completion with LSP
1272 #+BEGIN_SRC emacs-lisp
1273 (add-hook 'sh-mode-hook 'lsp)
1274 #+END_SRC
990949 1275 * Org mode
C 1276 ** Up to date org
0ba1ff 1277 Pull the latest org mode from the repository, rather than the org which comes with emacs.
990949 1278 #+BEGIN_SRC emacs-lisp
C 1279     (use-package org
0ba1ff 1280       :ensure org-plus-contrib
990949 1281       :pin org)
C 1282 #+END_SRC
8a38cc 1283
990949 1284 ** Small tweaks
0ba1ff 1285 Small quality of life changes to org-mode.
990949 1286 #+BEGIN_SRC emacs-lisp
C 1287 (setq org-src-fontify-natively t)
1288 (setq org-src-tab-acts-natively t)
1289 (setq org-confirm-babel-evaluate nil)
1290 (setq org-export-with-smart-quotes t)
1291 (setq org-src-window-setup 'current-window)
1292 (add-hook 'org-mode-hook 'org-indent-mode)
1293 (diminish 'org-indent-mode)
1294 (diminish 'visual-line-mode)
1295 #+END_SRC
a428a2 1296 *** Spell checking for code and latex
JG 1297 #+BEGIN_SRC emacs-lisp
1298   (add-to-list 'ispell-skip-region-alist '("#\\+BEGIN_SRC" . "#\\+END_SRC"))
1299   (add-to-list 'ispell-skip-region-alist '("\\$" . "\\$"))
1300   (add-to-list 'ispell-skip-region-alist '("\\$\\$" . "\\$\\$"))
1301 #+END_SRC
8a38cc 1302
990949 1303 ** Line wrapping
0ba1ff 1304 Enable line wrapping for long lines.
990949 1305 #+BEGIN_SRC emacs-lisp
C 1306   (add-hook 'org-mode-hook
bf794a 1307             '(lambda ()
JG 1308                (visual-line-mode 1)))
990949 1309 #+END_SRC
8a38cc 1310
990949 1311 ** org-bullets
0ba1ff 1312 Use bullets of different colours and styles instead of the "\*\*\*" to denote indentation levels.
990949 1313 #+BEGIN_SRC emacs-lisp
bf794a 1314   (use-package org-bullets
JG 1315     :ensure t
1316     :config
990949 1317     (add-hook 'org-mode-hook (lambda () (org-bullets-mode))))
C 1318 #+END_SRC
8a38cc 1319
990949 1320 ** Org Babel
0ba1ff 1321 Allows the execution of code from within an org buffer.
JG 1322 Code output can also be input to the buffer.
990949 1323 *** Languages
0ba1ff 1324 Add a bunch of languages to org babel supported languages
990949 1325 #+BEGIN_SRC emacs-lisp
baf326 1326     (org-babel-do-load-languages 'org-babel-load-languages '((emacs-lisp . t)
C 1327                                                              (C . t)
1328                                                              (python . t)
1329                                                              (latex . t)
1330                                                              (scheme . t)
1331                                                              (gnuplot . t)
1332                                                              (matlab . t)
1333                                                              (plantuml . t)
1334                                                              (fortran . t)
1335                                                              (java . t)
1336                                                              (plantuml . t)))
1337 #+END_SRC
1338
0ba1ff 1339 **** PlantUML path
JG 1340 Org uses its own path for some reason.
baf326 1341 #+BEGIN_SRC emacs-lisp
C 1342   (setq org-plantuml-jar-path plantuml-jar-path)
990949 1343 #+END_SRC
8a38cc 1344
5a75e4 1345 *** Async export
JG 1346 Allow the editing of files while execution of blocks is occurring.
1347 Needs :async tag in src header.
1348 #+BEGIN_SRC emacs-lisp
1349   (use-package ob-async
1350     :ensure t)
1351 #+END_SRC
1352
990949 1353 ** Latex preview fragments match colour
C 1354 Make the previews match theme colour of Emacs.
0ba1ff 1355 Gets very annoying very quickly without it.
990949 1356 #+BEGIN_SRC emacs-lisp
C 1357   (let ((dvipng--plist (alist-get 'dvipng org-preview-latex-process-alist)))
1358     (plist-put dvipng--plist :use-xcolor t)
1359     (plist-put dvipng--plist :image-converter '("dvipng -D %D -T tight -o %O %f")))
1360 #+END_SRC
bf794a 1361
0ba1ff 1362 ** Org export additions
JG 1363 *** Pandoc
1364 Call pandoc on org buffer from org export.
1365 #+BEGIN_SRC emacs-lisp
1366   (use-package ox-pandoc
1367     :ensure t)
1368 #+END_SRC
1369
1370 *** COMMENT Dokuwiki Wiki
1371 Allow export to dokuwiki markup from org.
1372 #+BEGIN_SRC emacs-lisp
1373   (use-package ox-wk
1374     :ensure t)
1375 #+END_SRC
1376
1377 * COMMENT EMMS
be9cff 1378 Emacs media manager.
0ba1ff 1379 I come back to it every now and again as an MPD front-end, but haven't quite gotten the hang of it.
be9cff 1380 #+BEGIN_SRC emacs-lisp
JG 1381   (use-package emms-setup
1382     :ensure emms
1383     :init
1384     (add-to-list 'load-path "~/elisp/emms/")
1385     :config
1386     (emms-all)
1387     (emms-default-players)
1388     (setq emms-source-file-directory "~/Music/"))
1389 #+END_SRC
1390
a428a2 1391 * COMMENT Org Blog
0ba1ff 1392 I use org to write my blog and use org-static-blog to generate the HTML.
be9cff 1393 ** Org static blog config
0ba1ff 1394 Basic configuration for site.
JG 1395 Copied and modified from the example configuration.
be9cff 1396 #+BEGIN_SRC emacs-lisp
1005e3 1397   (use-package org-static-blog
JG 1398     :ensure t
1399     :config
1400     (setq org-static-blog-publish-title "Joel's Site")
1401     (setq org-static-blog-publish-url "https://blog.joelg.cf/")
1402     (setq org-static-blog-publish-directory "/backup/home/joel/Downloads/Chizi123.github.io/")
1403     (setq org-static-blog-posts-directory "/backup/home/joel/Downloads/Chizi123.github.io/posts/")
1404     (setq org-static-blog-drafts-directory "/backup/home/joel/Downloads/Chizi123.github.io/drafts/")
1405     (setq org-static-blog-enable-tags t)
1406     (setq org-export-with-toc nil)
1407     (setq org-export-with-section-numbers nil)
be9cff 1408
1005e3 1409     ;; This header is inserted into the <head> section of every page:
JG 1410     ;;   (you will need to create the style sheet at
1411     ;;    ~/projects/blog/static/style.css
1412     ;;    and the favicon at
1413     ;;    ~/projects/blog/static/favicon.ico)
1414     (setq org-static-blog-page-header
1415           "<meta name=\"author\" content=\"Joel Grunbaum\">
0ba1ff 1416       <meta name=\"referrer\" content=\"no-referrer\">
JG 1417       <link href= \"static/style.css\" rel=\"stylesheet\" type=\"text/css\" />
1418       <link rel=\"icon\" href=\"static/favicon.png\">
1419       <script async src=\"https://www.googletagmanager.com/gtag/js?id=UA-147303155-2\"></script>
1420       <script>
1421         window.dataLayer = window.dataLayer || [];
1422         function gtag(){dataLayer.push(arguments);}
1423         gtag('js', new Date());
1424         gtag('config', 'UA-147303155-2');
1425       </script>
1426       ")
be9cff 1427
1005e3 1428     ;; This preamble is inserted at the beginning of the <body> of every page:
JG 1429     ;;   This particular HTML creates a <div> with a simple linked headline
1430     (setq org-static-blog-page-preamble
1431           "<div class=\"header\">
0ba1ff 1432         <a href=\"https://blog.joelg.cf\">Joel's Site - Personal site and constant work in progress</a>
JG 1433         <div class=\"sitelinks\">
1434           <a href=\"https://blog.joelg.cf/about-me.html\">About Me</a> |
1435           <a href=\"https://github.com/Chizi123\">Github</a> |
1436           <a href=\"https://facebook.com/joel.grun.5\">Facebook</a>
1437         </div>
1438       </div>")
1439
1005e3 1440     ;; This postamble is inserted at the end of the <body> of every page:
JG 1441     ;;   This particular HTML creates a <div> with a link to the archive page
1442     ;;   and a licensing stub.
1443     (setq org-static-blog-page-postamble
1444           "<div id=\"archive\">
0ba1ff 1445         <a href=\"https://blog.joelg.cf/archive.html\">Other posts</a>
be9cff 1446       </div>
0ba1ff 1447       <br>
1005e3 1448       <center><button id=\"disqus_button\" onclick=\"load_disqus()\">Load Disqus Comments</button></center>
JG 1449     <div id=\"disqus_thread\"></div>
1450     <script type=\"text/javascript\">
1451       function load_disqus() {
1452           var dsq = document.createElement('script');
1453           dsq.type = 'text/javascript';
1454           dsq.async = true;
1455           dsq.src = 'https://joelg-cf.disqus.com/embed.js';
1456           (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
1457           document.getElementById('disqus_button').style.visibility = 'hidden';
1458       };
1459     </script>"))
be9cff 1460 #+END_SRC
JG 1461
0ba1ff 1462 ** Sitemap addition
JG 1463 Creates a sitemap.xml for the blog based on the generated HTML files output in the final directory.
1464 #+BEGIN_SRC emacs-lisp
1465   (defun blog-publish()
1466     (interactive)
1467     (org-static-blog-publish)
1468     (setq n 0)
1469     (setq site "https://blog.joelg.cf/")
1470     (setq posts (directory-files org-static-blog-publish-directory))
1471     (generate-new-buffer "sitemap.xml.gen")
1472     (with-current-buffer "sitemap.xml.gen" (insert "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\n"))
1473     (while (< n (length (directory-files org-static-blog-publish-directory)))
1474       (setq curr (nth n posts))
1475       (if (string-match "\\(html\\)" curr)
1476           (if (string-match "index.html" curr)
1477               (with-current-buffer "sitemap.xml.gen" (insert (concat "\t<url>\n\t\t<loc>" site "</loc>\n\t</url>\n")))
1478             (with-current-buffer "sitemap.xml.gen" (insert (concat "\t<url>\n\t\t<loc>" site curr "</loc>\n\t</url>\n")))))
1479       (setq n (1+ n)))
1480     (with-current-buffer "sitemap.xml.gen" (insert "</urlset>"))
1481     (with-current-buffer "sitemap.xml.gen" (write-region (point-min) (point-max) (concat org-static-blog-publish-directory "sitemap.xml")) t)
1482     (kill-buffer "sitemap.xml.gen"))
1483 #+END_SRC
1484
be9cff 1485 ** Emacs-htmlize
0ba1ff 1486 Allow org features to be exported to HTML for site.
be9cff 1487 #+BEGIN_SRC emacs-lisp
JG 1488   (use-package htmlize
1489     :ensure t)
1490 #+END_SRC
0ba1ff 1491
a428a2 1492 * Journaling
JG 1493 ** Noteworthy entries
1494 I write weekly journal entries recapping my week.
1495 These files are in org mode.
1496 This is inspired by org-static-blog.
1497 #+BEGIN_SRC emacs-lisp
1498   (defun journal-create-new-post ()
1499       "Create a new entry, prompt for title and insert header"
1500     (interactive)
1501     (let ((title (read-string "Title: ")))
1502       (find-file (concat "~/Documents/Journal/entry/"
1503                          (read-string "Filename: "
1504                                       (concat (format-time-string "%Y-%m-%d-" (current-time))
1505                                               (replace-regexp-in-string "\s" "-" (downcase title))
1506                                               ".org"))))
1507       (insert "#+title: " title "\n"
1508               "#+date: " (format-time-string "<%Y-%m-%d %H:%M>") "\n"
1509               "#+filetags: ")))
1510 #+END_SRC
1511 *** Publish entries
1512 Use org-publish to collate entries into a single unit.
1513 #+BEGIN_SRC emacs-lisp
1514   (setq org-publish-project-alist
1515                '(("Journal"
1516                  :base-directory "~/Documents/Journal/entry/"
1517                  :publishing-directory "~/Documents/Journal/out/"
1518                  :publishing-function org-html-publish-to-html
0a6cd2 1519                  ;;:htmlized-source t
a428a2 1520                  :section-numbers nil
JG 1521                  :html-preamble t
0a6cd2 1522                  :html-validation-link nil
JG 1523
a428a2 1524                  :auto-sitemap t
0a6cd2 1525                  :sitemap-sort-files anti-chronologically
JG 1526                  :sitemap-file-entry-format "%d - %t"
1527                  :sitemap-title "Home"
1528                  :sitemap-filename "index.html"
1529                  :sitemap-function org-publish-sitemap)))
5a75e4 1530 #+END_SRC