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

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