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

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