summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--LaunchAgents/gnu.emacs.daemon.plist26
-rw-r--r--LaunchAgents/net.syncthing.syncthing.plist30
-rwxr-xr-xhooks/post-up/emacs6
-rwxr-xr-xhooks/post-up/zsh22
-rw-r--r--host-ap-spotcap.local/config/zsh/zshenv.local2
-rw-r--r--host-prefect/config/zsh/zshenv.local1
-rw-r--r--npmrc1
-rw-r--r--tag-emacs/emacs.d/init.org290
-rw-r--r--tag-karabiner/karabiner.d/configuration/karabiner.json102
-rwxr-xr-x[-rw-r--r--]tag-ssh/ssh/rc2
-rw-r--r--tag-zsh/config/zsh/zshenv26
-rw-r--r--tag-zsh/config/zsh/zshrc154
12 files changed, 329 insertions, 333 deletions
diff --git a/LaunchAgents/gnu.emacs.daemon.plist b/LaunchAgents/gnu.emacs.daemon.plist
index ecce7db7..873e28ff 100644
--- a/LaunchAgents/gnu.emacs.daemon.plist
+++ b/LaunchAgents/gnu.emacs.daemon.plist
@@ -2,18 +2,18 @@
 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
 <plist version="1.0">
 <dict>
-	<key>ServiceDescription</key>
-	<string>Gnu Emacs Daemon</string>
-	<key>ProgramArguments</key>
-	<array>
-		<string>/Applications/Emacs.app/Contents/MacOS/Emacs</string>
-		<string>--daemon</string>
-	</array>
-	<key>RunAtLoad</key>
-	<true/>
-	<key>WorkingDirectory</key>
-	<string>/Users/alan</string>
-	<key>Label</key>
-	<string>gnu.emacs.daemon</string>
+  <key>ServiceDescription</key>
+  <string>Gnu Emacs Daemon</string>
+  <key>ProgramArguments</key>
+  <array>
+    <string>/Applications/Emacs.app/Contents/MacOS/Emacs</string>
+    <string>--daemon</string>
+  </array>
+  <key>RunAtLoad</key>
+  <true/>
+  <key>WorkingDirectory</key>
+  <string>/Users/alan</string>
+  <key>Label</key>
+  <string>gnu.emacs.daemon</string>
 </dict>
 </plist>
diff --git a/LaunchAgents/net.syncthing.syncthing.plist b/LaunchAgents/net.syncthing.syncthing.plist
deleted file mode 100644
index 1fcd1281..00000000
--- a/LaunchAgents/net.syncthing.syncthing.plist
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-	<dict>
-		<key>Label</key>
-		<string>net.syncthing.syncthing</string>
-
-		<key>ProgramArguments</key>
-		<array>
-			<string>/Users/apearce/bin/syncthing</string>
-		</array>
-
-		<key>EnvironmentVariables</key>
-		<dict>
-			<key>HOME</key>
-			<string>/Users/apearce</string>
-			<key>STNORESTART</key>
-			<string>1</string>
-		</dict>
-
-		<key>KeepAlive</key>
-		<true/>
-
-		<key>LowPriorityIO</key>
-		<true/>
-
-		<key>ProcessType</key>
-		<string>Background</string>
-	</dict>
-</plist>
diff --git a/hooks/post-up/emacs b/hooks/post-up/emacs
index aad74be7..cb9c0916 100755
--- a/hooks/post-up/emacs
+++ b/hooks/post-up/emacs
@@ -2,8 +2,8 @@
 
 if [[ -s $commands[emacs] ]]
 then
