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

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