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

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