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

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