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

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