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

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