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

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