aboutsummaryrefslogtreecommitdiff
path: root/config
diff options
context:
space:
mode:
Diffstat (limited to 'config')
-rw-r--r--config/discord/settings.org16
-rw-r--r--config/emacs/config.org626
-rw-r--r--config/emacs/feed.org25
-rw-r--r--config/emacs/init.el5
-rw-r--r--config/emacs/init.org13
-rw-r--r--config/fastfetch/config.org92
-rw-r--r--config/foot/foot.org52
-rw-r--r--config/mpd/mpd.org68
-rw-r--r--config/ncmpcpp/bindings.org28
-rw-r--r--config/ncmpcpp/config.org16
-rw-r--r--config/nvim/init.org37
-rw-r--r--config/nvim/lua/appearance.org15
-rw-r--r--config/nvim/lua/autocomplete.org57
-rw-r--r--config/nvim/lua/behaviour.org19
-rw-r--r--config/nvim/lua/format.org25
-rw-r--r--config/nvim/lua/languageServers.org92
-rw-r--r--config/nvim/lua/plugins.org49
-rw-r--r--config/sway/config.org269
-rw-r--r--config/sway/poweraction.org9
-rw-r--r--config/sway/powerprompt.org19
-rw-r--r--config/waybar/config.org110
-rw-r--r--config/waybar/style.org142
22 files changed, 1784 insertions, 0 deletions
diff --git a/config/discord/settings.org b/config/discord/settings.org
new file mode 100644
index 0000000..7323f78
--- /dev/null
+++ b/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 json :tangle 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/config/emacs/config.org b/config/emacs/config.org
new file mode 100644
index 0000000..495f37c
--- /dev/null
+++ b/config/emacs/config.org
@@ -0,0 +1,626 @@
+#+title: Emacs Configuration
+* Package Setup
+Set up package archives including =melpa=, =org=, and =elpa=.
+#+begin_src emacs-lisp
+ (require 'package)
+
+ (setq package-archives '(("melpa" . "https://melpa.org/packages/")
+ ("org" . "https://orgmode.org/elpa/")
+ ("elpa" . "https://elpa.gnu.org/packages/")))
+
+ (package-initialize)
+ (unless package-archive-contents
+ (package-refresh-contents))
+#+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
+ (unless (package-installed-p 'use-package)
+ (package-install 'use-package))
+
+ (require 'use-package)
+ (setq use-package-always-ensure t)
+#+end_src
+
+* User Interface
+** Theming
+Set the default font to the Source Code Pro nerd font variant. I use size 14 font.
+#+begin_src emacs-lisp
+ (set-face-attribute 'default t :font "Sauce Code Pro Nerd Font-14")
+#+end_src
+
+Use the Doom Nord light theme.
+#+begin_src emacs-lisp
+ (use-package doom-themes
+ :config
+ (setq doom-themes-enable-bold t
+ doom-themes-enable-italic t)
+ (load-theme 'doom-nord-light t)
+ (doom-themes-org-config))
+#+end_src
+
+Use =doom-modeline= for a nicer modeline.
+#+begin_src emacs-lisp
+ (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
+ (setq inhibit-startup-screen t)
+ (setq initial-scratch-message nil)
+#+end_src
+
+Disable scroll bar, tool bar, and menu bar.
+#+begin_src emacs-lisp
+ (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
+ (global-display-line-numbers-mode 1)
+#+end_src
+
+Highlight changes for an operation with =evil-goggles=.
+#+begin_src emacs-lisp
+ (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
+ (use-package nerd-icons)
+#+end_src
+
+Scroll one line at a time.
+#+begin_src emacs-lisp
+ (setq scroll-conservatively most-positive-fixnum)
+#+end_src
+
+Create parent directories when they don't yet exist.
+#+begin_src emacs-lisp
+ (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
+ (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
+ (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
+ (setq make-backup-files nil)
+#+end_src
+
+** Customize =dired=
+Use nerd font icons in =dired=.
+#+begin_src emacs-lisp
+ (use-package nerd-icons-dired
+ :hook dired-mode)
+#+end_src
+
+Use colours in =dired= with =diredfl=.
+#+begin_src emacs-lisp
+ (use-package diredfl
+ :init (diredfl-global-mode 1))
+#+end_src
+
+* Tools
+** 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
+ (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)
+ :custom
+ (evil-undo-system 'undo-fu))
+#+end_src
+
+Use =evil-collection= to include =vi= keybindings in extra modes.
+#+begin_src emacs-lisp
+ (use-package evil-collection
+ :after evil
+ :config
+ (evil-collection-init))
+#+end_src
+
+** Lisp Editing
+Better Lisp editing with =lispy= and =lispyville=.
+#+begin_src emacs-lisp
+ (use-package lispy
+ :hook emacs-lisp-mode)
+ (use-package lispyville
+ :after lispy
+ :hook lispy-mode)
+#+end_src
+
+Better parentheses handling in lisp with =parinfer-rust-mode=.
+#+begin_src emacs-lisp
+ (use-package parinfer-rust-mode
+ :hook emacs-lisp-mode
+ :init
+ (setq parinfer-rust-auto-download t))
+#+end_src
+
+** Undo
+Better undo with =undo-fu=.
+#+begin_src emacs-lisp
+ (use-package undo-fu)
+#+end_src
+
+Make undo persistent when closing Emacs with =undo-fu-session=.
+#+begin_src emacs-lisp
+ (use-package undo-fu-session
+ :init (undo-fu-session-global-mode 1))
+#+end_src
+
+** Lookup
+Better lookup with =dumb-jump=.
+#+begin_src emacs-lisp
+ (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
+ (use-package magit)
+#+end_src
+
+** Document Viewing
+Replace =DocView= with a better document viewer from =pdf-tools=.
+#+begin_src emacs-lisp
+ (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
+ (use-package saveplace-pdf-view
+ :config (save-place-mode 1))
+#+end_src
+
+** Org-Mode
+Set my =org-mode= directory.
+#+begin_src emacs-lisp
+(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
+(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
+(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
+(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
+(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
+(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
+(setq org-return-follows-link t)
+#+end_src
+
+Tangle on save.
+#+begin_src emacs-lisp
+(add-hook 'org-mode-hook
+ (lambda ()
+ (add-hook 'after-save-hook #'org-babel-tangle)))
+#+end_src
+
+
+** Shell
+Use =eshell= as an integrated shell.
+#+begin_src emacs-lisp
+ (use-package eshell)
+#+end_src
+
+** Language Servers
+Add =eglot= keybindings.
+#+begin_src emacs-lisp
+ (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
+ (use-package tree-sitter)
+ (use-package tree-sitter-langs)
+#+end_src
+
+Define function to set up =eglot= automatically.
+#+begin_src emacs-lisp
+ (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
+ (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
+ (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
+ (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
+ (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
+ (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
+ (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
+ (use-package flycheck
+ :config
+ (add-hook 'after-init-hook #'global-flycheck-mode))
+#+end_src
+
+Use Flyspell for spell checking.
+#+begin_src emacs-lisp
+ (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
+ (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
+ (use-package yasnippet-snippets)
+#+end_src
+
+** Formatting
+Automatically format with Apheleia and =clang-format=.
+#+begin_src emacs-lisp
+ (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
+ (use-package elfeed
+ :config
+ (global-set-key (kbd "C-c w") 'elfeed)
+ (global-set-key (kbd "C-c C-W") 'elfeed-update))
+#+end_src
+
+Make =elfeed= more powerful with =elfeed-goodies=.
+#+begin_src emacs-lisp
+ (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
+ (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
+ (use-package deft
+ :config
+ (global-set-key (kbd "C-c d") 'deft)
+ (setq deft-directory "~/notes/"
+ deft-default-extension "org"))
+#+end_src
+
+* Languages
+** Shell Script
+Run =eglot= on shell script files.
+#+begin_src emacs-lisp
+ (add-hook 'sh-mode-hook 'jj/eglot-setup)
+#+end_src
+
+** C
+Run =eglot= on C and C++ files.
+#+begin_src emacs-lisp
+ (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
+ (add-hook 'html-mode-hook 'jj/eglot-setup)
+#+end_src
+
+Run =eglot= on CSS files.
+#+begin_src emacs-lisp
+ (add-hook 'css-mode-hook 'jj/eglot-setup)
+#+end_src
+
+Run =eglot= on JavaScript/Typescript files.
+#+begin_src emacs-lisp
+ (add-hook 'js-json-mode-hook 'jj/eglot-setup)
+ (add-hook 'js-mode-hook 'jj/eglot-setup)
+ (use-package typescript-mode
+ :init
+ (add-hook 'typescript-mode-hook 'jj/eglot-setup))
+#+end_src
+
+** Python
+Run =eglot= on Python files.
+#+begin_src emacs-lisp
+ (add-hook 'python-mode-hook 'jj/eglot-setup)
+#+end_src
+
+** TODO Rust
+Run =eglot= on Rust files. (This does not work at all)
+#+begin_src emacs-lisp
+ (use-package rust-mode
+ :init
+ (add-hook 'rust-mode-hook 'jj/eglot-setup))
+#+end_src
+
+** Go
+Run =eglot= on Go files.
+#+begin_src emacs-lisp
+ (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
+ (use-package go-eldoc
+ :init
+ (add-hook 'go-mode-hook 'go-eldoc-setup))
+#+end_src
+
+Automatically generate tests.
+#+begin_src emacs-lisp
+ (use-package go-gen-test)
+#+end_src
+
+Refactoring tools from =go-guru=.
+#+begin_src emacs-lisp
+ (use-package go-guru
+ :hook (go-mode . go-guru-hl-identifier-mode))
+#+end_src
+
+** Lua
+Run =eglot= on Lua files.
+#+begin_src emacs-lisp
+ (use-package lua-mode
+ :init
+ (add-hook 'lua-mode-hook 'jj/eglot-setup))
+#+end_src
+
+** Markdown
+Run =eglot= on Markdown files.
+#+begin_src emacs-lisp
+ (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
+ (add-hook 'tex-mode-hook 'jj/eglot-setup)
+#+end_src
+
+Use AUCTeX for extra LaTeX integrations.
+#+begin_src emacs-lisp
+ (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
+ (use-package cdlatex
+ :config
+ (add-hook 'LaTeX-mode-hook #'turn-on-cdlatex))
+#+end_src
+
+** YAML
+Run =eglot= on YAML files.
+#+begin_src emacs-lisp
+ (use-package yaml-mode
+ :init
+ (add-hook 'yaml-mode-hook 'jj/eglot-setup))
+#+end_src
diff --git a/config/emacs/feed.org b/config/emacs/feed.org
new file mode 100644
index 0000000..045ac62
--- /dev/null
+++ b/config/emacs/feed.org
@@ -0,0 +1,25 @@
+* Blogs
+:PROPERTIES:
+:ID: elfeed
+:END:
+** http://feeds.feedburner.com/InformationIsBeautiful
+** [[http://orgmode.org][Org Mode Links supported as well]]
+** Software Development :dev:
+*** Emacs :emacs:mustread:
+**** http://www.terminally-incoherent.com/blog/feed
+**** http://nullprogram.com/feed
+**** entry-title: \(emacs\|org-mode\)
+**** http://planet.emacsen.org/atom.xml
+**** [[toobnix:154][EmacsConf]]
+*** Web Development :web:
+**** http://planet.phpunit.de/atom.xml
+**** http://feeds.feedburner.com/symfony/blog
+**** http://feeds.feedburner.com/qooxdoo/blog/content
+*** Eclipse :eclipse:
+**** http://blog.eclipse-tips.com/feeds/posts/default?alt=rss
+**** http://ed-merks.blogspot.com/feeds/posts/default
+ A description of a feed can be written under any headline.
+ The text will be ignored by elfeed.
+**** http://feeds.feedburner.com/eclipselive :ignore:
+**** http://www.fosslc.org/drupal/rss.xml :video:
+#+link: toobnix https://toobnix.org/feeds/videos.xml?videoChannelId=
diff --git a/config/emacs/init.el b/config/emacs/init.el
new file mode 100644
index 0000000..cc210a3
--- /dev/null
+++ b/config/emacs/init.el
@@ -0,0 +1,5 @@
+(setq custom-file (concat user-emacs-directory "custom.el"))
+(when (file-exists-p custom-file)
+ (load custom-file))
+
+(org-babel-load-file "~/.config/emacs/config.org")
diff --git a/config/emacs/init.org b/config/emacs/init.org
new file mode 100644
index 0000000..36131cf
--- /dev/null
+++ b/config/emacs/init.org
@@ -0,0 +1,13 @@
+#+title: Emacs =init.el=
+
+Force the usage of a =custom.el= file for customizations.
+#+begin_src emacs-lisp :tangle yes
+(setq custom-file (concat user-emacs-directory "custom.el"))
+(when (file-exists-p custom-file)
+ (load custom-file))
+#+end_src
+
+Load the main configuration from [[./config.org][config.org]].
+#+begin_src emacs-lisp :tangle yes
+(org-babel-load-file "~/.config/emacs/config.org")
+#+end_src
diff --git a/config/fastfetch/config.org b/config/fastfetch/config.org
new file mode 100644
index 0000000..3aec5f6
--- /dev/null
+++ b/config/fastfetch/config.org
@@ -0,0 +1,92 @@
+#+title: Fastfetch Settings
+Open a JSON object.
+#+begin_src jsonc :tangle yes
+ {
+#+end_src
+
+Use a =sixel= image for the logo.
+#+begin_src jsonc :tangle 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 jsonc :tangle yes
+ "display": {
+ "separator": " "
+ },
+#+end_src
+
+Define the modules in the =fastfetch= display.
+#+begin_src jsonc :tangle 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 jsonc :tangle yes
+}
+#+end_src
diff --git a/config/foot/foot.org b/config/foot/foot.org
new file mode 100644
index 0000000..922964a
--- /dev/null
+++ b/config/foot/foot.org
@@ -0,0 +1,52 @@
+#+title: Foot Settings
+* Basic Settings
+Use Source Code Pro with Nerd Font in size 10.
+#+begin_src ini :tangle yes
+font=SauceCodePro Nerd Font:size=10
+#+end_src
+
+Add 6 pixel padding around the terminal.
+#+begin_src ini :tangle yes
+pad=6x6
+#+end_src
+
+* URL
+Use Firefox to open URLs.
+#+begin_src ini :tangle yes
+[url]
+launch=firefox ${url}
+#+end_src
+
+* Mouse
+Hide the mouse when typing.
+#+begin_src ini :tangle yes
+[mouse]
+hide-when-typing=yes
+#+end_src
+
+* Colours
+The colours are defined here. I use a slightly transparent background.
+#+begin_src ini :tangle yes
+[colors]
+alpha=0.9
+background=fcfcfc
+foreground=5c6166
+
+regular0=010101
+regular1=e7666a
+regular2=80ab24
+regular3=eba54d
+regular4=4196df
+regular5=9870c3
+regular6=51b891
+regular7=c1c1c1
+
+bright0=343434
+bright1=ee9295
+bright2=9fd32f
+bright3=f0bc7b
+bright4=6daee6
+bright5=b294d2
+bright6=75c7a8
+bright7=dbdbdb
+#+end_src
diff --git a/config/mpd/mpd.org b/config/mpd/mpd.org
new file mode 100644
index 0000000..4fa290e
--- /dev/null
+++ b/config/mpd/mpd.org
@@ -0,0 +1,68 @@
+#+title: MPD Settings
+* Directories
+Check for music files in =~/Music=.
+#+begin_src conf :tangle yes
+music_directory "~/Music"
+#+end_src
+
+Put playlists at =~/.config/mpd/playlists=.
+#+begin_src conf :tangle yes
+playlist_directory "~/.config/mpd/playlists"
+#+end_src
+
+Put database at =~/.config/mpd/database=.
+#+begin_src conf :tangle yes
+db_file "~/.config/mpd/database"
+#+end_src
+
+Put log file at =~/.config/mpd/log=.
+#+begin_src conf :tangle yes
+log_file "~/.config/mpd/log"
+#+end_src
+
+Put PID file at =~/.config/mpd/pid=.
+#+begin_src conf :tangle yes
+pid_file "~/.config/mpd/pid"
+#+end_src
+
+Put the state file at =~/.config/mpd/state=.
+#+begin_src conf :tangle yes
+state_file "~/.config/mpd/state"
+#+end_src
+
+Put the sticker file at =~/.config/mpd/sticker.sql=.
+#+begin_src conf :tangle yes
+sticker_file "~/.config/mpd/sticker.sql"
+#+end_src
+
+Use UTF-8 in the file system.
+#+begin_src conf :tangle yes
+filesystem_charset "UTF-8"
+#+end_src
+
+* Network
+Run MPD on =localhost=.
+#+begin_src conf :tangle yes
+bind_to_address "localhost"
+#+end_src
+
+* Outputs
+Output to PipeWire.
+#+begin_src conf :tangle yes
+audio_output {
+ type "pipewire"
+ name "Pipewire"
+ mixer_type "hardware"
+ enabled "yes"
+}
+#+end_src
+
+Output to FIFO.
+#+begin_src conf :tangle yes
+audio_output {
+ type "fifo"
+ name "my_fifo"
+ path "~/.config/mpd/mpd.fifo"
+ format "44100:16:2"
+}
+#+end_src
diff --git a/config/ncmpcpp/bindings.org b/config/ncmpcpp/bindings.org
new file mode 100644
index 0000000..159d3ae
--- /dev/null
+++ b/config/ncmpcpp/bindings.org
@@ -0,0 +1,28 @@
+#+title: =ncmpcpp= Keyboard Bindings
+Use =vi= motions.
+#+begin_src txt :tangle bindings
+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/config/ncmpcpp/config.org b/config/ncmpcpp/config.org
new file mode 100644
index 0000000..18a2a0e
--- /dev/null
+++ b/config/ncmpcpp/config.org
@@ -0,0 +1,16 @@
+#+title: =ncmpcpp= Configuration
+Set the =ncmpcpp= directory to =~/.config/ncmpcpp/=.
+#+begin_src conf :tangle config
+ncmpcpp_directory = "~/.ncmpcpp"
+#+end_src
+
+Set the host/port pair to find the music player daemon at.
+#+begin_src conf :tangle config
+mpd_host = "localhost"
+mpd_port = "6600"
+#+end_src
+
+Specify the location of the Music directory to be =~/Music=.
+#+begin_src conf :tangle config
+mpd_music_dir = "~/Music"
+#+end_src
diff --git a/config/nvim/init.org b/config/nvim/init.org
new file mode 100644
index 0000000..703e8e2
--- /dev/null
+++ b/config/nvim/init.org
@@ -0,0 +1,37 @@
+#+title: Neovim Settings
+This is the entry point for my Neovim configuration.
+
+Disable timeout to speed things up.
+#+begin_src lua :tangle yes
+vim.cmd([[set notimeout]])
+#+end_src
+
+Install plugins in the [[./lua/plugins.org][plugins.lua]] file.
+#+begin_src lua :tangle yes
+require('plugins')
+#+end_src
+
+Set up behaviour in the [[./lua/behaviour.org][behaviour.lua]] file.
+#+begin_src lua :tangle yes
+require('behaviour')
+#+end_src
+
+Set up appearance in the [[./lua/appearance.org][appearance.lua]] file.
+#+begin_src lua :tangle yes
+require('appearance')
+#+end_src
+
+Set up formatting options in the [[./lua/format.org][format.lua]] file.
+#+begin_src lua :tangle yes
+require('format')
+#+end_src
+
+Set up language servers in the [[./lua/languageServers.org][languageServers.lua]] file.
+#+begin_src lua :tangle yes
+require('languageServers')
+#+end_src
+
+Set up auto-complete in the [[./lua/autocomplete.org][autocomplete.lua]] file.
+#+begin_src lua :tangle yes
+require('autocomplete')
+#+end_src
diff --git a/config/nvim/lua/appearance.org b/config/nvim/lua/appearance.org
new file mode 100644
index 0000000..6cbf4ba
--- /dev/null
+++ b/config/nvim/lua/appearance.org
@@ -0,0 +1,15 @@
+#+title: Neovim Appearance Settings
+Use line numbers.
+#+begin_src lua :tangle yes
+ vim.opt.number = true
+#+end_src
+
+Set colour scheme.
+#+begin_src lua :tangle yes
+ vim.cmd([[
+ set termguicolors
+ let ayucolor="light"
+ syntax on
+ colorscheme ayu
+ ]])
+#+end_src
diff --git a/config/nvim/lua/autocomplete.org b/config/nvim/lua/autocomplete.org
new file mode 100644
index 0000000..505e93c
--- /dev/null
+++ b/config/nvim/lua/autocomplete.org
@@ -0,0 +1,57 @@
+#+title: Neovim Auto-complete Settings
+Set up auto-completion with LSP.
+#+begin_src lua :tangle yes
+ local capabilities = require("cmp_nvim_lsp").default_capabilities()
+
+ local lspconfig = require('lspconfig')
+
+ local servers = { 'clangd', 'rust_analyzer', 'pyright', 'tsserver' }
+ for _, lsp in ipairs(servers) do
+ lspconfig[lsp].setup {
+ -- on_attach = my_custom_on_attach,
+ capabilities = capabilities,
+ }
+ end
+
+ local luasnip = require 'luasnip'
+
+ local cmp = require 'cmp'
+ cmp.setup {
+ snippet = {
+ expand = function(args)
+ luasnip.lsp_expand(args.body)
+ end,
+ },
+ mapping = cmp.mapping.preset.insert({
+ ['<C-d>'] = cmp.mapping.scroll_docs(-4),
+ ['<C-f>'] = cmp.mapping.scroll_docs(4),
+ ['<C-Space>'] = cmp.mapping.complete(),
+ ['<CR>'] = cmp.mapping.confirm {
+ behavior = cmp.ConfirmBehavior.Replace,
+ select = true,
+ },
+ ['<Tab>'] = cmp.mapping(function(fallback)
+ if cmp.visible() then
+ cmp.select_next_item()
+ elseif luasnip.expand_or_jumpable() then
+ luasnip.expand_or_jump()
+ else
+ fallback()
+ end
+ end, { 'i', 's' }),
+ ['<S-Tab>'] = cmp.mapping(function(fallback)
+ if cmp.visible() then
+ cmp.select_prev_item()
+ elseif luasnip.jumpable(-1) then
+ luasnip.jump(-1)
+ else
+ fallback()
+ end
+ end, { 'i', 's' }),
+ }),
+ sources = {
+ { name = 'nvim_lsp' },
+ { name = 'luasnip' },
+ },
+ }
+#+end_src
diff --git a/config/nvim/lua/behaviour.org b/config/nvim/lua/behaviour.org
new file mode 100644
index 0000000..d843d7b
--- /dev/null
+++ b/config/nvim/lua/behaviour.org
@@ -0,0 +1,19 @@
+#+title: Neovim Behaviour Settings
+
+Use tabs with width 4.
+#+begin_src lua :tangle 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 yes
+ vim.opt.wildmode = 'longest,list'
+#+end_src
+
+Better management of file types.
+#+begin_src lua :tangle yes
+ vim.cmd('filetype plugin indent on')
+#+end_src
diff --git a/config/nvim/lua/format.org b/config/nvim/lua/format.org
new file mode 100644
index 0000000..5b362d0
--- /dev/null
+++ b/config/nvim/lua/format.org
@@ -0,0 +1,25 @@
+#+title: Neovim Formatting Settings
+Turn on =clang-format= in C, CUDA, C++, C#, Java, JavaScript, and JSON.
+#+begin_src lua :tangle yes
+ vim.cmd([[
+ let g:clang_format#code_style = 'file'
+ autocmd FileType c ClangFormatAutoEnable
+ autocmd FileType cuda ClangFormatAutoEnable
+ autocmd FileType cpp ClangFormatAutoEnable
+ autocmd FileType cs ClangFormatAutoEnable
+ autocmd FileType java ClangFormatAutoEnable
+ autocmd FileType javascript ClangFormatAutoEnable
+ autocmd FileType json ClangFormatAutoEnable
+ let g:vimtex_view_method = 'skim'
+ ]])
+#+end_src
+
+Auto-format Rust on save.
+#+begin_src lua :tangle yes
+ vim.g.rustfmt_autosave = 1
+#+end_src
+
+Start making a table by placing a =|=.
+#+begin_src lua :tangle yes
+ vim.g.table_mode_corner = '|'
+#+end_src
diff --git a/config/nvim/lua/languageServers.org b/config/nvim/lua/languageServers.org
new file mode 100644
index 0000000..8861ace
--- /dev/null
+++ b/config/nvim/lua/languageServers.org
@@ -0,0 +1,92 @@
+#+title: Neovim Language Server Configuration
+* Keybindings
+Set keys for LSP auto-completion.
+#+begin_src lua :tangle yes
+ vim.keymap.set('n', '<space>e', vim.diagnostic.open_float, opts)
+ vim.keymap.set('n', '[d', vim.diagnostic.goto_prev, opts)
+ vim.keymap.set('n', ']d', vim.diagnostic.goto_next, opts)
+ vim.keymap.set('n', '<space>q', vim.diagnostic.setloclist, opts)
+
+ -- Use an on_attach function to only map the following keys
+ -- after the language server attaches to the current buffer
+ local on_attach = function(client, bufnr)
+ -- Enable completion triggered by <c-x><c-o>
+ vim.api.nvim_buf_set_option(bufnr, 'omnifunc', 'v:lua.vim.lsp.omnifunc')
+
+ local bufopts = { noremap=true, silent=true, buffer=bufnr }
+ vim.keymap.set('n', 'gD', vim.lsp.buf.declaration, bufopts)
+ vim.keymap.set('n', 'gd', vim.lsp.buf.definition, bufopts)
+ vim.keymap.set('n', 'K', vim.lsp.buf.hover, bufopts)
+ vim.keymap.set('n', 'gi', vim.lsp.buf.implementation, bufopts)
+ vim.keymap.set('n', '<C-k>', vim.lsp.buf.signature_help, bufopts)
+ vim.keymap.set('n', '<space>wa', vim.lsp.buf.add_workspace_folder, bufopts)
+ vim.keymap.set('n', '<space>wr', vim.lsp.buf.remove_workspace_folder, bufopts)
+ vim.keymap.set('n', '<space>wl', function()
+ print(vim.inspect(vim.lsp.buf.list_workspace_folders()))
+ end, bufopts)
+ vim.keymap.set('n', '<space>D', vim.lsp.buf.type_definition, bufopts)
+ vim.keymap.set('n', '<space>rn', vim.lsp.buf.rename, bufopts)
+ vim.keymap.set('n', '<space>ca', vim.lsp.buf.code_action, bufopts)
+ vim.keymap.set('n', 'gr', vim.lsp.buf.references, bufopts)
+ vim.keymap.set('n', '<space>f', function() vim.lsp.buf.format { async = true } end, bufopts)
+ end
+#+end_src
+
+* Languages
+Turn on LSP for various languages.
+#+begin_src lua :tangle yes
+ require('lspconfig')['awk_ls'].setup{
+ on_attach = on_attach,
+ flags = lsp_flags,
+ }
+
+ require('lspconfig')['bashls'].setup{
+ on_attach = on_attach,
+ flags = lsp_flags,
+ }
+
+ require('lspconfig')['fortls'].setup{
+ on_attach = on_attach,
+ flags = lsp_flags,
+ }
+
+ require('lspconfig')['hls'].setup{
+ on_attach = on_attach,
+ flags = lsp_flags
+ }
+
+ require('lspconfig')['pyright'].setup{
+ on_attach = on_attach,
+ flags = lsp_flags,
+ }
+
+ require('lspconfig')['tsserver'].setup{
+ on_attach = on_attach,
+ flags = lsp_flags,
+ }
+
+ require('lspconfig')['rust_analyzer'].setup{
+ on_attach = on_attach,
+ flags = lsp_flags,
+ settings = {
+ ["rust-analyzer"] = {}
+ }
+ }
+
+ require('lspconfig')['gopls'].setup{
+ on_attach = on_attach,
+ flags = lsp_flags
+ }
+
+ require('lspconfig')['clangd'].setup{
+ on_attach = on_attach,
+ flags = lsp_flags
+ }
+
+ require('lspconfig')['texlab'].setup{
+ on_attach = on_attach,
+ flags = lsp_flags
+ }
+
+ require('lspconfig')['perlpls'].setup{}
+#+end_src
diff --git a/config/nvim/lua/plugins.org b/config/nvim/lua/plugins.org
new file mode 100644
index 0000000..0dab41b
--- /dev/null
+++ b/config/nvim/lua/plugins.org
@@ -0,0 +1,49 @@
+#+title: Neovim Plugins
+* Setup
+Use =lazy= to manage plugins.
+#+begin_src lua :tangle 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", -- latest stable release
+ lazypath,
+ })
+ end
+ vim.opt.rtp:prepend(lazypath)
+#+end_src
+
+* Plugins
+Install plugins here.
+#+begin_src lua :tangle yes
+require('lazy').setup({
+ 'itchyny/lightline.vim',
+ 'ayu-theme/ayu-vim',
+ 'Raimondi/delimitMate',
+ 'bronson/vim-trailing-whitespace',
+ 'dhruvasagar/vim-table-mode',
+ 'rhysd/vim-clang-format',
+ 'chrisbra/csv.vim',
+ 'neovim/nvim-lspconfig',
+ {
+ 'nvim-treesitter/nvim-treesitter',
+ cmd = 'TSUpdate'
+ },
+ 'junegunn/fzf',
+ 'junegunn/fzf.vim',
+ 'hrsh7th/nvim-cmp',
+ 'hrsh7th/cmp-nvim-lsp',
+ 'saadparwaiz1/cmp_luasnip',
+ 'L3MON4D3/LuaSnip',
+ {
+ 'fatih/vim-go',
+ cmd = 'GoUpdateBinaries',
+ },
+ 'rust-lang/rust.vim',
+ 'neovimhaskell/haskell-vim',
+ 'lervag/vimtex',
+})
+#+end_src
diff --git a/config/sway/config.org b/config/sway/config.org
new file mode 100644
index 0000000..b4923e6
--- /dev/null
+++ b/config/sway/config.org
@@ -0,0 +1,269 @@
+#+title: Sway Configuration
+* Variables
+Use =super= as modifier key.
+#+begin_src conf :tangle config
+ set $mod Mod4
+#+end_src
+
+Use =vi= motions as directional inputs.
+#+begin_src conf :tangle config
+ set $left h
+ set $down j
+ set $up k
+ set $right l
+#+end_src
+
+Use =foot= as default terminal.
+#+begin_src conf :tangle config
+ set $term foot
+#+end_src
+
+Use =wofi= as app launcher.
+#+begin_src conf :tangle config
+ set $menu wofi --show drun --allow-images
+#+end_src
+
+* Startup Application
+Use =dbus= environment.
+#+begin_src conf :tangle config
+ exec --no-startup-id dbus-update-activation-environment --all
+#+end_src
+
+Use =mako= as notification daemon.
+#+begin_src conf :tangle config
+ exec mako
+#+end_src
+
+Launch PipeWire without =systemd=.
+#+begin_src conf :tangle config
+ exec gentoo-pipewire-launcher &
+#+end_src
+
+Launch =blueman-applet= as Bluetooth daemon.
+#+begin_src conf :tangle config
+ exec blueman-applet
+#+end_src
+
+Launch music player daemon.
+#+begin_src conf :tangle config
+ exec mpd
+#+end_src
+
+Launch =mpdscribble= as scrobbler daemon.
+#+begin_src conf :tangle config
+ exec mpdscribble
+#+end_src
+
+* Display
+I use a vertical monitor on the left and horizontal monitor on the right.
+#+begin_src conf :tangle config
+ 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
+ output * bg ~/.wallpaper fill
+#+end_src
+
+Remove borders from windows.
+#+begin_src conf :tangle config
+ default_border none
+ default_floating_border none
+ font pango:monospace 1
+#+end_src
+
+Use 10 pixel gaps.
+#+begin_src conf :tangle config
+ gaps inner 10
+#+end_src
+
+Use =waybar= as a top bar.
+#+begin_src conf :tangle config
+ bar {
+ position top
+
+ status_command waybar
+ mode invisible
+ }
+#+end_src
+
+* Input
+Use pointer acceleration.
+#+begin_src conf :tangle config
+ 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
+ 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
+ bindsym $mod+Return exec $term
+#+end_src
+
+Add keybinding for killing a window.
+#+begin_src conf :tangle config
+ bindsym $mod+Shift+q kill
+#+end_src
+
+Add keybinding for opening an app launcher.
+#+begin_src conf :tangle config
+ bindsym $mod+d exec $menu
+#+end_src
+
+Holding the modifier key allows moving a window.
+#+begin_src conf :tangle config
+ floating_modifier $mod normal
+#+end_src
+
+Add keybinding for reloading the configuration.
+#+begin_src conf :tangle config
+ 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
+ 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
+ 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
+ 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
+ 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
+ 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
+ bindsym $mod+v splith
+ bindsym $mod+s splitv
+#+end_src
+
+Toggle layout keybindings.
+#+begin_src conf :tangle config
+ bindsym $mod+e layout toggle split
+#+end_src
+
+Define full screen keybinding.
+#+begin_src conf :tangle config
+ bindsym $mod+f fullscreen
+#+end_src
+
+Define toggle floating keybinding.
+#+begin_src conf :tangle config
+ bindsym $mod+Shift+space floating toggle
+#+end_src
+
+Move focus between floating and tiled layer keybinding.
+#+begin_src conf :tangle config
+ bindsym $mod+space focus mode_toggle
+#+end_src
+
+Focus on the parent window keybinding.
+#+begin_src conf :tangle config
+ bindsym $mod+a focus parent
+#+end_src
+
+Keybindings to move a window to the scratchpad and back from it.
+#+begin_src conf :tangle config
+ bindsym $mod+Shift+minus move scratchpad
+ bindsym $mod+minus scratchpad show
+#+end_src
+
+Add resize keybindings.
+#+begin_src conf :tangle config
+ 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
+ bindsym $mod+Shift+s exec grim -g "$(slurp)" - | wl-copy
+#+end_src
+
+Add volume keybindings.
+#+begin_src conf :tangle config
+ 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
+ bindsym XF86Eject exec mpc toggle
+#+end_src
+
+* Extras
+Load extra configuration.
+#+begin_src conf :tangle config
+ include /etc/sway/config.d/*
+#+end_src
diff --git a/config/sway/poweraction.org b/config/sway/poweraction.org
new file mode 100644
index 0000000..72931c7
--- /dev/null
+++ b/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 or power off.
+#+begin_src sh :tangle poweraction
+ rm ~/.swaynaglock
+ case $1 in
+ logout) swaymsg exit;;
+ ,*) doas "/sbin/$1";;
+ esac
+#+end_src
diff --git a/config/sway/powerprompt.org b/config/sway/powerprompt.org
new file mode 100644
index 0000000..796bead
--- /dev/null
+++ b/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 powerprompt
+ 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/config/waybar/config.org b/config/waybar/config.org
new file mode 100644
index 0000000..a23d887
--- /dev/null
+++ b/config/waybar/config.org
@@ -0,0 +1,110 @@
+#+title: Waybar Configuration
+* Layout
+Define the layout of the bar.
+#+begin_src js-json :tangle config
+ {
+ "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.
+#+begin_src js-json :tangle config
+ "sway/scratchpad": {
+ "format": "{icon} {count}",
+ "show-empty": false,
+ "format-icons": ["", ""],
+ "tooltip": true,
+ "tooltip-format": "{app}: {title}"
+ },
+#+end_src
+
+Define music player daemon component.
+#+begin_src js-json :tangle config
+ "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-json :tangle config
+ "tray": {
+ "icon-size": 21,
+ "spacing": 10,
+ "show-passive-items": true
+ },
+#+end_src
+
+Define clock component.
+#+begin_src js-json :tangle config
+ "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.
+#+begin_src js-json :tangle config
+ "cpu": {
+ "format": "{usage}% ",
+ "tooltip": false
+ },
+#+end_src
+
+Define memory usage component.
+#+begin_src js-json :tangle config
+ "memory": {
+ "format": "{}% "
+ },
+#+end_src
+
+Define network component.
+#+begin_src js-json :tangle config
+ "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.
+#+begin_src js-json :tangle config
+ "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/config/waybar/style.org b/config/waybar/style.org
new file mode 100644
index 0000000..193b465
--- /dev/null
+++ b/config/waybar/style.org
@@ -0,0 +1,142 @@
+#+title: Waybar Styling
+* Global
+Set global font, colours, and transitions.
+#+begin_src css :tangle 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
+
+* Button
+Set global button styling.
+#+begin_src css :tangle yes
+ button {
+ box-shadow: inset 0 -3px transparent;
+ border: none;
+ border-radius: 0;
+ }
+#+end_src
+
+Set button hover styling
+#+begin_src css :tangle yes
+ button:hover {
+ background: inherit;
+ box-shadow: inset 0 -3px #ffffff;
+ }
+#+end_src
+
+Set workspace button styling.
+#+begin_src css :tangle yes
+ #workspaces button {
+ padding: 0 5px;
+ text-shadow: 1px 1px #64727D;
+ background-color: transparent;
+ color: #ffffff;
+ }
+#+end_src
+
+Set button hover styling in workspaces.
+#+begin_src css :tangle yes
+ #workspaces button:hover {
+ background: rgba(0, 0, 0, 0.2);
+ }
+#+end_src
+
+Set button focused styling in workspaces.
+#+begin_src css :tangle yes
+ #workspaces button.focused {
+ background: transparent;
+ text-shadow: 1px 1px #64727D;
+ box-shadow: inset 0 -3px #ffffff;
+ }
+#+end_src
+
+Set button urgent styling in workspaces.
+#+begin_src css :tangle yes
+ #workspaces button.urgent {
+ background-color: #eb4d4b;
+ }
+#+end_src
+
+* Modes
+Set global mode styling.
+#+begin_src css :tangle yes
+ #mode {
+ background-color: #64727D;
+ border-bottom: 3px solid #ffffff;
+ }
+#+end_src
+
+Set typical mode styling.
+#+begin_src css :tangle yes
+ #clock,
+ #cpu,
+ #memory,
+ #disk,
+ #network,
+ #pulseaudio,
+ #wireplumber,
+ #custom-media,
+ #tray,
+ #mode,
+ #scratchpad,
+ #mpd {
+ padding: 0 10px;
+ color: #ffffff;
+ }
+#+end_src
+
+Add margins for workspaces and windows.
+#+begin_src css :tangle yes
+ #window,
+ #workspaces {
+ margin: 0 4px;
+ }
+#+end_src
+
+Omit margins on leftmost and rightmost workspaces.
+#+begin_src css :tangle 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
+
+Set focus styling.
+#+begin_src css :tangle yes
+ label:focus {
+ background-color: #000000;
+ }
+#+end_src
+
+Set important mode styling.
+#+begin_src css :tangle yes
+ #tray > .passive {
+ -gtk-icon-effect: dim;
+ }
+
+ #tray > .needs-attention {
+ -gtk-icon-effect: highlight;
+ }
+#+end_src
+
+Set scratchpad styling.
+#+begin_src css :tangle yes
+ #scratchpad {
+ background: rgba(0, 0, 0, 0.2);
+ }
+
+ #scratchpad.empty {
+ background-color: transparent;
+ }
+#+end_src