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

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