-	pushd ~/.emacs.d
-	emacs --batch --eval "(progn
+  pushd ~/.emacs.d
+  emacs --batch --eval "(progn
 (setq vc-follow-symlinks nil)
 (find-file \"init.org\")
 (require 'ob-tangle)
@@ -11,5 +11,5 @@ then
 (byte-compile-file \"init.el\")
 (load-file \"init.el\")
 )"
-	popd
+  popd
 fi
diff --git a/hooks/post-up/zsh b/hooks/post-up/zsh
index b7a7d4a2..3eef6e51 100755
--- a/hooks/post-up/zsh
+++ b/hooks/post-up/zsh
@@ -4,26 +4,26 @@ ZDOTDIR="${XDG_CONFIG_HOME:=~/.config}/zsh"
 pushd $ZDOTDIR
 for f in z*(-.)
 do
-	if [[ -e .$f ]]
-	then
-		if [[ ! -h .$f ]]
-		then
-			echo ".$f already exists as a regular file, ignoring"
-		fi
-	else
-		ln -s $f .$f
-	fi
+  if [[ -e .$f ]]
+  then
+    if [[ ! -h .$f ]]
+    then
+      echo ".$f already exists as a regular file, ignoring"
+    fi
+  else
+    ln -s $f .$f
+  fi
 done
 popd
 
 if [[ ! -d ~/.cache/zsh ]]
 then
-	mkdir -p ~/.cache/zsh
+  mkdir -p ~/.cache/zsh
 fi
 
 if [[ -z $commands[zplug] && ! -d ~/projects/zplug/ ]]
 then
-	git clone git://github.com/zplug/zplug ~/projects/zplug/
+  git clone git://github.com/zplug/zplug ~/projects/zplug/
 fi
 
 zsh -ic "zplug install"
diff --git a/host-ap-spotcap.local/config/zsh/zshenv.local b/host-ap-spotcap.local/config/zsh/zshenv.local
index f6881be2..55a6031d 100644
--- a/host-ap-spotcap.local/config/zsh/zshenv.local
+++ b/host-ap-spotcap.local/config/zsh/zshenv.local
@@ -1,5 +1,5 @@
 # -*- mode: sh; -*-
 if [[ -e $HOME/.nix-profile/etc/profile.d/nix.sh ]]
 then
-	. $HOME/.nix-profile/etc/profile.d/nix.sh;
+  . $HOME/.nix-profile/etc/profile.d/nix.sh;
 fi
diff --git a/host-prefect/config/zsh/zshenv.local b/host-prefect/config/zsh/zshenv.local
deleted file mode 100644
index 8ed2dc3d..00000000
--- a/host-prefect/config/zsh/zshenv.local
+++ /dev/null
@@ -1 +0,0 @@
-PURE_PROMPT_SYMBOL='>'
diff --git a/npmrc b/npmrc
new file mode 100644
index 00000000..6804f657
--- /dev/null
+++ b/npmrc
@@ -0,0 +1 @@
+prefix = ${HOME}/.local/
\ No newline at end of file
diff --git a/tag-emacs/emacs.d/init.org b/tag-emacs/emacs.d/init.org
index a0d3ba92..609f85cc 100644
--- a/tag-emacs/emacs.d/init.org
+++ b/tag-emacs/emacs.d/init.org
@@ -322,8 +322,6 @@ configuration with crux.el
 	:init (progn
 			(defalias 'delete-current-buffer-file #'crux-delete-file-and-buffer)
 			(defalias 'rename-current-buffer-file #'crux-rename-file-and-buffer)))
-
-
 #+END_SRC
 
 * Projects
@@ -623,11 +621,12 @@ I like a horizonal diff setup, with everything in one frame.
 * Indentation
 
 Ah, a complicated topic.  One day we’ll all be using elastic
-tabstops.  Until then, I want 4-wide tabs, and make them real tabs!
+tabstops.  I’ve recently switched to using two spaces, since elastic
+tabstops is probably never going to happen.
 
 #+BEGIN_SRC emacs-lisp
-  (setq-default tab-width 4
-				indent-tabs-mode t)
+  (setq-default tab-width 2
+				indent-tabs-mode nil)
 #+END_SRC
 
 ** auto-indent-mode
@@ -641,7 +640,7 @@ whitespace-sensitive language, of course.
 			  (setq auto-indent-key-for-end-of-line-then-newline "<C-return>"
 					auto-indent-key-for-end-of-line-insert-char-then-newline "<C-S-return>"
 					auto-indent-blank-lines-on-move nil
-					auto-indent-assign-indent-level 4
+					auto-indent-assign-indent-level 2
 					auto-indent-backward-delete-char-behavior nil
 					auto-indent-delete-trailing-whitespace-on-save-file t
 					auto-indent-mode-untabify-on-yank-or-paste nil
@@ -667,7 +666,7 @@ with spaces.  Perfect!
   (use-package smart-tabs-mode
 	:defer 1
 	:config (progn
-			  (smart-tabs-insinuate 'c 'cperl 'javascript 'python)
+			  (smart-tabs-insinuate 'c 'cperl 'python)
 			  (add-hook 'php-mode-hook (lambda ()
 										 (smart-tabs-mode indent-tabs-mode)))
 			  (with-eval-after-load "align.el"
@@ -820,7 +819,7 @@ point whilst I’m moving about.
 		scroll-preserve-screen-position t
 		mouse-wheel-scroll-amount '(1 ((shift) . 1) ((control)))
 		split-height-threshold 80
-		split-width-threshold 130
+		split-width-threshold 160
 		frame-resize-pixelwise nil)
   (if (boundp 'ns-pop-up-frames)
 	  (setq ns-pop-up-frames nil))
@@ -1077,8 +1076,8 @@ helps to make documentation for other languages easier to access
 A nicer way to browse keybindings for major modes.
 
 #+BEGIN_SRC emacs-lisp
-(use-package discover-my-major
-  :bind ("<f1>" . discover-my-major))
+  (use-package discover-my-major
+	:bind ("<f1>" . discover-my-major))
 #+END_SRC
 
 ** which-key
@@ -1175,9 +1174,9 @@ the prompt.  I don’t remember what exactly.
 
 Occasionally, I exit emacs.  I should probably reduce the frequency of this.
 #+BEGIN_SRC emacs-lisp
-(if (daemonp)
-	(defalias 'exit-emacs #'delete-frame)
-  (defalias 'exit-emacs #'save-buffers-kill-emacs))
+  (if (daemonp)
+	  (defalias 'exit-emacs #'delete-frame)
+	(defalias 'exit-emacs #'save-buffers-kill-emacs))
 #+END_SRC
 
 ** swiper/ivy
@@ -1283,15 +1282,15 @@ don’t use it directly.
 
 Setup some modes for systemd files
 #+BEGIN_SRC emacs-lisp
-(add-to-list 'auto-mode-alist '("\\.service\\'" . conf-mode))
-(add-to-list 'auto-mode-alist '("\\.target\\'" . conf-mode))
-(add-to-list 'auto-mode-alist '("\\.socket\\'" . conf-mode))
+  (add-to-list 'auto-mode-alist '("\\.service\\'" . conf-mode))
+  (add-to-list 'auto-mode-alist '("\\.target\\'" . conf-mode))
+  (add-to-list 'auto-mode-alist '("\\.socket\\'" . conf-mode))
 #+END_SRC
 
 =direnv=’s files are basically shell scripts, it’s a nice way to
 set environment variables for projects.
 #+BEGIN_SRC emacs-lisp
-(add-to-list 'auto-mode-alist '("\\.envrc\\'" . sh-mode))
+  (add-to-list 'auto-mode-alist '("\\.envrc\\'" . sh-mode))
 #+END_SRC
 
 Some modes that I don’t really customise much, mostly for
@@ -1309,10 +1308,7 @@ configuration files.
 	:mode (("Dockerfile\\'" . dockerfile-mode)))
 
   (use-package nix-mode
-	:mode (("\\.nix\\'" . nix-mode))
-	:config (progn
-			  (add-hook 'nix-mode-hook (lambda ()
-										 (setq-local indent-tabs-mode nil)))))
+	:mode (("\\.nix\\'" . nix-mode)))
 
   (define-derived-mode xmonad-mode haskell-mode "XM")
   (add-to-list 'auto-mode-alist '("xmobarrc\\'" . xmonad-mode))
@@ -1321,9 +1317,7 @@ configuration files.
   (use-package nginx-mode
 	:defer t
 	:mode (("/nginx/servers/" . nginx-mode)
-		   ("/nginx/.*\\.d/" . nginx-mode))
-	:config (progn
-			  (setq nginx-indent-tabs-mode t)))
+		   ("/nginx/.*\\.d/" . nginx-mode)))
 
   (use-package lua-mode
 	:defer t)
@@ -1370,9 +1364,6 @@ works really nicely.
 			  (find-file (expand-file-name "ledger/my.ledger" (projectile-project-root)))
 			  (ledger-report "Budget (Cumulative)" nil)))
 	:config (progn
-			  (defun setup-ledger-mode ()
-				(setq-local indent-tabs-mode nil))
-			  (add-hook 'ledger-mode-hook #'setup-ledger-mode)
 			  (setq ledger-use-iso-dates t
 					ledger-post-use-completion-engine :built-in
 					ledger-reconcile-default-commodity "€"
@@ -1399,18 +1390,16 @@ works really nicely.
 ** Markdown
 
 #+BEGIN_SRC emacs-lisp
-(use-package markdown-mode
-  :defer t
-  :config (progn
-			(add-hook 'markdown-mode-hook #'turn-on-auto-fill)))
+  (use-package markdown-mode
+	:defer t
+	:config (progn
+			  (add-hook 'markdown-mode-hook #'turn-on-auto-fill)))
 #+END_SRC
 
 ** Org
 
 Org is wünderbar.
 
-*** TODO Check whether all this configuration is necessary or helpful.
-
 #+BEGIN_SRC emacs-lisp
   (use-package org
 	:bind (("C-c C-a" . org-agenda-list)
@@ -1428,15 +1417,11 @@ Org is wünderbar.
 					;; ‘Remember’: new items at top
 					org-reverse-note-order t
 
-					org-modules '(org-habit
-								  org-protocol)
+					org-modules '(org-protocol)
 
 					;; Add time done to ‘done’ tasks
 					org-log-done 'time
 
-					;; Allow refiling into any org file
-					org-refile-targets '((org-agenda-files :maxlevel . 3))
-
 					org-list-allow-alphabetical t
 
 					org-adapt-indentation nil
@@ -1458,15 +1443,7 @@ Org is wünderbar.
 					org-log-into-drawer "LOGBOOK")
 			  (set-register ?o `(file . ,(expand-file-name "organiser.org" org-directory)))
 			  (add-hook 'org-mode-hook #'turn-on-auto-fill)
-			  (org-load-modules-maybe t)
-			  (defadvice org-clock-in (after wicked activate)
-				"Mark STARTED when clocked in"
-				(save-excursion
-				  (catch 'exit
-					(org-back-to-heading t)
-					(if (looking-at org-outline-regexp) (goto-char (1- (match-end 0))))
-					(if (looking-at (concat " +" org-todo-regexp "\\( +\\|[ \t]*$\\)"))
-						(org-todo "STARTED")))))
+			  (org-load-modules-maybe t)))
 #+END_SRC
 
 **** org-babel
@@ -1477,13 +1454,13 @@ to have my =ledger= setup in an org file with some graph processing
 with R or something.
 
 #+BEGIN_SRC emacs-lisp
-(use-package ob-core
-  :defer t
-  :ensure nil
-  :config (org-babel-do-load-languages
-		   'org-babel-load-languages
-		   '((ledger . t)
-			 (sh . t))))
+  (use-package ob-core
+	:defer t
+	:ensure nil
+	:config (org-babel-do-load-languages
+			 'org-babel-load-languages
+			 '((ledger . t)
+			   (sh . t))))
 #+END_SRC
 
 **** org-journal
@@ -1542,7 +1519,7 @@ I can use this to keep a journal.  I should use it.
 								  (file-name-as-directory org-mobile-directory)
 								  org-mobile-capture-file))))
 				  (setq org-mobile-watcher
-						(file-notify-add-watch org-file '(change) #'ap/org-mobile-pull))))))))
+						(file-notify-add-watch org-file '(change) #'ap/org-mobile-pull))))))
 #+END_SRC
 
 **** org-caldav
@@ -1565,6 +1542,20 @@ write to the Android calendar, and then for DAVDroid to sync with the server.
 					org-icalendar-alarm-time 60)))
 #+END_SRC
 
+**** org-page
+
+I would like to convert my website from using hugo to something else
+that I can work with nicely from inside Emacs.  I wonder if org-page
+will do the trick.
+
+#+BEGIN_SRC emacs-lisp
+  (use-package org-page
+	:config (progn
+			  (setq op/site-domain "https://alanpearce.uk/"
+					op/repository-directory "~/projects/alanpearce/"
+					op/personal-github-link "https://github.com/alanpearce")))
+#+END_SRC
+
 * Music
 Emacs actually supports playing music via mpd.
 
@@ -1638,8 +1629,7 @@ A nice completion backend for programming modes.
 *** All
 
 Lisp modes don’t seem to have a common ancestor.  So I made a custom
-hook which I trigger in every lispy-mode.  Of course, no tabs in
-lisps.  Even I understand that.
+hook which I trigger in every lispy-mode.
 
 #+BEGIN_SRC emacs-lisp
   (defcustom lisp-mode-common-hook nil
@@ -1648,8 +1638,7 @@ lisps.  Even I understand that.
 	:group 'lisp)
 
   (defun ap/lisp-setup ()
-	(run-hooks 'lisp-mode-common-hook)
-	(setq indent-tabs-mode nil))
+	(run-hooks 'lisp-mode-common-hook))
 #+END_SRC
 
 **** Redshank
@@ -1671,8 +1660,8 @@ Customise the modeline-display of =emacs-lisp-mode=.  Then make sure
 it runs the common lisp hooks.
 
 #+BEGIN_SRC emacs-lisp
-(add-hook 'emacs-lisp-mode-hook #'ap/lisp-setup)
-(add-hook 'emacs-lisp-mode-hook #'eldoc-mode)
+  (add-hook 'emacs-lisp-mode-hook #'ap/lisp-setup)
+  (add-hook 'emacs-lisp-mode-hook #'eldoc-mode)
 #+END_SRC
 
 Go-to function for elisp.  Except it works through the entire Emacs ecosystem.
@@ -1688,12 +1677,12 @@ Go-to function for elisp.  Except it works through the entire Emacs ecosystem.
 Interactive elisp
 
 #+BEGIN_SRC emacs-lisp
-(use-package ielm
-  :defer t
-  :ensure nil
-  :config (progn
-			(add-hook 'ielm-mode-hook (lambda ()
-										(run-hooks 'lisp-mode-common-hook)))))
+  (use-package ielm
+	:defer t
+	:ensure nil
+	:config (progn
+			  (add-hook 'ielm-mode-hook (lambda ()
+										  (run-hooks 'lisp-mode-common-hook)))))
 #+END_SRC
 
 *** Scheme & Lisp
@@ -1715,11 +1704,11 @@ A REPL thing for Scheme.  Hopefully I’ll get to use it more in the
 future.
 
 #+BEGIN_SRC emacs-lisp
-(use-package geiser
-  :commands (geiser-mode
-			 geiser
-			 run-geiser
-			 run-racket))
+  (use-package geiser
+	:commands (geiser-mode
+			   geiser
+			   run-geiser
+			   run-racket))
 #+END_SRC
 
 **** slime
@@ -1727,14 +1716,14 @@ future.
 A REPL thing (and more) for Lisp.
 
 #+BEGIN_SRC emacs-lisp
-(use-package slime
-  :commands (slime)
-  :config (progn
-			(let ((ql-slime-helper (expand-file-name "~/quicklisp/slime-helper.el")))
-			  (if (file-exists-p ql-slime-helper)
-				  (load ql-slime-helper))
-			  (slime-setup))
-			(setq inferior-lisp-program (executable-find "sbcl"))))
+  (use-package slime
+	:commands (slime)
+	:config (progn
+			  (let ((ql-slime-helper (expand-file-name "~/quicklisp/slime-helper.el")))
+				(if (file-exists-p ql-slime-helper)
+					(load ql-slime-helper))
+				(slime-setup))
+			  (setq inferior-lisp-program (executable-find "sbcl"))))
 #+END_SRC
 
 *** Clojure
@@ -1762,21 +1751,21 @@ A REPL thing (and more) for Lisp.
 A REPL thing for Clojure
 
 #+BEGIN_SRC emacs-lisp
-(use-package cider
-  :defer t
-  :config (progn
-			(setq nrepl-hide-special-buffers t)
-			(unbind-key "C-c C-f" cider-mode-map)
-			(add-hook 'cider-mode-hook #'eldoc-mode)))
+  (use-package cider
+	:defer t
+	:config (progn
+			  (setq nrepl-hide-special-buffers t)
+			  (unbind-key "C-c C-f" cider-mode-map)
+			  (add-hook 'cider-mode-hook #'eldoc-mode)))
 #+END_SRC
 
 ** Auto-compile
 
 Auto-compile emacs lisp when saving.
 #+BEGIN_SRC emacs-lisp
-(use-package auto-compile
-  :defer t
-  :init (add-hook 'emacs-lisp-mode-hook #'auto-compile-on-save-mode))
+  (use-package auto-compile
+	:defer t
+	:init (add-hook 'emacs-lisp-mode-hook #'auto-compile-on-save-mode))
 #+END_SRC
 
 ** cc-mode
@@ -1785,16 +1774,16 @@ Although I don’t use C or C++, setting up the mode is helpful because
 quite a few other modes are derived from it.
 
 #+BEGIN_SRC emacs-lisp
-(use-package cc-mode
-  :defer 5
-  :init (progn
-		  (add-hook 'c-mode-common-hook #'electric-indent-mode))
-  :config (progn
+  (use-package cc-mode
+	:defer 5
+	:init (progn
+			(add-hook 'c-mode-common-hook #'electric-indent-mode))
+	:config (progn
 			  (setq c-default-style '((java-mode . "java")
-									(awk-mode . "awk")
-									(other . "k&r"))
-				  c-basic-offset 4)
-			(c-set-offset 'case-label '+)))
+									  (awk-mode . "awk")
+									  (other . "k&r"))
+					c-basic-offset 4)
+			  (c-set-offset 'case-label '+)))
 #+END_SRC
 
 ** quickrun
@@ -1802,8 +1791,8 @@ quite a few other modes are derived from it.
 It’s nice to be able to quickly evaluate some code.  Although I don’t
 really seem to use it.
 #+BEGIN_SRC emacs-lisp
-(use-package quickrun
-  :bind (("C-c C-e" . quickrun)))
+  (use-package quickrun
+	:bind (("C-c C-e" . quickrun)))
 #+END_SRC
 
 ** Scala
@@ -1845,7 +1834,6 @@ it though
 						 (fboundp #'do-it))
 				  (do-it name)))
 			  (advice-add 'imenu-add-to-menubar :around #'js2--imenu-around)
-			  (setq js2-skip-preprocessor-directives t)
 			  (defun ap/javascript-setup ()
 				(auto-indent-mode -1))
 			  (defun ap/js2-prev-error ()
@@ -1854,7 +1842,7 @@ it though
 			  (bind-key "M-g M-n" #'js2-next-error js2-mode-map)
 			  (bind-key "M-g M-p" #'ap/js2-prev-error js2-mode-map)
 			  (add-hook 'js2-mode-hook #'ap/javascript-setup)
-			  (setq js2-basic-offset 4
+			  (setq js2-basic-offset 2
 					js2-include-node-externs t)))
 #+END_SRC
 
@@ -1919,9 +1907,9 @@ integration between the two yet.
 
 This is for HTML, since old versions of HTML were derived from SGML.
 #+BEGIN_SRC emacs-lisp
-(use-package sgml-mode
-  :defer t
-  :config (setq sgml-basic-offset 4))
+  (use-package sgml-mode
+	:defer t
+	:config (setq sgml-basic-offset 2))
 #+END_SRC
 
 *** emmet-mode
@@ -1949,9 +1937,9 @@ of them as well.
 		   ("/templates/.*\\.php\\'" . web-mode)
 		   ("\\.ejs\\'" . web-mode))
 	:config (progn
-			  (setq web-mode-code-indent-offset 4
-					web-mode-css-indent-offset 4
-					web-mode-markup-indent-offset 4
+			  (setq web-mode-code-indent-offset 2
+					web-mode-css-indent-offset 2
+					web-mode-markup-indent-offset 2
 					web-mode-style-padding 0
 					web-mode-script-padding 0
 					web-mode-comment-style 2
@@ -1963,8 +1951,8 @@ of them as well.
 I derived a mode for twig, in order to use its =mode-hook=.
 
 #+BEGIN_SRC emacs-lisp
-(define-derived-mode twig-mode web-mode "Twig")
-(add-to-list 'auto-mode-alist '("\\.html\\.twig\\'" . twig-mode))
+  (define-derived-mode twig-mode web-mode "Twig")
+  (add-to-list 'auto-mode-alist '("\\.html\\.twig\\'" . twig-mode))
 #+END_SRC
 
 * Spelling
@@ -1982,12 +1970,16 @@ I derived a mode for twig, in order to use its =mode-hook=.
 Make a shell-script buffer executable after saving it, if it has a shebang.
 
 #+BEGIN_SRC emacs-lisp
-(add-hook 'after-save-hook
-		  #'executable-make-buffer-file-executable-if-script-p)
+  (add-hook 'after-save-hook
+		#'executable-make-buffer-file-executable-if-script-p)
 
-(use-package sh-script
-  :mode (("\\.zsh\\'" . shell-script-mode))
-  :config (setq sh-shell-file "/usr/bin/env zsh"))
+  (use-package sh-script
+	:mode (("\\.zsh\\'" . shell-script-mode)
+		   ("zshenv\\'" . shell-script-mode)
+		   ("zshrc\\'"  . shell-script-mode))
+	:config (setq sh-shell-file "/usr/bin/env zsh"
+				  sh-indentation 2
+				  sh-basic-offset 2))
 #+END_SRC
 
 #+BEGIN_SRC emacs-lisp
@@ -2081,11 +2073,11 @@ The most important one for me is JSON property alignment.
 I like to use the clipboard more than the primary selection in X11.
 
 #+BEGIN_SRC emacs-lisp
-(setq x-select-enable-clipboard t)
-(if (functionp 'x-cut-buffer-or-selection-value)
-	(setq interprogram-paste-function 'x-cut-buffer-or-selection-value))
-(when (boundp 'x-select-request-type)
-  (setq x-select-request-type '(UTF8_STRING COMPOUND_TEXT TEXT STRING)))
+  (setq x-select-enable-clipboard t)
+  (if (functionp 'x-cut-buffer-or-selection-value)
+	  (setq interprogram-paste-function 'x-cut-buffer-or-selection-value))
+  (when (boundp 'x-select-request-type)
+	(setq x-select-request-type '(UTF8_STRING COMPOUND_TEXT TEXT STRING)))
 #+END_SRC
 
 ** Selection
@@ -2168,14 +2160,14 @@ cursors was one of my favourite features, so I was really happy when I
 saw that multiple-cursors was released for Emacs.
 
 #+BEGIN_SRC emacs-lisp
-(use-package multiple-cursors
-  :defer 1
-  :config (progn
-			(bind-key "C-." #'mc/mark-next-like-this)
-			(bind-key "C-," #'mc/mark-previous-like-this)
-			(bind-key "M-<f3>" #'mc/mark-all-like-this-dwim)
-			(bind-key "C-<f3>" #'mc/mark-more-like-this-extended)
-			(bind-key "C-S-L" #'mc/edit-lines)))
+  (use-package multiple-cursors
+	:defer 1
+	:config (progn
+			  (bind-key "C-." #'mc/mark-next-like-this)
+			  (bind-key "C-," #'mc/mark-previous-like-this)
+			  (bind-key "M-<f3>" #'mc/mark-all-like-this-dwim)
+			  (bind-key "C-<f3>" #'mc/mark-more-like-this-extended)
+			  (bind-key "C-S-L" #'mc/edit-lines)))
 #+END_SRC
 
 ** paredit
@@ -2244,8 +2236,8 @@ Move between instances of a symbol
 Transposing lines, made easier.
 
 #+BEGIN_SRC emacs-lisp
-(use-package move-text
-  :config (move-text-default-bindings))
+  (use-package move-text
+	:config (move-text-default-bindings))
 #+END_SRC
 
 ** undo-tree
@@ -2254,21 +2246,21 @@ Emacs’ default handling of undo is a bit confusing.  Undo-tree makes
 it much clearer.  It’s especially helpful for protoyping and refactoring.
 
 #+BEGIN_SRC emacs-lisp
-(use-package undo-tree
-  :config (progn
-			(global-undo-tree-mode)
-			;; Keep region when undoing in region
-			(defadvice undo-tree-undo (around keep-region activate)
-			  (if (use-region-p)
-				  (let ((m (set-marker (make-marker) (mark)))
-						(p (set-marker (make-marker) (point))))
-					ad-do-it
-					(goto-char p)
-					(set-mark m)
-					(set-marker p nil)
-					(set-marker m nil))
-				ad-do-it)))
-  :diminish undo-tree-mode)
+  (use-package undo-tree
+	:config (progn
+			  (global-undo-tree-mode)
+			  ;; Keep region when undoing in region
+			  (defadvice undo-tree-undo (around keep-region activate)
+				(if (use-region-p)
+					(let ((m (set-marker (make-marker) (mark)))
+						  (p (set-marker (make-marker) (point))))
+					  ad-do-it
+					  (goto-char p)
+					  (set-mark m)
+					  (set-marker p nil)
+					  (set-marker m nil))
+				  ad-do-it)))
+	:diminish undo-tree-mode)
 #+END_SRC
 
 ** visual-regexp
@@ -2278,10 +2270,10 @@ so this package is pretty useful because it highlights everything in
 the buffer for me.
 
 #+BEGIN_SRC emacs-lisp
-(use-package visual-regexp
-  :bind (("C-c r" . vr/replace)
-		 ("C-c q" . vr/query-replace)
-		 ("C-c m" . vc/mc-mark)))
+  (use-package visual-regexp
+	:bind (("C-c r" . vr/replace)
+		   ("C-c q" . vr/query-replace)
+		   ("C-c m" . vc/mc-mark)))
 #+END_SRC
 * Tangling
 
diff --git a/tag-karabiner/karabiner.d/configuration/karabiner.json b/tag-karabiner/karabiner.d/configuration/karabiner.json
index 4f78bb69..0e866a63 100644
--- a/tag-karabiner/karabiner.d/configuration/karabiner.json
+++ b/tag-karabiner/karabiner.d/configuration/karabiner.json
@@ -1,41 +1,63 @@
 {
-  "profiles" : [
-    {
-      "fn_function_keys" : {
-        "f12" : "volume_up",
-        "f9" : "vk_consumer_next",
-        "f5" : "vk_consumer_illumination_down",
-        "f10" : "mute",
-        "f1" : "vk_consumer_brightness_down",
-        "f6" : "vk_consumer_illumination_up",
-        "f2" : "vk_consumer_brightness_up",
-        "f7" : "vk_consumer_previous",
-        "f11" : "volume_down",
-        "f3" : "vk_mission_control",
-        "f8" : "vk_consumer_play",
-        "f4" : "vk_launchpad"
-      },
-      "name" : "Default Profile",
-      "selected" : true,
-      "simple_modifications" : {
-        "left_control" : "left_command",
-        "right_control" : "right_command",
-        "left_option" : "left_control",
-        "caps_lock" : "delete_or_backspace",
-        "right_command" : "right_option",
-        "left_command" : "left_option",
-        "right_option" : "right_control"
-      }
-    },
-    {
-      "name" : "Macbook keyboard",
-      "simple_modifications" : {
-        "left_command" : "left_control",
-        "caps_lock" : "delete_or_backspace",
-        "grave_accent_and_tilde" : "non_us_backslash",
-        "non_us_backslash" : "grave_accent_and_tilde",
-        "right_command" : "right_control"
-      }
-    }
-  ]
-}
\ No newline at end of file
+    "profiles": [
+        {
+            "devices": [
+                {
+                    "identifiers": {
+                        "is_keyboard": true,
+                        "is_pointing_device": false,
+                        "product_id": 602,
+                        "vendor_id": 1452
+                    },
+                    "ignore": true,
+                    "keyboard_type": 41
+                },
+                {
+                    "identifiers": {
+                        "is_keyboard": true,
+                        "is_pointing_device": false,
+                        "product_id": 8209,
+                        "vendor_id": 1241
+                    },
+                    "ignore": false,
+                    "keyboard_type": 40
+                }
+            ],
+            "fn_function_keys": {
+                "f1": "vk_consumer_brightness_down",
+                "f10": "mute",
+                "f11": "volume_down",
+                "f12": "volume_up",
+                "f2": "vk_consumer_brightness_up",
+                "f3": "vk_mission_control",
+                "f4": "vk_launchpad",
+                "f5": "vk_consumer_illumination_down",
+                "f6": "vk_consumer_illumination_up",
+                "f7": "vk_consumer_previous",
+                "f8": "vk_consumer_play",
+                "f9": "vk_consumer_next"
+            },
+            "name": "Default Profile",
+            "selected": true,
+            "simple_modifications": {
+                "caps_lock": "delete_or_backspace",
+                "left_command": "left_option",
+                "left_control": "left_command",
+                "left_option": "left_control",
+                "right_command": "right_option",
+                "right_control": "right_command",
+                "right_option": "right_control"
+            }
+        },
+        {
+            "name": "Macbook keyboard",
+            "simple_modifications": {
+                "caps_lock": "delete_or_backspace",
+                "grave_accent_and_tilde": "non_us_backslash",
+                "left_command": "left_control",
+                "non_us_backslash": "grave_accent_and_tilde",
+                "right_command": "right_control"
+            }
+        }
+    ]
+}
diff --git a/tag-ssh/ssh/rc b/tag-ssh/ssh/rc
index 7b6da3a8..59e4cfd1 100644..100755
--- a/tag-ssh/ssh/rc
+++ b/tag-ssh/ssh/rc
@@ -1,5 +1,5 @@
 #!/bin/sh
 if [ "$SSH_AUTH_SOCK" ]
 then
-    ln -sf $SSH_AUTH_SOCK ~/.ssh/ssh_auth_sock
+  ln -sf $SSH_AUTH_SOCK ~/.ssh/ssh_auth_sock
 fi
diff --git a/tag-zsh/config/zsh/zshenv b/tag-zsh/config/zsh/zshenv
index 93893530..86efc02d 100644
--- a/tag-zsh/config/zsh/zshenv
+++ b/tag-zsh/config/zsh/zshenv
@@ -1,19 +1,19 @@
 if [[ $SHLVL -eq 1 || (-n $DISPLAY && $SHLVL -lt 3) ]]
 then
-	if [[ -f $ZDOTDIR/zshenv.local ]]
-	then
-		. $ZDOTDIR/zshenv.local
-	fi
+  if [[ -f $ZDOTDIR/zshenv.local ]]
+  then
+    . $ZDOTDIR/zshenv.local
+  fi
 
-	if [[ -f $ZDOTDIR/zshenv.private ]]
-	then
-		. $ZDOTDIR/zshenv.private
-	fi
+  if [[ -f $ZDOTDIR/zshenv.private ]]
+  then
+    . $ZDOTDIR/zshenv.private
+  fi
 
-	ZPLUG_HOME=${ZPLUG_HOME:-~/projects/zplug}
+  ZPLUG_HOME=${ZPLUG_HOME:-~/projects/zplug}
 
-	if [[ -z $SSH_AUTH_SOCK ]]
-	then
-		export SSH_AUTH_SOCK=$XDG_RUNTIME_DIR/ssh-agent.socket
-	fi
+  if [[ -z $SSH_AUTH_SOCK ]]
+  then
+    export SSH_AUTH_SOCK=$XDG_RUNTIME_DIR/ssh-agent.socket
+  fi
 fi
diff --git a/tag-zsh/config/zsh/zshrc b/tag-zsh/config/zsh/zshrc
index 2a37b508..f5327507 100644
--- a/tag-zsh/config/zsh/zshrc
+++ b/tag-zsh/config/zsh/zshrc
@@ -7,29 +7,41 @@ zplug "clvv/fasd", hook-build:"PREFIX=$HOME make install"
 zplug "caarlos0/zsh-open-pr", as:plugin
 if [[ -n $commands[nix-env] ]]
 then
-	zplug "spwhitt/nix-zsh-completions", as:plugin
-	fpath=($fpath $ZPLUG_REPOS/spwhitt/nix-zsh-completions)
+  zplug "spwhitt/nix-zsh-completions", as:plugin
+  fpath=($fpath $ZPLUG_REPOS/spwhitt/nix-zsh-completions)
 fi
 
 zplug "gerges/oh-my-zsh-jira-plus", as:plugin, if:"[[ ${(SN)HOST%spotcap} ]]"
 zplug "lukechilds/zsh-better-npm-completion", if:"[[ -n $commands[npm] ]]", nice:10
 zplug "hlissner/zsh-autopair", nice:10
 
+HISTSIZE=3000
+SAVEHIST=10000
+HISTFILE=${XDG_CACHE_HOME:=$HOME/.cache}/zsh/history
+
 WORDCHARS=${${WORDCHARS//[-.]}//[\/]}
 
 if [[ ${path[(I)$HOME/bin ]} ]]
 then
-	path+=($HOME/bin)
+  path+=($HOME/bin)
+fi
+
+if [[ ${path[(I)$HOME/.local/bin ]} ]]
+then
+  path+=($HOME/.local/bin)
 fi
 
 export EDITOR=emacsclient
 alias ec=emacsclient
 alias open-project=projectile
 _emacs_function () {
-	emacsclient -e "($1 \"$2\")" > /dev/null
+  emacsclient -e "($1 \"$2\")" > /dev/null
 }
 projectile () {
-	_emacs_function projectile-switch-project-by-name ${1:-$PWD}
+  _emacs_function projectile-switch-project-by-name ${1:-$PWD}
+}
+yarn () {
+  PREFIX=$HOME/.local command yarn "$@"
 }
 
 ls='\ls'
@@ -39,25 +51,25 @@ bsd_ls_options="-p"
 bsd_ls_isodate="-D '%F %k:%M'"
 
 case $OSTYPE in
-	darwin*)
-		if [[ -n $commands[gls] ]]
-		then
-			ls='\gls'
-			ls_options=$gnu_ls_options
-			ls_isodate=$gnu_ls_isodate
-		else
-			ls_options=$bsd_ls_options
-			ls_isodate=$bsd_ls_isodate
-		fi
-		;;
-	freebsd*)
-		ls_options=$bsd_ls_options
-		ls_isodate=$bsd_ls_isodate
-		;;
-	linux-gnu)
-		ls_options=$gnu_ls_options
-		ls_isodate=$gnu_ls_isodate
-		;;
+  darwin*)
+    if [[ -n $commands[gls] ]]
+    then
+      ls='\gls'
+      ls_options=$gnu_ls_options
+      ls_isodate=$gnu_ls_isodate
+    else
+      ls_options=$bsd_ls_options
+      ls_isodate=$bsd_ls_isodate
+    fi
+    ;;
+  freebsd*)
+    ls_options=$bsd_ls_options
+    ls_isodate=$bsd_ls_isodate
+    ;;
+  linux-gnu)
+    ls_options=$gnu_ls_options
+    ls_isodate=$gnu_ls_isodate
+    ;;
 esac
 alias l="${ls} ${ls_options} -Bp"
 alias l1="${ls} ${ls_options} -1"
@@ -75,19 +87,19 @@ bindkey '\e[3~' delete-char
 bindkey '\C-hd' describe-key-briefly
 
 backward-argument () {
-	local WORDCHARS="\!\`~#@$%^&*()-_=+[{]}\|;:,<.>/?\'\""
-	zle backward-word
+  local WORDCHARS="\!\`~#@$%^&*()-_=+[{]}\|;:,<.>/?\'\""
+  zle backward-word
 }
 
 forward-argument () {
-	local WORDCHARS="\!\`~#@$%^&*()-_=+[{]}\|;:,<.>/?\'\""
-	zle forward-word
+  local WORDCHARS="\!\`~#@$%^&*()-_=+[{]}\|;:,<.>/?\'\""
+  zle forward-word
 }
 
 kill-argument () {
-	local WORDCHARS="\!\`~#@$%^&*()-_=+[{]}\|;:,<.>/?\'\""
-	zle backward-argument
-	zle kill-word
+  local WORDCHARS="\!\`~#@$%^&*()-_=+[{]}\|;:,<.>/?\'\""
+  zle backward-argument
+  zle kill-word
 }
 
 zle -N backward-argument
@@ -98,92 +110,92 @@ bindkey '\e^f' forward-argument
 bindkey '\e^k' kill-argument
 
 ds () {
-	du -hd1 $1 | sort -h
+  du -hd1 $1 | sort -h
 }
 
 zle -C hist-complete complete-word _generic
 zstyle ':completion:hist-complete:*' completer _history
-bindkey '\e	' hist-complete
+bindkey '\e ' hist-complete
 
 zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}' '+m:{A-Z}={a-z}'
 zstyle ':completion:*' completer _expand _complete _match
 
 if [[ -z $SSH_AUTH_SOCK && $commands[ssh-agent] ]]
 then
-	eval $(ssh-agent)
+  eval $(ssh-agent)
 fi
 
 if zplug check Tarrasch/zsh-autoenv
 then
-	AUTOENV_FILE_ENTER=.envrc
-	AUTOENV_HANDLE_LEAVE=0
-	AUTOENV_LOOK_UPWARDS=1
+  AUTOENV_FILE_ENTER=.envrc
+  AUTOENV_HANDLE_LEAVE=0
+  AUTOENV_LOOK_UPWARDS=1
 fi
 
 if zplug check gerges/oh-my-zsh-jira-plus
 then
-	JIRA_RAPID_BOARD=true
+  JIRA_RAPID_BOARD=true
 fi
 
 # Then, source plugins and add commands to $PATH
 zplug load
 
 # General configuration
-setopt auto_cd 					# Change directories without `cd`
+setopt auto_cd          # Change directories without `cd`
 
 if zplug check zsh-users/zsh-completions
 then
-	autoload -U compinit && compinit
+  autoload -U compinit && compinit
 fi
 
 if [[ -n $commands[hub] ]]
 then
-	compdef _hub hub
-	alias git=hub
-	alias gh=hub
+  compdef _hub hub
+  alias git=hub
+  alias gh=hub
 fi
 
 if [[ -n $commands[lunchy] ]]
 then
-	LUNCHY_DIR=$(dirname $(gem which lunchy))/../extras
-	if [ -f $LUNCHY_DIR/lunchy-completion.zsh ]; then
-		. $LUNCHY_DIR/lunchy-completion.zsh
-	fi
+  LUNCHY_DIR=$(dirname $(gem which lunchy))/../extras
+  if [ -f $LUNCHY_DIR/lunchy-completion.zsh ]; then
+    . $LUNCHY_DIR/lunchy-completion.zsh
+  fi
 fi
 
 if [[ $TERM == "dumb" ]]
 then
-	PROMPT="> "
+  PROMPT="> "
 else
-	unset RPROMPT
-	# show username@host if logged in through SSH
-	[[ "$SSH_CONNECTION" != '' ]] && prompt_pure_username=' %F{242}%n@%m%f'
+  unset RPROMPT
+  # show username@host if logged in through SSH
+  [[ "$SSH_CONNECTION" != '' ]] && prompt_pure_username=' %F{242}%n@%m%f'
 
-	# show username@host if root, with username in white
-	[[ $UID -eq 0 ]] && prompt_pure_username=' %F{white}%n%f%F{242}@%m%f'
+  # show username@host if root, with username in white
+  [[ $UID -eq 0 ]] && prompt_pure_username=' %F{white}%n%f%F{242}@%m%f'
 
-	setopt prompt_subst
-	setopt prompt_cr
-	PROMPT='%F{blue}%~%f${prompt_pure_username}
+  setopt prompt_subst
+  setopt prompt_cr
+  PROMPT='%F{blue}%~%f${prompt_pure_username}
 %(?.%F{magenta}.%F{red})>%f '
 fi
 
 if zplug check clvv/fasd
 then
-	if [[ -n $commands[fasd] ]]
-	then
-		_FASD_DATA="$HOME/.cache/zsh/fasd-data"
-		source =fasd
-
-		fasd_cache="$HOME/.fasd-init-zsh"
-		if [ "$(command -v fasd)" -nt "$fasd_cache" -o ! -s "$fasd_cache" ]; then
-			fasd --init posix-alias zsh-hook zsh-ccomp zsh-ccomp-install >| "$fasd_cache"
-		fi
-		source "$fasd_cache"
-		unset fasd_cache
-	else
-		echo "no fasd"
-	fi
+  if [[ -n $commands[fasd] ]]
+  then
+    _FASD_DATA="$HOME/.cache/zsh/fasd-data"
+    source =fasd
+
+    fasd_cache="$HOME/.fasd-init-zsh"
+    if [ "$(command -v fasd)" -nt "$fasd_cache" -o ! -s "$fasd_cache" ]; then
+      fasd --init posix-alias zsh-hook zsh-ccomp zsh-ccomp-install >| "$fasd_cache"
+    fi
+    source "$fasd_cache"
+    unset fasd_cache
+  else
+    echo "no fasd"
+  fi
 fi
 
-unsetopt flow_control 			# Let me use ^S and ^Q
+unsetopt flow_control       # Let me use ^S and ^Q