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

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