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

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