aboutsummaryrefslogtreecommitdiff
path: root/gentoo
diff options
context:
space:
mode:
authorJacob Janzen <jjanzenn@proton.me>2024-08-09 20:48:10 -0500
committerJacob Janzen <jjanzenn@proton.me>2024-08-09 20:48:10 -0500
commit40f02bc8088ca93224bf65f083c4ab3b17eaf435 (patch)
treef5c4d0bd619a4f7547f318a86ecfdd05e88ca814 /gentoo
parentd97f4feb2c17835d31a4dff5f1109d50c4111943 (diff)
move gentoo into subdirectory
Diffstat (limited to 'gentoo')
-rw-r--r--gentoo/.config/discord/settings.org16
-rw-r--r--gentoo/.config/emacs/feed.org22
-rw-r--r--gentoo/.config/emacs/force-custom-file.org8
-rw-r--r--gentoo/.config/emacs/init.org25
-rw-r--r--gentoo/.config/emacs/languages.org128
-rw-r--r--gentoo/.config/emacs/package-setup.org25
-rw-r--r--gentoo/.config/emacs/tools.org362
-rw-r--r--gentoo/.config/emacs/user-interface.org114
-rw-r--r--gentoo/.config/fastfetch/config.org92
-rw-r--r--gentoo/.config/foot/foot.org66
-rw-r--r--gentoo/.config/fuzzel/fuzzel.org35
-rw-r--r--gentoo/.config/mpd/mpd.org68
-rw-r--r--gentoo/.config/ncmpcpp/bindings.org28
-rw-r--r--gentoo/.config/ncmpcpp/config.org16
-rw-r--r--gentoo/.config/nvim/init.org22
-rw-r--r--gentoo/.config/nvim/lua/appearance.org15
-rw-r--r--gentoo/.config/nvim/lua/behaviour.org19
-rw-r--r--gentoo/.config/nvim/lua/plugins.org27
-rw-r--r--gentoo/.config/sway/config.org274
-rw-r--r--gentoo/.config/sway/poweraction.org9
-rw-r--r--gentoo/.config/sway/powerprompt.org19
-rw-r--r--gentoo/.config/waybar/config.org110
-rw-r--r--gentoo/.config/waybar/style.org124
-rw-r--r--gentoo/.local/share/applications/emacs.org20
-rw-r--r--gentoo/.local/share/applications/steam.org286
-rw-r--r--gentoo/.local/share/fonts/ComputerModern.tar.gzbin0 -> 6553600 bytes
-rw-r--r--gentoo/.local/share/fonts/NFM.tar.gzbin0 -> 2150400 bytes
-rw-r--r--gentoo/.local/share/fonts/SauceCodePro.tar.gzbin0 -> 90941440 bytes
-rw-r--r--gentoo/.ssh/config.org5
-rw-r--r--gentoo/.wallpaperbin0 -> 14122059 bytes
-rw-r--r--gentoo/clang-format.org9
-rw-r--r--gentoo/gitconfig.org18
-rw-r--r--gentoo/install58
-rw-r--r--gentoo/install.org93
-rw-r--r--gentoo/profile.org16
-rw-r--r--gentoo/zshrc.org111
36 files changed, 2240 insertions, 0 deletions
diff --git a/gentoo/.config/discord/settings.org b/gentoo/.config/discord/settings.org
new file mode 100644
index 0000000..725b773
--- /dev/null
+++ b/gentoo/.config/discord/settings.org
@@ -0,0 +1,16 @@
+#+title: Discord settings.json
+There really isn't much to this. I do set =SKIP_HOST_UPDATE= to =true= though to prevent it from trying to auto-update before it appears in my operating system repositories.
+#+begin_src js :tangle ~/.config/discord/settings.json :mkdirp yes
+ {
+ "IS_MAXIMIZED": false,
+ "IS_MINIMIZED": false,
+ "SKIP_HOST_UPDATE": true,
+ "chromiumSwitches": {},
+ "WINDOW_BOUNDS": {
+ "x": 0,
+ "y": 0,
+ "width": 1060,
+ "height": 1870
+ }
+ }
+#+end_src
diff --git a/gentoo/.config/emacs/feed.org b/gentoo/.config/emacs/feed.org
new file mode 100644
index 0000000..9cf8cb6
--- /dev/null
+++ b/gentoo/.config/emacs/feed.org
@@ -0,0 +1,22 @@
+#+title: Emacs RSS Feed
+
+#+begin_src org :tangle ~/.config/emacs/feed.org :mkdirp yes
+ ,* Blogs
+ :PROPERTIES:
+ :ID: elfeed
+ :END:
+ ,** Software :software:
+ ,*** [[https://pluralistic.net/feed/][Cory Doctorow's Blog]] :politics:fiction:
+ ,*** [[https://maia.crimew.gay/feed.xml][Maia Crimew's Blog]] :internet:politics:
+ ,*** [[https://drewdevault.com/blog/index.xml][Drew DeVault's Blog]]
+ ,** Comics :comic:
+ ,*** [[https://xkcd.com/atom.xml][XKCD]]
+ ,** People I know
+ ,*** [[https://pinkish.bearblog.dev/feed/][Pinkish's Blog]] :software:
+ ,*** [[https://jjanzen.ca/rss.xml][Me]] :software:review:
+ ,** Internet Infrastructure :internet:software:
+ ,*** [[https://daniel.haxx.se/blog/feed/][cURL Blog]]
+ ,*** [[https://blog.archive.org/feed/][Archive.org Blog]]
+ ,** Reviews :review:
+ ,*** [[https://mountainofink.com/?format=rss][Mountain of Ink]]
+#+end_src
diff --git a/gentoo/.config/emacs/force-custom-file.org b/gentoo/.config/emacs/force-custom-file.org
new file mode 100644
index 0000000..8b8a418
--- /dev/null
+++ b/gentoo/.config/emacs/force-custom-file.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/gentoo/.config/emacs/init.org b/gentoo/.config/emacs/init.org
new file mode 100644
index 0000000..7eec368
--- /dev/null
+++ b/gentoo/.config/emacs/init.org
@@ -0,0 +1,25 @@
+#+title: Emacs Configuration
+Load [[./force-custom-file.org][force-custom-file.el]] to ensure that =init.el= is not polluted by customizations.
+#+begin_src emacs-lisp :tangle ~/.config/emacs/init.el :mkdirp yes
+ (load "~/.config/emacs/force-custom-file.el")
+#+end_src
+
+Load [[./package-setup.org][package-setup.el]] to allow for package installation.
+#+begin_src emacs-lisp :tangle ~/.config/emacs/init.el :mkdirp yes
+ (load "~/.config/emacs/package-setup.el")
+#+end_src
+
+Load [[./user-interface.org][user-interface.el]] to clean up Emacs' user interface and make it look the way I like.
+#+begin_src emacs-lisp :tangle ~/.config/emacs/init.el :mkdirp yes
+ (load "~/.config/emacs/user-interface.el")
+#+end_src
+
+Load [[./tools.org][tools.el]] to add functionality to Emacs.
+#+begin_src emacs-lisp :tangle ~/.config/emacs/init.el :mkdirp yes
+ (load "~/.config/emacs/tools.el")
+#+end_src
+
+Load [[./languages.org][languages.el]] to add language and language server protocol support.
+#+begin_src emacs-lisp :tangle ~/.config/emacs/init.el :mkdirp yes
+ (load "~/.config/emacs/tools.el")
+#+end_src
diff --git a/gentoo/.config/emacs/languages.org b/gentoo/.config/emacs/languages.org
new file mode 100644
index 0000000..a0a19e4
--- /dev/null
+++ b/gentoo/.config/emacs/languages.org
@@ -0,0 +1,128 @@
+#+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
+
+* 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/tools.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
diff --git a/gentoo/.config/emacs/package-setup.org b/gentoo/.config/emacs/package-setup.org
new file mode 100644
index 0000000..6ed238c
--- /dev/null
+++ b/gentoo/.config/emacs/package-setup.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/gentoo/.config/emacs/tools.org b/gentoo/.config/emacs/tools.org
new file mode 100644
index 0000000..54da2b4
--- /dev/null
+++ b/gentoo/.config/emacs/tools.org
@@ -0,0 +1,362 @@
+#+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
+
+* 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 (:family "CMU Serif" :height 130 :weight thin))))
+ '(fixed-pitch ((t (:family "SauceCodePro Nerd Font" :height 110 :weight regular))))
+ '(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
+
+* 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
diff --git a/gentoo/.config/emacs/user-interface.org b/gentoo/.config/emacs/user-interface.org
new file mode 100644
index 0000000..b5a860d
--- /dev/null
+++ b/gentoo/.config/emacs/user-interface.org
@@ -0,0 +1,114 @@
+#+title: Emacs User Interface
+
+* Theming
+Set the default font to the Source Code Pro nerd font variant. I use size 14 font.
+#+begin_src emacs-lisp :tangle ~/.config/emacs/user-interface.el :mkdirp yes
+ (set-face-attribute 'default t :font "Sauce Code Pro Nerd Font-14")
+#+end_src
+
+Use my custom Emacs 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
+
+* 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/gentoo/.config/fastfetch/config.org b/gentoo/.config/fastfetch/config.org
new file mode 100644
index 0000000..7a2d099
--- /dev/null
+++ b/gentoo/.config/fastfetch/config.org
@@ -0,0 +1,92 @@
+#+title: Fastfetch Settings
+Open a JSON object.
+#+begin_src js :tangle ~/.config/fastfetch/config.jsonc :mkdirp yes
+ {
+#+end_src
+
+Use a =sixel= image for the logo.
+#+begin_src js :tangle ~/.config/fastfetch/config.jsonc :mkdirp yes
+ "logo": {
+ "type": "raw",
+ "source": "~/.config/fastfetch/logo.sixel",
+ "width": 40,
+ "height": 19
+ },
+#+end_src
+
+Two spaces between an item and its key.
+#+begin_src js :tangle ~/.config/fastfetch/config.jsonc :mkdirp yes
+ "display": {
+ "separator": " "
+ },
+#+end_src
+
+Define the modules in the =fastfetch= display.
+#+begin_src js :tangle ~/.config/fastfetch/config.jsonc :mkdirp yes
+ "modules": [
+ "title",
+ {
+ "type": "custom",
+ "format": "──────────────────────────────────"
+ },
+ {
+ "type": "os",
+ "key": ""
+ },
+ {
+ "type": "kernel",
+ "key": "󰞸"
+ },
+ {
+ "type": "uptime",
+ "key": ""
+ },
+ {
+ "type": "packages",
+ "key": ""
+ },
+ {
+ "type": "shell",
+ "key": ""
+ },
+ {
+ "type": "display",
+ "key": "󰍹"
+ },
+ {
+ "type": "wm",
+ "key": ""
+ },
+ {
+ "type": "terminal",
+ "key": ""
+ },
+ {
+ "type": "cpu",
+ "key": ""
+ },
+ {
+ "type": "gpu",
+ "key": ""
+ },
+ {
+ "type": "memory",
+ "key": ""
+ },
+ {
+ "type": "disk",
+ "key": ""
+ },
+ {
+ "type": "locale",
+ "key": ""
+ },
+ "break",
+ "colors"
+ ]
+#+end_src
+
+Close the JSON object.
+#+begin_src js :tangle ~/.config/fastfetch/config.jsonc :mkdirp yes
+}
+#+end_src
diff --git a/gentoo/.config/foot/foot.org b/gentoo/.config/foot/foot.org
new file mode 100644
index 0000000..01d7489
--- /dev/null
+++ b/gentoo/.config/foot/foot.org
@@ -0,0 +1,66 @@
+#+title: Foot Settings
+* Basic Settings
+Use Source Code Pro with Nerd Font in size 10.
+#+begin_src conf :tangle ~/.config/foot/foot.ini :mkdirp yes
+ font=SauceCodePro Nerd Font:size=10
+#+end_src
+
+Add 6 pixel padding around the terminal.
+#+begin_src conf :tangle ~/.config/foot/foot.ini :mkdirp yes
+ pad=6x6
+#+end_src
+
+* URL
+Use Firefox to open URLs.
+#+begin_src conf :tangle ~/.config/foot/foot.ini :mkdirp yes
+ [url]
+ launch=firefox ${url}
+#+end_src
+
+* Mouse
+Hide the mouse when typing.
+#+begin_src conf :tangle ~/.config/foot/foot.ini :mkdirp yes
+ [mouse]
+ hide-when-typing=yes
+#+end_src
+
+* Colours
+The colours are defined here.
+#+begin_src conf :tangle ~/.config/foot/foot.ini :mkdirp yes
+ [colors]
+#+end_src
+
+I use a slightly transparent background.
+#+begin_src conf :tangle ~/.config/foot/foot.ini :mkdirp yes
+ alpha=0.9
+#+end_src
+
+Set my foreground and background colours.
+#+begin_src conf :tangle ~/.config/foot/foot.ini :mkdirp yes
+ background=ece0c9
+ foreground=191916
+#+end_src
+
+Set my regular 8 colours.
+#+begin_src conf :tangle ~/.config/foot/foot.ini :mkdirp yes
+ regular0=191916
+ regular1=ac4438
+ regular2=354d52
+ regular3=ba9151
+ regular4=465b91
+ regular5=5b5489
+ regular6=4e6062
+ regular7=c9ad7a
+#+end_src
+
+Set my bright 8 colours.
+#+begin_src conf :tangle ~/.config/foot/foot.ini :mkdirp yes
+ bright0=293c3c
+ bright1=d8611c
+ bright2=4b7b53
+ bright3=d8974b
+ bright4=2f3d91
+ bright5=735e82
+ bright6=6b8f92
+ bright7=ece0c9
+#+end_src
diff --git a/gentoo/.config/fuzzel/fuzzel.org b/gentoo/.config/fuzzel/fuzzel.org
new file mode 100644
index 0000000..be2d91a
--- /dev/null
+++ b/gentoo/.config/fuzzel/fuzzel.org
@@ -0,0 +1,35 @@
+#+title: Fuzzel Configuration
+
+Place Fuzzel above fullscreen windows.
+#+begin_src conf :tangle ~/.config/fuzzel/fuzzel.ini :mkdirp yes
+ layer=overlay
+#+end_src
+
+Define fields to search in.
+#+begin_src conf :tangle ~/.config/fuzzel/fuzzel.ini :mkdirp yes
+ fields=name,generic,comment,categories,filename,keywords
+#+end_src
+
+Launch terminal programs in =foot=.
+#+begin_src conf :tangle ~/.config/fuzzel/fuzzel.ini :mkdirp yes
+ terminal=foot -e
+#+end_src
+
+Use Source Code Pro like the rest of my configuration.
+#+begin_src conf :tangle ~/.config/fuzzel/fuzzel.ini :mkdirp yes
+ font=SauceCodePro Nerd Font:size=15
+#+end_src
+
+Set the colours.
+#+begin_src conf :tangle ~/.config/fuzzel/fuzzel.ini :mkdirp yes
+ [colors]
+ background=ece0c9e6
+ selection=cfbc8ce6
+ border=ffffff00
+#+end_src
+
+Use a square border.
+#+begin_src conf :tangle ~/.config/fuzzel/fuzzel.ini :mkdirp yes
+ [border]
+ radius=0
+#+end_src
diff --git a/gentoo/.config/mpd/mpd.org b/gentoo/.config/mpd/mpd.org
new file mode 100644
index 0000000..4eca326
--- /dev/null
+++ b/gentoo/.config/mpd/mpd.org
@@ -0,0 +1,68 @@
+#+title: MPD Settings
+* Directories
+Check for music files in =~/Music=.
+#+begin_src conf :tangle ~/.config/mpd/mpd.conf :mkdirp yes
+ music_directory "~/Music"
+#+end_src
+
+Put playlists at =~/.config/mpd/playlists=.
+#+begin_src conf :tangle ~/.config/mpd/mpd.conf :mkdirp yes
+ playlist_directory "~/.config/mpd/playlists"
+#+end_src
+
+Put database at =~/.config/mpd/database=.
+#+begin_src conf :tangle ~/.config/mpd/mpd.conf :mkdirp yes
+ db_file "~/.config/mpd/database"
+#+end_src
+
+Put log file at =~/.config/mpd/log=.
+#+begin_src conf :tangle ~/.config/mpd/mpd.conf :mkdirp yes
+ log_file "~/.config/mpd/log"
+#+end_src
+
+Put PID file at =~/.config/mpd/pid=.
+#+begin_src conf :tangle ~/.config/mpd/mpd.conf :mkdirp yes
+ pid_file "~/.config/mpd/pid"
+#+end_src
+
+Put the state file at =~/.config/mpd/state=.
+#+begin_src conf :tangle ~/.config/mpd/mpd.conf :mkdirp yes
+ state_file "~/.config/mpd/state"
+#+end_src
+
+Put the sticker file at =~/.config/mpd/sticker.sql=.
+#+begin_src conf :tangle ~/.config/mpd/mpd.conf :mkdirp yes
+ sticker_file "~/.config/mpd/sticker.sql"
+#+end_src
+
+Use UTF-8 in the file system.
+#+begin_src conf :tangle ~/.config/mpd/mpd.conf :mkdirp yes
+ filesystem_charset "UTF-8"
+#+end_src
+
+* Network
+Run MPD on =localhost=.
+#+begin_src conf :tangle ~/.config/mpd/mpd.conf :mkdirp yes
+ bind_to_address "localhost"
+#+end_src
+
+* Outputs
+Output to PipeWire.
+#+begin_src conf :tangle ~/.config/mpd/mpd.conf :mkdirp yes
+ audio_output {
+ type "pipewire"
+ name "Pipewire"
+ mixer_type "hardware"
+ enabled "yes"
+ }
+#+end_src
+
+Output to FIFO.
+#+begin_src conf :tangle ~/.config/mpd/mpd.conf :mkdirp yes
+ audio_output {
+ type "fifo"
+ name "my_fifo"
+ path "~/.config/mpd/mpd.fifo"
+ format "44100:16:2"
+ }
+#+end_src
diff --git a/gentoo/.config/ncmpcpp/bindings.org b/gentoo/.config/ncmpcpp/bindings.org
new file mode 100644
index 0000000..1982a6d
--- /dev/null
+++ b/gentoo/.config/ncmpcpp/bindings.org
@@ -0,0 +1,28 @@
+#+title: =ncmpcpp= Keyboard Bindings
+Use =vi= motions in =ncmpcpp=.
+#+begin_src conf :tangle ~/.config/ncmpcpp/bindings :mkdirp yes
+def_key "j"
+ scroll_down
+def_key "k"
+ scroll_up
+def_key "h"
+ previous_column
+def_key "l"
+ next_column
+def_key "ctrl-b"
+ page_up
+def_key "ctrl-u"
+ page_up
+def_key "ctrl-f"
+ page_down
+def_key "ctrl-d"
+ page_down
+def_key "g"
+ move_home
+def_key "G"
+ move_end
+def_key "n"
+ next_found_item
+def_key "N"
+ previous_found_item
+#+end_src
diff --git a/gentoo/.config/ncmpcpp/config.org b/gentoo/.config/ncmpcpp/config.org
new file mode 100644
index 0000000..8195877
--- /dev/null
+++ b/gentoo/.config/ncmpcpp/config.org
@@ -0,0 +1,16 @@
+#+title: =ncmpcpp= Configuration
+Set the =ncmpcpp= directory to =~/.config/ncmpcpp/=.
+#+begin_src conf :tangle ~/.config/ncmpcpp/config :mkdirp yes
+ncmpcpp_directory = "~/.config/ncmpcpp"
+#+end_src
+
+Set the host/port pair to find the music player daemon at.
+#+begin_src conf :tangle ~/.config/ncmpcpp/config :mkdirp yes
+mpd_host = "localhost"
+mpd_port = "6600"
+#+end_src
+
+Specify the location of the Music directory to be =~/Music=.
+#+begin_src conf :tangle ~/.config/ncmpcpp/config :mkdirp yes
+mpd_music_dir = "~/Music"
+#+end_src
diff --git a/gentoo/.config/nvim/init.org b/gentoo/.config/nvim/init.org
new file mode 100644
index 0000000..9c15739
--- /dev/null
+++ b/gentoo/.config/nvim/init.org
@@ -0,0 +1,22 @@
+#+title: Neovim Settings
+This is the entry point for my Neovim configuration. I don't use Neovim much these days, so it is very stripped back from what it once was. Emacs is much comfier for most uses, so Neovim is mostly relegated to editing system configuration files.
+
+Disable timeout to speed things up.
+#+begin_src lua :tangle ~/.config/nvim/init.lua :mkdirp yes
+ vim.cmd([[set notimeout]])
+#+end_src
+
+Install plugins in the [[./lua/plugins.org][plugins.lua]] file.
+#+begin_src lua :tangle ~/.config/nvim/init.lua :mkdirp yes
+ require('plugins')
+#+end_src
+
+Set up behaviour in the [[./lua/behaviour.org][behaviour.lua]] file.
+#+begin_src lua :tangle ~/.config/nvim/init.lua :mkdirp yes
+ require('behaviour')
+#+end_src
+
+Set up appearance in the [[./lua/appearance.org][appearance.lua]] file.
+#+begin_src lua :tangle ~/.config/nvim/init.lua :mkdirp yes
+ require('appearance')
+#+end_src
diff --git a/gentoo/.config/nvim/lua/appearance.org b/gentoo/.config/nvim/lua/appearance.org
new file mode 100644
index 0000000..274f438
--- /dev/null
+++ b/gentoo/.config/nvim/lua/appearance.org
@@ -0,0 +1,15 @@
+#+title: Neovim Appearance Settings
+Use line numbers.
+#+begin_src lua :tangle ~/.config/nvim/lua/appearance.lua :mkdirp yes
+ vim.opt.number = true
+#+end_src
+
+Turn on syntax highlighting.
+#+begin_src lua :tangle ~/.config/nvim/lua/appearance.lua :mkdirp yes
+ vim.cmd([[
+ set termguicolors
+ syntax on
+ colorscheme default
+ set background=light
+ ]])
+#+end_src
diff --git a/gentoo/.config/nvim/lua/behaviour.org b/gentoo/.config/nvim/lua/behaviour.org
new file mode 100644
index 0000000..871b65e
--- /dev/null
+++ b/gentoo/.config/nvim/lua/behaviour.org
@@ -0,0 +1,19 @@
+#+title: Neovim Behaviour Settings
+
+Use tabs with width 4.
+#+begin_src lua :tangle ~/.config/nvim/lua/behaviour.lua :mkdirp yes
+ vim.opt.tabstop = 4
+ vim.opt.expandtab = true
+ vim.opt.shiftwidth = 4
+ vim.opt.autoindent = true
+#+end_src
+
+Better command line completion.
+#+begin_src lua :tangle ~/.config/nvim/lua/behaviour.lua :mkdirp yes
+ vim.opt.wildmode = 'longest,list'
+#+end_src
+
+Better management of file types.
+#+begin_src lua :tangle ~/.config/nvim/lua/behaviour.lua :mkdirp yes
+ vim.cmd('filetype plugin indent on')
+#+end_src
diff --git a/gentoo/.config/nvim/lua/plugins.org b/gentoo/.config/nvim/lua/plugins.org
new file mode 100644
index 0000000..f3027f9
--- /dev/null
+++ b/gentoo/.config/nvim/lua/plugins.org
@@ -0,0 +1,27 @@
+#+title: Neovim Plugins
+* Setup
+Use =lazy= to manage plugins. This block activates =lazy=.
+#+begin_src lua :tangle ~/.config/nvim/lua/plugins.lua :mkdirp yes
+ local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim"
+ if not vim.loop.fs_stat(lazypath) then
+ vim.fn.system({
+ "git",
+ "clone",
+ "--filter=blob:none",
+ "https://github.com/folke/lazy.nvim.git",
+ "--branch=stable",
+ lazypath,
+ })
+ end
+ vim.opt.rtp:prepend(lazypath)
+#+end_src
+
+* Plugins
+I use =lightline= for a nice status bar. The Ayu theme matches my overall colour scheme. =delimitmate= provides better delimiter handling. Trailing whitespace is highlighted with =vim-trailing-whitespace=.
+#+begin_src lua :tangle ~/.config/nvim/lua/plugins.lua :mkdirp yes
+ require('lazy').setup({
+ 'itchyny/lightline.vim',
+ 'Raimondi/delimitMate',
+ 'bronson/vim-trailing-whitespace',
+ })
+#+end_src
diff --git a/gentoo/.config/sway/config.org b/gentoo/.config/sway/config.org
new file mode 100644
index 0000000..bf29a61
--- /dev/null
+++ b/gentoo/.config/sway/config.org
@@ -0,0 +1,274 @@
+#+title: Sway Configuration
+* Variables
+Use =super= as modifier key.
+#+begin_src conf :tangle ~/.config/sway/config :mkdirp yes
+ set $mod Mod4
+#+end_src
+
+Use =vi= motions as directional inputs.
+#+begin_src conf :tangle ~/.config/sway/config :mkdirp yes
+ set $left h
+ set $down j
+ set $up k
+ set $right l
+#+end_src
+
+Use =foot= as default terminal.
+#+begin_src conf :tangle ~/.config/sway/config :mkdirp yes
+ set $term foot
+#+end_src
+
+Use =wofi= as app launcher.
+#+begin_src conf :tangle ~/.config/sway/config :mkdirp yes
+ set $menu fuzzel
+#+end_src
+
+* Startup Application
+Use =dbus= environment.
+#+begin_src conf :tangle ~/.config/sway/config :mkdirp yes
+ exec --no-startup-id dbus-update-activation-environment --all
+#+end_src
+
+Use =mako= as notification daemon.
+#+begin_src conf :tangle ~/.config/sway/config :mkdirp yes
+ exec mako
+#+end_src
+
+Launch PipeWire without =systemd=.
+#+begin_src conf :tangle ~/.config/sway/config :mkdirp yes
+ exec gentoo-pipewire-launcher &
+#+end_src
+
+Launch =blueman-applet= as Bluetooth daemon.
+#+begin_src conf :tangle ~/.config/sway/config :mkdirp yes
+ exec blueman-applet
+#+end_src
+
+Launch music player daemon.
+#+begin_src conf :tangle ~/.config/sway/config :mkdirp yes
+ exec mpd
+#+end_src
+
+Launch =mpdscribble= as scrobbler daemon.
+#+begin_src conf :tangle ~/.config/sway/config :mkdirp yes
+ exec mpdscribble
+#+end_src
+
+Launch Emacs daemon.
+#+begin_src conf :tangle ~/.config/sway/config :mkdirp yes
+ exec emacs --daemon
+#+end_src
+
+* Display
+I use a vertical monitor on the left and horizontal monitor on the right.
+#+begin_src conf :tangle ~/.config/sway/config :mkdirp yes
+ output HDMI-A-1 resolution 1920x1080 position 1080 140
+ output HDMI-A-2 resolution 1920x1080 transform 90 position 0 0
+#+end_src
+
+Use the file at =~/.wallpaper= as my wallpaper.
+#+begin_src conf :tangle ~/.config/sway/config :mkdirp yes
+ output * bg ~/.wallpaper fill
+#+end_src
+
+Remove borders from windows.
+#+begin_src conf :tangle ~/.config/sway/config :mkdirp yes
+ default_border none
+ default_floating_border none
+ font pango:monospace 1
+#+end_src
+
+Use 10 pixel gaps.
+#+begin_src conf :tangle ~/.config/sway/config :mkdirp yes
+ gaps inner 10
+#+end_src
+
+Use =waybar= as a top bar.
+#+begin_src conf :tangle ~/.config/sway/config :mkdirp yes
+ bar {
+ position top
+
+ status_command waybar
+ mode invisible
+ }
+#+end_src
+
+* Input
+Use pointer acceleration.
+#+begin_src conf :tangle ~/.config/sway/config :mkdirp yes
+ input * {
+ accel_profile "adaptive"
+ pointer_accel -.5
+ }
+#+end_src
+
+* Controls
+Add ability to lock the screen with =swaylock=. Turn off the screen after 15 seconds on lock screen.
+#+begin_src conf :tangle ~/.config/sway/config :mkdirp yes
+ bindsym $mod+Control+l exec swaylock --ignore-empty-password --show-failed-attempts --image ~/.wallpaper
+ exec swayidle -w timeout 15 'if pgrep -x swaylock; then swaymsg "output * power off"; fi' resume 'swaymsg "output * power on"'
+#+end_src
+
+Add keybinding to open a terminal emulator.
+#+begin_src conf :tangle ~/.config/sway/config :mkdirp yes
+ bindsym $mod+Return exec $term
+#+end_src
+
+Add keybinding for killing a window.
+#+begin_src conf :tangle ~/.config/sway/config :mkdirp yes
+ bindsym $mod+Shift+q kill
+#+end_src
+
+Add keybinding for opening an app launcher.
+#+begin_src conf :tangle ~/.config/sway/config :mkdirp yes
+ bindsym $mod+d exec $menu
+#+end_src
+
+Holding the modifier key allows moving a window.
+#+begin_src conf :tangle ~/.config/sway/config :mkdirp yes
+ floating_modifier $mod normal
+#+end_src
+
+Add keybinding for reloading the configuration.
+#+begin_src conf :tangle ~/.config/sway/config :mkdirp yes
+ bindsym $mod+Shift+c reload
+#+end_src
+
+Add keybinding to launch logout/power off/restart [[file:powerprompt.org][prompt]] which also activates with the power key.
+#+begin_src conf :tangle ~/.config/sway/config :mkdirp yes
+ bindsym $mod+Shift+e exec bash ~/.config/sway/powerprompt
+ bindsym XF86PowerOff exec bash ~/.config/sway/powerprompt
+#+end_src
+
+Change focus keybindings.
+#+begin_src conf :tangle ~/.config/sway/config :mkdirp yes
+ bindsym $mod+$left focus left
+ bindsym $mod+$down focus down
+ bindsym $mod+$up focus up
+ bindsym $mod+$right focus right
+
+ bindsym $mod+Left focus left
+ bindsym $mod+Down focus down
+ bindsym $mod+Up focus up
+ bindsym $mod+Right focus right
+#+end_src
+
+Move window keybindings.
+#+begin_src conf :tangle ~/.config/sway/config :mkdirp yes
+ bindsym $mod+Shift+$left move left
+ bindsym $mod+Shift+$down move down
+ bindsym $mod+Shift+$up move up
+ bindsym $mod+Shift+$right move right
+
+ bindsym $mod+Shift+Left move left
+ bindsym $mod+Shift+Down move down
+ bindsym $mod+Shift+Up move up
+ bindsym $mod+Shift+Right move right
+#+end_src
+
+Change workspace keybindings.
+#+begin_src conf :tangle ~/.config/sway/config :mkdirp yes
+ bindsym $mod+1 workspace number 1
+ bindsym $mod+2 workspace number 2
+ bindsym $mod+3 workspace number 3
+ bindsym $mod+4 workspace number 4
+ bindsym $mod+5 workspace number 5
+ bindsym $mod+6 workspace number 6
+ bindsym $mod+7 workspace number 7
+ bindsym $mod+8 workspace number 8
+ bindsym $mod+9 workspace number 9
+ bindsym $mod+0 workspace number 10
+#+end_src
+
+Move window to workspace keybindings.
+#+begin_src conf :tangle ~/.config/sway/config :mkdirp yes
+ bindsym $mod+Shift+1 move container to workspace number 1
+ bindsym $mod+Shift+2 move container to workspace number 2
+ bindsym $mod+Shift+3 move container to workspace number 3
+ bindsym $mod+Shift+4 move container to workspace number 4
+ bindsym $mod+Shift+5 move container to workspace number 5
+ bindsym $mod+Shift+6 move container to workspace number 6
+ bindsym $mod+Shift+7 move container to workspace number 7
+ bindsym $mod+Shift+8 move container to workspace number 8
+ bindsym $mod+Shift+9 move container to workspace number 9
+ bindsym $mod+Shift+0 move container to workspace number 10
+#+end_src
+
+Set split direction keybindings.
+#+begin_src conf :tangle ~/.config/sway/config :mkdirp yes
+ bindsym $mod+v splith
+ bindsym $mod+s splitv
+#+end_src
+
+Toggle layout keybindings.
+#+begin_src conf :tangle ~/.config/sway/config :mkdirp yes
+ bindsym $mod+e layout toggle split
+#+end_src
+
+Define full screen keybinding.
+#+begin_src conf :tangle ~/.config/sway/config :mkdirp yes
+ bindsym $mod+f fullscreen
+#+end_src
+
+Define toggle floating keybinding.
+#+begin_src conf :tangle ~/.config/sway/config :mkdirp yes
+ bindsym $mod+Shift+space floating toggle
+#+end_src
+
+Move focus between floating and tiled layer keybinding.
+#+begin_src conf :tangle ~/.config/sway/config :mkdirp yes
+ bindsym $mod+space focus mode_toggle
+#+end_src
+
+Focus on the parent window keybinding.
+#+begin_src conf :tangle ~/.config/sway/config :mkdirp yes
+ bindsym $mod+a focus parent
+#+end_src
+
+Keybindings to move a window to the scratchpad and back from it.
+#+begin_src conf :tangle ~/.config/sway/config :mkdirp yes
+ bindsym $mod+Shift+minus move scratchpad
+ bindsym $mod+minus scratchpad show
+#+end_src
+
+Add resize keybindings.
+#+begin_src conf :tangle ~/.config/sway/config :mkdirp yes
+ mode "resize" {
+ bindsym $left resize shrink width 10px
+ bindsym $down resize grow height 10px
+ bindsym $up resize shrink height 10px
+ bindsym $right resize grow width 10px
+
+ bindsym Left resize shrink width 10px
+ bindsym Down resize grow height 10px
+ bindsym Up resize shrink height 10px
+ bindsym Right resize grow width 10px
+
+ bindsym Return mode "default"
+ bindsym Escape mode "default"
+ }
+ bindsym $mod+r mode "resize"
+#+end_src
+
+Add screenshot keybinding.
+#+begin_src conf :tangle ~/.config/sway/config :mkdirp yes
+ bindsym $mod+Shift+s exec grim -g "$(slurp)" - | wl-copy
+#+end_src
+
+Add volume keybindings.
+#+begin_src conf :tangle ~/.config/sway/config :mkdirp yes
+ bindsym XF86AudioRaiseVolume exec wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%+
+ bindsym XF86AudioLowerVolume exec wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-
+ bindsym XF86AudioMute exec wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle
+#+end_src
+
+Add pause keybinding.
+#+begin_src conf :tangle ~/.config/sway/config :mkdirp yes
+ bindsym XF86Eject exec mpc toggle
+#+end_src
+
+* Extras
+Load extra configuration.
+#+begin_src conf :tangle ~/.config/sway/config :mkdirp yes
+ include /etc/sway/config.d/*
+#+end_src
diff --git a/gentoo/.config/sway/poweraction.org b/gentoo/.config/sway/poweraction.org
new file mode 100644
index 0000000..68105ca
--- /dev/null
+++ b/gentoo/.config/sway/poweraction.org
@@ -0,0 +1,9 @@
+#+title: Sway Power Action Script
+Run this shell script from power off menu to either log off, restart, or power off.
+#+begin_src sh :tangle ~/.config/sway/poweraction :mkdirp yes
+ rm ~/.swaynaglock
+ case $1 in
+ logout) swaymsg exit;;
+ ,*) doas "/sbin/$1";;
+ esac
+#+end_src
diff --git a/gentoo/.config/sway/powerprompt.org b/gentoo/.config/sway/powerprompt.org
new file mode 100644
index 0000000..dcc93fd
--- /dev/null
+++ b/gentoo/.config/sway/powerprompt.org
@@ -0,0 +1,19 @@
+#+title: Sway Power Prompt Script
+Activate =swaynag= prompt with power-off options if the lock file is not present which executes an [[file:poweraction.org][action]].
+#+begin_src sh :tangle ~/.config/sway/powerprompt :mkdirp yes
+ if test -f ~/.swaynaglock; then
+ killall swaynag
+ rm ~/.swaynaglock
+ else
+ touch ~/.swaynaglock
+ swaynag --background 00000030 --border 00000030 --border-bottom 00000030 --button-background 00000030 --font=SauceCodePro Nerd Font 256\
+ -m '' \
+ -b '󰍃' \
+ 'bash ~/.config/sway/poweraction logout' \
+ -b '⏻' \
+ 'bash ~/.config/sway/poweraction poweroff' \
+ -b '' \
+ 'bash ~/.config/sway/poweraction reboot'
+ rm ~/.swaynaglock
+ fi
+#+end_src
diff --git a/gentoo/.config/waybar/config.org b/gentoo/.config/waybar/config.org
new file mode 100644
index 0000000..2a4d14b
--- /dev/null
+++ b/gentoo/.config/waybar/config.org
@@ -0,0 +1,110 @@
+#+title: Waybar Configuration
+* Layout
+Define the layout of the bar with workspaces and scratchpad on the left, the current window in the middle, and music player daemon, sound, network, CPU usage, memory usage, clock, and system tray on the right.
+#+begin_src js :tangle ~/.config/waybar/config :mkdirp yes
+ {
+ "height": 30,
+ "spacing": 4,
+ "modules-left": ["sway/workspaces", "sway/scratchpad"],
+ "modules-center": ["sway/window"],
+ "modules-right": ["mpd", "pulseaudio", "network", "cpu", "memory", "clock", "tray"],
+#+end_src
+
+* Components
+Define scratchpad component. To show an icon and the count of items in it.
+#+begin_src js :tangle ~/.config/waybar/config :mkdirp yes
+ "sway/scratchpad": {
+ "format": "{icon} {count}",
+ "show-empty": false,
+ "format-icons": ["", ""],
+ "tooltip": true,
+ "tooltip-format": "{app}: {title}"
+ },
+#+end_src
+
+Define music player daemon component to list the current song, album, artist, and position in the song with an icon representing the status. Clicking it opens a TUI interface to the daemon.
+#+begin_src js :tangle ~/.config/waybar/config :mkdirp yes
+ "mpd": {
+ "format": "{stateIcon} {artist} - {album} - {title} ({elapsedTime:%M:%S}/{totalTime:%M:%S}) [{songPosition}|{queueLength}] 🎵",
+ "format-disconnected": "Disconnected 🎵",
+ "format-stopped": "{consumeIcon}Stopped 🎵",
+ "unknown-tag": "N/A",
+ "interval": 2,
+ "state-icons": {
+ "paused": "",
+ "playing": ""
+ },
+ "tooltip-format": "MPD (connected)",
+ "tooltip-format-disconnected": "MPD (disconnected)",
+ "on-click": "foot -e ncmpcpp"
+ },
+#+end_src
+
+Define tray component.
+#+begin_src js :tangle ~/.config/waybar/config :mkdirp yes
+ "tray": {
+ "icon-size": 21,
+ "spacing": 10,
+ "show-passive-items": true
+ },
+#+end_src
+
+Define clock component to show the current time and a calendar in a tooltip.
+#+begin_src js :tangle ~/.config/waybar/config :mkdirp yes
+ "clock": {
+ "format": "{:%H:%M\t%Y-%m-%d}",
+ "tooltip-format": "<big>{:%Y %B}</big>\n<tt><small>{calendar}</small></tt>"
+ },
+#+end_src
+
+Define CPU usage component to show usage in percent with an icon.
+#+begin_src js :tangle ~/.config/waybar/config :mkdirp yes
+ "cpu": {
+ "format": "{usage}% ",
+ "tooltip": false
+ },
+#+end_src
+
+Define memory usage component to show usage in percent with an icon.
+#+begin_src js :tangle ~/.config/waybar/config :mkdirp yes
+ "memory": {
+ "format": "{}% "
+ },
+#+end_src
+
+Define network component to show a Wi-Fi icon if connected and a warning signal if not.
+#+begin_src js :tangle ~/.config/waybar/config :mkdirp yes
+ "network": {
+ // "interface": "wlp2*", // (Optional) To force the use of this interface
+ "format-wifi": "",
+ "tooltip": false,
+ "format-ethernet": "",
+ "format-linked": "",
+ "format-disconnected": "⚠",
+ "format-alt": "{ifname}: {ipaddr}/{cidr}"
+ },
+#+end_src
+
+Define audio component to show the volume level and whether or not it is muted with an icon. Clicking it opens a GUI sound menu.
+#+begin_src js :tangle ~/.config/waybar/config :mkdirp yes
+ "pulseaudio": {
+ // "scroll-step": 1, // %, can be a float
+ "format": "{volume}% {icon}",
+ "format-bluetooth": "{volume}% {icon}",
+ "format-bluetooth-muted": " {icon}",
+ "format-muted": " ",
+ "format-source": "{volume}% ",
+ "format-source-muted": "",
+ "format-icons": {
+ "headphone": "",
+ "hands-free": "",
+ "headset": "",
+ "phone": "",
+ "portable": "",
+ "car": "",
+ "default": ["", "", ""]
+ },
+ "on-click": "pavucontrol"
+ }
+ }
+#+end_src
diff --git a/gentoo/.config/waybar/style.org b/gentoo/.config/waybar/style.org
new file mode 100644
index 0000000..3f2ae62
--- /dev/null
+++ b/gentoo/.config/waybar/style.org
@@ -0,0 +1,124 @@
+#+title: Waybar Styling
+Set global font, colours, and transitions to have a transparent background. The text is white with a small shadow.
+#+begin_src css :tangle ~/.config/waybar/style.css :mkdirp yes
+ window#waybar {
+ font-family: FontAwesome, Roboto, Helvetica, Arial, sans-serif;
+ font-size: 13px;
+ background: transparent;
+ color: #ffffff;
+ text-shadow: 1px 1px #64727D;
+ transition-property: background-color;
+ transition-duration: .5s;
+ }
+#+end_src
+
+Remove the border from buttons and make them square.
+#+begin_src css :tangle ~/.config/waybar/style.css :mkdirp yes
+ button {
+ border: none;
+ border-radius: 0;
+ }
+#+end_src
+
+Hovering over a button should inherit the background colour and add a white border to the bottom.
+#+begin_src css :tangle ~/.config/waybar/style.css :mkdirp yes
+ button:hover {
+ background: inherit;
+ box-shadow: inset 0 -3px #ffffff;
+ }
+#+end_src
+
+Workspace buttons should have white with a small shadow, a little bit of extra horizontal padding, and a transparent background.
+#+begin_src css :tangle ~/.config/waybar/style.css :mkdirp yes
+ #workspaces button {
+ padding: 0 5px;
+ text-shadow: 1px 1px #64727D;
+ background-color: transparent;
+ color: #ffffff;
+ }
+#+end_src
+
+Hovering over a workspace button should darken it.
+#+begin_src css :tangle ~/.config/waybar/style.css :mkdirp yes
+ #workspaces button:hover {
+ background: rgba(0, 0, 0, 0.2);
+ }
+#+end_src
+
+The focused workspace should have a white bottom border.
+#+begin_src css :tangle ~/.config/waybar/style.css :mkdirp yes
+ #workspaces button.focused {
+ background: transparent;
+ box-shadow: inset 0 -3px #ffffff;
+ }
+#+end_src
+
+Urgent workspaces should be red.
+#+begin_src css :tangle ~/.config/waybar/style.css :mkdirp yes
+ #workspaces button.urgent {
+ background-color: #eb4d4b;
+ }
+#+end_src
+
+Add extra horizontal padding where needed.
+#+begin_src css :tangle ~/.config/waybar/style.css :mkdirp yes
+ #clock,
+ #cpu,
+ #memory,
+ #disk,
+ #network,
+ #pulseaudio,
+ #wireplumber,
+ #custom-media,
+ #tray,
+ #mode,
+ #scratchpad,
+ #mpd {
+ padding: 0 10px;
+ }
+#+end_src
+
+Add extra horizontal margins where needed.
+#+begin_src css :tangle ~/.config/waybar/style.css :mkdirp yes
+ #window,
+ #workspaces {
+ margin: 0 4px;
+ }
+#+end_src
+
+Omit margins on the leftmost and rightmost workspaces.
+#+begin_src css :tangle ~/.config/waybar/style.css :mkdirp yes
+ .modules-left > widget:first-child > #workspaces {
+ margin-left: 0;
+ }
+
+ /* If workspaces is the rightmost module, omit right margin */
+ .modules-right > widget:last-child > #workspaces {
+ margin-right: 0;
+ }
+#+end_src
+
+Passive system tray icons are dimmed.
+#+begin_src css :tangle ~/.config/waybar/style.css :mkdirp yes
+ #tray > .passive {
+ -gtk-icon-effect: dim;
+ }
+#+end_src
+
+Tray icons that need attention are highlighted.
+#+begin_src css :tangle ~/.config/waybar/style.css :mkdirp yes
+ #tray > .needs-attention {
+ -gtk-icon-effect: highlight;
+ }
+#+end_src
+
+The scratchpad should be darkened and transparent when empty.
+#+begin_src css :tangle ~/.config/waybar/style.css :mkdirp yes
+ #scratchpad {
+ background: rgba(0, 0, 0, 0.2);
+ }
+
+ #scratchpad.empty {
+ background-color: transparent;
+ }
+#+end_src
diff --git a/gentoo/.local/share/applications/emacs.org b/gentoo/.local/share/applications/emacs.org
new file mode 100644
index 0000000..6eab52f
--- /dev/null
+++ b/gentoo/.local/share/applications/emacs.org
@@ -0,0 +1,20 @@
+#+title: Emacs Desktop File
+This is a copy of the normal Emacs desktop file, but it launches with =emacsclient= instead of =emacs= to allow connecting to the Emacs daemon.
+#+begin_src desktop :tangle ~/.local/share/applications/emacs.desktop :mkdirp yes
+ [Desktop Entry]
+ Type=Application
+ Version=1.0
+ Name=GNU Emacs
+ GenericName=Emacs
+ Comment=Emacs is the extensible, customizable, self-documenting real-time display editor
+ Comment[de]=Emacs ist der erweiterbare, anpassbare, selbst-dokumentierende Echtzeit-Editor
+ Comment[es]=Emacs es un editor ampliable, adaptable, mismo documentado, de tiempo real
+ Comment[fr]=Emacs est l'éditeur plein écran avancé, auto-documenté, personnalisable et extensible
+ Icon=emacs
+ TryExec=/usr/bin/emacs
+ Exec=/usr/bin/emacsclient -c %F
+ Terminal=false
+ MimeType=text/css;text/english;text/html;text/plain;text/x-c;text/x-chdr;text/x-csrc;text/x-c++;text/x-c++hdr;text/x-c++src;text/x-java;text/x-makefile;text/x-moc;text/x-pascal;text/x-tcl;text/x-tex;application/x-shellscript;
+ Categories=Development;TextEditor;
+ StartupWMClass=Emacs
+#+end_src
diff --git a/gentoo/.local/share/applications/steam.org b/gentoo/.local/share/applications/steam.org
new file mode 100644
index 0000000..dd30240
--- /dev/null
+++ b/gentoo/.local/share/applications/steam.org
@@ -0,0 +1,286 @@
+#+title: Steam Desktop File
+This is a copy of the normal Steam desktop entry, but I launch it with =PrefersNonDefaultGPU=false= which I need to make the desktop entry work on my desktop for some reason.
+#+begin_src desktop :tangle ~/.local/share/applications/steam.desktop :mkdirp yes
+ [Desktop Entry]
+ Name=Steam
+ Comment=Application for managing and playing games on Steam
+ Comment[pt_BR]=Aplicativo para jogar e gerenciar jogos no Steam
+ Comment[bg]=Приложение за ръководене и пускане на игри в Steam
+ Comment[cs]=Aplikace pro spravování a hraní her ve službě Steam
+ Comment[da]=Applikation til at håndtere og spille spil på Steam
+ Comment[nl]=Applicatie voor het beheer en het spelen van games op Steam
+ Comment[fi]=Steamin pelien hallintaan ja pelaamiseen tarkoitettu sovellus
+ Comment[fr]=Application de gestion et d'utilisation des jeux sur Steam
+ Comment[de]=Anwendung zum Verwalten und Spielen von Spielen auf Steam
+ Comment[el]=Εφαρμογή διαχείρισης παιχνιδιών στο Steam
+ Comment[hu]=Alkalmazás a Steames játékok futtatásához és kezeléséhez
+ Comment[it]=Applicazione per la gestione e l'esecuzione di giochi su Steam
+ Comment[ja]=Steam 上でゲームを管理&プレイするためのアプリケーション
+ Comment[ko]=Steam에 있는 게임을 관리하고 플레이할 수 있는 응용 프로그램
+ Comment[no]=Program for å administrere og spille spill på Steam
+ Comment[pt_PT]=Aplicação para organizar e executar jogos no Steam
+ Comment[pl]=Aplikacja do zarządzania i uruchamiania gier na platformie Steam
+ Comment[ro]=Aplicație pentru administrarea și jucatul jocurilor pe Steam
+ Comment[ru]=Приложение для игр и управления играми в Steam
+ Comment[es]=Aplicación para administrar y ejecutar juegos en Steam
+ Comment[sv]=Ett program för att hantera samt spela spel på Steam
+ Comment[zh_CN]=管理和进行 Steam 游戏的应用程序
+ Comment[zh_TW]=管理並執行 Steam 遊戲的應用程式
+ Comment[th]=โปรแกรมสำหรับจัดการและเล่นเกมบน Steam
+ Comment[tr]=Steam üzerinden oyun oynama ve düzenleme uygulaması
+ Comment[uk]=Програма для керування іграми та запуску ігор у Steam
+ Comment[vi]=Ứng dụng để quản lý và chơi trò chơi trên Steam
+ Exec=/usr/bin/steam %U
+ Icon=steam
+ Terminal=false
+ Type=Application
+ Categories=Network;FileTransfer;Game;
+ MimeType=x-scheme-handler/steam;x-scheme-handler/steamlink;
+ Actions=Store;Community;Library;Servers;Screenshots;News;Settings;BigPicture;Friends;
+ PrefersNonDefaultGPU=false
+ X-KDE-RunOnDiscreteGpu=true
+
+ [Desktop Action Store]
+ Name=Store
+ Name[pt_BR]=Loja
+ Name[bg]=Магазин
+ Name[cs]=Obchod
+ Name[da]=Butik
+ Name[nl]=Winkel
+ Name[fi]=Kauppa
+ Name[fr]=Magasin
+ Name[de]=Shop
+ Name[el]=ΚΑΤΑΣΤΗΜΑ
+ Name[hu]=Áruház
+ Name[it]=Negozio
+ Name[ja]=ストア
+ Name[ko]=상점
+ Name[no]=Butikk
+ Name[pt_PT]=Loja
+ Name[pl]=Sklep
+ Name[ro]=Magazin
+ Name[ru]=Магазин
+ Name[es]=Tienda
+ Name[sv]=Butik
+ Name[zh_CN]=商店
+ Name[zh_TW]=商店
+ Name[th]=ร้านค้า
+ Name[tr]=Mağaza
+ Name[uk]=Крамниця
+ Name[vi]=Cửa hàng
+ Exec=steam steam://store
+
+ [Desktop Action Community]
+ Name=Community
+ Name[pt_BR]=Comunidade
+ Name[bg]=Общност
+ Name[cs]=Komunita
+ Name[da]=Fællesskab
+ Name[nl]=Community
+ Name[fi]=Yhteisö
+ Name[fr]=Communauté
+ Name[de]=Community
+ Name[el]=Κοινότητα
+ Name[hu]=Közösség
+ Name[it]=Comunità
+ Name[ja]=コミュニティ
+ Name[ko]=커뮤니티
+ Name[no]=Samfunn
+ Name[pt_PT]=Comunidade
+ Name[pl]=Społeczność
+ Name[ro]=Comunitate
+ Name[ru]=Сообщество
+ Name[es]=Comunidad
+ Name[sv]=Gemenskap
+ Name[zh_CN]=社区
+ Name[zh_TW]=社群
+ Name[th]=ชุมชน
+ Name[tr]=Topluluk
+ Name[uk]=Спільнота
+ Name[vi]=Cộng đồng
+ Exec=steam steam://url/SteamIDControlPage
+
+ [Desktop Action Library]
+ Name=Library
+ Name[pt_BR]=Biblioteca
+ Name[bg]=Библиотека
+ Name[cs]=Knihovna
+ Name[da]=Bibliotek
+ Name[nl]=Bibliotheek
+ Name[fi]=Kokoelma
+ Name[fr]=Bibliothèque
+ Name[de]=Bibliothek
+ Name[el]=Συλλογή
+ Name[hu]=Könyvtár
+ Name[it]=Libreria
+ Name[ja]=ライブラリ
+ Name[ko]=라이브러리
+ Name[no]=Bibliotek
+ Name[pt_PT]=Biblioteca
+ Name[pl]=Biblioteka
+ Name[ro]=Colecţie
+ Name[ru]=Библиотека
+ Name[es]=Biblioteca
+ Name[sv]=Bibliotek
+ Name[zh_CN]=库
+ Name[zh_TW]=收藏庫
+ Name[th]=คลัง
+ Name[tr]=Kütüphane
+ Name[uk]=Бібліотека
+ Name[vi]=Thư viện
+ Exec=steam steam://open/games
+
+ [Desktop Action Servers]
+ Name=Servers
+ Name[pt_BR]=Servidores
+ Name[bg]=Сървъри
+ Name[cs]=Servery
+ Name[da]=Servere
+ Name[nl]=Servers
+ Name[fi]=Palvelimet
+ Name[fr]=Serveurs
+ Name[de]=Server
+ Name[el]=Διακομιστές
+ Name[hu]=Szerverek
+ Name[it]=Server
+ Name[ja]=サーバー
+ Name[ko]=서버
+ Name[no]=Tjenere
+ Name[pt_PT]=Servidores
+ Name[pl]=Serwery
+ Name[ro]=Servere
+ Name[ru]=Серверы
+ Name[es]=Servidores
+ Name[sv]=Servrar
+ Name[zh_CN]=服务器
+ Name[zh_TW]=伺服器
+ Name[th]=เซิร์ฟเวอร์
+ Name[tr]=Sunucular
+ Name[uk]=Сервери
+ Name[vi]=Máy chủ
+ Exec=steam steam://open/servers
+
+ [Desktop Action Screenshots]
+ Name=Screenshots
+ Name[pt_BR]=Capturas de tela
+ Name[bg]=Снимки
+ Name[cs]=Snímky obrazovky
+ Name[da]=Skærmbilleder
+ Name[nl]=Screenshots
+ Name[fi]=Kuvankaappaukset
+ Name[fr]=Captures d'écran
+ Name[de]=Screenshots
+ Name[el]=Φωτογραφίες
+ Name[hu]=Képernyőmentések
+ Name[it]=Screenshot
+ Name[ja]=スクリーンショット
+ Name[ko]=스크린샷
+ Name[no]=Skjermbilder
+ Name[pt_PT]=Capturas de ecrã
+ Name[pl]=Zrzuty ekranu
+ Name[ro]=Capturi de ecran
+ Name[ru]=Скриншоты
+ Name[es]=Capturas
+ Name[sv]=Skärmdumpar
+ Name[zh_CN]=截图
+ Name[zh_TW]=螢幕擷圖
+ Name[th]=ภาพหน้าจอ
+ Name[tr]=Ekran Görüntüleri
+ Name[uk]=Скріншоти
+ Name[vi]=Ảnh chụp
+ Exec=steam steam://open/screenshots
+
+ [Desktop Action News]
+ Name=News
+ Name[pt_BR]=Notícias
+ Name[bg]=Новини
+ Name[cs]=Zprávy
+ Name[da]=Nyheder
+ Name[nl]=Nieuws
+ Name[fi]=Uutiset
+ Name[fr]=Actualités
+ Name[de]=Neuigkeiten
+ Name[el]=Νέα
+ Name[hu]=Hírek
+ Name[it]=Notizie
+ Name[ja]=ニュース
+ Name[ko]=뉴스
+ Name[no]=Nyheter
+ Name[pt_PT]=Novidades
+ Name[pl]=Aktualności
+ Name[ro]=Știri
+ Name[ru]=Новости
+ Name[es]=Noticias
+ Name[sv]=Nyheter
+ Name[zh_CN]=新闻
+ Name[zh_TW]=新聞
+ Name[th]=ข่าวสาร
+ Name[tr]=Haberler
+ Name[uk]=Новини
+ Name[vi]=Tin tức
+ Exec=steam steam://open/news
+
+ [Desktop Action Settings]
+ Name=Settings
+ Name[pt_BR]=Configurações
+ Name[bg]=Настройки
+ Name[cs]=Nastavení
+ Name[da]=Indstillinger
+ Name[nl]=Instellingen
+ Name[fi]=Asetukset
+ Name[fr]=Paramètres
+ Name[de]=Einstellungen
+ Name[el]=Ρυθμίσεις
+ Name[hu]=Beállítások
+ Name[it]=Impostazioni
+ Name[ja]=設定
+ Name[ko]=설정
+ Name[no]=Innstillinger
+ Name[pt_PT]=Definições
+ Name[pl]=Ustawienia
+ Name[ro]=Setări
+ Name[ru]=Настройки
+ Name[es]=Parámetros
+ Name[sv]=Inställningar
+ Name[zh_CN]=设置
+ Name[zh_TW]=設定
+ Name[th]=การตั้งค่า
+ Name[tr]=Ayarlar
+ Name[uk]=Налаштування
+ Name[vi]=Thiết lập
+ Exec=steam steam://open/settings
+
+ [Desktop Action BigPicture]
+ Name=Big Picture
+ Exec=steam steam://open/bigpicture
+
+ [Desktop Action Friends]
+ Name=Friends
+ Name[pt_BR]=Amigos
+ Name[bg]=Приятели
+ Name[cs]=Přátelé
+ Name[da]=Venner
+ Name[nl]=Vrienden
+ Name[fi]=Kaverit
+ Name[fr]=Amis
+ Name[de]=Freunde
+ Name[el]=Φίλοι
+ Name[hu]=Barátok
+ Name[it]=Amici
+ Name[ja]=フレンド
+ Name[ko]=친구
+ Name[no]=Venner
+ Name[pt_PT]=Amigos
+ Name[pl]=Znajomi
+ Name[ro]=Prieteni
+ Name[ru]=Друзья
+ Name[es]=Amigos
+ Name[sv]=Vänner
+ Name[zh_CN]=好友
+ Name[zh_TW]=好友
+ Name[th]=เพื่อน
+ Name[tr]=Arkadaşlar
+ Name[uk]=Друзі
+ Name[vi]=Bạn bè
+ Exec=steam steam://open/friends
+#+end_src
diff --git a/gentoo/.local/share/fonts/ComputerModern.tar.gz b/gentoo/.local/share/fonts/ComputerModern.tar.gz
new file mode 100644
index 0000000..f84d106
--- /dev/null
+++ b/gentoo/.local/share/fonts/ComputerModern.tar.gz
Binary files differ
diff --git a/gentoo/.local/share/fonts/NFM.tar.gz b/gentoo/.local/share/fonts/NFM.tar.gz
new file mode 100644
index 0000000..b862584
--- /dev/null
+++ b/gentoo/.local/share/fonts/NFM.tar.gz
Binary files differ
diff --git a/gentoo/.local/share/fonts/SauceCodePro.tar.gz b/gentoo/.local/share/fonts/SauceCodePro.tar.gz
new file mode 100644
index 0000000..d3451f3
--- /dev/null
+++ b/gentoo/.local/share/fonts/SauceCodePro.tar.gz
Binary files differ
diff --git a/gentoo/.ssh/config.org b/gentoo/.ssh/config.org
new file mode 100644
index 0000000..e87c5c4
--- /dev/null
+++ b/gentoo/.ssh/config.org
@@ -0,0 +1,5 @@
+#+title: SSH Configuration
+Keys should be added to the SSH agent.
+#+begin_src conf :tangle ~/.ssh/config :mkdirp yes
+ AddKeysToAgent yes
+#+end_src
diff --git a/gentoo/.wallpaper b/gentoo/.wallpaper
new file mode 100644
index 0000000..e67150d
--- /dev/null
+++ b/gentoo/.wallpaper
Binary files differ
diff --git a/gentoo/clang-format.org b/gentoo/clang-format.org
new file mode 100644
index 0000000..6c38b3b
--- /dev/null
+++ b/gentoo/clang-format.org
@@ -0,0 +1,9 @@
+#+title: Clang-Format Settings
+Use a style similar to Linux kernel style (but with 4-wide indents and spaces over tabs).
+#+begin_src yaml :tangle ~/.clang-format
+BasedOnStyle: LLVM
+IndentWidth: 4
+BreakBeforeBraces: Linux
+AllowShortIfStatementsOnASingleLine: false
+IndentCaseLabels: false
+#+end_src
diff --git a/gentoo/gitconfig.org b/gentoo/gitconfig.org
new file mode 100644
index 0000000..c907204
--- /dev/null
+++ b/gentoo/gitconfig.org
@@ -0,0 +1,18 @@
+#+title: Git Configuration
+Define my full name and email.
+#+begin_src conf :tangle ~/.gitconfig
+ [user]
+ name = Jacob Janzen
+ email = jjanzenn@proton.me
+#+end_src
+Use =main= over =master=.
+#+begin_src conf :tangle ~/.gitconfig
+ [init]
+ defaultBranch = main
+#+end_src
+
+Make =pull= rebase on conflict.
+#+begin_src conf :tangle ~/.gitconfig
+ [pull]
+ rebase = true
+#+end_src
diff --git a/gentoo/install b/gentoo/install
new file mode 100644
index 0000000..09b2efd
--- /dev/null
+++ b/gentoo/install
@@ -0,0 +1,58 @@
+#!/bin/sh
+
+mv ~/.update-home.log ~/.update-home.log.old
+
+if ! test -d ~/.dotfiles; then
+ echo Installing dotfiles...
+ git clone git@git.sr.ht:~jjanzen/.dotfiles ~/.dotfiles >> ~/.update-home.log
+fi
+
+CWD=$(pwd)
+cd ~/.dotfiles || exit
+
+{
+ git stash
+ git checkout main
+ git pull --rebase
+} >> ~/.update-home.log
+
+if ! diff ~/.dotfiles/install ~/.local/bin/update-home >> ~/.update-home.log; then
+ cp ~/.dotfiles/install ~/.local/bin/update-home || exit 1
+ echo Changes have been made to the install script.
+ echo Running the new install script.
+ chmod +x ~/.local/bin/update-home
+ ~/.local/bin/update-home
+ exit
+fi
+
+echo Installing configuration files...
+find -- . -type f -name "*.org" | while read -r file; do
+ emacs --batch "${file}" -f package-initialize --eval '(org-babel-tangle)' >> ~/.update-home.log
+done
+
+echo Installing wallpaper...
+cp .wallpaper ~/.wallpaper
+
+fonts_changed=false
+if ! test -d ~/.local/share/fonts/ComputerModern; then
+ echo Computer Modern font missing. Installing...
+ tar xf ~/.dotfiles/.local/share/fonts/ComputerModern.tar.gz -C ~/.local/share/fonts >> ~/.update-home.log
+ fonts_changed=true
+fi
+if ! test -f ~/.local/share/fonts/NFM.ttf; then
+ echo Nerd Font Mono font missing. Installing...
+ tar xf ~/.dotfiles/.local/share/fonts/NFM.tar.gz -C ~/.local/share/fonts >> ~/.update-home.log
+ fonts_changed=true
+fi
+if ! test -d ~/.local/share/fonts/SauceCodePro; then
+ echo Source Code Pro Nerd Font missing. Installing...
+ tar xf ~/.dotfiles/.local/share/fonts/SauceCodePro.tar.gz -C ~/.local/share/fonts >> ~/.update-home.log
+ fonts_changed=true
+fi
+
+if [ $fonts_changed = true ]; then
+ echo Updating the font cache...
+ fc-cache -f >> ~/.update-home.log
+fi
+
+cd "${CWD}" || exit
diff --git a/gentoo/install.org b/gentoo/install.org
new file mode 100644
index 0000000..9a9c0aa
--- /dev/null
+++ b/gentoo/install.org
@@ -0,0 +1,93 @@
+#+title: Install Script
+
+This can be run as =./install=, so make it explicit what binary to run it with (POSIX shell).
+#+begin_src sh :tangle ~/.dotfiles/install :mkdirp yes
+ #!/bin/sh
+#+end_src
+
+Save the old log file.
+#+begin_src sh :tangle ~/.dotfiles/install :mkdirp yes
+ mv ~/.update-home.log ~/.update-home.log.old
+#+end_src
+
+Install the dotfiles repository at =~/.dotfiles= if it doesn't already exist.
+#+begin_src sh :tangle ~/.dotfiles/install :mkdirp yes
+ if ! test -d ~/.dotfiles; then
+ echo Installing dotfiles...
+ git clone git@git.sr.ht:~jjanzen/.dotfiles ~/.dotfiles >> ~/.update-home.log
+ fi
+#+end_src
+
+POSIX shell doesn't have =pushd= and =popd=. We do it manually by saving the current path before moving to =~/.dotfiles=. Exit if the =cd= call fails (it shouldn't).
+#+begin_src sh :tangle ~/.dotfiles/install :mkdirp yes
+ CWD=$(pwd)
+ cd ~/.dotfiles || exit
+#+end_src
+
+Stash any existing changes before moving to the main branch and pulling any new changes from the remote.
+#+begin_src sh :tangle ~/.dotfiles/install :mkdirp yes
+ {
+ git stash
+ git checkout main
+ git pull --rebase
+ } >> ~/.update-home.log
+#+end_src
+
+If the =update-home= executable has changed, replace it and bootstrap into the new one.
+#+begin_src sh :tangle ~/.dotfiles/install :mkdirp yes
+ if ! diff ~/.dotfiles/install ~/.local/bin/update-home >> ~/.update-home.log; then
+ cp ~/.dotfiles/install ~/.local/bin/update-home || exit 1
+ echo Changes have been made to the install script.
+ echo Running the new install script.
+ chmod +x ~/.local/bin/update-home
+ ~/.local/bin/update-home
+ exit
+ fi
+#+end_src
+
+Extract each configuration file from its literate =.org= file into its correct location by running =org-babel-tangle= on each =.org= file.
+#+begin_src sh :tangle ~/.dotfiles/install :mkdirp yes
+ echo Installing configuration files...
+ find -- . -type f -name "*.org" | while read -r file; do
+ emacs --batch "${file}" -f package-initialize --eval '(org-babel-tangle)' >> ~/.update-home.log
+ done
+#+end_src
+
+Install the [[./wallpaper.png][wallpaper]] file.
+#+begin_src sh :tangle ~/.dotfiles/install :mkdirp yes
+ echo Installing wallpaper...
+ cp .wallpaper ~/.wallpaper
+#+end_src
+
+Install any missing fonts by extracting the corresponding =tar.gz= archive.
+#+begin_src sh :tangle ~/.dotfiles/install :mkdirp yes
+ fonts_changed=false
+ if ! test -d ~/.local/share/fonts/ComputerModern; then
+ echo Computer Modern font missing. Installing...
+ tar xf ~/.dotfiles/.local/share/fonts/ComputerModern.tar.gz -C ~/.local/share/fonts >> ~/.update-home.log
+ fonts_changed=true
+ fi
+ if ! test -f ~/.local/share/fonts/NFM.ttf; then
+ echo Nerd Font Mono font missing. Installing...
+ tar xf ~/.dotfiles/.local/share/fonts/NFM.tar.gz -C ~/.local/share/fonts >> ~/.update-home.log
+ fonts_changed=true
+ fi
+ if ! test -d ~/.local/share/fonts/SauceCodePro; then
+ echo Source Code Pro Nerd Font missing. Installing...
+ tar xf ~/.dotfiles/.local/share/fonts/SauceCodePro.tar.gz -C ~/.local/share/fonts >> ~/.update-home.log
+ fonts_changed=true
+ fi
+#+end_src
+
+If any missing fonts were installed, update the font cache.
+#+begin_src sh :tangle ~/.dotfiles/install :mkdirp yes
+ if [ $fonts_changed = true ]; then
+ echo Updating the font cache...
+ fc-cache -f >> ~/.update-home.log
+ fi
+#+end_src
+
+Move the user back to where they came from.
+#+begin_src sh :tangle ~/.dotfiles/install :mkdirp yes
+ cd "${CWD}" || exit
+#+end_src
diff --git a/gentoo/profile.org b/gentoo/profile.org
new file mode 100644
index 0000000..7ff69db
--- /dev/null
+++ b/gentoo/profile.org
@@ -0,0 +1,16 @@
+#+TITLE: =.profile= Settings
+* Path
+Add items to the path.
+#+begin_src sh :tangle ~/.profile
+export PATH="$HOME/.local/share/fzf-zsh-plugin/bin:$HOME/node_modules/.bin:$HOME/.emacs.d/bin:$HOME/bin:$HOME/gems/bin:$HOME/.local/bin:$HOME/go/bin:$PATH"
+#+end_src
+
+* SSH Agent
+Run =ssh-agent= if =ssh-agent= is not already running. Ensure that the authorization socket is available in the shell.
+#+begin_src sh :tangle ~/.profile
+if [ ! -S ~/.ssh/ssh_auth_sock ]; then
+ eval `ssh-agent` > /dev/null
+ ln -sf "$SSH_AUTH_SOCK" ~/.ssh/ssh_auth_sock
+fi
+export SSH_AUTH_SOCK=~/.ssh/ssh_auth_sock
+#+end_src
diff --git a/gentoo/zshrc.org b/gentoo/zshrc.org
new file mode 100644
index 0000000..d6cdeb7
--- /dev/null
+++ b/gentoo/zshrc.org
@@ -0,0 +1,111 @@
+#+title: ZSH Configuration
+Set up completions.
+#+begin_src sh :tangle ~/.zshrc :mkdirp yes
+ zstyle ':completion:*' completer _expand _complete _ignored _approximate
+ zstyle ':completion:*' matcher-list '' 'm:{[:lower:]}={[:upper:]}' 'r:|[._-]=** r:|=**' 'l:|=* r:|=*'
+ zstyle :compinstall filename '/home/jjanzen/.zshrc'
+ autoload -U compinit promptinit
+ compinit
+ promptinit
+#+end_src
+
+Enable gentoo completions on Linux.
+#+begin_src sh :tangle (cond ((eq system-type 'gnu/linux) "~/.zshrc") (t "no")) :mkdirp yes
+ prompt gentoo
+#+end_src
+
+Set up the history with 1000 entries and ignored duplicate commands.
+#+begin_src sh :tangle ~/.zshrc :mkdirp yes
+ HISTFILE=~/.histfile
+ HISTSIZE=1000
+ SAVEHIST=1000
+ setopt hist_ignore_all_dups
+#+end_src
+
+Enable automatic =cd=.
+#+begin_src sh :tangle ~/.zshrc :mkdirp yes
+ setopt autocd
+#+end_src
+
+Enable extended glob.
+#+begin_src sh :tangle ~/.zshrc :mkdirp yes
+ setopt extendedglob
+#+end_src
+
+If a glob returns nothing, don't keep the =*=.
+#+begin_src sh :tangle ~/.zshrc :mkdirp yes
+ setopt nullglob
+#+end_src
+
+Report the status of background jobs immediately.
+#+begin_src sh :tangle ~/.zshrc :mkdirp yes
+ setopt notify
+#+end_src
+
+Disable the beep.
+#+begin_src sh :tangle ~/.zshrc :mkdirp yes
+ unsetopt beep
+#+end_src
+
+Use =vi= keybindings.
+#+begin_src sh :tangle ~/.zshrc :mkdirp yes
+ bindkey -v
+#+end_src
+
+Use =lesspipe= back end for =less= if it is installed.
+#+begin_src sh :tangle ~/.zshrc :mkdirp yes
+ which lesspipe.sh &> /dev/null && export LESSOPEN="|lesspipe.sh %s"
+#+end_src
+
+Use =eza= as my =ls= command if it is installed.
+#+begin_src sh :tangle ~/.zshrc :mkdirp yes
+ which eza &> /dev/null && alias ls=eza
+#+end_src
+
+Use Neovim as my =vi= and =vim= application if it is installed.
+#+begin_src sh :tangle ~/.zshrc :mkdirp yes
+ which nvim &> /dev/null && alias vi=nvim && alias vim=nvim
+#+end_src
+
+If the Firefox binary is called =firefox-bin=, let =firefox= also run =firefox-bin=.
+#+begin_src sh :tangle ~/.zshrc :mkdirp yes
+ which firefox-bin &> /dev/null && alias firefox=firefox-bin
+#+end_src
+
+Lazy =ls= shortcuts.
+#+begin_src sh :tangle ~/.zshrc :mkdirp yes
+ alias ll='ls -alF'
+ alias la='ls -a'
+ alias l='ls -F'
+ alias sl='ls'
+#+end_src
+
+*** Prompt
+Define function to write out icons for the git status.
+#+begin_src sh :tangle ~/.zshrc :mkdirp yes
+ parse_git_dirty() {
+ git_status="$(git status 2> /dev/null)"
+ [[ "$git_status" =~ "use \"git push\" to publish your local commits" ]] && echo -n " %F{green}%f"
+ [[ "$git_status" =~ "Changes to be committed:" ]] && echo -n " %F{magenta}%f"
+ [[ "$git_status" =~ "Changes not staged for commit:" ]] && echo -n " %F{yellow}%f"
+ [[ "$git_status" =~ "Untracked files:" ]] && echo -n " %F{red}%f"
+ }
+#+end_src
+
+Enable git status in the prompt.
+#+begin_src sh :tangle ~/.zshrc :mkdirp yes
+ setopt prompt_subst
+ autoload -Uz vcs_info
+ precmd () { vcs_info }
+ zstyle ':vcs_info:*' formats ' %F{blue}%b%f' # git(main)
+#+end_src
+
+Define the prompt as follows:
+- Error code (if applicable)
+- Path using =~= for the home directory and truncating if too long
+- Git branch
+- Git status
+- =$= to mark the start of the prompt
+#+begin_src sh :tangle ~/.zshrc :mkdirp yes
+ PS1='%(?..%B%F{red}[%?%\]%f%b )%F{green}%20<...<%~%<<%f$vcs_info_msg_0_$(parse_git_dirty) $ '
+#+end_src