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

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