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

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