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

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