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

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