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

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