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

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