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

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