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

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