aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJacob Janzen <jacob.a.s.janzen@gmail.com>2024-10-01 17:42:59 -0500
committerJacob Janzen <jacob.a.s.janzen@gmail.com>2024-10-01 17:42:59 -0500
commit7b0ea5cbdaaa5b8392777ad207c74cb27411eab1 (patch)
tree37a3438116ec3c84663133c820808ad9e2acf021
parent7a347653dfad8c6c33791f7e72a4ec40b8230ac3 (diff)
the big refactor
-rw-r--r--.gitignore1
-rw-r--r--Makefile61
-rw-r--r--common/.clang-format.org (renamed from common/clang-format.org)0
-rw-r--r--common/.config/alacritty/alacritty.toml.org (renamed from macos/.config/alacritty/alacritty.org)0
-rw-r--r--common/.config/emacs/feed.org.org39
-rw-r--r--common/.config/emacs/force-custom-file.el.org8
-rw-r--r--common/.config/emacs/init.el.org10
-rw-r--r--common/.config/emacs/languages.el.org148
-rw-r--r--common/.config/emacs/package-setup.el.org25
-rw-r--r--common/.config/emacs/tools.el.org391
-rw-r--r--common/.config/emacs/user-interface.el.org131
-rw-r--r--common/.config/fastfetch/config.jsonc.org (renamed from common/.config/fastfetch/config.org)0
-rw-r--r--common/.config/nvim/init.lua.org (renamed from common/.config/nvim/init.org)0
-rw-r--r--common/.config/nvim/lua/appearance.lua.org (renamed from common/.config/nvim/lua/appearance.org)0
-rw-r--r--common/.config/nvim/lua/behaviour.lua.org (renamed from common/.config/nvim/lua/behaviour.org)0
-rw-r--r--common/.config/nvim/lua/plugins.lua.org (renamed from common/.config/nvim/lua/plugins.org)0
-rwxr-xr-x[-rw-r--r--]common/.config/sketchybar/plugins/battery.sh.org (renamed from macos/.config/sketchybar/plugins/battery.org)0
-rwxr-xr-x[-rw-r--r--]common/.config/sketchybar/plugins/clock.sh.org (renamed from macos/.config/sketchybar/plugins/clock.org)0
-rwxr-xr-x[-rw-r--r--]common/.config/sketchybar/plugins/cpu.sh.org (renamed from macos/.config/sketchybar/plugins/cpu.org)0
-rwxr-xr-x[-rw-r--r--]common/.config/sketchybar/plugins/front_app.sh.org (renamed from macos/.config/sketchybar/plugins/front_app.org)0
-rwxr-xr-x[-rw-r--r--]common/.config/sketchybar/plugins/mem.sh.org (renamed from macos/.config/sketchybar/plugins/mem.org)0
-rwxr-xr-x[-rw-r--r--]common/.config/sketchybar/plugins/space.sh.org (renamed from macos/.config/sketchybar/plugins/space.org)0
-rwxr-xr-x[-rw-r--r--]common/.config/sketchybar/plugins/volume.sh.org (renamed from macos/.config/sketchybar/plugins/volume.org)0
-rwxr-xr-x[-rw-r--r--]common/.config/sketchybar/sketchybarrc.org (renamed from macos/.config/sketchybar/sketchybarrc.org)0
-rw-r--r--common/.config/skhd/skhdrc.org (renamed from macos/.config/skhd/skhdrc.org)0
-rw-r--r--common/.config/yabai/yabairc.org (renamed from macos/.config/yabai/yabairc.org)0
-rw-r--r--common/.gitconfig.org.gpg (renamed from common/gitconfig.org.gpg)bin929 -> 929 bytes
-rw-r--r--common/.local/share/fonts/NFM.tar.gzbin2150400 -> 0 bytes
-rw-r--r--common/.profile.org (renamed from common/profile.org)0
-rw-r--r--common/.zshrc.org (renamed from common/zshrc.org)0
-rwxr-xr-x[-rw-r--r--]extract_src.py4
-rwxr-xr-xinstall83
l---------macos.local/.clang-format.org1
l---------macos.local/.config/alacritty1
l---------macos.local/.config/emacs (renamed from macos/.config/emacs)0
l---------macos.local/.config/fastfetch (renamed from macos/.config/fastfetch)0
l---------macos.local/.config/nvim (renamed from macos/.config/nvim)0
l---------macos.local/.config/sketchybar1
l---------macos.local/.config/skhd1
l---------macos.local/.config/yabai1
l---------macos.local/.gitconfig.org.gpg1
-rw-r--r--macos.local/.gnupg/gpg-agent.org (renamed from macos/.gnupg/gpg-agent.org)0
-rwxr-xr-x[-rw-r--r--]macos.local/.local/bin/launcher.org (renamed from macos/.local/bin/launcher.org)0
l---------macos.local/.local/share/fonts (renamed from macos/.local/share/fonts)0
l---------macos.local/.profile.org1
-rw-r--r--macos.local/.ssh/config.org (renamed from macos/.ssh/config.org)0
l---------macos.local/.wallpaper (renamed from macos/.wallpaper)0
l---------macos.local/.zshrc.org1
-rwxr-xr-x[-rw-r--r--]macos.local/Applications/Emacs.app/Contents/MacOS/Emacs.org (renamed from macos/Applications/Emacs.app/Contents/MacOS/Emacs.org)0
l---------macos/clang-format.org1
l---------macos/gitconfig.org.gpg1
l---------macos/profile.org1
l---------macos/zshrc.org1
l---------[-rw-r--r--]nixos/.flake/home/programs/emacs/feed.org.org40
l---------[-rw-r--r--]nixos/.flake/home/programs/emacs/force-custom-file.el.org9
l---------[-rw-r--r--]nixos/.flake/home/programs/emacs/languages.el.org149
l---------[-rw-r--r--]nixos/.flake/home/programs/emacs/package-setup.el.org26
l---------[-rw-r--r--]nixos/.flake/home/programs/emacs/tools.el.org392
l---------[-rw-r--r--]nixos/.flake/home/programs/emacs/user-interface.el.org132
59 files changed, 827 insertions, 834 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..90c47da
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+tmp.org
diff --git a/Makefile b/Makefile
index c03029d..266e19d 100644
--- a/Makefile
+++ b/Makefile
@@ -1,38 +1,89 @@
-.PHONY: install update nixos-update nixos-install
+.PHONY: install update macos-update macos-install nixos-update nixos-install fonts
-SYSTEM = $(shell uname -n)
+# Determine the current system from its hostname.
+# My university network changes my hostname on my laptop. I use the disgusting system_profiler pipeline to get the real hostname
+# if the uname command fails
+SYSTEM := $(shell uname -n)
+ifeq ($(wildcard src/$(project)/*),)
+ SYSTEM = $(shell system_profiler SPSoftwareDataType | grep "Computer Name" | xargs | sed 's/Computer Name: //' | sed 's/$$/.local/')
+endif
+
+# Set directories
SRCDIR = ./$(SYSTEM)
DSTDIR = $(HOME)
+FONTSDIR = .local/share/fonts
+# Get the list of files that need to be generated
SOURCES := $(shell find -L $(SRCDIR)/ -type f)
-CONFIGS := $(subst $(SRCDIR)/,$(DSTDIR)/,$(SOURCES:%.org=%))
+NOGPG := $(SOURCES:%.gpg=%)
+NOORG := $(NOGPG:%.org=%)
+CONFIGS := $(subst $(SRCDIR)/,$(DSTDIR)/,$(NOORG))
+# Set any extra targets based on the hostname
UPDATE_TARGET :=
INSTALL_TARGET :=
-
ifeq ($(SYSTEM), nixos)
UPDATE_TARGET += nixos-update
INSTALL_TARGET += nixos-install
+else ifeq ($(SYSTEM), macos.local)
+ UPDATE_TARGET += macos-update
+ INSTALL_TARGET += macos-install
endif
+# update by default, install first
all: update
-
update: install $(UPDATE_TARGET)
+# install configs and any additional targets
install: $(CONFIGS) $(INSTALL_TARGET)
+# ignored files
+%.tar.gz:
+ :
+
+# install encrypted org configs
+$(DSTDIR)/%: $(SRCDIR)/%.org.gpg
+ mkdir -p $(dir $@)
+ gpg -d --batch $< 1> tmp.org
+ python3 ./extract_src.py tmp.org $@
+ rm tmp.org
+
+# install org configs
$(DSTDIR)/%: $(SRCDIR)/%.org
mkdir -p $(dir $@)
python3 ./extract_src.py $< $@
+# install generic files
$(DSTDIR)/%: $(SRCDIR)/%
mkdir -p $(dir $@)
cp $< $@
+# install fonts
+fonts: $(DSTDIR)/$(FONTSDIR)/.ComputerModern $(DSTDIR)/$(FONTSDIR)/.SauceCodePro
+ -fc-cache -f
+$(DSTDIR)/$(FONTSDIR)/.ComputerModern: $(SRCDIR)/$(FONTSDIR)/ComputerModern.tar.gz
+ mkdir -p $(DSTDIR)/$(FONTSDIR)
+ tar xf $(SRCDIR)/$(FONTSDIR)/ComputerModern.tar.gz -C $(DSTDIR)/$(FONTSDIR)
+ touch $(DSTDIR)/$(FONTSDIR)/.ComputerModern
+$(DSTDIR)/$(FONTSDIR)/.SauceCodePro: $(SRCDIR)/$(FONTSDIR)/SauceCodePro.tar.gz
+ mkdir -p $(DSTDIR)/$(FONTSDIR)
+ tar xf $(SRCDIR)/$(FONTSDIR)/SauceCodePro.tar.gz -C $(DSTDIR)/$(FONTSDIR)
+ touch $(DSTDIR)/$(FONTSDIR)/.SauceCodePro
+
+# macos update just runs brew upgrade
+macos-update: install
+ brew upgrade
+
+# macos install also install fonts and tells System Events to update the wallpaper
+macos-install: $(CONFIGS) fonts
+ osascript -e "tell application \"System Events\" to tell every desktop to set picture to \"/$$HOME/.wallpaper\" as POSIX file"
+
+# nixos update backs up the flake lock file
nixos-update: install
nix flake update $(DSTDIR)/.flake
cp $(DSTDIR)/.flake/flake.lock $(SRCDIR)/.flake
sudo nixos-rebuild switch --flake $(DSTDIR)/.flake
+# nixos install runs nixos-rebuild switch to install everything declaratively
nixos-install: $(CONFIGS)
sudo nixos-rebuild switch --flake $(DSTDIR)/.flake
diff --git a/common/clang-format.org b/common/.clang-format.org
index 6c38b3b..6c38b3b 100644
--- a/common/clang-format.org
+++ b/common/.clang-format.org
diff --git a/macos/.config/alacritty/alacritty.org b/common/.config/alacritty/alacritty.toml.org
index 992ed63..992ed63 100644
--- a/macos/.config/alacritty/alacritty.org
+++ b/common/.config/alacritty/alacritty.toml.org
diff --git a/common/.config/emacs/feed.org.org b/common/.config/emacs/feed.org.org
new file mode 100644
index 0000000..f0de605
--- /dev/null
+++ b/common/.config/emacs/feed.org.org
@@ -0,0 +1,39 @@
+#+title: Emacs RSS Feed
+
+#+begin_src org :tangle ~/.config/emacs/feed.org :mkdirp yes
+ ,* Blogs
+ :PROPERTIES:
+ :ID: elfeed
+ :END:
+ ,** Journalism :journalism:
+ ,*** [[https://waxy.org/feed/][Waxy.org]]
+ ,*** [[https://pluralistic.net/feed/][Cory Doctorow]] :technology:software:fiction:
+ ,** Computer Science :cs:
+ ,*** [[https://a.exozy.me/index.xml][Some Random Website]] :math:algorithms:fiction:
+ ,** Technology :technology:
+ ,*** [[https://ciechanow.ski/atom.xml][Bartosz Ciechanowshki]]
+ ,*** [[https://www.citationneeded.news/rss/][Citation Needed]]
+ ,*** [[https://www.lilysthings.org/blog/rss.xml][The Cool Blog]]
+ ,** Software :software:
+ ,*** [[https://eieio.games/feed.xml][eieio.games]]
+ ,*** [[https://ersei.net/en/blog.atom][Ersei]]
+ ,*** [[https://lilysthings.org/blog/rss.xml][Lily's Things]]
+ ,*** [[https://ntietz.com/atom.xml][Technically a Blog]]
+ ,*** [[https://alexwlchan.net/atom.xml][Alex Chan]]
+ ,*** [[https://eaton-works.com/feed.atom][Eaton Works]] :hacking:
+ ,*** [[https://computer.rip/rss.xml][Computer's Are Bad]] :technology:
+ ,*** [[https://mark.stosberg.com/rss/][Mark Stosberg]] :biking:
+ ,*** [[https://maia.crimew.gay/feed.xml][Maia Crimew]] :internet:hacking:
+ ,*** [[https://drewdevault.com/blog/index.xml][Drew DeVault]]
+ ,** Comics :comic:
+ ,*** [[https://xkcd.com/atom.xml][XKCD]]
+ ,** People I know
+ ,*** [[https://www.weavingwatersexpedition.com/news?format=rss][Weaving Waters Expedition]] :journalism:
+ ,*** [[https://pinkish.bearblog.dev/feed/][Pinkish]] :software:
+ ,*** [[https://jjanzen.ca/rss.xml][Me]] :software:review:
+ ,** Internet Infrastructure :internet:software:
+ ,*** [[https://daniel.haxx.se/blog/feed/][cURL]]
+ ,*** [[https://blog.archive.org/feed/][Archive.org]]
+ ,** Reviews :review:
+ ,*** [[https://mountainofink.com/?format=rss][Mountain of Ink]]
+#+end_src
diff --git a/common/.config/emacs/force-custom-file.el.org b/common/.config/emacs/force-custom-file.el.org
new file mode 100644
index 0000000..8b8a418
--- /dev/null
+++ b/common/.config/emacs/force-custom-file.el.org
@@ -0,0 +1,8 @@
+#+title: Emacs Force the Usage of a =custom.el= File
+
+Force the usage of a =custom.el= file for customizations instead of placing them in =init.el=.
+#+begin_src emacs-lisp :tangle ~/.config/emacs/force-custom-file.el :mkdirp yes
+ (setq custom-file (concat user-emacs-directory "custom.el"))
+ (when (file-exists-p custom-file)
+ (load custom-file))
+#+end_src
diff --git a/common/.config/emacs/init.el.org b/common/.config/emacs/init.el.org
new file mode 100644
index 0000000..4f13b21
--- /dev/null
+++ b/common/.config/emacs/init.el.org
@@ -0,0 +1,10 @@
+#+title: Emacs Configuration
+
+Load files for config.
+#+begin_src emacs-lisp :tangle ~/.config/emacs/init.el :mkdirp yes
+ (load "~/.config/emacs/force-custom-file.el")
+ (load "~/.config/emacs/package-setup.el")
+ (load "~/.config/emacs/user-interface.el")
+ (load "~/.config/emacs/tools.el")
+ (load "~/.config/emacs/languages.el")
+#+end_src
diff --git a/common/.config/emacs/languages.el.org b/common/.config/emacs/languages.el.org
new file mode 100644
index 0000000..3ee63e0
--- /dev/null
+++ b/common/.config/emacs/languages.el.org
@@ -0,0 +1,148 @@
+#+title: Emacs Programming Language Setup
+
+* Shell Script
+Run =eglot= on shell script files.
+#+begin_src emacs-lisp :tangle ~/.config/emacs/languages.el :mkdirp yes
+ (add-hook 'sh-mode-hook 'jj/eglot-setup)
+#+end_src
+
+* C
+Run =eglot= on C and C++ files.
+#+begin_src emacs-lisp :tangle ~/.config/emacs/languages.el :mkdirp yes
+ (add-hook 'c-mode-hook 'jj/eglot-setup)
+ (add-hook 'c++-mode-hook 'jj/eglot-setup)
+ (add-hook 'cc-mode-hook 'jj/eglot-setup)
+#+end_src
+
+Run =eglot= on CMake files.
+#+begin_src emacs-lisp :tangle ~/.config/emacs/languages.el :mkdirp yes
+ (use-package cmake-mode
+ :init
+ (add-hook 'cmake-mode-hook 'jj/eglot-setup))
+#+end_src
+
+Turn off C mode in =lex= and =yacc= files.
+#+begin_src emacs-lisp :tangle ~/.config/emacs/languages.el :mkdirp yes
+ (add-to-list 'auto-mode-alist '("\\.l$" . prog-mode))
+ (add-to-list 'auto-mode-alist '("\\.y$" . prog-mode))
+#+end_src
+
+* Web
+Run =eglot= on HTML files.
+#+begin_src emacs-lisp :tangle ~/.config/emacs/languages.el :mkdirp yes
+ (add-hook 'html-mode-hook 'jj/eglot-setup)
+#+end_src
+
+Run =eglot= on CSS files.
+#+begin_src emacs-lisp :tangle ~/.config/emacs/languages.el :mkdirp yes
+ (add-hook 'css-mode-hook 'jj/eglot-setup)
+#+end_src
+
+Run =eglot= on JavaScript files.
+#+begin_src emacs-lisp :tangle ~/.config/emacs/languages.el :mkdirp yes
+ (add-hook 'js-json-mode-hook 'jj/eglot-setup)
+ (add-hook 'js-mode-hook 'jj/eglot-setup)
+#+end_src
+
+* Python
+Run =eglot= on Python files.
+#+begin_src emacs-lisp :tangle ~/.config/emacs/languages.el :mkdirp yes
+ (add-hook 'python-mode-hook 'jj/eglot-setup)
+#+end_src
+
+* Go
+Install Go support and run =eglot= on Go files.
+#+begin_src emacs-lisp :tangle ~/.config/emacs/languages.el :mkdirp yes
+ (use-package go-mode
+ :init
+ (add-hook 'go-mode-hook 'jj/eglot-setup))
+#+end_src
+
+Get documentation for Go variables, functions, and arguments.
+#+begin_src emacs-lisp :tangle ~/.config/emacs/languages.el :mkdirp yes
+ (use-package go-eldoc
+ :init
+ (add-hook 'go-mode-hook 'go-eldoc-setup))
+#+end_src
+
+Automatically generate tests in Go.
+#+begin_src emacs-lisp :tangle ~/.config/emacs/languages.el :mkdirp yes
+ (use-package go-gen-test)
+#+end_src
+
+Get refactoring tools from =go-guru=.
+#+begin_src emacs-lisp :tangle ~/.config/emacs/languages.el :mkdirp yes
+ (use-package go-guru
+ :hook (go-mode . go-guru-hl-identifier-mode))
+#+end_src
+
+* Lua
+Install Lua support and run =eglot= on Lua files.
+#+begin_src emacs-lisp :tangle ~/.config/emacs/languages.el :mkdirp yes
+ (use-package lua-mode
+ :init
+ (add-hook 'lua-mode-hook 'jj/eglot-setup))
+#+end_src
+
+Better Lisp editing with =lispy=.
+#+begin_src emacs-lisp :tangle ~/.config/emacs/languages.el :mkdirp yes
+ (use-package lispy
+ :hook (emacs-lisp-mode . lispy-mode))
+ (use-package lispyville
+ :after lispy
+ :hook (lispy-mode . lispyville-mode))
+#+end_src
+
+Better parentheses handling in lisp with =parinfer-rust-mode=.
+#+begin_src emacs-lisp :tangle ~/.config/emacs/languages.el :mkdirp yes
+ (use-package parinfer-rust-mode
+ :hook (emacs-lisp-mode . parinfer-rust-mode)
+ :init
+ (setq parinfer-rust-auto-download t))
+#+end_src
+
+* Markdown
+Install Markdown support and run =eglot= on Markdown files.
+#+begin_src emacs-lisp :tangle ~/.config/emacs/languages.el :mkdirp yes
+ (use-package markdown-mode
+ :init
+ (add-hook 'markdown-mode-hook 'jj/eglot-setup))
+#+end_src
+
+* LaTeX
+Run =eglot= on TeX files.
+#+begin_src emacs-lisp :tangle ~/.config/emacs/languages.el :mkdirp yes
+ (add-hook 'tex-mode-hook 'jj/eglot-setup)
+#+end_src
+
+Use AUCTeX for extra LaTeX integration.
+#+begin_src emacs-lisp :tangle ~/.config/emacs/languages.el :mkdirp yes
+ (use-package auctex
+ :config
+ (add-hook 'LaTeX-mode-hook 'jj/eglot-setup)
+ (add-hook 'LaTeX-mode-hook
+ (lambda ()
+ (put 'LaTeX-mode 'eglot-language-id "latex"))))
+#+end_src
+
+Use CDLaTeX for environment and macro insertion.
+#+begin_src emacs-lisp :tangle ~/.config/emacs/languages.el :mkdirp yes
+ (use-package cdlatex
+ :config
+ (add-hook 'LaTeX-mode-hook #'turn-on-cdlatex))
+#+end_src
+
+* YAML
+Install YAML support and run =eglot= on YAML files.
+#+begin_src emacs-lisp :tangle ~/.config/emacs/languages.el :mkdirp yes
+ (use-package yaml-mode
+ :init
+ (add-hook 'yaml-mode-hook 'jj/eglot-setup))
+#+end_src
+
+* Nix
+Install =nix= support and run =eglot= on =nix= files.
+#+begin_src emacs-lisp :tangle ~/.config/emacs/languages.el :mkdirp yes
+ (use-package nix-mode
+ :mode "\\.nix\\'")
+#+end_src
diff --git a/common/.config/emacs/package-setup.el.org b/common/.config/emacs/package-setup.el.org
new file mode 100644
index 0000000..6ed238c
--- /dev/null
+++ b/common/.config/emacs/package-setup.el.org
@@ -0,0 +1,25 @@
+#+title: Emacs Package Setup
+Install =straight= for better package management.
+#+begin_src emacs-lisp :tangle ~/.config/emacs/package-setup.el :mkdirp yes
+ (defvar bootstrap-version)
+ (let ((bootstrap-file
+ (expand-file-name
+ "straight/repos/straight.el/bootstrap.el"
+ (or (bound-and-true-p straight-base-dir)
+ user-emacs-directory)))
+ (bootstrap-version 7))
+ (unless (file-exists-p bootstrap-file)
+ (with-current-buffer
+ (url-retrieve-synchronously
+ "https://raw.githubusercontent.com/radian-software/straight.el/develop/install.el"
+ 'silent 'inhibit-cookies)
+ (goto-char (point-max))
+ (eval-print-last-sexp)))
+ (load bootstrap-file nil 'nomessage))
+#+end_src
+
+Install =use-package= for declarative package installation. Make =use-package= default to =ensure t= so that packages are enabled if they are declared.
+#+begin_src emacs-lisp :tangle ~/.config/emacs/package-setup.el :mkdirp yes
+ (straight-use-package 'use-package)
+ (setq straight-use-package-by-default t)
+#+end_src
diff --git a/common/.config/emacs/tools.el.org b/common/.config/emacs/tools.el.org
new file mode 100644
index 0000000..d52c1b6
--- /dev/null
+++ b/common/.config/emacs/tools.el.org
@@ -0,0 +1,391 @@
+#+title: Emacs Tool Setup
+
+* Vi Keybindings
+Use =vi= keybindings with =evil=. Set the undo system to =undo-fu=. Wrapped lines can be moved between with =j= and =k=.
+#+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes
+ (use-package evil
+ :init
+ (setq evil-want-keybinding nil)
+ :config
+ (evil-mode)
+ (evil-global-set-key 'motion "j" 'evil-next-visual-line)
+ (evil-global-set-key 'motion "k" 'evil-previous-visual-line)
+ (evil-global-set-key 'motion (kbd "RET") nil)
+ :custom
+ (evil-undo-system 'undo-fu))
+#+end_src
+
+Use =evil-collection= to include =vi= keybindings in extra modes.
+#+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes
+ (use-package evil-collection
+ :after evil
+ :config
+ (evil-collection-init))
+#+end_src
+
+* Undo
+Better undo with =undo-fu=.
+#+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes
+ (use-package undo-fu)
+#+end_src
+
+Make undo persistent when closing Emacs with =undo-fu-session=.
+#+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes
+ (use-package undo-fu-session
+ :init (undo-fu-session-global-mode 1))
+#+end_src
+
+* Lookup
+Better lookup with =dumb-jump=.
+#+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes
+ (use-package dumb-jump
+ :init (add-hook 'xref-backend-functions #'dumb-jump-xref-activate))
+#+end_src
+
+* Version Control
+Install Magit for Git integration.
+#+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes
+ (use-package magit)
+#+end_src
+
+* Remote Editing
+#+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes
+(setq tramp-default-method "ssh")
+#+end_src
+
+* Document Viewing
+Replace =DocView= with a better document viewer from =pdf-tools=.
+#+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes
+ (use-package pdf-tools
+ :config
+ (pdf-tools-install)
+ :init
+ (add-hook 'pdf-view-mode-hook #'(lambda () (display-line-numbers-mode -1)))
+ (add-hook 'TeX-after-compilation-finished-functions
+ #'TeX-revert-document-buffer)
+ :config
+ (setq TeX-view-program-selection '((output-pdf "PDF Tools"))
+ TeX-view-program-list '(("PDF Tools" TeX-pdf-tools-sync-view))
+ TeX-source-correlate-start-server t))
+#+end_src
+
+Save place in PDFs with =saveplace-pdf-view=.
+#+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes
+ (use-package saveplace-pdf-view
+ :config (save-place-mode 1))
+#+end_src
+
+* Org-Mode
+Ensure that =org= is set up before any of this.
+#+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes
+ (use-package org)
+#+end_src
+Set my =org-mode= directory.
+#+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes
+ (setq org-directory "~/org")
+#+end_src
+
+Hide emphasis markers because I can see if something is *bold*, /italic/, or =monospace= without needing to see the markers.
+#+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes
+ (setq org-hide-emphasis-markers t)
+#+end_src
+
+Set up nicer looking bullet points.
+- they look like circles
+- instead of hyphens
+#+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes
+ (font-lock-add-keywords 'org-mode
+ '(("^ *\\([-]\\) "
+ (0 (prog1 () (compose-region (match-beginning 1) (match-end 1) "•"))))))
+#+end_src
+
+Set up fonts. Don't use =monospace= by default. Do use it where necessary though. Also, make different heading levels different sizes.
+#+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes
+ (add-hook 'org-mode-hook 'variable-pitch-mode)
+ (custom-set-faces
+ `(variable-pitch ((t :font ,jj/var-font)))
+ `(fixed-pitch ((t :font ,jj/mono-font)))
+ '(org-block ((t (:inherit fixed-pitch))))
+ '(org-code ((t (:inherit (shadow fixed-pitch)))))
+ '(org-document-info-keyword ((t (:inherit (shadow fixed-pitch)))))
+ '(org-meta-line ((t (:inherit (font-lock-comment-face fixed-pitch)))))
+ '(org-verbatim ((t (:inherit (shadow fixed-pitch)))))
+ '(org-table ((t (:inherit (shadow fixed-pitch)))))
+ '(org-document-title ((t (:inherit title :height 2.0 :underline nil))))
+ '(org-level-1 ((t (:inherit outline-1 :weight: bold :height 1.75))))
+ '(org-level-2 ((t (:inherit outline-2 :weight: bold :height 1.5))))
+ '(org-level-2 ((t (:inherit outline-3 :weight: bold :height 1.25))))
+ '(org-level-2 ((t (:inherit outline-4 :weight: bold :height 1.1))))
+ '(org-level-4 ((t (:inherit outline-4 :height 1.1))))
+ '(org-level-5 ((t (:inherit outline-5 :height 1.0))))
+ )
+#+end_src
+
+Wrap lines and centre the view to make for a nicer reading experience.
+#+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes
+ (use-package visual-fill-column)
+ (add-hook 'org-mode-hook 'visual-line-mode)
+ (add-hook 'org-mode-hook #'(lambda () (display-line-numbers-mode -1)))
+ (defun jj/org-mode-visual-fill ()
+ (setq visual-fill-column-width 100
+ visual-fill-column-center-text t)
+ (visual-fill-column-mode 1))
+ (add-hook 'org-mode-hook #'jj/org-mode-visual-fill)
+#+end_src
+
+Increase the size of LaTeX previews.
+#+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes
+ (setq org-format-latex-options (plist-put org-format-latex-options :scale 2.0))
+#+end_src
+
+Follow links with the return key.
+#+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes
+ (setq org-return-follows-link t)
+#+end_src
+
+Tangle on save.
+#+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes
+ (defun org-babel-tangle-config ()
+ (when (string-suffix-p ".org" (buffer-file-name))
+ (org-babel-tangle)))
+ (add-hook 'org-mode-hook
+ (lambda ()
+ (add-hook 'after-save-hook #'org-babel-tangle-config)))
+#+end_src
+
+Enable Org Crypt.
+#+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes
+ (org-crypt-use-before-save-magic)
+ (setq org-tags-exclude-from-inheritance '("crypt"))
+ (setq org-crypt-key nil)
+ (setq auto-save-default nil)
+#+end_src
+
+* Shell
+Use =eshell= as an integrated shell.
+#+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes
+ (use-package eshell)
+ (global-set-key (kbd "C-c e") 'eshell)
+#+end_src
+
+* Language Servers
+Add =eglot= keybindings.
+#+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes
+ (global-set-key (kbd "C-c r") 'eglot-rename)
+ (global-set-key (kbd "C-c a") 'eglot-code-actions)
+#+end_src
+
+Install =tree-sitter=.
+#+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes
+ (use-package tree-sitter)
+ (use-package tree-sitter-langs)
+#+end_src
+
+Define function to set up =eglot= automatically.
+#+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes
+ (defun jj/eglot-setup ()
+ (eglot-ensure)
+ (tree-sitter-mode 1)
+ (tree-sitter-hl-mode 1))
+#+end_src
+
+* Completions
+Use company for completions with no delay, starting immediately after first character is typed.
+#+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes
+ (use-package company
+ :config
+ (add-hook 'after-init-hook 'global-company-mode)
+ (setq company-idle-delay 0
+ company-minimum-prefix-length 1
+ company-selection-wrap-around t))
+#+end_src
+
+Use =vertico= as a completion user interface.
+#+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes
+ (use-package vertico
+ :custom
+ (vertico-cycle t)
+ :init
+ (vertico-mode))
+#+end_src
+
+Use =orderless= to allow typing any portion of a word that you want to search for.
+#+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes
+ (use-package orderless
+ :ensure t
+ :custom
+ (completion-styles '(orderless basic))
+ (completion-category-overrides '((file (styles basic partial-completion)))))
+#+end_src
+
+Get descriptions of items in =vertico= with =marginalia=.
+#+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes
+ (use-package marginalia
+ :bind (:map minibuffer-local-map
+ ("M-A" . marginalia-cycle))
+ :init
+ (marginalia-mode))
+#+end_src
+
+Get nerd font icons in completions.
+#+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes
+ (use-package nerd-icons-completion
+ :config
+ (nerd-icons-completion-mode))
+#+end_src
+
+Use consult with =vertico= for extra functionality to various functions.
+#+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes
+ (use-package consult
+ :bind (
+ ("C-c M-x" . consult-mode-command)
+ ("C-c h" . consult-history)
+ ("C-c k" . consult-kmacro)
+ ("C-c m" . consult-man)
+ ("C-c i" . consult-info)
+ ([remap Info-search] . consult-info)
+ ("C-x M-:" . consult-complex-command)
+ ("C-x b" . consult-buffer)
+ ("C-x 4 b" . consult-buffer-other-window)
+ ("C-x 5 b" . consult-buffer-other-frame)
+ ("C-x t b" . consult-buffer-other-tab)
+ ("C-x r b" . consult-bookmark)
+ ("C-x p b" . consult-project-buffer)
+ ("M-#" . consult-register-load)
+ ("M-'" . consult-register-store)
+ ("C-M-#" . consult-register)
+ ("M-y" . consult-yank-pop)
+ ("M-g e" . consult-compile-error)
+ ("M-g f" . consult-flycheck)
+ ("M-g g" . consult-goto-line)
+ ("M-g M-g" . consult-goto-line)
+ ("M-g o" . consult-outline)
+ ("M-g m" . consult-mark)
+ ("M-g k" . consult-global-mark)
+ ("M-g i" . consult-imenu)
+ ("M-g I" . consult-imenu-multi)
+ ("M-s d" . consult-fd)
+ ("M-s c" . consult-locate)
+ ("M-s g" . consult-grep)
+ ("M-s G" . consult-git-grep)
+ ("M-s r" . consult-ripgrep)
+ ("M-s l" . consult-line)
+ ("M-s L" . consult-line-multi)
+ ("M-s k" . consult-keep-lines)
+ ("M-s u" . consult-focus-lines)
+ ("M-s e" . consult-isearch-history)
+ :map isearch-mode-map
+ ("M-e" . consult-isearch-history)
+ ("M-s e" . consult-isearch-history)
+ ("M-s l" . consult-line)
+ ("M-s L" . consult-line-multi)
+ :map minibuffer-local-map
+ ("M-s" . consult-history)
+ ("M-r" . consult-history))
+ :hook (completion-list-mode . consult-preview-at-point-mode)
+ :init
+ (setq register-preview-delay 0.5
+ register-preview-function #'consult-register-format)
+ (advice-add #'register-preview :override #'consult-register-window)
+ (setq xref-show-xrefs-function #'consult-xref
+ xref-show-definitions-function #'consult-xref)
+ :config
+ (consult-customize
+ consult-theme :preview-key '(:debounce 0.2 any)
+ consult-ripgrep consult-git-grep consult-grep
+ consult-bookmark consult-recent-file consult-xref
+ consult--source-bookmark consult--source-file-register
+ consult--source-recent-file consult--source-project-recent-file
+ :preview-key '(:debounce 0.4 any))
+ (setq consult-narrow-key "<"))
+#+end_src
+
+Use Flycheck for syntax checking.
+#+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes
+ (use-package flycheck
+ :config
+ (add-hook 'after-init-hook #'global-flycheck-mode))
+#+end_src
+
+Use Flyspell for spell checking.
+#+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes
+ (dolist (hook '(text-mode-hook))
+ (add-hook hook (lambda () (flyspell-mode 1))))
+ (use-package flyspell-correct
+ :after flyspell
+ :bind (:map flyspell-mode-map ("C-;" . flyspell-correct-wrapper)))
+#+end_src
+
+* Snippets
+Use =yasnippet= for snippets so I don't need to type as much.
+#+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes
+ (use-package yasnippet
+ :init
+ (yas-global-mode 1)
+ :config
+ (global-set-key (kbd "C-c s") 'yas-insert-snippet))
+#+end_src
+
+Install snippet collection for =yasnippet=.
+#+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes
+ (use-package yasnippet-snippets)
+#+end_src
+
+* Formatting
+Automatically format with Apheleia and =clang-format=.
+#+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes
+ (use-package apheleia
+ :init (apheleia-global-mode +1))
+ (use-package clang-format)
+#+end_src
+
+* RSS
+Use Emacs as an RSS feed with =elfeed=.
+#+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes
+ (use-package elfeed
+ :config
+ (global-set-key (kbd "C-c f") 'elfeed)
+ (global-set-key (kbd "C-c M-f") 'elfeed-update))
+#+end_src
+
+Make =elfeed= more powerful with =elfeed-goodies=.
+#+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes
+ (use-package elfeed-goodies
+ :after elfeed
+ :config
+ (elfeed-goodies/setup))
+#+end_src
+
+Store my feed in Org-mode [[./feed.org][here]].
+#+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes
+ (use-package elfeed-org
+ :config
+ (elfeed-org)
+ (setq rmh-elfeed-org-files (list "~/.config/emacs/feed.org")))
+#+end_src
+
+* Deft
+Use the Deft package to manage notes.
+#+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes
+ (use-package deft
+ :config
+ (global-set-key (kbd "C-c d") 'deft)
+ (setq deft-directory "~/notes/"
+ deft-default-extension "org"))
+#+end_src
+
+* Reference Management
+Use Biblio and Citar to manage citations.
+#+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes
+ (use-package biblio)
+ (use-package citar
+ :custom
+ (citar-bibliography '("~/bib/references.bib"))
+ :hook
+ (LaTeX-mode . citar-capf-setup)
+ (org-mode . citar-capf-setup))
+ (use-package citar-embark
+ :after citar embark
+ :no-require
+ :config (citar-embark-mode))
+#+end_src
diff --git a/common/.config/emacs/user-interface.el.org b/common/.config/emacs/user-interface.el.org
new file mode 100644
index 0000000..ff4bd34
--- /dev/null
+++ b/common/.config/emacs/user-interface.el.org
@@ -0,0 +1,131 @@
+#+title: Emacs User Interface
+
+* Theming
+Set up Source Code Pro with Nerd Font patches as default font and Computer Modern as a variable pitch font.
+#+begin_src emacs-lisp :tangle ~/.config/emacs/user-interface.el :mkdirp yes
+ (defvar jj/mono-font)
+ (defvar jj/var-font)
+ (pcase system-type
+ (`gnu/linux
+ (when (eq (system-name) "gentoo"))
+ (setq jj/mono-font "SauceCodePro Nerd Font-11")
+ (setq jj/var-font "CMU Serif-14"))
+ (`darwin
+ (setq jj/mono-font "SauceCodePro Nerd Font-14:weight=thin")
+ (setq jj/var-font "CMU Serif-18")))
+ (add-to-list 'default-frame-alist
+ `(font . ,jj/mono-font))
+#+end_src
+
+Use my custom Doom Disco light theme.
+#+begin_src emacs-lisp :tangle ~/.config/emacs/user-interface.el :mkdirp yes
+ (use-package doom-themes
+ :straight (doom-themes :type git :host github :repo "doomemacs/themes"
+ :fork (:host github
+ :repo "JacobJanzen/emacs-doom-themes"))
+ :config
+ (setq doom-themes-enable-bold t
+ doom-themes-enable-italic t)
+ (load-theme 'doom-disco t)
+ (doom-themes-org-config))
+
+(add-to-list 'default-frame-alist '(alpha-background . 90))
+#+end_src
+
+Use =doom-modeline= for a nicer modeline.
+#+begin_src emacs-lisp :tangle ~/.config/emacs/user-interface.el :mkdirp yes
+ (use-package doom-modeline
+ :init (doom-modeline-mode 1))
+#+end_src
+
+Remove the title bar.
+#+begin_src emacs-lisp :tangle ~/.config/emacs/user-interface.el :mkdirp yes
+ (add-to-list 'default-frame-alist '(undecorated . t))
+#+end_src
+
+
+* Clean UI
+Disable the Emacs start screen and make the =scratch= buffer default to empty.
+#+begin_src emacs-lisp :tangle ~/.config/emacs/user-interface.el :mkdirp yes
+ (setq inhibit-startup-screen t)
+ (setq initial-scratch-message nil)
+#+end_src
+
+Disable scroll bar, tool bar, and menu bar.
+#+begin_src emacs-lisp :tangle ~/.config/emacs/user-interface.el :mkdirp yes
+ (scroll-bar-mode -1)
+ (tool-bar-mode -1)
+ (menu-bar-mode -1)
+#+end_src
+
+* Fancy Stuff
+Use line numbers by default.
+#+begin_src emacs-lisp :tangle ~/.config/emacs/user-interface.el :mkdirp yes
+ (global-display-line-numbers-mode 1)
+#+end_src
+
+Highlight changes for an operation with =evil-goggles=.
+#+begin_src emacs-lisp :tangle ~/.config/emacs/user-interface.el :mkdirp yes
+ (use-package evil-goggles
+ :after evil
+ :config
+ (evil-goggles-mode)
+ (evil-goggles-use-diff-faces))
+#+end_src
+
+Install nerd font icons.
+#+begin_src emacs-lisp :tangle ~/.config/emacs/user-interface.el :mkdirp yes
+ (use-package nerd-icons)
+#+end_src
+
+Scroll one line at a time.
+#+begin_src emacs-lisp :tangle ~/.config/emacs/user-interface.el :mkdirp yes
+ (setq scroll-conservatively most-positive-fixnum)
+#+end_src
+
+Create parent directories when they don't yet exist.
+#+begin_src emacs-lisp :tangle ~/.config/emacs/user-interface.el :mkdirp yes
+ (defun jj/create-non-existent-directory ()
+ (let ((parent-directory (file-name-directory buffer-file-name)))
+ (when (and (not (file-exists-p parent-directory))
+ (y-or-n-p (format "Directory `%s' does not exist! Create it?" parent-directory)))
+ (make-directory parent-directory t))))
+ (add-to-list 'find-file-not-found-functions #'jj/create-non-existent-directory)
+#+end_src
+
+
+* Whitespace Management
+Use spaces over tabs and set tab width to 4.
+#+begin_src emacs-lisp :tangle ~/.config/emacs/user-interface.el :mkdirp yes
+ (setq-default indent-tabs-mode nil)
+ (setq tab-width 4
+ c-basic-offset tab-width)
+#+end_src
+
+Delete trailing whitespace on save.
+#+begin_src emacs-lisp :tangle ~/.config/emacs/user-interface.el :mkdirp yes
+ (defun jj/before-save-hook ()
+ (unless (eql (with-current-buffer (current-buffer) major-mode)
+ 'markdown-mode)
+ (delete-trailing-whitespace)))
+ (add-hook 'before-save-hook #'jj/before-save-hook)
+#+end_src
+
+* Backup Management
+Don't create backup files.
+#+begin_src emacs-lisp :tangle ~/.config/emacs/user-interface.el :mkdirp yes
+ (setq make-backup-files nil)
+#+end_src
+
+* Customize =dired=
+Use nerd font icons in =dired=.
+#+begin_src emacs-lisp :tangle ~/.config/emacs/user-interface.el :mkdirp yes
+ (use-package nerd-icons-dired
+ :hook (dired-mode . nerd-icons-dired-mode))
+#+end_src
+
+Use colours in =dired= with =diredfl=.
+#+begin_src emacs-lisp :tangle ~/.config/emacs/user-interface.el :mkdirp yes
+ (use-package diredfl
+ :init (diredfl-global-mode 1))
+#+end_src
diff --git a/common/.config/fastfetch/config.org b/common/.config/fastfetch/config.jsonc.org
index 7a2d099..7a2d099 100644
--- a/common/.config/fastfetch/config.org
+++ b/common/.config/fastfetch/config.jsonc.org
diff --git a/common/.config/nvim/init.org b/common/.config/nvim/init.lua.org
index 0f7dffa..0f7dffa 100644
--- a/common/.config/nvim/init.org
+++ b/common/.config/nvim/init.lua.org
diff --git a/common/.config/nvim/lua/appearance.org b/common/.config/nvim/lua/appearance.lua.org
index 1f1d534..1f1d534 100644
--- a/common/.config/nvim/lua/appearance.org
+++ b/common/.config/nvim/lua/appearance.lua.org
diff --git a/common/.config/nvim/lua/behaviour.org b/common/.config/nvim/lua/behaviour.lua.org
index 871b65e..871b65e 100644
--- a/common/.config/nvim/lua/behaviour.org
+++ b/common/.config/nvim/lua/behaviour.lua.org
diff --git a/common/.config/nvim/lua/plugins.org b/common/.config/nvim/lua/plugins.lua.org
index f3027f9..f3027f9 100644
--- a/common/.config/nvim/lua/plugins.org
+++ b/common/.config/nvim/lua/plugins.lua.org
diff --git a/macos/.config/sketchybar/plugins/battery.org b/common/.config/sketchybar/plugins/battery.sh.org
index d3918e2..d3918e2 100644..100755
--- a/macos/.config/sketchybar/plugins/battery.org
+++ b/common/.config/sketchybar/plugins/battery.sh.org
diff --git a/macos/.config/sketchybar/plugins/clock.org b/common/.config/sketchybar/plugins/clock.sh.org
index 1ab5ec3..1ab5ec3 100644..100755
--- a/macos/.config/sketchybar/plugins/clock.org
+++ b/common/.config/sketchybar/plugins/clock.sh.org
diff --git a/macos/.config/sketchybar/plugins/cpu.org b/common/.config/sketchybar/plugins/cpu.sh.org
index 199d89b..199d89b 100644..100755
--- a/macos/.config/sketchybar/plugins/cpu.org
+++ b/common/.config/sketchybar/plugins/cpu.sh.org
diff --git a/macos/.config/sketchybar/plugins/front_app.org b/common/.config/sketchybar/plugins/front_app.sh.org
index 44917e4..44917e4 100644..100755
--- a/macos/.config/sketchybar/plugins/front_app.org
+++ b/common/.config/sketchybar/plugins/front_app.sh.org
diff --git a/macos/.config/sketchybar/plugins/mem.org b/common/.config/sketchybar/plugins/mem.sh.org
index ef3feef..ef3feef 100644..100755
--- a/macos/.config/sketchybar/plugins/mem.org
+++ b/common/.config/sketchybar/plugins/mem.sh.org
diff --git a/macos/.config/sketchybar/plugins/space.org b/common/.config/sketchybar/plugins/space.sh.org
index 97581aa..97581aa 100644..100755
--- a/macos/.config/sketchybar/plugins/space.org
+++ b/common/.config/sketchybar/plugins/space.sh.org
diff --git a/macos/.config/sketchybar/plugins/volume.org b/common/.config/sketchybar/plugins/volume.sh.org
index c53b2a1..c53b2a1 100644..100755
--- a/macos/.config/sketchybar/plugins/volume.org
+++ b/common/.config/sketchybar/plugins/volume.sh.org
diff --git a/macos/.config/sketchybar/sketchybarrc.org b/common/.config/sketchybar/sketchybarrc.org
index 316eaf3..316eaf3 100644..100755
--- a/macos/.config/sketchybar/sketchybarrc.org
+++ b/common/.config/sketchybar/sketchybarrc.org
diff --git a/macos/.config/skhd/skhdrc.org b/common/.config/skhd/skhdrc.org
index e628cd4..e628cd4 100644
--- a/macos/.config/skhd/skhdrc.org
+++ b/common/.config/skhd/skhdrc.org
diff --git a/macos/.config/yabai/yabairc.org b/common/.config/yabai/yabairc.org
index 4307c1f..4307c1f 100644
--- a/macos/.config/yabai/yabairc.org
+++ b/common/.config/yabai/yabairc.org
diff --git a/common/gitconfig.org.gpg b/common/.gitconfig.org.gpg
index 12954b7..12954b7 100644
--- a/common/gitconfig.org.gpg
+++ b/common/.gitconfig.org.gpg
Binary files differ
diff --git a/common/.local/share/fonts/NFM.tar.gz b/common/.local/share/fonts/NFM.tar.gz
deleted file mode 100644
index b862584..0000000
--- a/common/.local/share/fonts/NFM.tar.gz
+++ /dev/null
Binary files differ
diff --git a/common/profile.org b/common/.profile.org
index 99c0908..99c0908 100644
--- a/common/profile.org
+++ b/common/.profile.org
diff --git a/common/zshrc.org b/common/.zshrc.org
index 02601e5..02601e5 100644
--- a/common/zshrc.org
+++ b/common/.zshrc.org
diff --git a/extract_src.py b/extract_src.py
index 665c4c4..766bf1a 100644..100755
--- a/extract_src.py
+++ b/extract_src.py
@@ -1,5 +1,7 @@
#!/usr/bin/env python3
+import os
+from stat import ST_MODE
import sys
import re
@@ -27,3 +29,5 @@ with open(sys.argv[1], "r") as inp:
if min_spaces == -1 or min_spaces > spaces:
min_spaces = spaces
curr.append(re.sub(r"^(\s*),(\*|,\*|#\+|,#\+)", r"\1\2", line))
+
+ os.chmod(sys.argv[2], os.stat(sys.argv[1])[ST_MODE])
diff --git a/install b/install
deleted file mode 100755
index 52acedb..0000000
--- a/install
+++ /dev/null
@@ -1,83 +0,0 @@
-#!/bin/sh
-
-echo 'backing up previous log file to ~/.update-home-old.log'
-mv ~/.update-home.log ~/.update-home-old.log >> /dev/null 2>&1
-
-if ! test -d ~/.dotfiles; then
- echo '.dotfiles should be at ~/.dotfiles; reinstalling dotfiles at ~/.dotfiles...'
- git clone git@git.sr.ht:~jjanzen/.dotfiles ~/.dotfiles >> ~/.update-home.log 2>&1
-fi
-
-echo 'retrieving the latest changes (any unmerged local changes will be stashed)...'
-{
- git stash
- git checkout main
- git pull --rebase
-} >> ~/.update-home.log 2>&1
-
-CWD=$(pwd)
-
-if [ "$(uname)" = 'Darwin' ]; then
- echo 'detected Mac OS; installing Mac OS configuration...'
- cd ~/.dotfiles/macos/ || exit
-elif [ "$(uname)" = 'Linux' ] && grep -q 'ID=nixos' /etc/os-release; then
- echo 'detected NixOS; installing NixOS configuration...'
- cd ~/.dotfiles/nixos/ || exit
-else
- echo 'unsupported operating system'
- exit 1
-fi
-
-echo 'installing configuration files...'
-find -L -- . -type f -name "*\.org" | while read -r file; do
- echo " installing $file..."
- emacs --batch "$file" -f package-initialize --eval '(org-babel-tangle)' >> ~/.update-home.log 2>&1
-done
-find -L -- . -type f -name "*\.org\.gpg" | while read -r file; do
- echo " installing $file..."
- gpg -d --batch "$file" 1> tmp.org 2>> ~/.update-home.log
- emacs --batch tmp.org -f package-initialize --eval '(org-babel-tangle)' >> ~/.update-home.log 2>&1
- rm tmp.org
-done
-
-echo 'installing wallpaper...'
-cp .wallpaper ~/.wallpaper
-if [ "$(uname)" = 'Darwin' ]; then
- osascript -e "tell application \"System Events\" to tell every desktop to set picture to \"/$HOME/.wallpaper\" as POSIX file"
-fi
-
-if [ "$(uname)" = 'Linux' ] && grep -q 'ID=nixos' /etc/os-release; then
- echo 'installing NixOS flake'
- sudo cp ./.flake/system/hardware-configuration.nix ~/.flake/system
- sudo cp ./.flake/home/.wallpaper ~/.flake/home
- sudo cp ./.flake/flake.lock ~/.flake
- sudo nixos-rebuild switch --flake "$HOME/.flake#nixos"
-fi
-
-if [ "$(uname)" = 'Darwin' ]; then
- fonts_changed=false
- echo 'installing fonts...'
- mkdir -p ~/.local/share/fonts
- if ! test -d ~/.local/share/fonts/ComputerModern; then
- echo ' Computer Modern font missing. Installing...'
- tar xf .local/share/fonts/ComputerModern.tar.gz -C ~/.local/share/fonts >> ~/.update-home.log 2>&1
- fonts_changed=true
- fi
- if ! test -f ~/.local/share/fonts/NFM.ttf; then
- echo ' Nerd Font Mono font missing. Installing...'
- tar xf .local/share/fonts/NFM.tar.gz -C ~/.local/share/fonts >> ~/.update-home.log 2>&1
- fonts_changed=true
- fi
- if ! test -d ~/.local/share/fonts/SauceCodePro; then
- echo ' Source Code Pro Nerd Font missing. Installing...'
- tar xf .local/share/fonts/SauceCodePro.tar.gz -C ~/.local/share/fonts >> ~/.update-home.log 2>&1
- fonts_changed=true
- fi
-
- if [ $fonts_changed = true ]; then
- echo ' updating the font cache...'
- fc-cache -f >> ~/.update-home.log
- fi
-fi
-
-cd "$CWD" || exit
diff --git a/macos.local/.clang-format.org b/macos.local/.clang-format.org
new file mode 120000
index 0000000..4b4ef61
--- /dev/null
+++ b/macos.local/.clang-format.org
@@ -0,0 +1 @@
+../common/.clang-format.org \ No newline at end of file
diff --git a/macos.local/.config/alacritty b/macos.local/.config/alacritty
new file mode 120000
index 0000000..bfce794
--- /dev/null
+++ b/macos.local/.config/alacritty
@@ -0,0 +1 @@
+../../common/.config/alacritty \ No newline at end of file
diff --git a/macos/.config/emacs b/macos.local/.config/emacs
index f4e5e56..f4e5e56 120000
--- a/macos/.config/emacs
+++ b/macos.local/.config/emacs
diff --git a/macos/.config/fastfetch b/macos.local/.config/fastfetch
index a73d684..a73d684 120000
--- a/macos/.config/fastfetch
+++ b/macos.local/.config/fastfetch
diff --git a/macos/.config/nvim b/macos.local/.config/nvim
index a0abd03..a0abd03 120000
--- a/macos/.config/nvim
+++ b/macos.local/.config/nvim
diff --git a/macos.local/.config/sketchybar b/macos.local/.config/sketchybar
new file mode 120000
index 0000000..b808184
--- /dev/null
+++ b/macos.local/.config/sketchybar
@@ -0,0 +1 @@
+../../common/.config/sketchybar \ No newline at end of file
diff --git a/macos.local/.config/skhd b/macos.local/.config/skhd
new file mode 120000
index 0000000..3aa80d0
--- /dev/null
+++ b/macos.local/.config/skhd
@@ -0,0 +1 @@
+../../common/.config/skhd \ No newline at end of file
diff --git a/macos.local/.config/yabai b/macos.local/.config/yabai
new file mode 120000
index 0000000..d2b69c5
--- /dev/null
+++ b/macos.local/.config/yabai
@@ -0,0 +1 @@
+../../common/.config/yabai \ No newline at end of file
diff --git a/macos.local/.gitconfig.org.gpg b/macos.local/.gitconfig.org.gpg
new file mode 120000
index 0000000..b4b87c9
--- /dev/null
+++ b/macos.local/.gitconfig.org.gpg
@@ -0,0 +1 @@
+../common/.gitconfig.org.gpg \ No newline at end of file
diff --git a/macos/.gnupg/gpg-agent.org b/macos.local/.gnupg/gpg-agent.org
index 8de64d2..8de64d2 100644
--- a/macos/.gnupg/gpg-agent.org
+++ b/macos.local/.gnupg/gpg-agent.org
diff --git a/macos/.local/bin/launcher.org b/macos.local/.local/bin/launcher.org
index f74d094..f74d094 100644..100755
--- a/macos/.local/bin/launcher.org
+++ b/macos.local/.local/bin/launcher.org
diff --git a/macos/.local/share/fonts b/macos.local/.local/share/fonts
index 9ab89c4..9ab89c4 120000
--- a/macos/.local/share/fonts
+++ b/macos.local/.local/share/fonts
diff --git a/macos.local/.profile.org b/macos.local/.profile.org
new file mode 120000
index 0000000..6341fcf
--- /dev/null
+++ b/macos.local/.profile.org
@@ -0,0 +1 @@
+../common/.profile.org \ No newline at end of file
diff --git a/macos/.ssh/config.org b/macos.local/.ssh/config.org
index e78c4fb..e78c4fb 100644
--- a/macos/.ssh/config.org
+++ b/macos.local/.ssh/config.org
diff --git a/macos/.wallpaper b/macos.local/.wallpaper
index ec41b94..ec41b94 120000
--- a/macos/.wallpaper
+++ b/macos.local/.wallpaper
diff --git a/macos.local/.zshrc.org b/macos.local/.zshrc.org
new file mode 120000
index 0000000..ccbdc43
--- /dev/null
+++ b/macos.local/.zshrc.org
@@ -0,0 +1 @@
+../common/.zshrc.org \ No newline at end of file
diff --git a/macos/Applications/Emacs.app/Contents/MacOS/Emacs.org b/macos.local/Applications/Emacs.app/Contents/MacOS/Emacs.org
index 03c5152..03c5152 100644..100755
--- a/macos/Applications/Emacs.app/Contents/MacOS/Emacs.org
+++ b/macos.local/Applications/Emacs.app/Contents/MacOS/Emacs.org
diff --git a/macos/clang-format.org b/macos/clang-format.org
deleted file mode 120000
index 960b79e..0000000
--- a/macos/clang-format.org
+++ /dev/null
@@ -1 +0,0 @@
-../common/clang-format.org \ No newline at end of file
diff --git a/macos/gitconfig.org.gpg b/macos/gitconfig.org.gpg
deleted file mode 120000
index e4cb6ab..0000000
--- a/macos/gitconfig.org.gpg
+++ /dev/null
@@ -1 +0,0 @@
-../common/gitconfig.org.gpg \ No newline at end of file
diff --git a/macos/profile.org b/macos/profile.org
deleted file mode 120000
index 7db75e0..0000000
--- a/macos/profile.org
+++ /dev/null
@@ -1 +0,0 @@
-../common/profile.org \ No newline at end of file
diff --git a/macos/zshrc.org b/macos/zshrc.org
deleted file mode 120000
index 8a52724..0000000
--- a/macos/zshrc.org
+++ /dev/null
@@ -1 +0,0 @@
-../common/zshrc.org \ No newline at end of file
diff --git a/nixos/.flake/home/programs/emacs/feed.org.org b/nixos/.flake/home/programs/emacs/feed.org.org
index f0de605..d074855 100644..120000
--- a/nixos/.flake/home/programs/emacs/feed.org.org
+++ b/nixos/.flake/home/programs/emacs/feed.org.org
@@ -1,39 +1 @@
-#+title: Emacs RSS Feed
-
-#+begin_src org :tangle ~/.config/emacs/feed.org :mkdirp yes
- ,* Blogs
- :PROPERTIES:
- :ID: elfeed
- :END:
- ,** Journalism :journalism:
- ,*** [[https://waxy.org/feed/][Waxy.org]]
- ,*** [[https://pluralistic.net/feed/][Cory Doctorow]] :technology:software:fiction:
- ,** Computer Science :cs:
- ,*** [[https://a.exozy.me/index.xml][Some Random Website]] :math:algorithms:fiction:
- ,** Technology :technology:
- ,*** [[https://ciechanow.ski/atom.xml][Bartosz Ciechanowshki]]
- ,*** [[https://www.citationneeded.news/rss/][Citation Needed]]
- ,*** [[https://www.lilysthings.org/blog/rss.xml][The Cool Blog]]
- ,** Software :software:
- ,*** [[https://eieio.games/feed.xml][eieio.games]]
- ,*** [[https://ersei.net/en/blog.atom][Ersei]]
- ,*** [[https://lilysthings.org/blog/rss.xml][Lily's Things]]
- ,*** [[https://ntietz.com/atom.xml][Technically a Blog]]
- ,*** [[https://alexwlchan.net/atom.xml][Alex Chan]]
- ,*** [[https://eaton-works.com/feed.atom][Eaton Works]] :hacking:
- ,*** [[https://computer.rip/rss.xml][Computer's Are Bad]] :technology:
- ,*** [[https://mark.stosberg.com/rss/][Mark Stosberg]] :biking:
- ,*** [[https://maia.crimew.gay/feed.xml][Maia Crimew]] :internet:hacking:
- ,*** [[https://drewdevault.com/blog/index.xml][Drew DeVault]]
- ,** Comics :comic:
- ,*** [[https://xkcd.com/atom.xml][XKCD]]
- ,** People I know
- ,*** [[https://www.weavingwatersexpedition.com/news?format=rss][Weaving Waters Expedition]] :journalism:
- ,*** [[https://pinkish.bearblog.dev/feed/][Pinkish]] :software:
- ,*** [[https://jjanzen.ca/rss.xml][Me]] :software:review:
- ,** Internet Infrastructure :internet:software:
- ,*** [[https://daniel.haxx.se/blog/feed/][cURL]]
- ,*** [[https://blog.archive.org/feed/][Archive.org]]
- ,** Reviews :review:
- ,*** [[https://mountainofink.com/?format=rss][Mountain of Ink]]
-#+end_src
+../../../../../common/.config/emacs/feed.org.org \ No newline at end of file
diff --git a/nixos/.flake/home/programs/emacs/force-custom-file.el.org b/nixos/.flake/home/programs/emacs/force-custom-file.el.org
index 8b8a418..06a4dc7 100644..120000
--- a/nixos/.flake/home/programs/emacs/force-custom-file.el.org
+++ b/nixos/.flake/home/programs/emacs/force-custom-file.el.org
@@ -1,8 +1 @@
-#+title: Emacs Force the Usage of a =custom.el= File
-
-Force the usage of a =custom.el= file for customizations instead of placing them in =init.el=.
-#+begin_src emacs-lisp :tangle ~/.config/emacs/force-custom-file.el :mkdirp yes
- (setq custom-file (concat user-emacs-directory "custom.el"))
- (when (file-exists-p custom-file)
- (load custom-file))
-#+end_src
+../../../../../common/.config/emacs/force-custom-file.el.org \ No newline at end of file
diff --git a/nixos/.flake/home/programs/emacs/languages.el.org b/nixos/.flake/home/programs/emacs/languages.el.org
index 3ee63e0..dd60c9f 100644..120000
--- a/nixos/.flake/home/programs/emacs/languages.el.org
+++ b/nixos/.flake/home/programs/emacs/languages.el.org
@@ -1,148 +1 @@
-#+title: Emacs Programming Language Setup
-
-* Shell Script
-Run =eglot= on shell script files.
-#+begin_src emacs-lisp :tangle ~/.config/emacs/languages.el :mkdirp yes
- (add-hook 'sh-mode-hook 'jj/eglot-setup)
-#+end_src
-
-* C
-Run =eglot= on C and C++ files.
-#+begin_src emacs-lisp :tangle ~/.config/emacs/languages.el :mkdirp yes
- (add-hook 'c-mode-hook 'jj/eglot-setup)
- (add-hook 'c++-mode-hook 'jj/eglot-setup)
- (add-hook 'cc-mode-hook 'jj/eglot-setup)
-#+end_src
-
-Run =eglot= on CMake files.
-#+begin_src emacs-lisp :tangle ~/.config/emacs/languages.el :mkdirp yes
- (use-package cmake-mode
- :init
- (add-hook 'cmake-mode-hook 'jj/eglot-setup))
-#+end_src
-
-Turn off C mode in =lex= and =yacc= files.
-#+begin_src emacs-lisp :tangle ~/.config/emacs/languages.el :mkdirp yes
- (add-to-list 'auto-mode-alist '("\\.l$" . prog-mode))
- (add-to-list 'auto-mode-alist '("\\.y$" . prog-mode))
-#+end_src
-
-* Web
-Run =eglot= on HTML files.
-#+begin_src emacs-lisp :tangle ~/.config/emacs/languages.el :mkdirp yes
- (add-hook 'html-mode-hook 'jj/eglot-setup)
-#+end_src
-
-Run =eglot= on CSS files.
-#+begin_src emacs-lisp :tangle ~/.config/emacs/languages.el :mkdirp yes
- (add-hook 'css-mode-hook 'jj/eglot-setup)
-#+end_src
-
-Run =eglot= on JavaScript files.
-#+begin_src emacs-lisp :tangle ~/.config/emacs/languages.el :mkdirp yes
- (add-hook 'js-json-mode-hook 'jj/eglot-setup)
- (add-hook 'js-mode-hook 'jj/eglot-setup)
-#+end_src
-
-* Python
-Run =eglot= on Python files.
-#+begin_src emacs-lisp :tangle ~/.config/emacs/languages.el :mkdirp yes
- (add-hook 'python-mode-hook 'jj/eglot-setup)
-#+end_src
-
-* Go
-Install Go support and run =eglot= on Go files.
-#+begin_src emacs-lisp :tangle ~/.config/emacs/languages.el :mkdirp yes
- (use-package go-mode
- :init
- (add-hook 'go-mode-hook 'jj/eglot-setup))
-#+end_src
-
-Get documentation for Go variables, functions, and arguments.
-#+begin_src emacs-lisp :tangle ~/.config/emacs/languages.el :mkdirp yes
- (use-package go-eldoc
- :init
- (add-hook 'go-mode-hook 'go-eldoc-setup))
-#+end_src
-
-Automatically generate tests in Go.
-#+begin_src emacs-lisp :tangle ~/.config/emacs/languages.el :mkdirp yes
- (use-package go-gen-test)
-#+end_src
-
-Get refactoring tools from =go-guru=.
-#+begin_src emacs-lisp :tangle ~/.config/emacs/languages.el :mkdirp yes
- (use-package go-guru
- :hook (go-mode . go-guru-hl-identifier-mode))
-#+end_src
-
-* Lua
-Install Lua support and run =eglot= on Lua files.
-#+begin_src emacs-lisp :tangle ~/.config/emacs/languages.el :mkdirp yes
- (use-package lua-mode
- :init
- (add-hook 'lua-mode-hook 'jj/eglot-setup))
-#+end_src
-
-Better Lisp editing with =lispy=.
-#+begin_src emacs-lisp :tangle ~/.config/emacs/languages.el :mkdirp yes
- (use-package lispy
- :hook (emacs-lisp-mode . lispy-mode))
- (use-package lispyville
- :after lispy
- :hook (lispy-mode . lispyville-mode))
-#+end_src
-
-Better parentheses handling in lisp with =parinfer-rust-mode=.
-#+begin_src emacs-lisp :tangle ~/.config/emacs/languages.el :mkdirp yes
- (use-package parinfer-rust-mode
- :hook (emacs-lisp-mode . parinfer-rust-mode)
- :init
- (setq parinfer-rust-auto-download t))
-#+end_src
-
-* Markdown
-Install Markdown support and run =eglot= on Markdown files.
-#+begin_src emacs-lisp :tangle ~/.config/emacs/languages.el :mkdirp yes
- (use-package markdown-mode
- :init
- (add-hook 'markdown-mode-hook 'jj/eglot-setup))
-#+end_src
-
-* LaTeX
-Run =eglot= on TeX files.
-#+begin_src emacs-lisp :tangle ~/.config/emacs/languages.el :mkdirp yes
- (add-hook 'tex-mode-hook 'jj/eglot-setup)
-#+end_src
-
-Use AUCTeX for extra LaTeX integration.
-#+begin_src emacs-lisp :tangle ~/.config/emacs/languages.el :mkdirp yes
- (use-package auctex
- :config
- (add-hook 'LaTeX-mode-hook 'jj/eglot-setup)
- (add-hook 'LaTeX-mode-hook
- (lambda ()
- (put 'LaTeX-mode 'eglot-language-id "latex"))))
-#+end_src
-
-Use CDLaTeX for environment and macro insertion.
-#+begin_src emacs-lisp :tangle ~/.config/emacs/languages.el :mkdirp yes
- (use-package cdlatex
- :config
- (add-hook 'LaTeX-mode-hook #'turn-on-cdlatex))
-#+end_src
-
-* YAML
-Install YAML support and run =eglot= on YAML files.
-#+begin_src emacs-lisp :tangle ~/.config/emacs/languages.el :mkdirp yes
- (use-package yaml-mode
- :init
- (add-hook 'yaml-mode-hook 'jj/eglot-setup))
-#+end_src
-
-* Nix
-Install =nix= support and run =eglot= on =nix= files.
-#+begin_src emacs-lisp :tangle ~/.config/emacs/languages.el :mkdirp yes
- (use-package nix-mode
- :mode "\\.nix\\'")
-#+end_src
+../../../../../common/.config/emacs/languages.el.org \ No newline at end of file
diff --git a/nixos/.flake/home/programs/emacs/package-setup.el.org b/nixos/.flake/home/programs/emacs/package-setup.el.org
index 6ed238c..c0f3ead 100644..120000
--- a/nixos/.flake/home/programs/emacs/package-setup.el.org
+++ b/nixos/.flake/home/programs/emacs/package-setup.el.org
@@ -1,25 +1 @@
-#+title: Emacs Package Setup
-Install =straight= for better package management.
-#+begin_src emacs-lisp :tangle ~/.config/emacs/package-setup.el :mkdirp yes
- (defvar bootstrap-version)
- (let ((bootstrap-file
- (expand-file-name
- "straight/repos/straight.el/bootstrap.el"
- (or (bound-and-true-p straight-base-dir)
- user-emacs-directory)))
- (bootstrap-version 7))
- (unless (file-exists-p bootstrap-file)
- (with-current-buffer
- (url-retrieve-synchronously
- "https://raw.githubusercontent.com/radian-software/straight.el/develop/install.el"
- 'silent 'inhibit-cookies)
- (goto-char (point-max))
- (eval-print-last-sexp)))
- (load bootstrap-file nil 'nomessage))
-#+end_src
-
-Install =use-package= for declarative package installation. Make =use-package= default to =ensure t= so that packages are enabled if they are declared.
-#+begin_src emacs-lisp :tangle ~/.config/emacs/package-setup.el :mkdirp yes
- (straight-use-package 'use-package)
- (setq straight-use-package-by-default t)
-#+end_src
+../../../../../common/.config/emacs/package-setup.el.org \ No newline at end of file
diff --git a/nixos/.flake/home/programs/emacs/tools.el.org b/nixos/.flake/home/programs/emacs/tools.el.org
index d52c1b6..ff0296b 100644..120000
--- a/nixos/.flake/home/programs/emacs/tools.el.org
+++ b/nixos/.flake/home/programs/emacs/tools.el.org
@@ -1,391 +1 @@
-#+title: Emacs Tool Setup
-
-* Vi Keybindings
-Use =vi= keybindings with =evil=. Set the undo system to =undo-fu=. Wrapped lines can be moved between with =j= and =k=.
-#+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes
- (use-package evil
- :init
- (setq evil-want-keybinding nil)
- :config
- (evil-mode)
- (evil-global-set-key 'motion "j" 'evil-next-visual-line)
- (evil-global-set-key 'motion "k" 'evil-previous-visual-line)
- (evil-global-set-key 'motion (kbd "RET") nil)
- :custom
- (evil-undo-system 'undo-fu))
-#+end_src
-
-Use =evil-collection= to include =vi= keybindings in extra modes.
-#+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes
- (use-package evil-collection
- :after evil
- :config
- (evil-collection-init))
-#+end_src
-
-* Undo
-Better undo with =undo-fu=.
-#+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes
- (use-package undo-fu)
-#+end_src
-
-Make undo persistent when closing Emacs with =undo-fu-session=.
-#+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes
- (use-package undo-fu-session
- :init (undo-fu-session-global-mode 1))
-#+end_src
-
-* Lookup
-Better lookup with =dumb-jump=.
-#+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes
- (use-package dumb-jump
- :init (add-hook 'xref-backend-functions #'dumb-jump-xref-activate))
-#+end_src
-
-* Version Control
-Install Magit for Git integration.
-#+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes
- (use-package magit)
-#+end_src
-
-* Remote Editing
-#+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes
-(setq tramp-default-method "ssh")
-#+end_src
-
-* Document Viewing
-Replace =DocView= with a better document viewer from =pdf-tools=.
-#+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes
- (use-package pdf-tools
- :config
- (pdf-tools-install)
- :init
- (add-hook 'pdf-view-mode-hook #'(lambda () (display-line-numbers-mode -1)))
- (add-hook 'TeX-after-compilation-finished-functions
- #'TeX-revert-document-buffer)
- :config
- (setq TeX-view-program-selection '((output-pdf "PDF Tools"))
- TeX-view-program-list '(("PDF Tools" TeX-pdf-tools-sync-view))
- TeX-source-correlate-start-server t))
-#+end_src
-
-Save place in PDFs with =saveplace-pdf-view=.
-#+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes
- (use-package saveplace-pdf-view
- :config (save-place-mode 1))
-#+end_src
-
-* Org-Mode
-Ensure that =org= is set up before any of this.
-#+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes
- (use-package org)
-#+end_src
-Set my =org-mode= directory.
-#+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes
- (setq org-directory "~/org")
-#+end_src
-
-Hide emphasis markers because I can see if something is *bold*, /italic/, or =monospace= without needing to see the markers.
-#+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes
- (setq org-hide-emphasis-markers t)
-#+end_src
-
-Set up nicer looking bullet points.
-- they look like circles
-- instead of hyphens
-#+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes
- (font-lock-add-keywords 'org-mode
- '(("^ *\\([-]\\) "
- (0 (prog1 () (compose-region (match-beginning 1) (match-end 1) "•"))))))
-#+end_src
-
-Set up fonts. Don't use =monospace= by default. Do use it where necessary though. Also, make different heading levels different sizes.
-#+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes
- (add-hook 'org-mode-hook 'variable-pitch-mode)
- (custom-set-faces
- `(variable-pitch ((t :font ,jj/var-font)))
- `(fixed-pitch ((t :font ,jj/mono-font)))
- '(org-block ((t (:inherit fixed-pitch))))
- '(org-code ((t (:inherit (shadow fixed-pitch)))))
- '(org-document-info-keyword ((t (:inherit (shadow fixed-pitch)))))
- '(org-meta-line ((t (:inherit (font-lock-comment-face fixed-pitch)))))
- '(org-verbatim ((t (:inherit (shadow fixed-pitch)))))
- '(org-table ((t (:inherit (shadow fixed-pitch)))))
- '(org-document-title ((t (:inherit title :height 2.0 :underline nil))))
- '(org-level-1 ((t (:inherit outline-1 :weight: bold :height 1.75))))
- '(org-level-2 ((t (:inherit outline-2 :weight: bold :height 1.5))))
- '(org-level-2 ((t (:inherit outline-3 :weight: bold :height 1.25))))
- '(org-level-2 ((t (:inherit outline-4 :weight: bold :height 1.1))))
- '(org-level-4 ((t (:inherit outline-4 :height 1.1))))
- '(org-level-5 ((t (:inherit outline-5 :height 1.0))))
- )
-#+end_src
-
-Wrap lines and centre the view to make for a nicer reading experience.
-#+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes
- (use-package visual-fill-column)
- (add-hook 'org-mode-hook 'visual-line-mode)
- (add-hook 'org-mode-hook #'(lambda () (display-line-numbers-mode -1)))
- (defun jj/org-mode-visual-fill ()
- (setq visual-fill-column-width 100
- visual-fill-column-center-text t)
- (visual-fill-column-mode 1))
- (add-hook 'org-mode-hook #'jj/org-mode-visual-fill)
-#+end_src
-
-Increase the size of LaTeX previews.
-#+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes
- (setq org-format-latex-options (plist-put org-format-latex-options :scale 2.0))
-#+end_src
-
-Follow links with the return key.
-#+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes
- (setq org-return-follows-link t)
-#+end_src
-
-Tangle on save.
-#+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes
- (defun org-babel-tangle-config ()
- (when (string-suffix-p ".org" (buffer-file-name))
- (org-babel-tangle)))
- (add-hook 'org-mode-hook
- (lambda ()
- (add-hook 'after-save-hook #'org-babel-tangle-config)))
-#+end_src
-
-Enable Org Crypt.
-#+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes
- (org-crypt-use-before-save-magic)
- (setq org-tags-exclude-from-inheritance '("crypt"))
- (setq org-crypt-key nil)
- (setq auto-save-default nil)
-#+end_src
-
-* Shell
-Use =eshell= as an integrated shell.
-#+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes
- (use-package eshell)
- (global-set-key (kbd "C-c e") 'eshell)
-#+end_src
-
-* Language Servers
-Add =eglot= keybindings.
-#+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes
- (global-set-key (kbd "C-c r") 'eglot-rename)
- (global-set-key (kbd "C-c a") 'eglot-code-actions)
-#+end_src
-
-Install =tree-sitter=.
-#+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes
- (use-package tree-sitter)
- (use-package tree-sitter-langs)
-#+end_src
-
-Define function to set up =eglot= automatically.
-#+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes
- (defun jj/eglot-setup ()
- (eglot-ensure)
- (tree-sitter-mode 1)
- (tree-sitter-hl-mode 1))
-#+end_src
-
-* Completions
-Use company for completions with no delay, starting immediately after first character is typed.
-#+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes
- (use-package company
- :config
- (add-hook 'after-init-hook 'global-company-mode)
- (setq company-idle-delay 0
- company-minimum-prefix-length 1
- company-selection-wrap-around t))
-#+end_src
-
-Use =vertico= as a completion user interface.
-#+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes
- (use-package vertico
- :custom
- (vertico-cycle t)
- :init
- (vertico-mode))
-#+end_src
-
-Use =orderless= to allow typing any portion of a word that you want to search for.
-#+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes
- (use-package orderless
- :ensure t
- :custom
- (completion-styles '(orderless basic))
- (completion-category-overrides '((file (styles basic partial-completion)))))
-#+end_src
-
-Get descriptions of items in =vertico= with =marginalia=.
-#+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes
- (use-package marginalia
- :bind (:map minibuffer-local-map
- ("M-A" . marginalia-cycle))
- :init
- (marginalia-mode))
-#+end_src
-
-Get nerd font icons in completions.
-#+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes
- (use-package nerd-icons-completion
- :config
- (nerd-icons-completion-mode))
-#+end_src
-
-Use consult with =vertico= for extra functionality to various functions.
-#+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes
- (use-package consult
- :bind (
- ("C-c M-x" . consult-mode-command)
- ("C-c h" . consult-history)
- ("C-c k" . consult-kmacro)
- ("C-c m" . consult-man)
- ("C-c i" . consult-info)
- ([remap Info-search] . consult-info)
- ("C-x M-:" . consult-complex-command)
- ("C-x b" . consult-buffer)
- ("C-x 4 b" . consult-buffer-other-window)
- ("C-x 5 b" . consult-buffer-other-frame)
- ("C-x t b" . consult-buffer-other-tab)
- ("C-x r b" . consult-bookmark)
- ("C-x p b" . consult-project-buffer)
- ("M-#" . consult-register-load)
- ("M-'" . consult-register-store)
- ("C-M-#" . consult-register)
- ("M-y" . consult-yank-pop)
- ("M-g e" . consult-compile-error)
- ("M-g f" . consult-flycheck)
- ("M-g g" . consult-goto-line)
- ("M-g M-g" . consult-goto-line)
- ("M-g o" . consult-outline)
- ("M-g m" . consult-mark)
- ("M-g k" . consult-global-mark)
- ("M-g i" . consult-imenu)
- ("M-g I" . consult-imenu-multi)
- ("M-s d" . consult-fd)
- ("M-s c" . consult-locate)
- ("M-s g" . consult-grep)
- ("M-s G" . consult-git-grep)
- ("M-s r" . consult-ripgrep)
- ("M-s l" . consult-line)
- ("M-s L" . consult-line-multi)
- ("M-s k" . consult-keep-lines)
- ("M-s u" . consult-focus-lines)
- ("M-s e" . consult-isearch-history)
- :map isearch-mode-map
- ("M-e" . consult-isearch-history)
- ("M-s e" . consult-isearch-history)
- ("M-s l" . consult-line)
- ("M-s L" . consult-line-multi)
- :map minibuffer-local-map
- ("M-s" . consult-history)
- ("M-r" . consult-history))
- :hook (completion-list-mode . consult-preview-at-point-mode)
- :init
- (setq register-preview-delay 0.5
- register-preview-function #'consult-register-format)
- (advice-add #'register-preview :override #'consult-register-window)
- (setq xref-show-xrefs-function #'consult-xref
- xref-show-definitions-function #'consult-xref)
- :config
- (consult-customize
- consult-theme :preview-key '(:debounce 0.2 any)
- consult-ripgrep consult-git-grep consult-grep
- consult-bookmark consult-recent-file consult-xref
- consult--source-bookmark consult--source-file-register
- consult--source-recent-file consult--source-project-recent-file
- :preview-key '(:debounce 0.4 any))
- (setq consult-narrow-key "<"))
-#+end_src
-
-Use Flycheck for syntax checking.
-#+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes
- (use-package flycheck
- :config
- (add-hook 'after-init-hook #'global-flycheck-mode))
-#+end_src
-
-Use Flyspell for spell checking.
-#+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes
- (dolist (hook '(text-mode-hook))
- (add-hook hook (lambda () (flyspell-mode 1))))
- (use-package flyspell-correct
- :after flyspell
- :bind (:map flyspell-mode-map ("C-;" . flyspell-correct-wrapper)))
-#+end_src
-
-* Snippets
-Use =yasnippet= for snippets so I don't need to type as much.
-#+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes
- (use-package yasnippet
- :init
- (yas-global-mode 1)
- :config
- (global-set-key (kbd "C-c s") 'yas-insert-snippet))
-#+end_src
-
-Install snippet collection for =yasnippet=.
-#+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes
- (use-package yasnippet-snippets)
-#+end_src
-
-* Formatting
-Automatically format with Apheleia and =clang-format=.
-#+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes
- (use-package apheleia
- :init (apheleia-global-mode +1))
- (use-package clang-format)
-#+end_src
-
-* RSS
-Use Emacs as an RSS feed with =elfeed=.
-#+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes
- (use-package elfeed
- :config
- (global-set-key (kbd "C-c f") 'elfeed)
- (global-set-key (kbd "C-c M-f") 'elfeed-update))
-#+end_src
-
-Make =elfeed= more powerful with =elfeed-goodies=.
-#+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes
- (use-package elfeed-goodies
- :after elfeed
- :config
- (elfeed-goodies/setup))
-#+end_src
-
-Store my feed in Org-mode [[./feed.org][here]].
-#+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes
- (use-package elfeed-org
- :config
- (elfeed-org)
- (setq rmh-elfeed-org-files (list "~/.config/emacs/feed.org")))
-#+end_src
-
-* Deft
-Use the Deft package to manage notes.
-#+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes
- (use-package deft
- :config
- (global-set-key (kbd "C-c d") 'deft)
- (setq deft-directory "~/notes/"
- deft-default-extension "org"))
-#+end_src
-
-* Reference Management
-Use Biblio and Citar to manage citations.
-#+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes
- (use-package biblio)
- (use-package citar
- :custom
- (citar-bibliography '("~/bib/references.bib"))
- :hook
- (LaTeX-mode . citar-capf-setup)
- (org-mode . citar-capf-setup))
- (use-package citar-embark
- :after citar embark
- :no-require
- :config (citar-embark-mode))
-#+end_src
+../../../../../common/.config/emacs/tools.el.org \ No newline at end of file
diff --git a/nixos/.flake/home/programs/emacs/user-interface.el.org b/nixos/.flake/home/programs/emacs/user-interface.el.org
index ff4bd34..8a7f782 100644..120000
--- a/nixos/.flake/home/programs/emacs/user-interface.el.org
+++ b/nixos/.flake/home/programs/emacs/user-interface.el.org
@@ -1,131 +1 @@
-#+title: Emacs User Interface
-
-* Theming
-Set up Source Code Pro with Nerd Font patches as default font and Computer Modern as a variable pitch font.
-#+begin_src emacs-lisp :tangle ~/.config/emacs/user-interface.el :mkdirp yes
- (defvar jj/mono-font)
- (defvar jj/var-font)
- (pcase system-type
- (`gnu/linux
- (when (eq (system-name) "gentoo"))
- (setq jj/mono-font "SauceCodePro Nerd Font-11")
- (setq jj/var-font "CMU Serif-14"))
- (`darwin
- (setq jj/mono-font "SauceCodePro Nerd Font-14:weight=thin")
- (setq jj/var-font "CMU Serif-18")))
- (add-to-list 'default-frame-alist
- `(font . ,jj/mono-font))
-#+end_src
-
-Use my custom Doom Disco light theme.
-#+begin_src emacs-lisp :tangle ~/.config/emacs/user-interface.el :mkdirp yes
- (use-package doom-themes
- :straight (doom-themes :type git :host github :repo "doomemacs/themes"
- :fork (:host github
- :repo "JacobJanzen/emacs-doom-themes"))
- :config
- (setq doom-themes-enable-bold t
- doom-themes-enable-italic t)
- (load-theme 'doom-disco t)
- (doom-themes-org-config))
-
-(add-to-list 'default-frame-alist '(alpha-background . 90))
-#+end_src
-
-Use =doom-modeline= for a nicer modeline.
-#+begin_src emacs-lisp :tangle ~/.config/emacs/user-interface.el :mkdirp yes
- (use-package doom-modeline
- :init (doom-modeline-mode 1))
-#+end_src
-
-Remove the title bar.
-#+begin_src emacs-lisp :tangle ~/.config/emacs/user-interface.el :mkdirp yes
- (add-to-list 'default-frame-alist '(undecorated . t))
-#+end_src
-
-
-* Clean UI
-Disable the Emacs start screen and make the =scratch= buffer default to empty.
-#+begin_src emacs-lisp :tangle ~/.config/emacs/user-interface.el :mkdirp yes
- (setq inhibit-startup-screen t)
- (setq initial-scratch-message nil)
-#+end_src
-
-Disable scroll bar, tool bar, and menu bar.
-#+begin_src emacs-lisp :tangle ~/.config/emacs/user-interface.el :mkdirp yes
- (scroll-bar-mode -1)
- (tool-bar-mode -1)
- (menu-bar-mode -1)
-#+end_src
-
-* Fancy Stuff
-Use line numbers by default.
-#+begin_src emacs-lisp :tangle ~/.config/emacs/user-interface.el :mkdirp yes
- (global-display-line-numbers-mode 1)
-#+end_src
-
-Highlight changes for an operation with =evil-goggles=.
-#+begin_src emacs-lisp :tangle ~/.config/emacs/user-interface.el :mkdirp yes
- (use-package evil-goggles
- :after evil
- :config
- (evil-goggles-mode)
- (evil-goggles-use-diff-faces))
-#+end_src
-
-Install nerd font icons.
-#+begin_src emacs-lisp :tangle ~/.config/emacs/user-interface.el :mkdirp yes
- (use-package nerd-icons)
-#+end_src
-
-Scroll one line at a time.
-#+begin_src emacs-lisp :tangle ~/.config/emacs/user-interface.el :mkdirp yes
- (setq scroll-conservatively most-positive-fixnum)
-#+end_src
-
-Create parent directories when they don't yet exist.
-#+begin_src emacs-lisp :tangle ~/.config/emacs/user-interface.el :mkdirp yes
- (defun jj/create-non-existent-directory ()
- (let ((parent-directory (file-name-directory buffer-file-name)))
- (when (and (not (file-exists-p parent-directory))
- (y-or-n-p (format "Directory `%s' does not exist! Create it?" parent-directory)))
- (make-directory parent-directory t))))
- (add-to-list 'find-file-not-found-functions #'jj/create-non-existent-directory)
-#+end_src
-
-
-* Whitespace Management
-Use spaces over tabs and set tab width to 4.
-#+begin_src emacs-lisp :tangle ~/.config/emacs/user-interface.el :mkdirp yes
- (setq-default indent-tabs-mode nil)
- (setq tab-width 4
- c-basic-offset tab-width)
-#+end_src
-
-Delete trailing whitespace on save.
-#+begin_src emacs-lisp :tangle ~/.config/emacs/user-interface.el :mkdirp yes
- (defun jj/before-save-hook ()
- (unless (eql (with-current-buffer (current-buffer) major-mode)
- 'markdown-mode)
- (delete-trailing-whitespace)))
- (add-hook 'before-save-hook #'jj/before-save-hook)
-#+end_src
-
-* Backup Management
-Don't create backup files.
-#+begin_src emacs-lisp :tangle ~/.config/emacs/user-interface.el :mkdirp yes
- (setq make-backup-files nil)
-#+end_src
-
-* Customize =dired=
-Use nerd font icons in =dired=.
-#+begin_src emacs-lisp :tangle ~/.config/emacs/user-interface.el :mkdirp yes
- (use-package nerd-icons-dired
- :hook (dired-mode . nerd-icons-dired-mode))
-#+end_src
-
-Use colours in =dired= with =diredfl=.
-#+begin_src emacs-lisp :tangle ~/.config/emacs/user-interface.el :mkdirp yes
- (use-package diredfl
- :init (diredfl-global-mode 1))
-#+end_src
+../../../../../common/.config/emacs/user-interface.el.org \ No newline at end of file