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

Joel Grunbaum
2020-10-20 2b80ab79e7214879060a9c1cdbcc4840386d6a40
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
103     :config
104     (require 'exwm-config)
105     (exwm-config-default))
106 #+END_SRC
990949 107
C 108 * Writing requirements
109 ** Spellchecking
80d515 110 Use aspell for spellchecking. 
JG 111 Auto-enable in latex and org as they're the main writing modes.
990949 112 #+BEGIN_SRC emacs-lisp
C 113   (require 'ispell)
114   (setq-default ispell-program-name "aspell")
115   (setq-default ispell-local-dictionary "en_AU")
f0bf38 116   (add-hook 'tex-mode-hook 'flyspell-mode)
990949 117   (add-hook 'latex-mode-hook 'flyspell-mode)
f0bf38 118   (add-hook 'TeX-mode-hook 'flyspell-mode)
JG 119   (add-hook 'LaTeX-mode-hook 'flyspell-mode)
0ba1ff 120   ;; (add-hook 'latex-mode-hook 'flyspell-buffer)
990949 121   (add-hook 'org-mode-hook 'flyspell-mode)
0ba1ff 122   ;; (add-hook 'org-mode-hook 'flyspell-buffer)
f1b53f 123   (diminish 'flyspell-mode)
a428a2 124
990949 125 #+END_SRC
C 126
127 ** Switch-window
80d515 128 Helps to change windows easily when many are open at once.
990949 129 #+BEGIN_SRC emacs-lisp
C 130 (use-package switch-window
131   :ensure t
132   :config
133     (setq switch-window-input-style 'minibuffer)
134     (setq switch-window-increase 4)
135     (setq switch-window-threshold 2)
136     (setq switch-window-shortcut-style 'qwerty)
137     (setq switch-window-qwerty-shortcuts
138         '("a" "s" "d" "f" "j" "k" "l" "i" "o"))
139   :bind
140     ([remap other-window] . switch-window))
141 #+END_SRC
8a38cc 142
990949 143 ** Go to new window when opened
80d515 144 Go to new window when its opened instead of staying with current one.
990949 145 #+BEGIN_SRC emacs-lisp
C 146   (defun split-and-follow-horizontally ()
147     (interactive)
148     (split-window-below)
149     (balance-windows)
150     (other-window 1))
151   (global-set-key (kbd "C-x 2") 'split-and-follow-horizontally)
152
153   (defun split-and-follow-vertically ()
154     (interactive)
155     (split-window-right)
156     (balance-windows)
157     (other-window 1))
158   (global-set-key (kbd "C-x 3") 'split-and-follow-vertically)
159 #+END_SRC
8a38cc 160
990949 161 ** PDF-tools
80d515 162 Helpful pdf viewer.
990949 163 #+BEGIN_SRC emacs-lisp
bf794a 164   (use-package pdf-tools
JG 165     :ensure t
166     :config
167     (pdf-tools-install 1))
990949 168 #+END_SRC
8a38cc 169
be9cff 170 ** COMMENT Writegood-mode
80d515 171 Supposedly should provide insight to writing quality.
49aa9f 172 #+BEGIN_SRC emacs-lisp
JG 173   (use-package writegood-mode
174     :ensure t
175     :hook (text-mode . writegood-mode))
176 #+END_SRC
177
990949 178 * Helm and Projectile
C 179 ** Helm core
80d515 180 Helm aids the user interface for emacs. Adds visual and auto-complete feedback for emacs commands.
990949 181 #+BEGIN_SRC emacs-lisp
C 182   (use-package helm-config
183     :ensure helm
184     :bind (("M-x" . helm-M-x)
185            ("C-x C-f" . helm-find-files)
186            ("M-y" . helm-show-kill-ring)
187            ("C-x b" . helm-mini)
188            ("C-c h o" . helm-occur))
189     :config
190     (setq helm-M-x-fuzzy-match t)
191     (setq helm-buffers-fuzzy-matching t
192           helm-recentf-fuzzy-match    t)
193     (setq helm-split-window-in-side-p           t ; open helm buffer inside current window, not occupy whole other window
194           helm-move-to-line-cycle-in-source     t ; move to end or beginning of source when reaching top or bottom of source.
195           helm-ff-search-library-in-sexp        t ; search for library in `require' and `declare-function' sexp.
196           helm-scroll-amount                    8 ; scroll 8 lines other window using M-<next>/M-<prior>
197           helm-ff-file-name-history-use-recentf t
198           helm-echo-input-in-header-line t)
199     (defun spacemacs//helm-hide-minibuffer-maybe ()
200       "Hide minibuffer in Helm session if we use the header line as input field."
201       (when (with-helm-buffer helm-echo-input-in-header-line)
202         (let ((ov (make-overlay (point-min) (point-max) nil nil t)))
203           (overlay-put ov 'window (selected-window))
204           (overlay-put ov 'face
205                        (let ((bg-color (face-background 'default nil)))
206                          `(:background ,bg-color :foreground ,bg-color)))
207           (setq-local cursor-type nil))))
208     (add-hook 'helm-minibuffer-set-up-hook
209               'spacemacs//helm-hide-minibuffer-maybe)
210     (helm-mode 1))
211 #+END_SRC
8a38cc 212
990949 213 ** Projectile
80d515 214 Projectile is project management framework for emacs.
JG 215 Helps in navigation and management of projects.
216 Identifies project layout from git.
990949 217 *** Enable it
C 218  #+BEGIN_SRC emacs-lisp
219    (use-package projectile
220      :ensure t
221      :bind ("C-c p" . projectile-command-map)
222      :diminish projectile-mode
223      :config
224      (projectile-global-mode)
225      (setq projectile-completion-system 'helm)
226      (when (eq system-type 'windows-nt)
227        (setq projectile-indexing-method 'alien)))
228  #+END_SRC
8a38cc 229
990949 230 *** Let it compile things
80d515 231 Shortcut for compilation.
990949 232  #+BEGIN_SRC emacs-lisp
C 233    (global-set-key (kbd "<f5>") 'projectile-compile-project)
234  #+END_SRC
8a38cc 235
990949 236 *** Enable communication with helm
80d515 237 Use helm to manage project.
990949 238 #+BEGIN_SRC emacs-lisp
baf326 239   (use-package helm-projectile
C 240     :ensure t
241     :config
242     (helm-projectile-on))
990949 243 #+END_SRC
8a38cc 244
be9cff 245 ** COMMENT ggtags
0ba1ff 246 Use GNU Global Tags. Can be useful for large projects.
bf794a 247 #+BEGIN_SRC emacs-lisp
JG 248     (use-package ggtags
249       :ensure t
250       :bind (("C-c g s" . ggtags-find-other-symbol)
251            ("C-c g h" . ggtags-view-tag-history)
252            ("C-c g r" . ggtags-find-reference)
253            ("C-c g f" . ggtags-find-file)
254            ("C-c g c" . ggtags-create-tags)
255            ("C-c g u" . ggtags-update-tags))
256       :config
257       (add-hook 'c-mode-common-hook
258               (lambda ()
259                 (when (derived-mode-p 'c-mode 'c++-mode 'java-mode)
260                   (ggtags-mode 1))))
261       )
262
263     (setq
264      helm-gtags-ignore-case t
265      helm-gtags-auto-update t
266      helm-gtags-use-input-at-cursor t
267      helm-gtags-pulse-at-cursor t
268      helm-gtags-prefix-key "\C-c g"
269      helm-gtags-suggested-key-mapping t
270      )
271
272     (use-package helm-gtags
273       :ensure t
274       :config
275       (add-hook 'dired-mode-hook 'helm-gtags-mode)
276       (add-hook 'eshell-mode-hook 'helm-gtags-mode)
277       (add-hook 'c-mode-hook 'helm-gtags-mode)
278       (add-hook 'c++-mode-hook 'helm-gtags-mode)
279       (add-hook 'asm-mode-hook 'helm-gtags-mode)
280     
281       (define-key helm-gtags-mode-map (kbd "C-c g a") 'helm-gtags-tags-in-this-function)
282       (define-key helm-gtags-mode-map (kbd "C-j") 'helm-gtags-select)
283       (define-key helm-gtags-mode-map (kbd "M-.") 'helm-gtags-dwim)
284       (define-key helm-gtags-mode-map (kbd "M-,") 'helm-gtags-pop-stack)
285       (define-key helm-gtags-mode-map (kbd "C-c <") 'helm-gtags-previous-history)
286       (define-key helm-gtags-mode-map (kbd "C-c >") 'helm-gtags-next-history))
287 #+END_SRC
288
be9cff 289 ** COMMENT Ctags
0ba1ff 290 Ctags is an older tagging program that supports more languages.
JG 291 Currently setup for VHDL as I had to work with a large existing VHDL code-base.
bf794a 292 #+BEGIN_SRC emacs-lisp
JG 293   (defvar ctags-command "ctags -e -R --languages=vhdl")
294
295   (defun ctags ()
296     (call-process-shell-command ctags-command nil "*Ctags*"))
297
298
299   (defun ctags-find-tags-file ()
300     "Recursively searches each parent directory for a file named
301                 TAGS and returns the path to that file or nil if a tags file is
302                 not found or if the buffer is not visiting a file."
303     (progn
304       (defun find-tags-file-r (path)
305         "Find the tags file from current to the parent directories."
306         (let* ((parent-directory (file-name-directory (directory-file-name path)))
307                (tags-file-name (concat (file-name-as-directory path) "TAGS")))
308           (cond
309            ((file-exists-p tags-file-name) (throw 'found tags-file-name))
310            ((string= "/TAGS" tags-file-name) nil)
311            (t (find-tags-file-r parent-directory)))))
312
313       (if (buffer-file-name)
314           (catch 'found
315             (find-tags-file-r (file-name-directory buffer-file-name)))
316         nil)))
317
318   (defun ctags-set-tags-file ()
319     "Uses `ctags-find-tags-file' to find a TAGS file. If found,
320                 set 'tags-file-name' with its path or set as nil."
321     (setq-default tags-file-name (ctags-find-tags-file)))
322
323   (defun ctags-create-tags-table ()
324     (interactive)
325     (let* ((current-directory default-directory)
326            (top-directory (read-directory-name
327                            "Top of source tree: " default-directory))
328            (file-name (concat (file-name-as-directory top-directory) "TAGS")))
329       (cd top-directory)
330       (if (not (= 0 (ctags)))
331           (message "Error creating %s!" file-name)
332         (setq-default tags-file-name file-name)
333         (message "Table %s created and configured." tags-file-name))
334       (cd current-directory)))
335
336   (defun ctags-update-tags-table ()
337     (interactive)
338     (let ((current-directory default-directory))
339       (if (not tags-file-name)
340           (message "Tags table not configured.")
341         (cd (file-name-directory tags-file-name))
342         (if (not (= 0 (ctags)))
343             (message "Error updating %s!" tags-file-name)
344           (message "Table %s updated." tags-file-name))
345         (cd current-directory))))
346
347   (defun ctags-create-or-update-tags-table ()
348     "Create or update a tags table with `ctags-command'."
349     (interactive)
350     (if (not (ctags-set-tags-file))
351         (ctags-create-tags-table)
352       (ctags-update-tags-table)))
353
354
355   (defun ctags-search ()
356     "A wrapper for `tags-search' that provide a default input."
357     (interactive)
358     (let* ((symbol-at-point (symbol-at-point))
359            (default (symbol-name symbol-at-point))
360            (input (read-from-minibuffer
361                    (if (symbol-at-point)
362                        (concat "Tags search (default " default "): ")
363                      "Tags search (regexp): "))))
364       (if (and (symbol-at-point) (string= input ""))
365           (tags-search default)
366         (if (string= input "")
367             (message "You must provide a regexp.")
368           (tags-search input)))))
369 #+END_SRC
370
990949 371 * Small tweaks
C 372 ** Remove startup screen
0ba1ff 373 Start on scratch buffer instead.
990949 374 #+BEGIN_SRC emacs-lisp
C 375 (setq inhibit-startup-message t)
376 #+END_SRC
8a38cc 377
990949 378 ** Disable bell
0ba1ff 379 Bloody bell dings every time you hit a key too much.
990949 380 #+BEGIN_SRC emacs-lisp
C 381 (setq ring-bell-function 'ignore)
382 #+END_SRC
8a38cc 383
990949 384 ** Pretty symbols
0ba1ff 385 Why not? They make it look nice.
990949 386 #+BEGIN_SRC emacs-lisp
C 387   (when window-system
388     (use-package pretty-mode
389       :ensure t
390       :diminish t
391       :config
392       (global-pretty-mode)))
393 #+END_SRC
8a38cc 394
0ba1ff 395 ** COMMENT Find file other window
990949 396 Lets it accept more than one file. Works recursively.
C 397 #+BEGIN_SRC emacs-lisp
398 (defadvice find-file-other-window (around find-files activate)
399   (if (listp filename)
400       (loop for f in filename do (find-file-other-window f wildcards))
401     ad-do-it))
402 #+END_SRC
8a38cc 403
990949 404 ** Which key
0ba1ff 405 Helps to explain keybindings if you get lost.
990949 406 #+BEGIN_SRC emacs-lisp
C 407   (use-package which-key
408     :ensure t
409     :diminish which-key-mode
410     :config
411     (which-key-mode))
412 #+END_SRC
8a38cc 413
bf794a 414 ** Config shortcuts
JG 415 *** Go to this file
990949 416 #+BEGIN_SRC emacs-lisp
C 417 (defun config-visit ()
418   (interactive)
419   (find-file "~/.emacs.d/config.org"))
420 (global-set-key (kbd "C-c e d") 'config-visit)
421 #+END_SRC
8a38cc 422
bf794a 423 *** Go to init.el
990949 424 #+BEGIN_SRC emacs-lisp
C 425   (defun init-visit ()
426     (interactive)
427     (find-file "~/.emacs.d/init.el"))
428   (global-set-key (kbd "C-c e i") 'init-visit)
429 #+END_SRC
8a38cc 430
bf794a 431 *** Reload configuration
990949 432 #+BEGIN_SRC emacs-lisp
C 433 (defun config-reload ()
434   "Reloads ~/.emacs.d/config.org at run time"
435   (interactive)
436   (org-babel-load-file (expand-file-name "~/.emacs.d/config.org")))
437 (global-set-key (kbd "C-c e r") 'config-reload)
438 #+END_SRC
8a38cc 439
990949 440 ** Smartparens
0ba1ff 441 Matches brackets automatically. Added "$" for latex in org mode.
990949 442 #+BEGIN_SRC emacs-lisp
0ba1ff 443   (use-package smartparens
JG 444     :ensure t
445     :diminish smartparens-mode
446     :config
447     (progn
448       (require 'smartparens-config)
449       (smartparens-global-mode 1))
450     (sp-with-modes 'org-mode
451       (sp-local-pair "$" "$")))
990949 452 #+END_SRC
8a38cc 453
0ba1ff 454 ** COMMENT Rainbow
JG 455 Its a little gimmicky but its still cool.
456 Colours according to code after a "#", works with 3 and 6 character hex codes.
990949 457 #+BEGIN_SRC emacs-lisp
C 458   (use-package rainbow-mode
459     :ensure t
460     :diminish rainbow-mode
461     :init
462     (add-hook 'prog-mode-hook 'rainbow-mode))
463 #+END_SRC
8a38cc 464
990949 465 ** Rainbow delimiters
C 466 A bit more useful than above.
467 Colours the brackets so that they stand out more.
468 #+BEGIN_SRC emacs-lisp
469   (use-package rainbow-delimiters
470     :ensure t
471     :init
472       (add-hook 'prog-mode-hook #'rainbow-delimiters-mode))
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
0ba1ff 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     (use-package yasnippet-snippets
756       :ensure t)
757     (yas-reload-all)
758     (yas-global-mode 1))
990949 759 #+END_SRC
8a38cc 760
0ba1ff 761 ** Flycheck
JG 762 Basic linter. Works pretty well.
990949 763 #+BEGIN_SRC emacs-lisp
8a38cc 764   (use-package flycheck
C 765     :ensure t
766     :diminish flycheck-mode
767     :config
768     (global-flycheck-mode))
990949 769 #+END_SRC
0ba1ff 770 *** flycheck-pos-tip
JG 771 Add suggestions at the cursor.
990949 772 #+BEGIN_SRC emacs-lisp
C 773 (use-package flycheck-pos-tip
774   :ensure t
775   :after flycheck
776   :config
777   (flycheck-pos-tip-mode))
778 #+END_SRC
8a38cc 779
990949 780 ** Company
0ba1ff 781 Company is auto-complete for Emacs.
JG 782 Uses various backends, more of which are added later.
990949 783 #+BEGIN_SRC emacs-lisp
C 784   (use-package company
785     :ensure t
786     :diminish company-mode
787     :config
788     (global-company-mode)
789     (setq company-idle-delay 0)
790     (setq company-minimum-prefix-length 3))
791 #+END_SRC
8a38cc 792
c8124c 793 ** LSP Mode
JG 794 Use LSP for completion suggestions
795 #+BEGIN_SRC emacs-lisp
796   (use-package lsp-mode
797     :ensure t
798     :hook ((lsp-mode . lsp-enable-which-key-integration))
799     :init
800     (setq lsp-keymap-prefix "C-c l")
801     :commands lsp
802     :config
803     (setq read-process-output-max (* 1024 1024))
f0bf38 804     (setq lsp-completion-provider :capf)
JG 805     (add-to-list 'exec-path "~/.cargo/bin"))
c8124c 806
JG 807   (use-package lsp-ui
808     :ensure t
809     :commands lsp-ui-mode)
810
811   (use-package helm-lsp
812     :ensure t
813     :commands helm-lsp-workspace-symbol)
814 #+END_SRC
da7a13 815 ** Version control
JG 816 Settings for emacs' own version control system.
817 *** Enable version control on the mode line
818 #+BEGIN_SRC emacs-lisp
819   (vc-mode)
820 #+END_SRC
990949 821 ** Magit
0ba1ff 822 Emacs git client.
JG 823 Pretty good and offers fairly decent features.
990949 824 #+BEGIN_SRC emacs-lisp
C 825   (use-package magit
826     :ensure t
827     :commands magit-get-top-dir
828     :bind ("C-x g" . magit-status)
829     :init
830     (progn
831       ;; make magit status go full-screen but remember previous window
832       ;; settings
833       ;; from: http://whattheemacsd.com/setup-magit.el-01.html
834       (defadvice magit-status (around magit-fullscreen activate)
835         (window-configuration-to-register :magit-fullscreen)
836         ad-do-it
837         (delete-other-windows))
838
839       ;; Close popup when committing - this stops the commit window
840       ;; hanging around
841       ;; From: http://git.io/rPBE0Q
842       (defadvice git-commit-commit (after delete-window activate)
843         (delete-window))
844
845       (defadvice git-commit-abort (after delete-window activate)
846         (delete-window))
847
848       :config
849       (progn
850         ;; restore previously hidden windows
851         (defadvice magit-quit-window (around magit-restore-screen activate)
852           (let ((current-mode major-mode))
853             ad-do-it
854             ;; we only want to jump to register when the last seen buffer
855             ;; was a magit-status buffer.
856             (when (eq 'magit-status-mode current-mode)
857               (jump-to-register :magit-fullscreen)))))
858
859       ;; magit settings
860       (setq
861        ;; don't put "origin-" in front of new branch names by default
862        magit-default-tracking-name-function 'magit-default-tracking-name-branch-only
863        ;; open magit status in same window as current buffer
864        magit-status-buffer-switch-function 'switch-to-buffer
865        ;; highlight word/letter changes in hunk diffs
866        magit-diff-refine-hunk t
867        ;; ask me if I want to include a revision when rewriting
868        magit-rewrite-inclusive 'ask
869        ;; ask me to save buffers
870        magit-save-some-buffers t
871        ;; pop the process buffer if we're taking a while to complete
872        magit-process-popup-time 10
873        ;; ask me if I want a tracking upstream
874        magit-set-upstream-on-push 'askifnotset
875        )))
876 #+END_SRC
8a38cc 877
990949 878 ** CEDET
0ba1ff 879 *** Semantic
JG 880 Parser library for code, supports many other packages.
881 Allows emacs to be mode aware of what is being written.
990949 882 #+BEGIN_SRC emacs-lisp
C 883   (use-package semantic
884     :config
885     (global-semanticdb-minor-mode 1)
886     (global-semantic-idle-scheduler-mode 1)
887     (global-semantic-idle-summary-mode 1)
888     (semantic-mode 1))
889 #+END_SRC
8a38cc 890
a428a2 891 *** COMMENT EDE
0ba1ff 892 Emacs Development Environment.
JG 893 Can be used to manage and create build files for a project.
990949 894 #+BEGIN_SRC emacs-lisp
C 895 (use-package ede
896   :config
897   (global-ede-mode t))
898 #+END_SRC
8a38cc 899
990949 900 *** gdb-many-windows
0ba1ff 901 Enhances the use of GDB in emacs.
JG 902 Shows register contents, variable contents and others in addition to GDB shell.
903 Also shows source code while debugging.
990949 904 #+BEGIN_SRC emacs-lisp
C 905 (setq
906  gdb-many-windows t
907  gdb-show-main t)
908 #+END_SRC
8a38cc 909
0ba1ff 910 *** COMMENT Semantic refactor
JG 911 Trying to get this to work.
912 Should help to refactor file.
990949 913 #+BEGIN_SRC emacs-lisp
0ba1ff 914   (use-package srefactor
JG 915     :ensure t
916     :bind (("M-RET o" . 'srefactor-lisp-one-line)
917        ("M-RET m" . 'srefactor-lisp-format-sexp)
918        ("M-RET d" . 'srefactor-lisp-format-defun)
919        ("M-RET b" . 'srefactor-lisp-format-buffer)
920        :map c-mode-base-map
921             ("M-RET" . 'srefactor-refactor-at-point)
922             :map c++-mode-map
923             ("M-RET" . 'srefactor-refactor-at-point)))
990949 924 #+END_SRC
8a38cc 925
990949 926 ** Language specific configs
C 927 *** C/C++
0ba1ff 928 **** COMMENT yasnippet
JG 929 Enable yasnippet for C/C++.
990949 930 #+BEGIN_SRC emacs-lisp
C 931 (add-hook 'c++-mode-hook 'yas-minor-mode)
932 (add-hook 'c-mode-hook 'yas-minor-mode)
933 #+END_SRC
8a38cc 934
0ba1ff 935 **** Flycheck clang
JG 936 Add the clang backend for linting.
990949 937 #+BEGIN_SRC emacs-lisp
C 938 (use-package flycheck-clang-analyzer
939   :ensure t
940   :config
941   (with-eval-after-load 'flycheck
942     (require 'flycheck-clang-analyzer)
943      (flycheck-clang-analyzer-setup)))
944 #+END_SRC
8a38cc 945
0ba1ff 946 **** Company
JG 947 Add header completion as well as Irony, which uses clang for suggestions.
990949 948 #+BEGIN_SRC emacs-lisp
C 949   (use-package company-c-headers
950       :ensure t
951       :after company
952       :config
953       (add-hook 'c++-mode-hook 'company-mode)
954       (add-hook 'c-mode-hook 'company-mode))
955
956   (use-package irony
957     :ensure t
958     :init
959     (setq w32-pipe-read-delay 0)
960     (setq irony-server-w32-pipe-buffer-size (* 64 1024))
961     (add-hook 'c++-mode-hook 'irony-mode)
962     (add-hook 'c-mode-hook 'irony-mode)
963     (add-hook 'irony-mode-hook 'irony-cdb-autosetup-compile-options)
964     (add-hook 'irony-mode-hook 'irony-cdb-autosetup-compile-options))
0ba1ff 965
JG 966   (use-package company-irony
967     :ensure t
968     :config
969     (add-to-list 'company-backends '(company-c-headers
970                                      company-dabbrev-code
971                                      company-irony)))
990949 972 #+END_SRC
8a38cc 973
c8124c 974 **** LSP
JG 975 Allow completion with LSP.
976 #+BEGIN_SRC emacs-lisp
977 (add-hook 'c-mode-hook 'lsp)
978 (add-hook 'cpp-mode-hook 'lsp)
979 #+END_SRC
990949 980 *** emacs-lisp
0ba1ff 981 **** COMMENT yasnippet
JG 982 Enable yasnippet.
990949 983 #+BEGIN_SRC emacs-lisp
C 984 (add-hook 'emacs-lisp-mode-hook 'yas-minor-mode)
985 #+END_SRC
8a38cc 986
0ba1ff 987 **** COMMENT company
JG 988 Add slime backend.
990949 989 #+BEGIN_SRC emacs-lisp
C 990 (add-hook 'emacs-lisp-mode-hook 'company-mode)
991
992 (use-package slime
993   :ensure t
994   :config
995   (setq inferior-lisp-program "/usr/bin/sbcl")
996   (setq slime-contribs '(slime-fancy)))
997
998 (use-package slime-company
999   :ensure t
1000   :init
1001     (require 'company)
1002     (slime-setup '(slime-fancy slime-company)))
1003 #+END_SRC
8a38cc 1004
bf794a 1005 *** COMMENT x86
990949 1006 **** x86-lookup
0ba1ff 1007 Look up reference PDF. Use Intel manual.
990949 1008 #+BEGIN_SRC emacs-lisp
C 1009 (use-package x86-lookup
1010   :ensure t
1011   :init
1012   (setq x86-lookup-pdf "D:/Coding/x86-instructions.pdf")
1013   :bind ("C-h x" . x86-lookup))
1014 #+END_SRC
8a38cc 1015
990949 1016 *** Latex
C 1017 **** AucTex
0ba1ff 1018 AucTex contains many additions to make tex editing good.
990949 1019 #+BEGIN_SRC emacs-lisp
20e001 1020   (use-package tex
C 1021     :ensure auctex
1022     :config
1023     (setq TeX-auto-save t)
1024     (setq TeX-parse-self t)
1025     (setq TeX-view-program-selection '((output-pdf "PDF Tools"))
1026           TeX-source-correlate-start-server t)
1027     (add-hook 'TeX-after-compilation-finished-functions #'TeX-revert-document-buffer))
990949 1028 #+END_SRC
8a38cc 1029
990949 1030 **** Company
0ba1ff 1031 Help company complete tex math and references.
990949 1032 #+BEGIN_SRC emacs-lisp
C 1033   (use-package company-math
1034     :ensure t
1035     :after company
1036     :config
1005e3 1037     (add-to-list 'company-backends '(company-math-symbols-unicode company-math-symbols-latex
0a6cd2 1038                                      company-latex-commands))
1005e3 1039     (setq company-math-allow-latex-symbols-in-faces t))
990949 1040
C 1041   (use-package company-reftex
1042     :ensure t
1043     :after company
1044     :config
1005e3 1045     (add-to-list 'company-backends 'company-reftex-citations))
990949 1046
C 1047   (use-package company-auctex
1048     :ensure t
1049     :after company
1050     :config
1051     (company-auctex-init))
1052
1053   (use-package company-bibtex
1054     :ensure t
1055     :after company
1056     (add-to-list 'company-backends 'company-bibtex))
1057 #+END_SRC
8a38cc 1058
bf794a 1059 **** TeXcount
0ba1ff 1060 Word counts in latex.
JG 1061 Uses a Perl script.
1062 #+BEGIN_SRC emacs-lisp
1063   (defun get-texcount-latest()
1064     (if (not(file-directory-p "~/.texcount"))
1065         (make-directory "~/.texcount"))
1066     (url-copy-file "https://app.uio.no/ifi/texcount/download.php?file=texcount_3_1_1.zip" "~/.texcount/texcount.zip" 1)
1067     (shell-command "unzip -o ~/.texcount/texcount.zip -d ~/.texcount")
1068     (add-to-list 'exec-path "~/.texcount/texcount.pl"))
20e001 1069
df1744 1070   (if (not(or (file-exists-p "~/.texcount/texcount.pl") (file-exists-p "/usr/bin/texcount")))
0ba1ff 1071       (get-texcount-latest))
990949 1072
0ba1ff 1073   (defun texcount ()
JG 1074     (interactive)
1075     (let*
1076         ( (this-file (buffer-file-name))
1077           (enc-str (symbol-name buffer-file-coding-system))
1078           (enc-opt
1079            (cond
1080             ((string-match "utf-8" enc-str) "-utf8")
1081             ((string-match "latin" enc-str) "-latin1")
1082             ("-encoding=guess")
1083             ) )
1084           (word-count
1085            (with-output-to-string
1086              (with-current-buffer standard-output
1087                (call-process "texcount" nil t nil "-0" enc-opt this-file)
1088                ) ) ) )
1089       (message word-count)
1090       ) )
1091   (add-hook 'LaTeX-mode-hook (lambda () (define-key LaTeX-mode-map (kbd "C-c c") 'texcount)))
1092   (add-hook 'latex-mode-hook (lambda () (define-key latex-mode-map (kbd "C-c c") 'texcount)))
1093 #+END_SRC
990949 1094
f0bf38 1095 **** LSP
JG 1096 Allow LSP completion
1097 #+BEGIN_SRC emacs-lisp
1098   (add-hook 'tex-mode-hook 'lsp)
1099   (add-hook 'latex-mode-hook 'lsp)
1100   (add-hook 'TeX-mode-hook 'lsp)
1101   (add-hook 'LaTeX-mode-hook 'lsp)
1102 #+END_SRC
990949 1103 *** PlantUML
0ba1ff 1104 Sets the PlantUML path for the mode to generate models.
990949 1105 #+BEGIN_SRC emacs-lisp
bf794a 1106   (use-package plantuml-mode
JG 1107     :ensure t
1108     :init
1109     (cond ((eq system-type 'windows-nt)
1110            (setq plantuml-jar-path "c:/ProgramData/chocolatey/lib/plantuml/tools/plantuml.jar"))
1111           ((eq system-type 'gnu/linux)
4659c3 1112            (setq plantuml-jar-path "/usr/share/java/plantuml/plantuml.jar")))
JG 1113     (setq planuml-default-exec-mode 'jar))
990949 1114 #+END_SRC
C 1115
bf794a 1116 *** COMMENT Racket
990949 1117 **** Major mode
0ba1ff 1118 Set racket path in windows and enable racket mode.
990949 1119 #+BEGIN_SRC emacs-lisp
C 1120   (when (eq system-type 'windows-nt)
1121     (add-to-list 'exec-path "c:/Program Files/Racket")
1122     (setenv "PATH" (mapconcat #'identity exec-path path-separator)))
1123
1124   (use-package racket-mode
1125       :ensure t
1126       :config
1127       (autoload 'racket-mode "Racket" "Racket Editing Mode" t)
1128       (add-to-list
1129        'auto-mode-alist
8a38cc 1130        '("\\.rkt$" . racket-mode))
990949 1131       (setq matlab-indent-function t))
C 1132 #+END_SRC
1133
0ba1ff 1134 *** COMMENT Verilog
baf326 1135 **** Get latest version
0ba1ff 1136 Pull the latest version from the web.
baf326 1137 #+BEGIN_SRC emacs-lisp
C 1138   (defun get-verilog-latest()
0864ff 1139     (if (not(file-directory-p "~/.emacs.d/elpa/verilog-mode"))
C 1140         (make-directory "~/.emacs.d/elpa/verilog-mode"))
1141     (if (file-exists-p "~/.emacs.d/elpa/verilog-mode/verilog-mode.el")
1142         (delete-file "~/.emacs.d/elpa/verilog-mode/verilog-mode.el"))
dc8eb0 1143     (url-copy-file "https://www.veripool.org/ftp/verilog-mode.el" "~/.emacs.d/elpa/verilog-mode/verilog-mode.el" 1))
baf326 1144 #+END_SRC
C 1145
1146 **** Integrate into emacs
0ba1ff 1147 Add updated version (based off auto-package-update) and integrate it with Emacs.
990949 1148 #+BEGIN_SRC emacs-lisp
c8124c 1149   (defun verilog-read-file-as-string (file)
JG 1150     "Read FILE contents."
1151     (when (file-exists-p file)
0864ff 1152       (with-temp-buffer
c8124c 1153         (insert-file-contents file)
JG 1154         (buffer-string))))
0864ff 1155
c8124c 1156   (defun verilog-write-string-to-file (file string)
JG 1157     "Substitute FILE contents with STRING."
1158     (with-temp-buffer
1159       (insert string)
1160       (when (file-writable-p file)
1161         (write-region (point-min)
1162                       (point-max)
1163                       file))))
0864ff 1164
c8124c 1165   (defun verilog-today-day ()
JG 1166     (time-to-days (current-time)))
0864ff 1167
c8124c 1168   (defun should-update-verilog-p ()
JG 1169     "Return non-nil when an update is due."
1170     (and
1171      (or
1172       (not (file-exists-p "~/.emacs.d/.last-verilog-update-day"))
1173       (if (>= (/ (- (verilog-today-day) (verilog-read-last-update-day)) 7) 1)
1174           t
1175         nil))))
0864ff 1176
c8124c 1177   (defun verilog-read-last-update-day ()
JG 1178     "Read last update day."
1179     (string-to-number
1180      (verilog-read-file-as-string "~/.emacs.d/.last-verilog-update-day")))
0864ff 1181
c8124c 1182   (defun verilog-write-current-day ()
JG 1183     "Store current day."
1184     (verilog-write-string-to-file
1185      "~/.emacs.d/.last-verilog-update-day"
1186      (int-to-string (verilog-today-day))))
1187
1188   (use-package verilog-mode
1189     :hook (verilog-mode . lsp)
1190     :init
1191     (when (should-update-verilog-p)
1192         (get-verilog-latest)
1193         (verilog-write-current-day))
1194     (add-to-list 'load-path "~/.emacs.d/elpa/verilog-mode/verilog-mode.el")
1195     :config
1196     (autoload 'verilog-mode "verilog-mode" "Verilog mode" t )
1197     (add-to-list 'auto-mode-alist '("\\.[ds]?vh?\\'" . verilog-mode)))
990949 1198 #+END_SRC
8a38cc 1199
0ba1ff 1200 *** COMMENT MATLAB
49aa9f 1201 Mode for editing MATLAB m-files.
JG 1202 #+BEGIN_SRC emacs-lisp
0ba1ff 1203   (use-package matlab
JG 1204     :ensure matlab-mode
1205     :config
1206     (autoload 'matlab-mode "matlab" "Matlab Editing Mode" t)
1207     (add-to-list
1208      'auto-mode-alist
1209      '("\\.m$" . matlab-mode))
1210     (setq matlab-indent-function t)
1211     (setq matlab-shell-command "matlab")
1212     (matlab-cedet-setup))
49aa9f 1213 #+END_SRC
JG 1214
0ba1ff 1215 *** COMMENT MIPS
JG 1216 For editing MIPS assembly.
49aa9f 1217 #+BEGIN_SRC emacs-lisp
JG 1218   (use-package mips-mode
1219     :ensure t
1220     :mode "\\.mips$")
1221 #+END_SRC
1222
0ba1ff 1223 *** COMMENT IPython notebooks
60454d 1224 Allow emacs to view and use IPython notebooks
JG 1225 #+BEGIN_SRC emacs-lisp
1226   (use-package ein
1227     :ensure t)
1228 #+END_SRC
1229
22b4cd 1230 *** Rust
JG 1231 **** Major mode
1232 Get the major mode for rust files.
1233 #+BEGIN_SRC emacs-lisp
1234   (use-package rust-mode
1235     :ensure t
c8124c 1236     :hook (rust-mode . lsp)
22b4cd 1237     :config
JG 1238     ;; style guide suggests spaces not tabs
1239     (add-hook 'rust-mode-hook (lambda () (setq indent-tabs-mode nil)))
1240     (setq rust-format-on-save t))
1241
1242   (use-package toml-mode
1243     :ensure t)
1244 #+END_SRC
1245 **** Cargo integration
1246 Integrate Cargo, rust's package manager.
1247 #+BEGIN_SRC emacs-lisp
1248   (use-package cargo
1249     :ensure t
1250     :hook
1251     (rust-mode . cargo-minor-mode))
1252 #+END_SRC
1253 **** Flycheck
1254 Linting with flycheck.
1255 #+BEGIN_SRC emacs-lisp
1256   (use-package flycheck-rust
1257     :ensure t
1258     :config
1259     (add-hook 'flyckeck-mode-hook #'flycheck-rust-setup))
1260 #+END_SRC
1261
1262 **** COMMENT Completion
1263 Code completion with racer.
1264 #+BEGIN_SRC emacs-lisp
1265   (use-package racer
1266     :ensure t
1267     :hook ((rust-mode . racer-mode)
1268            (racer-mode . (eldoc-mode company-mode)))
1269     :init
1270     (setq racer-command "~/.cargo/bin/racer"))
1271 #+END_SRC
c8124c 1272 *** Bash
JG 1273 **** LSP
1274 Completion with LSP
1275 #+BEGIN_SRC emacs-lisp
1276 (add-hook 'sh-mode-hook 'lsp)
1277 #+END_SRC
990949 1278 * Org mode
C 1279 ** Up to date org
0ba1ff 1280 Pull the latest org mode from the repository, rather than the org which comes with emacs.
990949 1281 #+BEGIN_SRC emacs-lisp
C 1282     (use-package org
0ba1ff 1283       :ensure org-plus-contrib
990949 1284       :pin org)
C 1285 #+END_SRC
8a38cc 1286
990949 1287 ** Small tweaks
0ba1ff 1288 Small quality of life changes to org-mode.
990949 1289 #+BEGIN_SRC emacs-lisp
C 1290 (setq org-src-fontify-natively t)
1291 (setq org-src-tab-acts-natively t)
1292 (setq org-confirm-babel-evaluate nil)
1293 (setq org-export-with-smart-quotes t)
1294 (setq org-src-window-setup 'current-window)
1295 (add-hook 'org-mode-hook 'org-indent-mode)
1296 (diminish 'org-indent-mode)
1297 (diminish 'visual-line-mode)
1298 #+END_SRC
a428a2 1299 *** Spell checking for code and latex
JG 1300 #+BEGIN_SRC emacs-lisp
1301   (add-to-list 'ispell-skip-region-alist '("#\\+BEGIN_SRC" . "#\\+END_SRC"))
1302   (add-to-list 'ispell-skip-region-alist '("\\$" . "\\$"))
1303   (add-to-list 'ispell-skip-region-alist '("\\$\\$" . "\\$\\$"))
1304 #+END_SRC
8a38cc 1305
990949 1306 ** Line wrapping
0ba1ff 1307 Enable line wrapping for long lines.
990949 1308 #+BEGIN_SRC emacs-lisp
C 1309   (add-hook 'org-mode-hook
bf794a 1310             '(lambda ()
JG 1311                (visual-line-mode 1)))
990949 1312 #+END_SRC
8a38cc 1313
990949 1314 ** org-bullets
0ba1ff 1315 Use bullets of different colours and styles instead of the "\*\*\*" to denote indentation levels.
990949 1316 #+BEGIN_SRC emacs-lisp
bf794a 1317   (use-package org-bullets
JG 1318     :ensure t
1319     :config
990949 1320     (add-hook 'org-mode-hook (lambda () (org-bullets-mode))))
C 1321 #+END_SRC
8a38cc 1322
990949 1323 ** Org Babel
0ba1ff 1324 Allows the execution of code from within an org buffer.
JG 1325 Code output can also be input to the buffer.
990949 1326 *** Languages
0ba1ff 1327 Add a bunch of languages to org babel supported languages
990949 1328 #+BEGIN_SRC emacs-lisp
baf326 1329     (org-babel-do-load-languages 'org-babel-load-languages '((emacs-lisp . t)
C 1330                                                              (C . t)
1331                                                              (python . t)
1332                                                              (latex . t)
1333                                                              (scheme . t)
1334                                                              (gnuplot . t)
1335                                                              (matlab . t)
1336                                                              (plantuml . t)
1337                                                              (fortran . t)
1338                                                              (java . t)
1339                                                              (plantuml . t)))
1340 #+END_SRC
1341
0ba1ff 1342 **** PlantUML path
JG 1343 Org uses its own path for some reason.
baf326 1344 #+BEGIN_SRC emacs-lisp
C 1345   (setq org-plantuml-jar-path plantuml-jar-path)
990949 1346 #+END_SRC
8a38cc 1347
5a75e4 1348 *** Async export
JG 1349 Allow the editing of files while execution of blocks is occurring.
1350 Needs :async tag in src header.
1351 #+BEGIN_SRC emacs-lisp
1352   (use-package ob-async
1353     :ensure t)
1354 #+END_SRC
1355
990949 1356 ** Latex preview fragments match colour
C 1357 Make the previews match theme colour of Emacs.
0ba1ff 1358 Gets very annoying very quickly without it.
990949 1359 #+BEGIN_SRC emacs-lisp
C 1360   (let ((dvipng--plist (alist-get 'dvipng org-preview-latex-process-alist)))
1361     (plist-put dvipng--plist :use-xcolor t)
1362     (plist-put dvipng--plist :image-converter '("dvipng -D %D -T tight -o %O %f")))
1363 #+END_SRC
bf794a 1364
0ba1ff 1365 ** Org export additions
JG 1366 *** Pandoc
1367 Call pandoc on org buffer from org export.
1368 #+BEGIN_SRC emacs-lisp
1369   (use-package ox-pandoc
1370     :ensure t)
1371 #+END_SRC
1372
1373 *** COMMENT Dokuwiki Wiki
1374 Allow export to dokuwiki markup from org.
1375 #+BEGIN_SRC emacs-lisp
1376   (use-package ox-wk
1377     :ensure t)
1378 #+END_SRC
1379
1380 * COMMENT EMMS
be9cff 1381 Emacs media manager.
0ba1ff 1382 I come back to it every now and again as an MPD front-end, but haven't quite gotten the hang of it.
be9cff 1383 #+BEGIN_SRC emacs-lisp
JG 1384   (use-package emms-setup
1385     :ensure emms
1386     :init
1387     (add-to-list 'load-path "~/elisp/emms/")
1388     :config
1389     (emms-all)
1390     (emms-default-players)
1391     (setq emms-source-file-directory "~/Music/"))
1392 #+END_SRC
1393
a428a2 1394 * COMMENT Org Blog
0ba1ff 1395 I use org to write my blog and use org-static-blog to generate the HTML.
be9cff 1396 ** Org static blog config
0ba1ff 1397 Basic configuration for site.
JG 1398 Copied and modified from the example configuration.
be9cff 1399 #+BEGIN_SRC emacs-lisp
1005e3 1400   (use-package org-static-blog
JG 1401     :ensure t
1402     :config
1403     (setq org-static-blog-publish-title "Joel's Site")
1404     (setq org-static-blog-publish-url "https://blog.joelg.cf/")
1405     (setq org-static-blog-publish-directory "/backup/home/joel/Downloads/Chizi123.github.io/")
1406     (setq org-static-blog-posts-directory "/backup/home/joel/Downloads/Chizi123.github.io/posts/")
1407     (setq org-static-blog-drafts-directory "/backup/home/joel/Downloads/Chizi123.github.io/drafts/")
1408     (setq org-static-blog-enable-tags t)
1409     (setq org-export-with-toc nil)
1410     (setq org-export-with-section-numbers nil)
be9cff 1411
1005e3 1412     ;; This header is inserted into the <head> section of every page:
JG 1413     ;;   (you will need to create the style sheet at
1414     ;;    ~/projects/blog/static/style.css
1415     ;;    and the favicon at
1416     ;;    ~/projects/blog/static/favicon.ico)
1417     (setq org-static-blog-page-header
1418           "<meta name=\"author\" content=\"Joel Grunbaum\">
0ba1ff 1419       <meta name=\"referrer\" content=\"no-referrer\">
JG 1420       <link href= \"static/style.css\" rel=\"stylesheet\" type=\"text/css\" />
1421       <link rel=\"icon\" href=\"static/favicon.png\">
1422       <script async src=\"https://www.googletagmanager.com/gtag/js?id=UA-147303155-2\"></script>
1423       <script>
1424         window.dataLayer = window.dataLayer || [];
1425         function gtag(){dataLayer.push(arguments);}
1426         gtag('js', new Date());
1427         gtag('config', 'UA-147303155-2');
1428       </script>
1429       ")
be9cff 1430
1005e3 1431     ;; This preamble is inserted at the beginning of the <body> of every page:
JG 1432     ;;   This particular HTML creates a <div> with a simple linked headline
1433     (setq org-static-blog-page-preamble
1434           "<div class=\"header\">
0ba1ff 1435         <a href=\"https://blog.joelg.cf\">Joel's Site - Personal site and constant work in progress</a>
JG 1436         <div class=\"sitelinks\">
1437           <a href=\"https://blog.joelg.cf/about-me.html\">About Me</a> |
1438           <a href=\"https://github.com/Chizi123\">Github</a> |
1439           <a href=\"https://facebook.com/joel.grun.5\">Facebook</a>
1440         </div>
1441       </div>")
1442
1005e3 1443     ;; This postamble is inserted at the end of the <body> of every page:
JG 1444     ;;   This particular HTML creates a <div> with a link to the archive page
1445     ;;   and a licensing stub.
1446     (setq org-static-blog-page-postamble
1447           "<div id=\"archive\">
0ba1ff 1448         <a href=\"https://blog.joelg.cf/archive.html\">Other posts</a>
be9cff 1449       </div>
0ba1ff 1450       <br>
1005e3 1451       <center><button id=\"disqus_button\" onclick=\"load_disqus()\">Load Disqus Comments</button></center>
JG 1452     <div id=\"disqus_thread\"></div>
1453     <script type=\"text/javascript\">
1454       function load_disqus() {
1455           var dsq = document.createElement('script');
1456           dsq.type = 'text/javascript';
1457           dsq.async = true;
1458           dsq.src = 'https://joelg-cf.disqus.com/embed.js';
1459           (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
1460           document.getElementById('disqus_button').style.visibility = 'hidden';
1461       };
1462     </script>"))
be9cff 1463 #+END_SRC
JG 1464
0ba1ff 1465 ** Sitemap addition
JG 1466 Creates a sitemap.xml for the blog based on the generated HTML files output in the final directory.
1467 #+BEGIN_SRC emacs-lisp
1468   (defun blog-publish()
1469     (interactive)
1470     (org-static-blog-publish)
1471     (setq n 0)
1472     (setq site "https://blog.joelg.cf/")
1473     (setq posts (directory-files org-static-blog-publish-directory))
1474     (generate-new-buffer "sitemap.xml.gen")
1475     (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"))
1476     (while (< n (length (directory-files org-static-blog-publish-directory)))
1477       (setq curr (nth n posts))
1478       (if (string-match "\\(html\\)" curr)
1479           (if (string-match "index.html" curr)
1480               (with-current-buffer "sitemap.xml.gen" (insert (concat "\t<url>\n\t\t<loc>" site "</loc>\n\t</url>\n")))
1481             (with-current-buffer "sitemap.xml.gen" (insert (concat "\t<url>\n\t\t<loc>" site curr "</loc>\n\t</url>\n")))))
1482       (setq n (1+ n)))
1483     (with-current-buffer "sitemap.xml.gen" (insert "</urlset>"))
1484     (with-current-buffer "sitemap.xml.gen" (write-region (point-min) (point-max) (concat org-static-blog-publish-directory "sitemap.xml")) t)
1485     (kill-buffer "sitemap.xml.gen"))
1486 #+END_SRC
1487
be9cff 1488 ** Emacs-htmlize
0ba1ff 1489 Allow org features to be exported to HTML for site.
be9cff 1490 #+BEGIN_SRC emacs-lisp
JG 1491   (use-package htmlize
1492     :ensure t)
1493 #+END_SRC
0ba1ff 1494
a428a2 1495 * Journaling
JG 1496 ** Noteworthy entries
1497 I write weekly journal entries recapping my week.
1498 These files are in org mode.
1499 This is inspired by org-static-blog.
1500 #+BEGIN_SRC emacs-lisp
1501   (defun journal-create-new-post ()
1502       "Create a new entry, prompt for title and insert header"
1503     (interactive)
1504     (let ((title (read-string "Title: ")))
1505       (find-file (concat "~/Documents/Journal/entry/"
1506                          (read-string "Filename: "
1507                                       (concat (format-time-string "%Y-%m-%d-" (current-time))
1508                                               (replace-regexp-in-string "\s" "-" (downcase title))
1509                                               ".org"))))
1510       (insert "#+title: " title "\n"
1511               "#+date: " (format-time-string "<%Y-%m-%d %H:%M>") "\n"
1512               "#+filetags: ")))
1513 #+END_SRC
1514 *** Publish entries
1515 Use org-publish to collate entries into a single unit.
1516 #+BEGIN_SRC emacs-lisp
1517   (setq org-publish-project-alist
1518                '(("Journal"
1519                  :base-directory "~/Documents/Journal/entry/"
1520                  :publishing-directory "~/Documents/Journal/out/"
1521                  :publishing-function org-html-publish-to-html
0a6cd2 1522                  ;;:htmlized-source t
a428a2 1523                  :section-numbers nil
JG 1524                  :html-preamble t
0a6cd2 1525                  :html-validation-link nil
JG 1526
a428a2 1527                  :auto-sitemap t
0a6cd2 1528                  :sitemap-sort-files anti-chronologically
JG 1529                  :sitemap-file-entry-format "%d - %t"
1530                  :sitemap-title "Home"
1531                  :sitemap-filename "index.html"
1532                  :sitemap-function org-publish-sitemap)))
5a75e4 1533 #+END_SRC