about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--.config/mc/hotlist2
-rw-r--r--.config/mc/hotlist.bak1
-rw-r--r--.config/mc/ini166
-rw-r--r--.config/mc/panels.ini37
-rw-r--r--.config/shell/alias3
-rw-r--r--.config/shell/vars3
-rw-r--r--.emacs.d/config.org1138
-rw-r--r--.ghci1
-rw-r--r--.gitconfig3
-rw-r--r--.mg1
-rw-r--r--.stow-local-ignore2
-rw-r--r--.xsessionrc2
-rw-r--r--.zshrc86
-rw-r--r--README.md2
-rw-r--r--config/bat/config1
-rw-r--r--config/bat/themes/modus_vivendi.tmTheme439
-rw-r--r--config/emacs/.gitignore62
-rw-r--r--config/emacs/config.org950
-rw-r--r--config/emacs/early-init.el9
-rw-r--r--config/emacs/init.el (renamed from .emacs.d/init.el)0
-rw-r--r--config/eza/theme.yml147
-rw-r--r--config/lazygit/.gitignore1
-rw-r--r--config/lazygit/config.yml182
-rw-r--r--config/nvim/.gitignore1
-rw-r--r--config/nvim/.luarc.json18
-rw-r--r--config/nvim/ftplugin/markdown.lua10
-rw-r--r--config/nvim/init.lua10
-rw-r--r--config/nvim/lua/config/colemak.lua32
-rw-r--r--config/nvim/lua/config/keymaps.lua53
-rw-r--r--config/nvim/lua/config/options.lua107
-rw-r--r--config/nvim/lua/manager.lua26
-rw-r--r--config/nvim/lua/plugins/autopairs.lua8
-rw-r--r--config/nvim/lua/plugins/catppuccin.lua15
-rw-r--r--config/nvim/lua/plugins/cmp.lua99
-rw-r--r--config/nvim/lua/plugins/colorizer.lua15
-rw-r--r--config/nvim/lua/plugins/compile.lua20
-rw-r--r--config/nvim/lua/plugins/image.lua20
-rw-r--r--config/nvim/lua/plugins/lazygit.lua20
-rw-r--r--config/nvim/lua/plugins/lualine.lua38
-rw-r--r--config/nvim/lua/plugins/oil.lua28
-rw-r--r--config/nvim/lua/plugins/rainbow-delimiters.lua6
-rw-r--r--config/nvim/lua/plugins/remember.lua7
-rw-r--r--config/nvim/lua/plugins/render-markdown.lua114
-rw-r--r--config/nvim/lua/plugins/telescope.lua40
-rw-r--r--config/nvim/lua/plugins/todo-comments.lua14
-rw-r--r--config/nvim/lua/plugins/ui.lua27
-rw-r--r--config/nvim/lua/plugins/which-key.lua17
-rw-r--r--config/nvim/lua/plugins/zk.lua26
-rw-r--r--config/nvim/lua/scripts/diagnostics.lua760
-rw-r--r--config/nvim/lua/scripts/init.lua4
-rw-r--r--config/shell/alias10
-rw-r--r--config/shell/functions16
-rw-r--r--config/shell/vars5
-rw-r--r--config/starship/config.toml97
-rw-r--r--config/yazi/keymap.toml164
-rw-r--r--config/yazi/modus_vivendi.tmTheme439
-rw-r--r--config/yazi/theme.toml135
-rw-r--r--config/yazi/yazi.toml7
-rw-r--r--config/zk/config.toml35
-rw-r--r--config/zk/templates/note.md6
-rw-r--r--flake.lock48
-rw-r--r--flake.nix31
-rw-r--r--home.nix66
63 files changed, 4386 insertions, 1446 deletions
diff --git a/.config/mc/hotlist b/.config/mc/hotlist
deleted file mode 100644
index 47b50be..0000000
--- a/.config/mc/hotlist
+++ /dev/null
@@ -1,2 +0,0 @@
-ENTRY "/home/venomade/.build/suckless" URL "/home/venomade/.build/suckless"
-ENTRY "/home/venomade/Documents" URL "/home/venomade/Documents"
diff --git a/.config/mc/hotlist.bak b/.config/mc/hotlist.bak
deleted file mode 100644
index 4dbffb7..0000000
--- a/.config/mc/hotlist.bak
+++ /dev/null
@@ -1 +0,0 @@
-ENTRY "/home/venomade/.build/suckless" URL "/home/venomade/.build/suckless"
diff --git a/.config/mc/ini b/.config/mc/ini
deleted file mode 100644
index 115ff36..0000000
--- a/.config/mc/ini
+++ /dev/null
@@ -1,166 +0,0 @@
-[Midnight-Commander]
-verbose=true
-shell_patterns=true
-auto_save_setup=true
-preallocate_space=false
-auto_menu=false
-use_internal_view=false
-use_internal_edit=false
-clear_before_exec=true
-confirm_delete=true
-confirm_overwrite=true
-confirm_execute=false
-confirm_history_cleanup=true
-confirm_exit=false
-confirm_directory_hotlist_delete=false
-confirm_view_dir=false
-safe_delete=false
-safe_overwrite=false
-use_8th_bit_as_meta=false
-mouse_move_pages_viewer=true
-mouse_close_dialog=false
-fast_refresh=false
-drop_menus=false
-wrap_mode=true
-old_esc_mode=true
-cd_symlinks=true
-show_all_if_ambiguous=false
-alternate_plus_minus=false
-only_leading_plus_minus=true
-show_output_starts_shell=false
-xtree_mode=false
-file_op_compute_totals=true
-classic_progressbar=true
-use_netrc=true
-ftpfs_always_use_proxy=false
-ftpfs_use_passive_connections=true
-ftpfs_use_passive_connections_over_proxy=false
-ftpfs_use_unix_list_options=true
-ftpfs_first_cd_then_ls=true
-ignore_ftp_chattr_errors=true
-editor_fill_tabs_with_spaces=false
-editor_return_does_auto_indent=true
-editor_backspace_through_tabs=false
-editor_fake_half_tabs=true
-editor_option_save_position=true
-editor_option_auto_para_formatting=false
-editor_option_typewriter_wrap=false
-editor_edit_confirm_save=true
-editor_syntax_highlighting=true
-editor_persistent_selections=true
-editor_drop_selection_on_copy=true
-editor_cursor_beyond_eol=false
-editor_cursor_after_inserted_block=false
-editor_visible_tabs=true
-editor_visible_spaces=true
-editor_line_state=false
-editor_simple_statusbar=false
-editor_check_new_line=false
-editor_show_right_margin=false
-editor_group_undo=false
-editor_state_full_filename=false
-editor_ask_filename_before_edit=false
-nice_rotating_dash=true
-shadows=true
-mcview_remember_file_position=false
-auto_fill_mkdir_name=true
-copymove_persistent_attr=true
-pause_after_run=1
-mouse_repeat_rate=100
-double_click_speed=250
-old_esc_mode_timeout=1000000
-max_dirt_limit=10
-num_history_items_recorded=60
-vfs_timeout=60
-ftpfs_directory_timeout=900
-ftpfs_retry_seconds=30
-shell_directory_timeout=900
-editor_tab_spacing=8
-editor_word_wrap_line_length=72
-editor_option_save_mode=0
-editor_backup_extension=~
-editor_filesize_threshold=64M
-editor_stop_format_chars=-+*\\,.;:&>
-mcview_eof=
-skin=seasons-winter16M
-filepos_max_saved_entries=1024
-
-use_file_to_guess_type=true
-fish_directory_timeout=900
-
-[Layout]
-output_lines=0
-left_panel_size=40
-top_panel_size=0
-message_visible=true
-keybar_visible=false
-xterm_title=true
-command_prompt=true
-menubar_visible=false
-free_space=false
-horizontal_split=false
-vertical_equal=true
-horizontal_equal=true
-
-[Misc]
-timeformat_recent=%b %e %H:%M
-timeformat_old=%b %e  %Y
-ftp_proxy_host=gate
-ftpfs_password=anonymous@
-display_codepage=UTF-8
-source_codepage=Other_8_bit
-autodetect_codeset=
-clipboard_store=
-clipboard_paste=
-
-spell_language=en
-
-[Colors]
-base_color=
-xterm-kitty=
-color_terminals=
-
-xterm-256color=
-
-[Panels]
-simple_swap=false
-show_mini_info=true
-kilobyte_si=false
-mix_all_files=false
-show_backups=true
-show_dot_files=true
-fast_reload=false
-fast_reload_msg_shown=false
-mark_moves_down=true
-reverse_files_only=true
-auto_save_setup_panels=false
-navigate_with_arrows=false
-panel_scroll_pages=true
-panel_scroll_center=false
-mouse_move_pages=true
-filetype_mode=true
-permission_mode=false
-torben_fj_mode=false
-quick_search_mode=0
-select_flags=6
-
-[FindFile]
-file_case_sens=true
-file_shell_pattern=true
-file_find_recurs=true
-follow_symlinks=false
-file_skip_hidden=false
-file_all_charsets=false
-content_case_sens=true
-content_regexp=false
-content_first_hit=false
-content_whole_words=false
-content_all_charsets=false
-ignore_dirs_enable=true
-ignore_dirs=
-
-[Panelize]
-Find *.orig after patching=find . -name \\*.orig -print
-Find SUID and SGID programs=find . \\( \\( -perm -04000 -a -perm /011 \\) -o \\( -perm -02000 -a -perm /01 \\) \\) -print
-Find rejects after patching=find . -name \\*.rej -print
-Modified git files=git ls-files --modified
diff --git a/.config/mc/panels.ini b/.config/mc/panels.ini
deleted file mode 100644
index d22858b..0000000
--- a/.config/mc/panels.ini
+++ /dev/null
@@ -1,37 +0,0 @@
-[New Left Panel]
-display=listing
-reverse=false
-case_sensitive=true
-exec_first=false
-sort_order=name
-list_mode=full
-brief_cols=2
-user_format=half type name | size | perm
-user_status0=half type name | size | perm
-user_status1=half type name | size | perm
-user_status2=half type name | size | perm
-user_status3=half type name | size | perm
-user_mini_status=false
-filter_flags=7
-list_format=full
-
-[New Right Panel]
-display=listing
-reverse=false
-case_sensitive=true
-exec_first=false
-sort_order=name
-list_mode=full
-brief_cols=2
-user_format=half type name | size | perm
-user_status0=half type name | size | perm
-user_status1=half type name | size | perm
-user_status2=half type name | size | perm
-user_status3=half type name | size | perm
-user_mini_status=false
-filter_flags=7
-list_format=full
-
-[Dirs]
-current_is_left=true
-other_dir=/home/venomade/.build/suckless/patches/st
diff --git a/.config/shell/alias b/.config/shell/alias
deleted file mode 100644
index c060c0e..0000000
--- a/.config/shell/alias
+++ /dev/null
@@ -1,3 +0,0 @@
-alias gvc="ssh git@git.venomade.com"
-alias rgf='rg --files | rg'
-alias ls='ls --color=auto'
\ No newline at end of file
diff --git a/.config/shell/vars b/.config/shell/vars
deleted file mode 100644
index 11f8faa..0000000
--- a/.config/shell/vars
+++ /dev/null
@@ -1,3 +0,0 @@
-export PATH="$PATH:$HOME/.local/bin"
-
-export EDITOR=mg
\ No newline at end of file
diff --git a/.emacs.d/config.org b/.emacs.d/config.org
deleted file mode 100644
index 5b7f51e..0000000
--- a/.emacs.d/config.org
+++ /dev/null
@@ -1,1138 +0,0 @@
-#+title: Emacs Config
-#+author: Venomade
-
-* Contents :toc_2:
-- [[#straight-package-manager][Straight Package Manager]]
-- [[#configs][Configs]]
-  - [[#custom-functions][Custom Functions]]
-  - [[#fix-annoyances][Fix Annoyances]]
-  - [[#keybindings][Keybindings]]
-  - [[#setup-line-numbers][Setup Line Numbers]]
-- [[#general][General]]
-  - [[#avy][Avy]]
-  - [[#colors][Colors]]
-  - [[#dired][Dired]]
-  - [[#eshell][EShell]]
-  - [[#git][Git]]
-  - [[#move-text][Move Text]]
-  - [[#ivy-counsel][Ivy (Counsel)]]
-  - [[#simple-modeline][Simple Modeline]]
-  - [[#smart-parentheses-pairing][Smart Parentheses Pairing]]
-  - [[#undo-tree][Undo Tree]]
-- [[#org-mode][Org Mode]]
-  - [[#table-of-contents][Table of Contents]]
-  - [[#bullet-headers][Bullet Headers]]
-  - [[#org-agenda][Org Agenda]]
-  - [[#org-babel][Org Babel]]
-  - [[#org-tempo][Org Tempo]]
-  - [[#styling][Styling]]
-- [[#programming][Programming]]
-  - [[#projects][Projects]]
-  - [[#lsp][LSP]]
-  - [[#treesitter][TreeSitter]]
-  - [[#languages][Languages]]
-  - [[#company][Company]]
-  - [[#cape][Cape]]
-  - [[#utilities][Utilities]]
-- [[#user-interface][User Interface]]
-  - [[#add-nerd-icons][Add Nerd Icons]]
-  - [[#fonts][Fonts]]
-  - [[#theme][Theme]]
-  - [[#niceties][Niceties]]
-  - [[#modern-looking-emacs][Modern Looking Emacs]]
-
-* Straight Package Manager
-I'm using the Straight package manager instead of use-package because it is only available in Emacs 29 and above.
-#+begin_src emacs-lisp
-  (defvar bootstrap-version)
-  (let ((bootstrap-file
-	 (expand-file-name "straight/repos/straight.el/bootstrap.el" user-emacs-directory))
-	(bootstrap-version 6))
-    (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))
-
-  (setq straight-use-package-by-default t)
-#+end_src
-
-* Configs
-** Custom Functions
-*** Cursor follow on split 
-This is so that action can be taken as soon as a split takes place, to either close/move the window or perform an action inside of it.
-#+begin_src emacs-lisp
-  (defun split-and-follow-horizontally()
-    (interactive)
-    (split-window-below)
-    (balance-windows)
-    (other-window 1))
-
-  (defun split-and-follow-vertically()
-    (interactive)
-    (split-window-right)
-    (balance-windows)
-    (other-window 1))
-#+end_src
-*** Duplicate Line
-Duplicates the current line to the line below.
-#+begin_src emacs-lisp
-  (defun duplicate-line ()
-    (interactive)
-    (let ((column (- (point) (point-at-bol)))
-    (line (let ((s (thing-at-point 'line t)))
-      (if s (string-remove-suffix "\n" s) ""))))
-      (move-end-of-line 1)
-      (newline)
-      (insert line)
-      (move-beginning-of-line 1)
-      (forward-char column)))
-
-  (keymap-global-set "C-c y d" 'duplicate-line)
-#+end_src
-*** Open Line above and below
-Vim's o and S-o implemented for Emacs bindings.
-#+begin_src emacs-lisp
-  (defun vi-open-line-above ()
-    (interactive)
-    (unless (bolp)
-      (beginning-of-line))
-    (newline)
-    (forward-line -1)
-    (indent-according-to-mode))
-
-  (defun vi-open-line-below ()
-    (interactive)
-    (unless (eolp)
-      (end-of-line))
-    (newline-and-indent))
-
-  (keymap-global-set "C-c O" 'vi-open-line-below)
-  (keymap-global-set "C-c o" 'vi-open-line-above)
-#+end_src
-*** C-a to indentation
-Have c-a move the cursor to the start after indentation unless already there.
-#+begin_src emacs-lisp
-  (defun smart-beginning-of-line ()
-    (interactive)
-    (let ((initial-point (point)))
-      (back-to-indentation)
-      (when (eq initial-point (point))
-        (move-beginning-of-line 1))))
-
-  (defun setup-prog-mode-c-a ()
-    (local-set-key (kbd "C-a") 'smart-beginning-of-line))
-
-  (add-hook 'prog-mode-hook 'setup-prog-mode-c-a)
-#+end_src
-*** Automatically Cull Whitespace
-Remove trailing whitespaces when saving in prog-modes.
-#+begin_src emacs-lisp
-  (defun prog-nuke-trailing-whitespace ()
-    (when (derived-mode-p 'prog-mode)
-      (delete-trailing-whitespace)))
-
-  (add-hook 'before-save-hook 'prog-nuke-trailing-whitespace)
-#+end_src
-*** Quick Grep
-Quickly grep both my current project and the system include directory.
-#+begin_src emacs-lisp
-  (defun grep-symbol-at-point ()
-    (interactive)
-    (let ((symbol (thing-at-point 'symbol)))
-      (if symbol
-          (counsel-rg (concat symbol))
-        (message "No symbol at point."))))
-
-  (defun grep-symbol-in-include-at-point ()
-    (interactive)
-    (let ((symbol (thing-at-point 'symbol)))
-      (if symbol
-          (counsel-rg (concat symbol) "/usr/include/")
-        (message "No symbol at point."))))
-
-  (global-set-key (kbd "C-c g") 'grep-symbol-at-point)
-  (global-set-key (kbd "C-c G") 'grep-symbol-in-include-at-point)
-#+end_src
-
-** Fix Annoyances
-*** Disable Backups
-Living on the edge.
-#+begin_src emacs-lisp
-  (setq backup-directory-alist
-  `(("." . ,(concat user-emacs-directory "backups"))))
-  (setq auto-save-file-name-transforms
-  `(("." ,(concat user-emacs-directory "autosaves/") t)))
-  (setq lock-file-name-transforms
-  `(("." ,(concat user-emacs-directory "lock") t)))
-#+end_src
-*** Disable Bell
-Only flash, no sound, it gets annoying.
-#+begin_src emacs-lisp
-  (setq ring-bell-function 'ignore)
-#+end_src
-*** Hide Warnings
-Fixing warnings is for nerds. This is basically necessary after more than 5 packages.
-#+begin_src emacs-lisp
-  (setq warning-minimum-level :emergency)
-#+end_src
-*** Add Scroll Marginn
-This adds a scroll margin at the top and bottom of 10 lines to make it easier to scroll through the buffer.
-#+begin_src emacs-lisp
-  (setq scroll-margin 10)
-#+end_src
-*** Save Place
-Go back to old position on file open.
-#+begin_src emacs-lisp
-  (save-place-mode 1)
-#+end_src
-
-** Keybindings
-*** Reload Emacs
-Reload Emacs by sourcing the init.el file.
-#+begin_src emacs-lisp
-  (keymap-global-set "C-c e c" (lambda () (interactive) (load-file "~/.emacs.d/init.el")))
-#+end_src
-*** Open Common Files
-Open the TODO, Bookmarks and Notes from synced Documents and the config file with simple shortcuts.
-#+begin_src emacs-lisp
-  (keymap-global-set "C-c f c" (lambda () (interactive) (find-file "~/.emacs.d/config.org")))
-  (keymap-global-set "C-c f t" (lambda () (interactive) (find-file "~/Documents/TODO.org")))
-  (keymap-global-set "C-c f b" (lambda () (interactive) (find-file "~/Documents/Bookmarks.org")))
-  (keymap-global-set "C-c f n" (lambda () (interactive) (find-file "~/Documents/Notes.org")))
-  (keymap-global-set "C-c f i" (lambda () (interactive) (find-file "~/Documents/Ideas.org")))
-#+end_src
-*** Switch and Revert Buffers
-Add shortcuts to switch buffers and to revert buffer.
-#+begin_src emacs-lisp
-  (keymap-global-set "C-x C-b" 'ibuffer)
-  (keymap-global-set "C-c b p" 'previous-buffer)
-  (keymap-global-set "C-c b n" 'next-buffer)
-  (keymap-global-set "C-c b r" 'revert-buffer)
-#+end_src
-*** Compile Mode
-Add shortcuts to build in compile-mode.
-#+begin_src emacs-lisp
-  (setq compilation-scroll-output t)
-  (keymap-global-set "C-c m c" 'compile)
-  (keymap-global-set "C-c m r" 'recompile)
-#+end_src
-*** Emacs
-Add shortcuts to various Emacs functions.
-#+begin_src emacs-lisp
-  (keymap-global-set "C-c e b" 'eval-buffer)
-  (keymap-global-set "C-c e r" 'eval-region)
-  (keymap-global-set "C-c e s" 'eshell)
-  (keymap-global-set "C-c e t" 'ef-themes-load-random)
-#+end_src
-*** Regex and Copy from Above
-Add shortcuts to entering a regex replace and copying a line from above.
-#+begin_src emacs-lisp
-  (keymap-global-set "C-c r" 'replace-regexp)
-  (keymap-global-set "C-c y a" 'copy-from-above-command)
-#+end_src
-*** Window Management
-Add shortcuts to scrolling and moving between windows.
-#+begin_src emacs-lisp
-  (keymap-global-set "C-c v" 'scroll-other-window)
-  (keymap-global-set "C-c V" 'scroll-other-window-down)
-
-  (keymap-global-set "C-c w n" 'other-window)
-  (keymap-global-set "C-c w f" 'other-window)
-  (keymap-global-set "C-c w p" (lambda () (interactive) (other-window -1)))
-  (keymap-global-set "C-c w b" (lambda () (interactive) (other-window -1)))
-#+end_src
-
-** Setup Line Numbers
-*** Always show line numbers
-Show line numbers and highlight the current line.
-#+begin_src emacs-lisp
-  (add-hook 'prog-mode-hook 'display-line-numbers-mode)
-  (global-visual-line-mode t)
-  (add-hook 'prog-mode-hook (lambda () (visual-line-mode -1)))
-  (setq-default truncate-lines t)
-  (global-hl-line-mode 1)
-#+end_src
-*** Generally use spaces instead of tabs
-Generally, as in everywhere but Go.
-#+begin_src emacs-lisp
-  (setq-default indent-tabs-mode nil)
-  (setq tab-width 2)
-  (setq tab-stop-list (number-sequence 2 100 2))
-#+end_src
-*** Highlight Column
-Highlight a column at 120 chars to respect GNOME style.
-#+begin_src emacs-lisp
-  (setq-default display-fill-column-indicator-column 120)
-  (add-hook 'prog-mode-hook #'display-fill-column-indicator-mode)
-#+end_src
-
-* General
-** Avy
-Keybind superfast cursor movement to "C-q".
-#+begin_src emacs-lisp
-  (use-package avy
-    :config
-    (setq avy-keys '(?a ?r ?s ?t ?n ?e ?i ?o)
-          avy-all-windows nil)
-    (bind-key* "C-q" 'avy-goto-char))
-#+end_src
-
-** Colors
-*** Highlight Todo
-Highlight TODO items so they can be reviewed later.
-#+begin_src emacs-lisp
-  (use-package hl-todo
-    :hook ((org-mode . hl-todo-mode)
-           (prog-mode . hl-todo-mode))
-
-    :config
-    (setq hl-todo-highlight-punctuation ":"
-          hl-todo-highlight-faces
-          `(("TODO"       warning bold)
-            ("FIXME"      error bold)
-            ("HACK"       font-lock-constant-face bold)
-            ("REVIEW"     font-lock-doc-face bold)
-            ("NOTE"       success bold)
-            ("DEPRECATED" font-lock-doc-face bold))))
-#+end_src
-*** Rainbow Delimiters
-Makes different brackets and other delimeters levels different colors so they can be quickly distinguished.
-#+begin_src emacs-lisp
-  (use-package rainbow-delimiters
-    :hook (prog-mode . rainbow-delimiters-mode))
-#+end_src
-
-** Dired
-A powerful built-in file manager.
-#+begin_src emacs-lisp
-  (setq dired-listing-switches "-lh")
-#+end_src
-
-** EShell
-A built in posix shell.
-#+begin_src emacs-lisp
-  ;; Define custom faces for the prompt. These inherit from standard faces so they
-  ;; automatically adapt to your current theme.
-  (defface eshell-prompt-user-face
-    '((t (:inherit font-lock-keyword-face)))
-    "Face for the username in the eshell prompt."
-    :group 'eshell-prompt)
-
-  (defface eshell-prompt-venv-face
-    '((t (:inherit font-lock-string-face)))
-    "Face for the virtualenv name in the eshell prompt."
-    :group 'eshell-prompt)
-
-  (defface eshell-prompt-dir-face
-    '((t (:inherit dired-directory)))
-    "Face for the directory path in the eshell prompt."
-    :group 'eshell-prompt)
-
-  (defface eshell-prompt-git-face
-    '((t (:inherit magit-tag)))
-    "Face for the git branch in the eshell prompt."
-    :group 'eshell-prompt)
-
-  (defface eshell-prompt-git-dirty-face
-    '((t (:inherit eshell-prompt-git-face)))
-    "Face for the git dirty status in the eshell prompt."
-    :group 'eshell-prompt)
-
-  (defface eshell-prompt-symbol-face
-    '((t (:inherit font-lock-builtin-face)))
-    "Face for the prompt symbol (e.g. λ) in the eshell prompt."
-    :group 'eshell-prompt)
-
-  ;; A helper function to abbreviate long directory names.
-  (defun my-abbreviate-dir (dir)
-    "Abbreviate DIR to show only the first and the last two components.
-  For example, \"~/Projects/Learning/C/GeneticsProject/TsodingGenetics\" becomes
-  \"~/.../GeneticsProject/TsodingGenetics\"."
-    (let* ((abbrev (abbreviate-file-name dir))
-           (components (split-string abbrev "/" t))  ; t omits empty strings
-           (num-components (length components)))
-      (if (>= num-components 4)
-          (concat (car components) "/.../"
-                  (mapconcat #'identity (last components 2) "/"))
-        abbrev)))
-
-  ;; These are the same helper functions for git information you had.
-  (defun my-prompt-git-branch ()
-    "Return the current git branch or short commit hash, if available."
-    (when (and (executable-find "git")
-               (locate-dominating-file default-directory ".git"))
-      (with-temp-buffer
-        (let ((ret (call-process "git" nil t nil "symbolic-ref" "--short" "HEAD")))
-          (if (zerop ret)
-              (string-trim (buffer-string))
-            (when (zerop (call-process "git" nil t nil "rev-parse" "--short" "HEAD"))
-              (string-trim (buffer-string))))))))
-
-  (defun my-prompt-git-dirty ()
-    "Return a dirty flag (✗ if dirty, ✓ if clean) for the git repository."
-    (when (my-prompt-git-branch)
-      (with-temp-buffer
-        (call-process "git" nil t nil "status" "--porcelain")
-        (if (> (buffer-size) 0) "✗" "✓"))))
-
-  ;; Finally, build the prompt itself.
-  (defun eshell-prompt ()
-    "Custom eshell prompt with theme-derived colors and shortened directory path."
-    (let* ((user (propertize (user-login-name) 'face 'eshell-prompt-user-face))
-           (venv (when-let ((venv (getenv "VIRTUAL_ENV")))
-                   (concat (propertize "(" 'face 'eshell-prompt-venv-face)
-                           (propertize (file-name-nondirectory venv) 'face 'eshell-prompt-venv-face)
-                           (propertize ")" 'face 'eshell-prompt-venv-face))))
-           (path (propertize (my-abbreviate-dir (eshell/pwd)) 'face 'eshell-prompt-dir-face))
-           (git-branch (my-prompt-git-branch))
-           (git-info (when git-branch
-                       (concat " " (propertize "on" 'face 'font-lock-number-face) " "
-                               (propertize git-branch 'face 'eshell-prompt-git-face)
-                               (propertize (my-prompt-git-dirty) 'face 'eshell-prompt-git-dirty-face))))
-           (prompt (concat user " " (propertize "in" 'face 'font-lock-number-face) " "
-                           (if venv (concat venv " ") "")
-                           path git-info "\n"
-                           (propertize "λ" 'face 'eshell-prompt-symbol-face) " ")))
-      prompt))
-
-  ;; Tell eshell to use our prompt function.
-  (setq eshell-prompt-function 'eshell-prompt)
-  (setq eshell-prompt-regexp "^[^λ\n]*λ ")
-#+end_src
-** Git
-Tools for the primary version control system.
-*** Magit
-A very extensive Git GUI for Emacs.
-#+begin_src emacs-lisp
-  (use-package magit)
-#+end_src
-*** Magit Todos
-Show Todo list in Magit.
-#+begin_src emacs-lisp
-  (use-package magit-todos
-    :after magit
-    :config (magit-todos-mode 1))
-#+end_src
-*** Magit Forge
-Work with Git Forges from within Emacs.
-#+begin_src emacs-lisp
-    (use-package forge
-      :after magit
-      :config
-      (setq auth-sources '("~/.authinfo")))
-#+end_src
-
-** Move Text
-Move text up and down with simple keybindings.
-#+begin_src emacs-lisp
-  (use-package move-text
-    :config
-    (keymap-global-set "M-p" 'move-text-up)
-    (keymap-global-set "M-n" 'move-text-down))
-#+end_src
-
-** Ivy (Counsel)
-*** Counsel
-Adds better fuzzy completion to many Emacs commands.
-#+begin_src emacs-lisp
-  (use-package counsel
-    :after ivy
-    :config
-    (counsel-mode 1)
-    (keymap-global-set "C-c f r" 'counsel-buffer-or-recentf)
-    (keymap-global-set "C-c f f" 'counsel-fzf)
-    (keymap-global-set "C-c f g" 'counsel-rg)
-    (keymap-global-set "C-c f l" 'counsel-locate)
-    (keymap-global-set "C-c s" 'swiper))
-#+end_src
-*** Ivy
-Adds fuzzy completion to basic Emacs commands.
-#+begin_src emacs-lisp
-  (use-package ivy
-    :custom
-    (setq ivy-use-virtual-buffers t)
-    (setq ivy-count-format "(%d/%d) ")
-    (setq enable-recursive-minibuffers t)
-    :config
-    (ivy-mode 1))
-
-  ;; (use-package ivy-prescient
-  ;;   :after counsel
-  ;;   :config
-  ;;   (ivy-prescient-mode 1))
-#+end_src
-*** Ivy Rich
-Adds Icons to all the new fuzzy completed Emacs commands.
-#+begin_src emacs-lisp
-  (use-package ivy-rich
-    :after ivy
-    :init (ivy-rich-mode 1)
-    :custom
-    (ivy-virtual-abbreviate 'full
-                            ivy-rich-switch-buffer-align-virtual-buffer t
-                            ivy-rich-path-style 'abbrev))
-#+end_src
-
-** Simple Modeline
-Make the modeline simple by hiding modes.
-#+begin_src emacs-lisp
-  (setq-default mode-line-format (delq 'mode-line-modes mode-line-format)
-                display-time-24hr-format t
-                display-time-default-load-average nil)
-  (display-battery-mode 1)
-  (display-time-mode 1)
-#+end_src
-
-** Smart Parentheses Pairing
-Automatically deals with parentheses in pairs.
-#+begin_src emacs-lisp
-  (use-package smartparens
-    :hook (prog-mode text-mode markdown-mode)
-    :config
-    (require 'smartparens-config)
-    (sp-use-paredit-bindings))
-#+end_src
-
-** Undo Tree
-Makes undo history like a Git commit tree, very powerful.
-#+begin_src emacs-lisp
-  (use-package undo-tree
-    :config
-    (setq undo-tree-history-directory-alist
-          `(("." . ,(concat user-emacs-directory "undo"))))
-    (global-undo-tree-mode 1))
-#+end_src
-
-* Org Mode
-** Table of Contents
-Automatically generate a table of contents for an Org file.
-#+begin_src emacs-lisp
-  (use-package toc-org
-    :commands toc-org-enable
-    :init (add-hook 'org-mode-hook 'toc-org-enable)
-    :config (setq org-src-window-setup 'current-window))
-  (add-hook 'org-mode-hook 'org-indent-mode)
-#+end_src
-
-** Bullet Headers 
-Stylize Org Mode headers with Nerd Icons.
-#+begin_src emacs-lisp
-  (use-package org-bullets
-    :config
-    (setq org-bullets-bullet-list '(
-                                    ""
-                                    ""
-                                    ""
-                                    ""
-                                    "")))
-  (add-hook 'org-mode-hook (lambda () (org-bullets-mode 1)))
-#+end_src
-
-** Org Agenda
-Manage a Todo list, a Calendar, and other organization tools with Org.
-#+begin_src emacs-lisp
-  (setq org-agenda-files '("~/Documents/Org/agenda.org"))
-  (setq org-fancy-priorities-list '("[A]" "[B]" "[C]")
-        org-priority-faces
-        '((?A :foreground "#ff6c6b" :weight bold)
-          (?B :foreground "#ffff91" :weight bold)
-          (?C :foreground "#aaffaa" :weight bold)))
-  (setq org-agenda-custom-commands
-        '(("v" "View Agenda"
-           ((tags "PRIORITY=\"A\""
-                  ((org-agenda-skip-function '(org-agenda-skip-entry-if 'todo 'done))
-                   (org-agenda-overriding-header "HIGH PRIORITY:")))
-            (tags "PRIORITY=\"B\""
-                  ((org-agenda-skip-function '(org-agenda-skip-entry-if 'todo 'done))
-                   (org-agenda-overriding-header "Medium Priority:")))
-            (tags "PRIORITY=\"C\""
-                  ((org-agenda-skip-function '(org-agenda-skip-entry-if 'todo 'done))
-                   (org-agenda-overriding-header "low priority:")))
-            (agenda "")
-            (alltodo "")))))
-#+end_src
-
-** Org Babel
-Setup literate progamming in Org Mode.
-*** Config
-Don't ask for conformation when evaluating source blocks.
-#+begin_src emacs-lisp
-  (setq org-confirm-babel-evaluate nil)
-#+end_src
-*** Load Languages
-#+begin_src emacs-lisp
-  (org-babel-do-load-languages
-   'org-babel-load-languages
-   '((python . t)
-     (lua . t)))
-#+end_src
-
-** Org Tempo
-This provides shorthands for Org functions.
-#+begin_src emacs-lisp
-  (require 'org-tempo)
-#+end_src
-
-** Styling
-Hide markers for bold, italic and other types of text styling.
-#+begin_src emacs-lisp
-  (setq org-hide-emphasis-markers t)
-#+end_src
-
-* Programming
-** Projects
-Manage Project folders from within Emacs.
-*** Project.el
-Use project.el and set shortcuts with prefix "C-c p".
-#+begin_src emacs-lisp
-  (require 'project)
-
-  (keymap-global-set "C-c p b" 'project-list-buffers)
-  (keymap-global-set "C-c p c" 'project-compile)
-  (keymap-global-set "C-c p e" 'project-dired)
-  (keymap-global-set "C-c p f" 'project-find-file)
-  (keymap-global-set "C-c f p" 'project-find-file)
-  (keymap-global-set "C-c p g" 'project-find-regexp)
-  (keymap-global-set "C-c p o" 'project-find-dir)
-  (keymap-global-set "C-c p p" 'project-switch-project)
-#+end_src
-*** Disproject
-Magit like interface ontop of project.el.
-#+begin_src emacs-lisp
-  (use-package disproject
-    ;; Replace `project-prefix-map' with `disproject-dispatch'.
-    :bind ( :map ctl-x-map
-            ("p" . disproject-dispatch)))
-#+end_src
-*** Run Project
-Run the current project.
-#+begin_src emacs-lisp
-  (require 'project)
-
-  (defvar-local project-binary-name nil)
-  (defvar-local project-binary-args nil)
-  (defvar-local project-debugger "gf2")
-
-  (defun get-project-binary-info ()
-    (let* ((project (project-current t))
-           (project-root (project-root project))
-           (binary-name (or project-binary-name
-                            (downcase
-                             (file-name-nondirectory (directory-file-name project-root)))))
-           (binary-path (expand-file-name binary-name project-root))
-           (args (or project-binary-args "")))
-      (list binary-path args)))
-
-  (defun run-project-binary ()
-    (interactive)
-    (let* ((binary-info (get-project-binary-info))
-           (binary-path (nth 0 binary-info))
-           (args (nth 1 binary-info))
-           (original-compile-command compile-command))
-      (if (file-executable-p binary-path)
-          (progn
-            (setq compile-command (concat binary-path " " args))
-            (unwind-protect
-                (compile compile-command)
-              (setq compile-command original-compile-command)))
-        (error "Binary '%s' not found or not executable in project root" binary-path))))
-
-  (defun debug-project-binary ()
-    (interactive)
-    (let* ((binary-info (get-project-binary-info))
-           (binary-path (nth 0 binary-info))
-           (args (nth 1 binary-info))
-           (debugger (or project-debugger "gdb"))
-           (debug-command (concat debugger " --args " binary-path " " args))
-           (original-compile-command compile-command))
-      (if (file-executable-p binary-path)
-          (progn
-            (setq compile-command debug-command)
-            (unwind-protect
-                (compile compile-command)
-              (setq compile-command original-compile-command)))
-        (error "Binary '%s' not found or not executable in project root" binary-path))))
-
-  ;; Mark 'project-binary-name' and 'project-binary-args' as safe for dir-locals.
-  (put 'project-binary-name 'safe-local-variable #'stringp)
-  (put 'project-binary-args 'safe-local-variable #'stringp)
-
-  (keymap-global-set "C-c p r" 'run-project-binary)
-  (keymap-global-set "C-c p d" 'debug-project-binary)
-#+end_src
-
-** LSP
-*** LSP Mode
-Use language servers to provide info and completion.
-#+begin_src emacs-lisp
-  (use-package lsp-mode
-    :init
-    (setq lsp-completion-provider :none
-          lsp-keymap-prefix "C-c l"
-          lsp-headerline-breadcrumb-enable nil)
-    :commands lsp lsp-deferred
-    :config
-    (lsp-enable-snippet t))
-    ;; (lsp-enable-which-key-integration t))
-
-  ;; (use-package lsp-ui
-  ;;   :commands lsp-ui-mode
-  ;;   :hook (prog-mode . lsp-ui-mode)
-  ;;   :config
-  ;;   (keymap-global-set "C-c l d" 'lsp-ui-doc-show))
-
-  ;; Instead:
-  (keymap-global-set "C-c l d" 'lsp-describe-thing-at-point)
-#+end_src
-*** YASnippet
-Autocomplete Snippets to write common code patterns faster.
-#+begin_src emacs-lisp
-  (use-package yasnippet
-    :config
-    (setq yas-snippet-dirs '("~/Documents/snippets"))
-    (yas-global-mode 1)
-    (keymap-global-set "M-<tab>" 'yas-next-field-or-maybe-expand)
-    (keymap-global-set "C-'" 'yas-expand))
-
-  (straight-use-package
-   '(yasnippet-capf :type git :host github :repo "elken/yasnippet-capf"))
-
-  (use-package yasnippet-treesitter-shim
-    :straight (:host github :repo "fbrosda/yasnippet-treesitter-shim"
-                     :files ("snippets/*"))
-    :no-require t
-    :config
-    (add-to-list 'yas-snippet-dirs
-                 (straight--build-dir "yasnippet-treesitter-shim")))
-#+end_src
-
-*** DevDocs
-Search documentation from within Emacs.
-#+begin_src emacs-lisp
-  (use-package devdocs
-    :config
-    (keymap-global-set "C-c d" 'devdocs-lookup))
-#+end_src
-
-** TreeSitter
-Use advanced highlighting by default.
-#+begin_src emacs-lisp
-  (require 'treesit)
-  (use-package treesit-auto
-    :config
-    (global-treesit-auto-mode))
-  (setq major-mode-remap-alist (treesit-auto--build-major-mode-remap-alist))
-#+end_src
-
-** Languages
-*** C
-The Classic.
-#+begin_src emacs-lisp
-  (add-hook 'c-mode-hook #'lsp)
-  (add-hook 'c-ts-mode-hook #'lsp)
-
-  ;; Use GNU Style in LSP-Mode for C
-  (with-eval-after-load 'lsp-clangd
-    (setq lsp-clients-clangd-args '("--header-insertion-decorators=0" "--fallback-style=GNU")))
-
-  ;; Automatically write header guards
-  (defun insert-header-guards ()
-    (when (and (buffer-file-name)
-               (string-match "\\.h\\'" (buffer-file-name)))
-      (let* ((filename (file-name-nondirectory (buffer-file-name)))
-             (guard (upcase (replace-regexp-in-string "[^a-zA-Z0-9]" "_" filename))))
-        (when (zerop (buffer-size)) ; Only insert if the file is empty
-          (insert (format "#ifndef %s\n#define %s\n\n\n$0\n\n#endif // %s\n"
-                          guard guard guard))
-          (goto-char (point-min))
-          (search-forward "$0")
-          (delete-char -3)))))
-
-  (add-hook 'find-file-hook 'insert-header-guards)
-#+end_src
-*** COMMENT D
-C Interop with a GC.
-#+begin_src emacs-lisp
-    (use-package d-mode
-      :hook (d-mode . lsp))
-#+end_src
-*** COMMENT Go
-A simple C-like language with a GC.
-#+begin_src emacs-lisp
-  (use-package go-mode
-    :config
-    (setenv "PATH" (concat (concat
-                            (concat (expand-file-name "/usr/local/go/bin") ":")
-                            (getenv "PATH"))))
-    (setenv "PATH" (concat (concat
-                            (concat (expand-file-name "~/.go/bin") ":")
-                            (getenv "PATH"))))
-
-    (setq exec-path (append exec-path (list (expand-file-name "/usr/local/go/bin"))))
-    (setq exec-path (append exec-path (list (expand-file-name "~/.go/bin"))))
-    (add-hook 'go-mode-hook
-              (lambda ()
-                (setq tab-width 4)))
-    :hook
-    (go-mode . lsp))
-#+end_src
-*** Haskell
-Functionally Scottish.
-#+begin_src emacs-lisp
-  (use-package haskell-mode
-    :config
-    (setenv "PATH" (concat (concat
-                            (concat (expand-file-name "~/.ghcup/bin") ":")
-                            (getenv "PATH"))))
-
-    (setq exec-path (append exec-path (list (expand-file-name "~/.ghcup/bin")))))
-
-  (use-package lsp-haskell
-    :hook
-    (haskell-mode . lsp))
-#+end_src
-*** COMMENT LISP
-Programming for Programmers.
-#+begin_src emacs-lisp
-  ;; (use-package slime
-  ;;   :init
-  ;;   (slime-setup '(slime-fancy slime-quicklisp slime-asdf slime-mrepl))
-  ;;   :config
-  ;;   (setq inferior-lisp-program "/usr/bin/sbcl")
-  ;;   (add-hook 'slime-repl-mode-hook 'smartparens-mode))
-
-  (use-package sly
-    :config
-    (setq inferior-lisp-program "ros -Q run"
-          browse-url-browser-function '(("hyperspec" . eww-browse-url) ("." . browse-url-default-browser)))
-    (add-hook 'sly-mrepl-mode-hook 'smartparens-mode)
-    (add-hook 'sly-mrepl-mode-hook 'company-mode)
-    (add-hook 'lisp-mode-hook
-              (lambda ()
-                (define-key lisp-mode-map (kbd "C-c d") 'sly-documentation))))
-
-  ;; (with-eval-after-load 'sly
-  ;;  (load (expand-file-name "~/.roswell/helper.el")))
-#+end_src
-*** COMMENT Lua
-A simple Python-like language with many implementations.
-#+begin_src emacs-lisp
-  (straight-use-package
-   '(lua-mode :type git :host github :repo "immerrr/lua-mode"))
-  (add-hook 'lua-mode-hook #'lsp)
-
-  (setq lua-indent-nested-block-content-align nil)
-  (setq lua-indent-close-paren-align nil)
-
-  (defun lua-at-most-one-indent (old-function &rest arguments)
-    (let ((old-res (apply old-function arguments)))
-      (if (> old-res lua-indent-level) lua-indent-level old-res)))
-
-  (advice-add #'lua-calculate-indentation-block-modifier
-              :around #'lua-at-most-one-indent)
-
-  (setq lua-indent-level 2)
-  (setq lua-electric-flag nil)
-  (defun lua-abbrev-mode-off () (abbrev-mode 0))
-  (add-hook 'lua-mode-hook 'lua-abbrev-mode-off)
-  (setq save-abbrevs nil)   ;; is this still needed?
-#+end_src
-*** OCaml
-Installed with OPAM
-#+begin_src emacs-lisp
-  (setenv "PATH" (concat (concat
-                          (concat (expand-file-name "~/.opam/default/bin") ":")
-                            (getenv "PATH"))))
-
-  (setq exec-path (append exec-path (list (expand-file-name "~/.opam/default/bin"))))
-
-  (use-package tuareg
-    :hook
-    (tuareg-mode . lsp))
-
-  (add-to-list 'load-path "/home/venomade/.opam/default/share/emacs/site-lisp")
-  (require 'ocp-indent)
-  (require 'dune)
-  (require 'utop)
-#+end_src
-*** COMMENT Vala
-An OOP Language for C & GLib interop.
-#+begin_src emacs-lisp
-  (use-package vala-mode)
-#+end_src
-
-** Company
-A powerful auto-completion utility.
-#+begin_src emacs-lisp
-  (use-package company
-    :config
-    (define-key company-active-map (kbd "RET") nil)
-    (define-key company-active-map (kbd "<return>") nil)
-    (define-key company-active-map (kbd "C-m") nil)
-
-    ;; TAB indents or selects a completion
-    (define-key company-active-map (kbd "TAB") #'company-complete-selection)
-    (define-key company-active-map (kbd "<tab>") #'company-complete-selection)
-
-    ;; Use C-p and C-n to navigate the completion list
-    (define-key company-active-map (kbd "C-p") #'company-select-previous)
-    (define-key company-active-map (kbd "C-n") #'company-select-next)
-
-    ;; Restore normal tab behavior outside company-mode completions
-    (define-key company-mode-map (kbd "TAB") #'indent-for-tab-command)
-    (define-key company-mode-map (kbd "<tab>") #'indent-for-tab-command)
-
-    ;; Disable Autocomplete
-    (setq company-idle-delay 0)
-
-    ;; Disable Case Sensitivity
-    (setq completion-ignore-case t)
-
-    ;; Bind M-/ to company-complete
-    (define-key global-map (kbd "M-/") 'company-complete)
-    (define-key global-map (kbd "M-?") 'dabbrev-expand)  
-    :hook
-    (prog-mode . company-mode))
-
-  (use-package company-quickhelp
-    :config
-    (company-quickhelp-mode 1)
-    (setq company-quickhelp-delay 0.5)
-    (setq company-quickhelp-color-background (face-attribute 'company-tooltip :background))
-    (add-hook 'enable-theme-functions
-              (lambda (_)
-                (setq company-quickhelp-color-background (face-attribute 'company-tooltip :background)))))
-
-#+end_src
-
-** Cape
-Add non-lsp completions to the capf.
-#+begin_src emacs-lisp
-  (use-package cape
-    :ensure t
-    :config
-    (keymap-global-set "C-c c" 'cape-prefix-map)
-    (setq dabbrev-case-fold-search t)
-    ;;(add-hook 'completion-at-point-functions #'cape-dabbrev) ;; TODO: Check if this is slowing down comments?
-    (add-hook 'completion-at-point-functions #'cape-file)
-    (add-hook 'completion-at-point-functions #'cape-elisp-block)
-    (add-hook 'completion-at-point-functions #'yasnippet-capf))
-#+end_src
-
-** Utilities
-*** Flycheck
-Syntax checking for Emacs.
-#+begin_src emacs-lisp
-  (use-package flycheck
-    :defer t
-    :init (global-flycheck-mode 1)
-    :config
-    (setq-default flycheck-disabled-checkers '(emacs-lisp-checkdoc))
-    (setq-default flycheck-cppcheck-args "--enable=all")
-    (flycheck-add-next-checker 'c/c++-gcc 'c/c++-cppcheck 'append)
-    (setq flycheck-indication-mode nil)
-    (set-face-attribute 'flycheck-warning nil :underline nil)) ;; Disable Warning Underline (NOT WORKING)
-#+end_src
-
-* User Interface
-** Add Nerd Icons 
-Use Icons from Nerd Font to add a little modern spice to Emacs.
-#+begin_src emacs-lisp
-  (use-package nerd-icons
-    :if (display-graphic-p))
-
-  (use-package nerd-icons-dired
-    :hook
-    (dired-mode . nerd-icons-dired-mode))
-
-  (use-package nerd-icons-ivy-rich
-      :init (nerd-icons-ivy-rich-mode 1))
-
-  (setq welcome-dashboard-use-nerd-icons t)
-#+end_src
-
-** Fonts
-*** Set Font
-Set font for both Monospace and Proportional text.
-#+begin_src emacs-lisp
-  (defvar fontconf
-      '((font . "Aporetic Sans Mono")
-        (size . 13)))
-
-    (set-face-attribute 'variable-pitch nil
-            :font (cdr (assoc 'font fontconf))
-            :height (* (cdr (assoc 'size fontconf)) 10)
-            :weight 'regular)
-
-    (set-face-attribute 'fixed-pitch nil
-            :font (cdr (assoc 'font fontconf))
-            :height (* (cdr (assoc 'size fontconf)) 10)
-            :weight 'regular)
-
-    (set-face-attribute 'default nil
-            :font (cdr (assoc 'font fontconf))
-            :height (* (cdr (assoc 'size fontconf)) 10)
-            :weight 'regular)
-
-
-    (add-to-list 'default-frame-alist
-           `(font . ,(concat (cdr (assoc 'font fontconf)) "-" (number-to-string (cdr (assoc 'size fontconf))))))
-
-    (set-face-attribute 'font-lock-comment-face nil
-            :slant 'italic)
-
-    (set-face-attribute 'font-lock-keyword-face nil
-            :slant 'italic)
-
-  ;;(set-frame-font "-misc-fixed-medium-r-normal--18-120-100-100-c-90-iso10646-1" t t)
-#+end_src
-*** Ligatures
-Make ligature symbols out of common function symbols.
-#+begin_src emacs-lisp
-    (dolist (char/ligature-re
-	     `((?-  . ,(rx (or (or "-->" "-<<" "->>" "-|" "-~" "-<" "->") (+ "-"))))
-	       (?/  . ,(rx (or (or "/==" "/=" "/>" "/**" "/*") (+ "/"))))
-	       (?*  . ,(rx (or (or "*>" "*/") (+ "*"))))
-	       (?<  . ,(rx (or (or "<<=" "<<-" "<|||" "<==>" "<!--" "<=>" "<||" "<|>" "<-<"
-				   "<==" "<=<" "<-|" "<~>" "<=|" "<~~" "<$>" "<+>" "</>"
-				   "<*>" "<->" "<=" "<|" "<:" "<>"  "<$" "<-" "<~" "<+"
-				   "</" "<*")
-			       (+ "<"))))
-	       (?:  . ,(rx (or (or ":?>" "::=" ":>" ":<" ":?" ":=") (+ ":"))))
-	       (?=  . ,(rx (or (or "=>>" "==>" "=/=" "=!=" "=>" "=:=") (+ "="))))
-	       (?!  . ,(rx (or (or "!==" "!=") (+ "!"))))
-	       (?>  . ,(rx (or (or ">>-" ">>=" ">=>" ">]" ">:" ">-" ">=") (+ ">"))))
-	       (?&  . ,(rx (+ "&")))
-	       (?|  . ,(rx (or (or "|->" "|||>" "||>" "|=>" "||-" "||=" "|-" "|>"
-				   "|]" "|}" "|=")
-			       (+ "|"))))
-	       (?.  . ,(rx (or (or ".?" ".=" ".-" "..<") (+ "."))))
-	       (?+  . ,(rx (or "+>" (+ "+"))))
-	       (?\[ . ,(rx (or "[<" "[|")))
-	       (?\{ . ,(rx "{|"))
-	       (?\? . ,(rx (or (or "?." "?=" "?:") (+ "?"))))
-	       (?#  . ,(rx (or (or "#_(" "#[" "#{" "#=" "#!" "#:" "#_" "#?" "#(")
-			       (+ "#"))))
-	       (?\; . ,(rx (+ ";")))
-	       (?_  . ,(rx (or "_|_" "__")))
-	       (?~  . ,(rx (or "~~>" "~~" "~>" "~-" "~@")))
-	       (?$  . ,(rx "$>"))
-	       (?^  . ,(rx "^="))
-	       (?\] . ,(rx "]#"))))
-      (let ((char (car char/ligature-re))
-	    (ligature-re (cdr char/ligature-re)))
-	(set-char-table-range composition-function-table char
-			      `([,ligature-re 0 font-shape-gstring]))))
-#+end_src
-*** Font Zooming
-Bind both scroling and +/- to zooming.
-#+begin_src emacs-lisp
-  (global-set-key (kbd "C-=") 'text-scale-increase)
-  (global-set-key (kbd "C--") 'text-scale-decrease)
-  (global-set-key (kbd "<C-wheel-up>") 'text-scale-increase)
-  (global-set-key (kbd "<C-wheel-down>") 'text-scale-decrease)
-#+end_src
-
-** Theme
-Set the theme to a nice dark one.
-#+begin_src emacs-lisp
-  (use-package ef-themes
-    :config
-    (set-window-margins nil 0))
-
-  (add-hook 'emacs-startup-hook
-            (lambda ()
-              (load-theme 'ef-bio t)))
-#+end_src
-
-** Niceties
-*** Disable Extra GUI Features
-Disable GUI features to simplify frames.
-#+begin_src emacs-lisp
-  (menu-bar-mode -1)
-  (tool-bar-mode -1)
-  (scroll-bar-mode -1)
-  (setq inhibit-startup-screen t)
-#+end_src
-*** No Scroll Jump
-Scroll line by line instead of jumping multiple.
-#+begin_src emacs-lisp
-  (setq scroll-conservatively 100)
-  (setq scroll-step 1)
-#+end_src
-*** Small Fringes
-Reduce fringe size to 1px.
-#+begin_src emacs-lisp
-  (set-fringe-mode 1)
-#+end_src
-*** Disable Background
-In no-window mode, disable the background to fit in with terminal theme.
-#+begin_src emacs-lisp
-  (defun on-after-init ()
-    (unless (display-graphic-p (selected-frame))
-      (set-face-background 'default "unspecified-bg" (selected-frame))))
-
-  (add-hook 'window-setup-hook 'on-after-init)
-#+end_src
-
-** Modern Looking Emacs
-*** Org Modern
-Modern iconography and styling for Org-Mode.
-#+begin_src emacs-lisp
-  (use-package org-modern)
-
-  (modify-all-frames-parameters
-   '((right-divider-width . 40)
-     (internal-border-width . 40)))
-  (dolist (face '(window-divider
-                  window-divider-first-pixel
-                  window-divider-last-pixel))
-    (face-spec-reset-face face)
-    (set-face-foreground face (face-attribute 'default :background)))
-  (set-face-background 'fringe (face-attribute 'default :background))
-
-
-  (setq org-pretty-entities t
-        org-auto-align-tags nil
-        org-tags-column 0
-        org-catch-invisible-edits 'show-and-error
-        org-special-ctrl-a/e t
-        org-insert-heading-respect-content t)
-
-  (add-hook 'org-mode-hook #'org-modern-mode)
-  (add-hook 'org-agenda-finalize-hook #'org-modern-agenda)
-#+end_src
-*** Spacious Padding
-Adds padding around various elements.
-#+begin_src emacs-lisp
-  (use-package spacious-padding)
-
-  ;; These are the default values, but I keep them here for visibility.
-  (setq spacious-padding-widths
-        '( :internal-border-width 15
-           :header-line-width 4
-           :mode-line-width 6
-           :tab-width 4
-           :right-divider-width 30
-           :scroll-bar-width 8
-           :fringe-width 8))
-
-  ;; Read the doc string of `spacious-padding-subtle-mode-line' as it
-  ;; is very flexible and provides several examples.
-  (setq spacious-padding-subtle-mode-line
-        `( :mode-line-active 'default
-           :mode-line-inactive vertical-border))
-
-  (spacious-padding-mode 1)
-#+end_src
-*** Zen Mode
-Center the edtior with Olivetti for distraction-free editing.
-#+begin_src emacs-lisp
-  (use-package olivetti
-    :config
-    (keymap-global-set "C-c z" 'olivetti-mode))
-#+end_src
diff --git a/.ghci b/.ghci
deleted file mode 100644
index 31f559e..0000000
--- a/.ghci
+++ /dev/null
@@ -1 +0,0 @@
-:set prompt "λ "
diff --git a/.gitconfig b/.gitconfig
deleted file mode 100644
index 8a59d3e..0000000
--- a/.gitconfig
+++ /dev/null
@@ -1,3 +0,0 @@
-[user]
-	name = venomade
-	email = venomade@venomade.com
diff --git a/.mg b/.mg
deleted file mode 100644
index 480ec1b..0000000
--- a/.mg
+++ /dev/null
@@ -1 +0,0 @@
-backup-to-home-directory
diff --git a/.stow-local-ignore b/.stow-local-ignore
deleted file mode 100644
index 35cdaf3..0000000
--- a/.stow-local-ignore
+++ /dev/null
@@ -1,2 +0,0 @@
-.git
-README.md
diff --git a/.xsessionrc b/.xsessionrc
deleted file mode 100644
index c923b63..0000000
--- a/.xsessionrc
+++ /dev/null
@@ -1,2 +0,0 @@
-export QT_QPA_PLATFORMTHEME=gtk2
-export QT_STYLE_OVERRIDE=gtk2
diff --git a/.zshrc b/.zshrc
deleted file mode 100644
index 6af87b4..0000000
--- a/.zshrc
+++ /dev/null
@@ -1,86 +0,0 @@
-# Venomade's zshrc
-
-# source global variables and aliases
-[ -f "$HOME/.config/shell/alias" ] && source "$HOME/.config/shell/alias"
-[ -f "$HOME/.config/shell/vars" ] && source "$HOME/.config/shell/vars"
-
-# load modules
-zmodload zsh/complist
-autoload -U compinit && compinit
-autoload -U colors && colors
-
-# completion
-zstyle ':completion:*' menu select
-zstyle ':completion:*' special-dirs true
-zstyle ':completion:*' list-colors ${(s.:.)LS_COLORS} ma=0\;33
-
-# options
-setopt append_history inc_append_history share_history
-setopt auto_menu menu_complete
-setopt auto_param_slash
-setopt no_case_glob no_case_match
-setopt globdots
-setopt extended_glob
-
-# history
-HISTCONTROL=ignoreboth
-
-
-# prompt
-USER_COLOR="%F{magenta}"
-VENV_COLOR="%F{yellow}"
-DIR_COLOR="%F{green}"
-GIT_COLOR="%F{blue}"
-GIT_DIRTY_COLOR="%F{red}"
-PROMPT_SYMBOL_COLOR="%F{yellow}"
-RESET_COLOR="%f"
-
-shorten_path() {
-  local path="${PWD/#$HOME/~}"
-  local parts=("${(@s:/:)path}")
-
-  if (( ${#parts} > 3 )); then
-    echo "${parts[1]}/.../${parts[-2]}/${parts[-1]}"
-  else
-    echo "$path"
-  fi
-}
-
-git_branch() {
-  local branch
-  branch=$(git symbolic-ref --short HEAD 2>/dev/null || git rev-parse --short HEAD 2>/dev/null)
-  [[ -n "$branch" ]] && echo "$branch"
-}
-
-git_dirty() {
-  [[ -n "$(git status --porcelain 2>/dev/null)" ]] && echo "✗" || echo "✓"
-}
-
-set_prompt() {
-  local user="${USER_COLOR}%n${RESET_COLOR}"
-  local venv=""
-  [[ -n "$VIRTUAL_ENV" ]] && venv="${VENV_COLOR}($(basename $VIRTUAL_ENV))${RESET_COLOR} "
-
-  local path="${DIR_COLOR}$(shorten_path)${RESET_COLOR}"
-  local git_info=""
-  local branch="$(git_branch)"
-
-  if [[ -n "$branch" ]]; then
-    git_info=" %F{white}on%f ${GIT_COLOR}${branch}${RESET_COLOR}${GIT_DIRTY_COLOR}$(git_dirty)${RESET_COLOR}"
-  fi
-
-  PROMPT="${user} %F{white}in%f ${venv}${path}${git_info}
-${PROMPT_SYMBOL_COLOR}λ${RESET_COLOR} "
-}
-
-autoload -Uz add-zsh-hook
-add-zsh-hook precmd set_prompt
-
-# plugins
-source /usr/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh
-
-# GHCUP for Haskell
-[ -f "/home/venomade/.ghcup/env" ] && . "/home/venomade/.ghcup/env" # ghcup-env
-
-# OPAM for OCaml
-[[ ! -r '/home/venomade/.opam/opam-init/init.zsh' ]] || source '/home/venomade/.opam/opam-init/init.zsh' > /dev/null 2> /dev/null
diff --git a/README.md b/README.md
index 7a22cbf..5fc3be5 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,3 @@
 # Venomade's Dotfiles
 
-These are my dotfiles managed with [GNU Stow](https://www.gnu.org/software/stow/).
+These are my dotfiles managed with [Home Manager](https://nixos.wiki/wiki/Home_Manager).
diff --git a/config/bat/config b/config/bat/config
new file mode 100644
index 0000000..2d65ccf
--- /dev/null
+++ b/config/bat/config
@@ -0,0 +1 @@
+--theme="modus_vivendi"
diff --git a/config/bat/themes/modus_vivendi.tmTheme b/config/bat/themes/modus_vivendi.tmTheme
new file mode 100644
index 0000000..15d2429
--- /dev/null
+++ b/config/bat/themes/modus_vivendi.tmTheme
@@ -0,0 +1,439 @@
+<!-- Modus Themes for Bat -->
+<!-- Auto generated with https://github.com/miikanissi/modus-themes.nvim/blob/master/lua/modus-themes/extras/bat.lua -->
+
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+  <dict>
+    <key>name</key>
+    <string>modus_vivendi</string>
+    <key>settings</key>
+    <array>
+      <dict>
+        <key>settings</key>
+        <dict>
+          <key>background</key>
+          <string>#000000</string>
+          <key>caret</key>
+          <string>#989898</string>
+          <key>foreground</key>
+          <string>#ffffff</string>
+          <key>invisibles</key>
+          <string>#989898</string>
+          <key>lineHighlight</key>
+          <string>#2f3849</string>
+          <key>selection</key>
+          <string>#7030af</string>
+          <key>findHighlight</key>
+          <string>#7a6100</string>
+          <key>selectionBorder</key>
+          <string>#646464</string>
+          <key>gutterForeground</key>
+          <string>#989898</string>
+        </dict>
+      </dict>
+      <dict>
+        <key>name</key>
+        <string>Comment</string>
+        <key>scope</key>
+        <string>comment</string>
+        <key>settings</key>
+        <dict>
+          <key>fontStyle</key>
+          <string>italic</string>
+          <key>foreground</key>
+          <string>#989898</string>
+        </dict>
+      </dict>
+      <dict>
+        <key>name</key>
+        <string>String</string>
+        <key>scope</key>
+        <string>string</string>
+        <key>settings</key>
+        <dict>
+          <key>foreground</key>
+          <string>#79a8ff</string>
+        </dict>
+      </dict>
+      <dict>
+        <key>name</key>
+        <string>Number</string>
+        <key>scope</key>
+        <string>constant.numeric</string>
+        <key>settings</key>
+        <dict>
+          <key>foreground</key>
+          <string>#82b0ec</string>
+        </dict>
+      </dict>
+      <dict>
+        <key>name</key>
+        <string>Built-in constant</string>
+        <key>scope</key>
+        <string>constant.language</string>
+        <key>settings</key>
+        <dict>
+          <key>foreground</key>
+          <string>#6ae4b9</string>
+        </dict>
+      </dict>
+      <dict>
+        <key>name</key>
+        <string>User-defined constant</string>
+        <key>scope</key>
+        <string>constant.character, constant.other</string>
+        <key>settings</key>
+        <dict>
+          <key>foreground</key>
+          <string>#ffffff</string>
+        </dict>
+      </dict>
+      <dict>
+        <key>name</key>
+        <string>Variable</string>
+        <key>scope</key>
+        <string>variable</string>
+        <key>settings</key>
+        <dict>
+          <key>fontStyle</key>
+          <string>#00d3d0</string>
+        </dict>
+      </dict>
+      <dict>
+        <key>name</key>
+        <string>Ruby's @variable</string>
+        <key>scope</key>
+        <string>variable.other.readwrite.instance</string>
+        <key>settings</key>
+        <dict>
+          <key>foreground</key>
+          <string>#00d3d0</string>
+        </dict>
+      </dict>
+      <dict>
+        <key>name</key>
+        <string>String interpolation</string>
+        <key>scope</key>
+        <string>constant.character.escaped, constant.character.escape, string source, string source.ruby</string>
+        <key>settings</key>
+        <dict>
+          <key>foreground</key>
+          <string>#d2b580</string>
+        </dict>
+      </dict>
+      <dict>
+        <key>name</key>
+        <string>Keyword</string>
+        <key>scope</key>
+        <string>keyword</string>
+        <key>settings</key>
+        <dict>
+          <key>fontStyle</key>
+          <string>italic</string>
+          <key>foreground</key>
+          <string>#b6a0ff</string>
+        </dict>
+      </dict>
+      <dict>
+        <key>name</key>
+        <string>Storage</string>
+        <key>scope</key>
+        <string>storage</string>
+        <key>settings</key>
+        <dict>
+          <key>foreground</key>
+          <string>#b6a0ff</string>
+        </dict>
+      </dict>
+      <dict>
+        <key>name</key>
+        <string>Storage type</string>
+        <key>scope</key>
+        <string>storage.type</string>
+        <key>settings</key>
+        <dict>
+          <key>foreground</key>
+          <string>#b6a0ff</string>
+        </dict>
+      </dict>
+      <dict>
+        <key>name</key>
+        <string>Class name</string>
+        <key>scope</key>
+        <string>entity.name.class</string>
+        <key>settings</key>
+        <dict>
+          <key>foreground</key>
+          <string>#b6a0ff</string>
+        </dict>
+      </dict>
+      <dict>
+        <key>name</key>
+        <string>Inherited class</string>
+        <key>scope</key>
+        <string>entity.other.inherited-class</string>
+        <key>settings</key>
+        <dict>
+          <key>foreground</key>
+          <string>#b6a0ff</string>
+        </dict>
+      </dict>
+      <dict>
+        <key>name</key>
+        <string>Function name</string>
+        <key>scope</key>
+        <string>entity.name.function</string>
+        <key>settings</key>
+        <dict>
+          <key>foreground</key>
+          <string>#feacd0</string>
+        </dict>
+      </dict>
+      <dict>
+        <key>name</key>
+        <string>Function argument</string>
+        <key>scope</key>
+        <string>variable.parameter</string>
+        <key>settings</key>
+        <dict>
+          <key>foreground</key>
+          <string>#00d3d0</string>
+        </dict>
+      </dict>
+      <dict>
+        <key>name</key>
+        <string>Tag name</string>
+        <key>scope</key>
+        <string>entity.name.tag</string>
+        <key>settings</key>
+        <dict>
+          <key>foreground</key>
+          <string>#00d3d0</string>
+        </dict>
+      </dict>
+      <dict>
+        <key>name</key>
+        <string>Tag attribute</string>
+        <key>scope</key>
+        <string>entity.other.attribute-name</string>
+        <key>settings</key>
+        <dict>
+          <key>foreground</key>
+          <string>#00d3d0</string>
+        </dict>
+      </dict>
+      <dict>
+        <key>name</key>
+        <string>Library function</string>
+        <key>scope</key>
+        <string>support.function</string>
+        <key>settings</key>
+        <dict>
+          <key>foreground</key>
+          <string>#feacd0</string>
+        </dict>
+      </dict>
+      <dict>
+        <key>name</key>
+        <string>Library constant</string>
+        <key>scope</key>
+        <string>support.constant</string>
+        <key>settings</key>
+        <dict>
+          <key>foreground</key>
+          <string>#6ae4b9</string>
+        </dict>
+      </dict>
+      <dict>
+        <key>name</key>
+        <string>Library class/type</string>
+        <key>scope</key>
+        <string>support.type, support.class</string>
+        <key>settings</key>
+        <dict>
+          <key>foreground</key>
+          <string>#6ae4b9</string>
+        </dict>
+      </dict>
+      <dict>
+        <key>name</key>
+        <string>Library variable</string>
+        <key>scope</key>
+        <string>support.other.variable</string>
+        <key>settings</key>
+        <dict>
+          <key>foreground</key>
+          <string>#00d3d0</string>
+        </dict>
+      </dict>
+      <dict>
+        <key>name</key>
+        <string>Invalid</string>
+        <key>scope</key>
+        <string>invalid</string>
+        <key>settings</key>
+        <dict>
+          <key>foreground</key>
+          <string>#989898</string>
+        </dict>
+      </dict>
+      <dict>
+        <key>name</key>
+        <string>Invalid deprecated</string>
+        <key>scope</key>
+        <string>invalid.deprecated</string>
+        <key>settings</key>
+        <dict>
+          <key>foreground</key>
+          <string>#989898</string>
+        </dict>
+      </dict>
+      <dict>
+        <key>name</key>
+        <string>JSON String</string>
+        <key>scope</key>
+        <string>meta.structure.dictionary.json string.quoted.double.json</string>
+        <key>settings</key>
+        <dict>
+          <key>foreground</key>
+          <string>#79a8ff</string>
+        </dict>
+      </dict>
+      <dict>
+        <key>name</key>
+        <string>diff.header</string>
+        <key>scope</key>
+        <string>meta.diff, meta.diff.header</string>
+        <key>settings</key>
+        <dict>
+          <key>foreground</key>
+          <string>#feacd0</string>
+        </dict>
+      </dict>
+      <dict>
+        <key>name</key>
+        <string>diff.deleted</string>
+        <key>scope</key>
+        <string>markup.deleted</string>
+        <key>settings</key>
+        <dict>
+          <key>background</key>
+          <string>#4f1119</string>
+        </dict>
+      </dict>
+      <dict>
+        <key>name</key>
+        <string>diff.inserted</string>
+        <key>scope</key>
+        <string>markup.inserted</string>
+        <key>settings</key>
+        <dict>
+          <key>background</key>
+          <string>#00381f</string>
+        </dict>
+      </dict>
+      <dict>
+        <key>name</key>
+        <string>diff.changed</string>
+        <key>scope</key>
+        <string>markup.changed</string>
+        <key>settings</key>
+        <dict>
+          <key>background</key>
+          <string>#363300</string>
+        </dict>
+      </dict>
+      <dict>
+        <key>scope</key>
+        <string>constant.numeric.line-number.find-in-files - match</string>
+        <key>settings</key>
+        <dict>
+          <key>foreground</key>
+          <string>#82b0ec</string>
+        </dict>
+      </dict>
+      <dict>
+        <key>scope</key>
+        <string>entity.name.filename</string>
+        <key>settings</key>
+        <dict>
+          <key>foreground</key>
+          <string>#2fafff</string>
+        </dict>
+      </dict>
+      <dict>
+        <key>scope</key>
+        <string>message.error</string>
+        <key>settings</key>
+        <dict>
+          <key>fontStyle</key>
+          <string>bold</string>
+          <key>foreground</key>
+          <string>#ff7f9f</string>
+        </dict>
+      </dict>
+      <dict>
+        <key>name</key>
+        <string>JSON Punctuation</string>
+        <key>scope</key>
+        <string>punctuation.definition.string.begin.json - meta.structure.dictionary.value.json, punctuation.definition.string.end.json - meta.structure.dictionary.value.json</string>
+        <key>settings</key>
+        <dict>
+          <key>foreground</key>
+          <string>#ffffff</string>
+        </dict>
+      </dict>
+      <dict>
+        <key>name</key>
+        <string>JSON Structure</string>
+        <key>scope</key>
+        <string>meta.structure.dictionary.json string.quoted.double.json</string>
+        <key>settings</key>
+        <dict>
+          <key>foreground</key>
+          <string>#79a8ff</string>
+        </dict>
+      </dict>
+      <dict>
+        <key>name</key>
+        <string>JSON String</string>
+        <key>scope</key>
+        <string>meta.structure.dictionary.value.json string.quoted.double.json</string>
+        <key>settings</key>
+        <dict>
+          <key>foreground</key>
+          <string>#79a8ff</string>
+        </dict>
+      </dict>
+      <dict>
+        <key>name</key>
+        <string>Escape Characters</string>
+        <key>scope</key>
+        <string>constant.character.escape</string>
+        <key>settings</key>
+        <dict>
+          <key>foreground</key>
+          <string>#d2b580</string>
+        </dict>
+      </dict>
+      <dict>
+        <key>name</key>
+        <string>Regular Expressions</string>
+        <key>scope</key>
+        <string>string.regexp</string>
+        <key>settings</key>
+        <dict>
+          <key>foreground</key>
+          <string>#00c06f</string>
+        </dict>
+      </dict>
+    </array>
+    <key>uuid</key>
+    <string>09CE9B40-0137-442C-8512-7CEAFC78C153</string>
+    <key>colorSpaceName</key>
+    <string>sRGB</string>
+    <key>semanticClass</key>
+    <string>Modus Vivendi</string>
+  </dict>
+</plist>
diff --git a/config/emacs/.gitignore b/config/emacs/.gitignore
new file mode 100644
index 0000000..1980dcd
--- /dev/null
+++ b/config/emacs/.gitignore
@@ -0,0 +1,62 @@
+/url/cache
+/.emacs.desktop
+/auto-save-list
+/network-security.data
+/.session
+/session.*
+/custom.el
+*.elc
+CVS
+.svn
+*~
+.cvsignore
+.*.lock
+/tramp
+/TODO
+/.org-id-locations
+cookies
+/newsticker
+\#*
+/tree-sitter
+/elpa
+/elpa-*
+site-lisp/package/
+/swank
+/.mc-lists.el
+/var
+/.sqli_history
+/frame-restore-parameters
+/.achievements
+/.bookmarks.el
+/history
+/helm-adaptive-history
+/thumbs/
+/emms/
+/.smex-items
+/image-dired/
+/eshell
+/.cask/
+/.sx/
+/org-clock-save.el
+/ditaa*.jar
+/ido.last
+/recentf
+/viper
+/projectile-bookmarks.eld
+/anaconda-mode/
+/.historian
+/.uptimes.el
+/rake.cache
+/plantuml.jar
+/magithub
+.cache/
+/forge-database.sqlite
+/transient
+/.lsp-session-v1
+/smex-items
+/eln-cache/
+/projects
+/forge-*.sqlite
+/projectile.cache
+config.el
+places
diff --git a/config/emacs/config.org b/config/emacs/config.org
new file mode 100644
index 0000000..d0a2ce3
--- /dev/null
+++ b/config/emacs/config.org
@@ -0,0 +1,950 @@
+#+TITLE: My Emacs Config
+#+AUTHOR: Venomade
+
+This is my Emacs config that is theoretically going to be simpler than my previous configs. I have been trying out neovim more recently and I liked how simple it can be, giving it very quick startup times. I've tried the Emacs Daemon in the past but have never really jived with it so I would rather just have a fast launch time instead. The target is that `emacs-init-time` should be <2 seconds.
+
+* Non-Package Configuration
+This section is the main non-package configuration of my Emacs config, everything here should be run before everything else in order to set up the basic environment for using packages.
+
+** Internal
+#+begin_src emacs-lisp
+  ;; Setup Native Compilation if available
+  (if (native-comp-available-p)
+      (setq package-native-compile t))
+
+  ;; Disable the command key on MacOS
+  (setq mac-command-modifier nil)
+
+  ;; Use a custom.el file instead of init.el to store uncommitable changes
+  (setq custom-file (expand-file-name "custom.el" user-emacs-directory))
+  (when (file-exists-p custom-file)
+    (load custom-file))
+
+  ;; Set Backups, Autosaves and Lockfiles to all be stored in the .emacs.d directory
+  (let* ((backup-dir (expand-file-name "backups/" user-emacs-directory))
+         (autosave-dir (expand-file-name "autosaves/" user-emacs-directory))
+         (lock-dir (expand-file-name "lock/" user-emacs-directory)))
+    (make-directory backup-dir t)
+    (make-directory autosave-dir t)
+    (make-directory lock-dir t)
+
+    (setq backup-directory-alist `((".*" . ,(directory-file-name backup-dir)))
+          auto-save-file-name-transforms `((".*" ,(directory-file-name autosave-dir) t))
+          lock-file-name-transforms `((".*" ,(directory-file-name lock-dir) t))))
+
+  ;; Don't show Warning and Compile-Log buffers in a window
+  (add-to-list 'display-buffer-alist
+               '("\\`\\*\\(Warnings\\|Compile-Log\\)\\*\\'"
+                 (display-buffer-no-window)
+                 (allow-no-window . t)))
+
+  ;; Use 'trash' to trash system files instead of permanently rm-ing
+  (setq trash-directory "~/.Trash")
+  (defun system-move-file-to-trash (file)
+    "Use \"trash\" to move FILE to the system trash."
+    (cl-assert (executable-find "trash") nil "'trash' executable not found.")
+    (call-process "trash" nil 0 nil "-F"  file))
+#+end_src
+
+** User Interface
+#+begin_src emacs-lisp
+        ;; Allow any size of the Emacs GUI
+  (setq frame-resize-pixelwise t
+        ;; Configure line numbers display
+        display-line-numbers-width-start t
+        display-line-numbers-width 4
+        display-line-numbers-grow-only t
+        ;; Disable bell
+        ring-bell-function 'ignore
+        ;; Confirm on C-x C-c
+        ns-confirm-quit t
+        ;; Don't open files opened from an external source in a new frame
+        ns-pop-up-frames nil
+        ;; Add a scroll margin and improve scrolling
+        scroll-margin 10 ; Doesn't work with smooth-scrolling
+        scroll-conservatively 100
+        scroll-step 1)
+
+  ;; Default to no wrapping on buffers
+  (setq-default truncate-lines t)
+
+  ;; Replace the $ signs for truncation with spaces
+  (set-display-table-slot standard-display-table 'truncation 32)
+
+  ;; Disable extra GUI interfaces
+  (tool-bar-mode -1)
+  (scroll-bar-mode -1)
+  (menu-bar-mode -1)
+
+  ;; Display line numbers from startup
+  (add-hook 'emacs-startup-hook #'global-display-line-numbers-mode)
+
+  ;; Focus new frames on creation
+  (add-hook 'after-make-frame-functions
+            (lambda (f)
+              (select-frame-set-input-focus f)))
+
+  ;; Custom quit messages from DOOM and DOOM Emacs
+  (setq quit-messages
+          `(; from DOOM 1
+            ,(format "I wouldn't leave if I were you. %s is much worse."
+                     (if (featurep 'windows-nt) "DOS" "UNIX"))
+            "Ya know, next time you come in here I'm gonna toast ya."
+            "Go ahead and leave. See if I care."
+            "Are you sure you want to quit this great editor?"
+            ; from DOOM Emacs
+            "(setq nothing t everything 'permitted)"
+            "Emacs will remember that."
+            "Emacs, Emacs never changes."
+            "Hey! Hey, M-x listen!"
+            "Wake up, Mr. Stallman. Wake up and smell the ashes."
+            "You are *not* prepared!"
+            "Please don't go. The drones need you. They look up to you."))
+
+  (defun random-quit-message ()
+    "Return a randomly chosen quit message from `quit-messages'."
+    (nth (random (length quit-messages)) quit-messages))
+
+  (defun message-confirm-kill-emacs (&rest _)
+    "Prompt the user with a random message before quitting.
+  Returns t to allow kill if the user answers yes; nil otherwise."
+    (let* ((msg (random-quit-message))
+           (prompt (format "%s  Really quit Emacs? " msg)))
+      (yes-or-no-p (propertize prompt 'face '(italic default)))))
+
+  (setq confirm-kill-emacs #'message-confirm-kill-emacs)
+
+  ;; Enable which-key on startup
+  (add-hook 'emacs-startup-hook #'which-key-mode)
+
+  ;; Disable line numbers in fundamental mode
+  (let ((no-numbers-modes '(fundamental-mode-hook)))
+    (dolist (hk no-numbers-modes)
+      (add-hook hk (lambda () (display-line-numbers-mode 0)))))
+
+  ;; Colorise the compile-mode buffer
+  (require 'ansi-color)
+  (defun colorize-compilation-buffer ()
+    (ansi-color-apply-on-region compilation-filter-start (point)))
+  (add-hook 'compilation-filter-hook 'colorize-compilation-buffer)
+
+  ;; Shorten symbols into their single character equivalent
+  (global-prettify-symbols-mode 1)
+
+  ;; Font Setup
+  (let* ((fontconf '((fixed-font    . "AporeticSansMonoNerdFont")
+                     (variable-font . "Google Sans")
+                     (size          . 16)))
+         (fixed-font    (cdr (assoc 'fixed-font fontconf)))
+         (variable-font (cdr (assoc 'variable-font fontconf)))
+         (pt-size       (cdr (assoc 'size fontconf)))
+         (height        (* pt-size 10))
+         (frame-font    (concat fixed-font "-" (number-to-string pt-size))))
+    ; Fixed-width faces
+    (dolist (face '(default fixed-pitch))
+      (set-face-attribute face nil
+                          :font fixed-font
+                          :height height
+                          :weight 'regular))
+    ; Variable-pitch face
+    (set-face-attribute 'variable-pitch nil
+                        :font variable-font
+                        :height height
+                        :weight 'regular)
+
+    ; Syntax styling
+    (set-face-attribute 'font-lock-comment-face nil :slant 'italic)
+    (set-face-attribute 'font-lock-keyword-face nil :slant 'italic)
+
+    ; Frame font
+    (add-to-list 'default-frame-alist `(font . ,frame-font)))
+
+  ;; Spacious user interface elements
+  (use-package spacious-padding
+    :ensure t
+    :hook (after-init . spacious-padding-mode)
+    :config
+    (setq spacious-padding-widths
+          '( :internal-border-width 8
+             :header-line-width 4
+             :mode-line-width 6
+             :custom-button-width 3
+             :tab-width 4
+             :right-divider-width 30
+             :scroll-bar-width 8
+             :fringe-width 0))
+    (setq spacious-padding-subtle-frame-lines
+        '( :mode-line-active spacious-padding-line-active
+           :mode-line-inactive spacious-padding-line-inactive
+           :header-line-active spacious-padding-line-active
+           :header-line-inactive spacious-padding-line-inactive)))
+
+  ;; Enable line wrapping for text documents
+  (add-hook 'text-mode-hook 'visual-line-mode)
+  ;; Disable line numbers in text mode
+  (add-hook 'text-mode-hook (lambda () (display-line-numbers-mode -1)))
+#+end_src
+
+** Functionality
+#+begin_src emacs-lisp
+                ;; Indent with spaces
+  (setq-default indent-tabs-mode nil
+  	      ;; Use 2 spaces
+                tab-width 2
+                tab-stop-list (number-sequence 2 100 2)
+                c-basic-offset 2)
+
+  ;; Regex find and replace shortcut
+  (keymap-global-set "C-c r" 'replace-regexp)
+
+  ;; Functions to match vi's 'o' and 'O'
+  (cl-labels
+      ((vi-open-line-above ()
+         "Open line above the current line."
+         (interactive)
+         (unless (bolp) (beginning-of-line))
+         (newline)
+         (forward-line -1)
+         (indent-according-to-mode))
+       (vi-open-line-below ()
+         "Open line below the current line."
+         (interactive)
+         (unless (eolp) (end-of-line))
+         (newline-and-indent)))
+    (define-key (current-global-map) (kbd "C-c o") #'vi-open-line-above)
+    (define-key (current-global-map) (kbd "C-c O") #'vi-open-line-below)
+    (which-key-add-key-based-replacements "C-c o" "open-line-above")
+    (which-key-add-key-based-replacements "C-c O" "open-line-below"))
+
+  ;; Move to the beginning of the line with respect to context
+  (progn
+    (defun smart-beginning-of-line ()
+      "Move the cursor to the beginning of text on the line."
+      (interactive)
+      (let ((initial-point (point)))
+        (back-to-indentation)
+        (when (eq initial-point (point))
+          (move-beginning-of-line 1))))
+    (defun setup-prog-mode-c-a ()
+      (local-set-key (kbd "C-a") 'smart-beginning-of-line))
+    (add-hook 'prog-mode-hook 'setup-prog-mode-c-a)
+    (add-hook 'conf-mode-hook 'setup-prog-mode-c-a))
+
+  ;; Clean up trailing whitespace
+  (progn
+    (defun prog-nuke-trailing-whitespace ()
+      "Removes trailing whitespace at the end of the line."
+      (when (or (derived-mode-p 'prog-mode) (derived-mode-p 'conf-mode))
+        (delete-trailing-whitespace)))
+    (add-hook 'before-save-hook 'prog-nuke-trailing-whitespace))
+
+  ;; Enable overwriting selection with the built-in delsel package
+  (use-package delsel
+      :hook (after-init . delete-selection-mode))
+
+  ;; Use y/n and other similar shortenings for dialogue response
+  (setopt use-short-answers t)
+
+  ;; Configure the built-in file-manager dired
+  (use-package dired
+    :commands (dired)
+    :hook
+    ((dired-mode . dired-hide-details-mode)
+     (dired-mode . hl-line-mode))
+    :config
+    (setq dired-recursive-copies 'always
+          dired-recursive-deletes 'always
+          ; delete-by-moving-to-trash t ; FIXME: Currently Broken, need to find why
+          dired-dwim-target t
+          insert-directory-program "~/.nix-profile/bin/ls"
+          dired-listing-switches "-lah"))
+
+  ;; Return to last position after leaving a file
+  (add-hook 'emacs-startup-hook #'save-place-mode)
+
+  ;; Setup a pretty and useful eshell prompt
+  (progn
+    (dolist (spec
+             '((eshell-prompt-user-face        font-lock-keyword-face   "Face for the username in the eshell prompt.")
+               (eshell-prompt-venv-face        font-lock-string-face    "Face for the virtualenv name in the eshell prompt.")
+               (eshell-prompt-dir-face         dired-directory          "Face for the directory path in the eshell prompt.")
+               (eshell-prompt-git-face         magit-tag                "Face for the git branch in the eshell prompt.")
+               (eshell-prompt-git-dirty-face   eshell-prompt-git-face   "Face for the git dirty status in the eshell prompt.")
+               (eshell-prompt-symbol-face      font-lock-builtin-face   "Face for the prompt symbol in the eshell prompt.")))
+      (cl-destructuring-bind (name inherit doc) spec
+        (defface name
+          `((t (:inherit ,inherit)))
+          doc
+          :group 'eshell-prompt)))
+
+    (defun eshell-abbreviate-dir (dir)
+      "Abbreviate directory to show only the first and the last two components."
+      (let* ((abbrev (abbreviate-file-name dir))
+             (components (split-string abbrev "/" t))
+             (num-components (length components)))
+        (if (>= num-components 4)
+            (concat (car components) "/.../"
+                    (mapconcat #'identity (last components 2) "/"))
+          abbrev)))
+
+    (defun eshell-prompt-git-branch ()
+      "Return the current git branch or short commit hash, if available."
+      (when (and (executable-find "git")
+                 (locate-dominating-file default-directory ".git"))
+        (with-temp-buffer
+          (let ((ret (call-process "git" nil t nil "symbolic-ref" "--short" "HEAD")))
+            (if (zerop ret)
+                (string-trim (buffer-string))
+              (when (zerop (call-process "git" nil t nil "rev-parse" "--short" "HEAD"))
+                (string-trim (buffer-string))))))))
+
+    (defun eshell-prompt-git-dirty ()
+      "Return a dirty flag (✗ if dirty, ✓ if clean) for the git repository."
+      (when (eshell-prompt-git-branch)
+        (with-temp-buffer
+          (call-process "git" nil t nil "status" "--porcelain")
+          (if (> (buffer-size) 0) "✗" "✓"))))
+
+    (defun eshell-prompt ()
+      "Custom eshell prompt."
+      (let* ((user (propertize (user-login-name) 'face 'eshell-prompt-user-face))
+             (venv (when-let ((venv (getenv "VIRTUAL_ENV")))
+                     (concat (propertize "(" 'face 'eshell-prompt-venv-face)
+                             (propertize (file-name-nondirectory venv) 'face 'eshell-prompt-venv-face)
+                             (propertize ")" 'face 'eshell-prompt-venv-face))))
+             (path (propertize (eshell-abbreviate-dir (eshell/pwd)) 'face 'eshell-prompt-dir-face))
+             (git-branch (eshell-prompt-git-branch))
+             (git-info (when git-branch
+                         (concat " " (propertize "on" 'face 'font-lock-number-face) " "
+                                 (propertize git-branch 'face 'eshell-prompt-git-face)
+                                 (propertize (eshell-prompt-git-dirty) 'face 'eshell-prompt-git-dirty-face))))
+             (prompt (concat user " " (propertize "in" 'face 'font-lock-number-face) " "
+                             (if venv (concat venv " ") "")
+                             path git-info "\n"
+                             (propertize "λ" 'face 'eshell-prompt-symbol-face) " ")))
+        prompt))
+
+    (setq eshell-prompt-function 'eshell-prompt
+          eshell-prompt-regexp "^[^λ\n]*λ "))
+
+  ;; Bind recent files to C-x C-r
+  (add-hook 'emacs-startup-hook #'recentf-mode)
+  (keymap-global-set "C-x C-r" 'recentf-open)
+  (which-key-add-key-based-replacements "C-x C-r" "Recent Files")
+  (put 'compile-command 'safe-local-variable #'stringp)
+
+  ;; Persistently save minibuffer history between sessions
+  (use-package savehist
+    :hook (after-init . savehist-mode))
+
+  ;; Local info files directory
+  (add-to-list 'Info-directory-list "/Users/venomade/Documents/Info/")
+
+  ;; Scroll on compilation mode output
+  (setq compilation-scroll-output t)
+
+  ;; Add keybinds for compiling
+  (keymap-global-set "C-c m c" 'compile)
+  (keymap-global-set "C-c m r" 'recompile)
+  (which-key-add-key-based-replacements "C-c m" "make")
+#+end_src
+
+* Basic Package Configuration
+This is the configuration for the necessary packages required for my base Emacs experience for all cases.
+
+** Setup
+#+begin_src emacs-lisp
+  ;; Setup Melpa
+  (require 'package)
+  (add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/") t)
+  (package-initialize)
+#+end_src
+
+** Internal Packages
+#+begin_src emacs-lisp
+  ;; Improved Garbage Collection
+  (use-package gcmh
+    :ensure t
+    :hook (after-init . gcmh-mode)
+    :config
+    (setq gcmh-high-cons-threshold (* 128 1024 1024)  ; 128MB
+          gcmh-idle-delay 10
+          gcmh-verbose nil))
+
+  ;; Find executables that are usable from the specified shell
+  (use-package exec-path-from-shell
+    :ensure t
+    :config
+    (setq exec-path-from-shell-shell-name "/bin/zsh"
+          exec-path-from-shell-arguments '("-l" "-i" "-c"))
+    (when (memq window-system '(mac ns x))
+      (exec-path-from-shell-initialize)))
+#+end_src
+
+** User Interface Packages
+#+begin_src emacs-lisp
+  ;; Catppuccin Color Theme
+  (use-package catppuccin-theme
+    :ensure t
+    :config
+    (setq catppuccin-flavor 'mocha)
+    (catppuccin-set-color 'base     "#000000")
+    (catppuccin-set-color 'mantle   "#181818")
+    (catppuccin-set-color 'crust    "#111111")
+    (catppuccin-set-color 'overlay2 "#9B9B9B")
+    (catppuccin-set-color 'overlay1 "#858585")
+    (catppuccin-set-color 'overlay0 "#707070")
+    (catppuccin-set-color 'surface2 "#5C5C5C")
+    (catppuccin-set-color 'surface1 "#474747")
+    (catppuccin-set-color 'surface0 "#333333")
+    (catppuccin-reload)
+    (load-theme 'catppuccin t))
+
+  ;; Automatically match the titlebar to the theme
+  (use-package ns-auto-titlebar
+    :ensure t
+    :config
+    (when (eq system-type 'darwin) (ns-auto-titlebar-mode)))
+
+  ;; More readable modeline from DOOM Emacs
+  (use-package doom-modeline
+    :ensure t
+    :hook (after-init . doom-modeline-mode)
+    :config
+    (setq doom-modeline-height 0 ; minimum
+          doom-modeline-bar-width 0 ; disabled
+          doom-modeline-project-detection 'project ; use project.el
+          doom-modeline-buffer-state-icon nil
+          doom-modeline-highlight-modified-buffer-name nil
+          doom-modeline-percent-position nil
+          line-number-mode nil
+          doom-modeline-buffer-encoding nil
+          doom-modeline-time-live-icon nil
+          doom-modeline-time-icon nil
+          display-time-default-load-average nil
+          display-time-format "%a %d %b | %R"
+          helm-ag-show-status-function nil)) ;HACK: Doom Modeline asks for this but I don't use helm
+
+  ;; Icons for use with a nerd-font
+  (use-package nerd-icons
+    :ensure t
+    :if (display-graphic-p))
+
+  ;; Nerd Icons in the file manager
+  (use-package nerd-icons-dired
+    :ensure t
+    :after nerd-icons
+    :hook
+    (dired-mode . nerd-icons-dired-mode))
+
+  ;; Nerd Icons in the buffer menu
+  (use-package nerd-icons-ibuffer
+    :ensure t
+    :after nerd-icons
+    :hook (ibuffer-mode . nerd-icons-ibuffer-mode))
+
+  ;; Color brackets for visual grepping
+  (use-package rainbow-delimiters
+    :ensure t
+    :hook (prog-mode . rainbow-delimiters-mode))
+
+  ;; Highlight todo comments
+  (use-package hl-todo
+    :ensure t
+    :hook ((org-mode . hl-todo-mode)
+           (prog-mode . hl-todo-mode))
+    :config
+    (add-to-list 'hl-todo-keyword-faces '("ERROR" . "#8c5353")))
+
+  ;; Highlight large changes
+  (use-package goggles
+    :ensure t
+    :hook ((prog-mode text-mode) . goggles-mode)
+    :config
+    (setq-default goggles-pulse t))
+
+  ;; Nicer view to manager project.el projects
+  (use-package disproject
+    :ensure t
+    :after project
+    :bind (:map ctl-x-map
+                ("p" . disproject-dispatch)))
+
+  ;; Sort buffers by project in the buffer manager
+  (use-package ibuffer-project
+    :ensure t
+    :after project
+    :config
+    (add-hook
+     'ibuffer-hook
+     (lambda ()
+       (setq ibuffer-filter-groups (ibuffer-project-generate-filter-groups))
+       (unless (eq ibuffer-sorting-mode 'project-file-relative)
+         (ibuffer-do-sort-by-project-file-relative))))
+    (keymap-global-set "C-x C-b" 'ibuffer))
+#+end_src
+
+** Functionality Packages
+#+begin_src emacs-lisp
+  ;; Move text up and down with a single keybind
+  (use-package move-text
+    :ensure t
+    :config
+    (keymap-global-set "M-p" 'move-text-up)
+    (keymap-global-set "M-n" 'move-text-down)
+    (defun indent-region-advice (&rest ignored)
+      (let ((deactivate deactivate-mark))
+        (if (region-active-p)
+            (indent-region (region-beginning) (region-end))
+          (indent-region (line-beginning-position) (line-end-position)))
+        (setq deactivate-mark deactivate)))
+
+    (advice-add 'move-text-up :after 'indent-region-advice)
+    (advice-add 'move-text-down :after 'indent-region-advice))
+
+  ;; Automatically insert matching delimiters and jump between them
+  (use-package smartparens
+    :ensure t
+    :hook (prog-mode text-mode markdown-mode)
+    :config
+    (require 'smartparens-config)
+    (sp-use-paredit-bindings))
+
+  ;; Undo across history and across revisions
+  (use-package undo-tree
+    :ensure t
+    :init
+    (global-undo-tree-mode 1)
+    :config
+    (setq undo-tree-auto-save-history t
+          undo-tree-history-directory-alist `(("." . ,(expand-file-name ".cache" user-emacs-directory)))))
+
+  ;; Insert accents with a menu
+  (use-package accent
+    :ensure t
+    :bind* (("C-'" . accent-menu))
+    :config
+    (setq accent-diacritics '((a (á ã â à)) ; só para Português
+                              (e (é ê))
+                              (i (í))
+                              (o (ó õ ô))
+                              (u (ú))
+                              (c (ç))
+                              (A (Á Ã Â À))
+                              (E (É Ê))
+                              (I (Í))
+                              (O (Ó Õ Ô))
+                              (U (Ú)))))
+
+  ;; Allow recursive expansion in the dired file-manager
+  (use-package dired-subtree
+    :ensure t
+    :after dired
+    :bind
+    (:map dired-mode-map
+          ("TAB" . (lambda () (interactive) (dired-subtree-toggle) (revert-buffer)))
+          ("<backtab>" . dired-subtree-remove))
+    :config
+    (setq dired-subtree-use-backgrounds nil))
+#+end_src
+
+* Advanced Package Configuration
+This configuration is for specific filetypes/languages and more advanced packages. It is sorted by module for easy enabling and disabling, and ordered by relevance to most modes.
+
+** Corfu Completion
+#+begin_src emacs-lisp
+  ;; Make completion matching much more powerful
+  (use-package orderless
+    :ensure t
+    :config
+    (setq completion-styles '(orderless basic)
+          completion-category-defaults nil
+          completion-category-overrides '((file (styles . (partial-completion)))
+                                          (eglot (styles . (orderless))))))
+
+  ;; Snippet expansion allows for powerful multi-stage completion
+  (use-package yasnippet
+    :ensure t
+    :hook (prog-mode . yas-minor-mode)
+    :bind
+    (("C-c y n" . yas-new-snippet)
+     ("C-c y v" . yas-visit-snippet-file)
+     ("C-c y i" . yas-insert-snippet))
+    :config
+    (yas-reload-all))
+
+  ;; Add some base snippets
+  (use-package yasnippet-snippets
+    :after yasnippet
+    :ensure t)
+
+  ;; Combiner for multiple completion backends
+  (use-package cape
+    :ensure t
+    :config
+    ;; TODO find out what the wrap buster actually does (caching or whatever)
+    (advice-add 'eglot-completion-at-point :around #'cape-wrap-buster))
+
+  (use-package yasnippet-capf
+    :ensure t
+    :after cape)
+
+  (defun eglot-capf-with-yasnippet ()
+    (setq-local completion-at-point-functions
+                (list
+                 (cape-capf-super
+                  #'eglot-completion-at-point
+                  #'yasnippet-capf))))
+  (with-eval-after-load 'eglot
+    (add-hook 'eglot-managed-mode-hook #'eglot-capf-with-yasnippet))
+
+  ;; The fast completion menu
+  (use-package corfu
+    :ensure t
+    :hook ((prog-mode . corfu-mode)
+           (eshell-mode . corfu-mode))
+    :bind (:map corfu-map
+                ("TAB" . corfu-insert)
+                ("<tab>" . corfu-insert)
+                ("RET" . nil)
+                ("C-n" . corfu-next)
+                ("C-p" . corfu-previous)
+                ("C-g" . corfu-quit))
+    :config
+    (setq corfu-cycle t
+          corfu-auto t
+          corfu-auto-delay 0.2
+          corfu-preselect 'first
+          corfu-quit-at-boundary t
+          corfu-quit-no-match t
+          corfu-scroll-margin 5
+          corfu-tab-always-indent 'complete
+          corfu-preview-current nil
+          corfu-min-width 20
+          corfu-popupinfo-delay '(1.25 . 0.5)
+          corfu-on-exact-match nil)
+    (corfu-popupinfo-mode 1)
+    (with-eval-after-load 'savehist
+      (corfu-history-mode 1)
+      (add-to-list 'savehist-additional-variables 'corfu-history)))
+
+  (use-package nerd-icons-corfu
+    :ensure t
+    :after nerd-icons corfu
+    :config
+    (add-to-list 'corfu-margin-formatters #'nerd-icons-corfu-formatter))
+#+end_src
+
+** Miscellaneous Completion
+#+begin_src emacs-lisp
+  ;; Powerful minibuffer completion
+  (use-package vertico
+    :ensure t
+    :hook (after-init . vertico-mode)
+    :bind (:map vertico-map
+                ("DEL" . vertico-directory-delete-char)))
+
+  ;; Powerful completion replacements for various other emacs functions
+  (use-package consult
+    :ensure t
+    :bind (("M-g g" . consult-goto-line)
+           ("M-g M-g" . consult-goto-line)
+           ("C-c s" . consult-line))
+
+    :config
+    (which-key-add-key-based-replacements "C-c s" "search-lines"))
+
+  ;; Powerful completion replacements for find-style emacs functions
+  (use-package affe
+    :ensure t
+    :after consult
+    :bind (("C-c f f" . affe-find)
+           ("C-c f g" . affe-grep))
+    :init
+    (which-key-add-key-based-replacements "C-c f" "find-file")
+    (which-key-add-key-based-replacements "C-c f f" "find-fuzzy")
+    (which-key-add-key-based-replacements "C-c f g" "find-greppy"))
+
+  ;; Add descriptive annotations to minibuffer completions
+  (use-package marginalia
+    :ensure t
+    :after vertico
+    :config (marginalia-mode 1))
+
+  ;; Add nerd-font icons to completions in minibuffer
+  (use-package nerd-icons-completion
+    :ensure t
+    :after vertico marginalia
+    :hook
+    (marginalia-mode . nerd-icons-completion-marginalia-setup)
+    (after-init . nerd-icons-completion-mode))
+#+end_src
+
+** Eglot
+#+begin_src emacs-lisp
+  (use-package eglot
+    :ensure t
+    :after cape
+    :config
+    ;; Disable progress indicator in the modeline
+    (setq eglot-report-progress nil
+          eglot-extend-to-xref t))
+
+  ;; Use a rust binary to do lsp communication and then send results to emacs
+  ; Booster at https://github.com/blahgeek/emacs-lsp-booster
+  (use-package eglot-booster
+    :vc (:url "https://github.com/jdtsmith/eglot-booster.git")
+    :ensure t
+  	:after eglot
+  	:config
+    ;; Use emacs-30's built in JSON handler
+    (setq eglot-booster-io-only t)
+    (eglot-booster-mode))
+
+  ;; Jump to workspace symbols from the LSP with consult
+  (use-package consult-eglot
+    :ensure t
+    :after eglot)
+
+  ;; Install markdown support for eldoc
+  (use-package markdown-mode
+    :ensure t)
+
+  ;; Popup lsp documentation information in a floating box
+  (use-package eldoc-box
+    :ensure t)
+  ;; Follow markdown links inside eldoc boxes on selection
+  (defun markdown-follow-help-or-link-at-point-advice (orig-fun &rest args)
+    "Prefer to use the help-echo property as `browse-url' target."
+    (let* ((event-win (posn-window (event-start last-input-event)))
+           (help-echo (with-selected-frame (window-frame event-win)
+                        (with-current-buffer (window-buffer event-win)
+                          (get-text-property (point) 'help-echo))))
+           (help-is-url (url-type (url-generic-parse-url help-echo))))
+      (message "if %s (browse-url %S)" help-is-url help-echo)
+      (if help-is-url
+          (browse-url help-echo)
+        (apply orig-fun args))))
+  (advice-add 'markdown-follow-link-at-point :around #'markdown-follow-help-or-link-at-point-advice)
+
+  ;; Menu for eglot and related functions
+  (require 'transient)
+  (transient-define-prefix eglot-transient ()
+    "Transient menu for Eglot."
+    [["Server"
+      ("c" "Reconnect" eglot-reconnect)
+      ("q" "Shutdown" eglot-shutdown)
+      ("I" "Server Info" eglot-show-workspace-configuration)]
+     ["Navigation"
+      ("g" "Go to Definition" xref-find-definitions)
+      ("d" "Describe Thing at Point" eldoc-box-help-at-point)
+      ("D" "Go to Declaration" eglot-find-declaration)
+      ("i" "Go to Implementation" eglot-find-implementation)
+      ("f" "Find References" xref-find-references)
+      ("t" "Type Definition" eglot-find-typeDefinition)
+      ("s" "Search Symbols"
+       (lambda ()
+         (interactive)
+         (if (eq major-mode 'java-mode)
+             (call-interactively 'consult-eglot-jdt-symbols)
+           (call-interactively 'consult-eglot-symbols))))]
+     ["Code Actions"
+      ("a" "Code Actions" eglot-code-actions)
+      ("q" "Quick Fix" eglot-code-action-quickfix)
+      ("=" "Format Buffer" eglot-format-buffer)
+      ("o" "Organize Imports" eglot-code-action-organize-imports)
+      ("r" "Rename Symbol" eglot-rename)]
+     ["Diagnostics"
+      ("l" "List Diagnostics" flycheck-list-errors)
+      ("L" "Project Diagnostics" flymake-show-project-diagnostics)]]
+    (interactive)
+     (transient-setup 'eglot-transient))
+
+  (define-key eglot-mode-map (kbd "C-c l") #'eglot-transient)
+
+  ;; Display error and warning highlighting from eglot
+  (use-package flycheck
+    :ensure t
+    :config
+    (global-flycheck-mode 1))
+
+  (use-package flycheck-eglot
+    :ensure t
+    :after (flycheck eglot)
+    :custom (flycheck-eglot-exclusive nil)
+    :config
+    (global-flycheck-eglot-mode 1))
+#+end_src
+
+** Org Mode
+#+begin_src emacs-lisp
+        ;; Open source blocks in the current window
+  (setq org-src-window-setup 'current-window
+        ;; Don't confirm when evaluating a code block
+        org-confirm-babel-evaluate nil
+        ;; Make org documents more seamless by hiding markup
+        org-hide-emphasis-markers t)
+
+  ;; A nicer org-bullets for headers
+  (use-package org-superstar
+    :ensure t
+    :hook (org-mode . org-superstar-mode)
+    :custom
+    (org-superstar-remove-leading-stars t)
+    (org-superstar-headline-bullets-list
+     '("•" "•" "•" "•" "•")))
+
+  ;; Specify the variable font for org-mode text
+  (let* ((variable-tuple
+          (cond ((x-list-fonts "Google Sans")     '(:font "Google Sans"))
+                ((x-family-fonts "Sans Serif")    '(:family "Sans Serif"))
+                (nil (warn "Cannot find a Sans Serif Font.  Install Google Sans."))))
+         (base-font-color     (face-foreground 'default nil 'default))
+         (headline           `(:inherit default :weight bold :foreground ,base-font-color)))
+
+    (custom-theme-set-faces
+     'user
+     `(org-level-8 ((t (,@headline ,@variable-tuple))))
+     `(org-level-7 ((t (,@headline ,@variable-tuple))))
+     `(org-level-6 ((t (,@headline ,@variable-tuple))))
+     `(org-level-5 ((t (,@headline ,@variable-tuple))))
+     `(org-level-4 ((t (,@headline ,@variable-tuple :height 1.1))))
+     `(org-level-3 ((t (,@headline ,@variable-tuple :height 1.2))))
+     `(org-level-2 ((t (,@headline ,@variable-tuple :height 1.3))))
+     `(org-level-1 ((t (,@headline ,@variable-tuple :height 1.4))))
+     `(org-document-title ((t (,@headline ,@variable-tuple :height 1.6 :underline nil))))))
+
+  ;; Enable a non-monospace font for org documents
+  (add-hook 'org-mode-hook 'variable-pitch-mode)
+  ;; Enable line wrapping for org documents
+  (add-hook 'org-mode-hook 'visual-line-mode)
+  ;; Disable line numbers in org mode
+  (add-hook 'org-mode-hook (lambda () (display-line-numbers-mode -1)))
+
+  ;; Theme the fonts and styles for various org elements
+  (custom-theme-set-faces
+   'user
+   '(org-block ((t (:inherit fixed-pitch))))
+   '(org-code ((t (:inherit (shadow fixed-pitch)))))
+   '(org-document-info-keyword ((t (:inherit (shadow fixed-pitch)))))
+   '(org-indent ((t (:inherit (org-hide fixed-pitch)))))
+   '(org-link ((t (:foreground "#89b4fa" :underline t))))
+   '(org-meta-line ((t (:inherit (font-lock-comment-face fixed-pitch)))))
+   '(org-property-value ((t (:inherit fixed-pitch))) t)
+   '(org-special-keyword ((t (:inherit (font-lock-comment-face fixed-pitch)))))
+   '(org-table ((t (:inherit fixed-pitch))))
+   '(org-tag ((t (:inherit (shadow fixed-pitch) :weight bold :height 0.8))))
+   '(org-verbatim ((t (:inherit (shadow fixed-pitch))))))
+
+  ;; Provides quick snippets for common org templates
+                                          ;(add-to-list 'org-modules 'org-tempo)
+  (require 'org-tempo)
+                                          ; FIXME: Won't enable for some reason,
+                                          ; figure out why, and make it lazy
+
+  ;; Open org mode links in current window
+  (setq org-link-frame-setup
+        '((file . find-file)
+          (wl . wl-other-frame)
+          (vm . vm-visit-folder-other-frame)
+          (gnus . gnus)))
+
+  (add-hook 'org-mode-hook (lambda () (electric-indent-local-mode -1)))
+#+end_src
+
+* Language Specific Configuration
+These are the configurations for specific programming languages that should be enabled or disabled based on what is needed at any time.
+
+** Lua
+#+begin_src emacs-lisp
+  (use-package lua-mode
+    :ensure t
+    :hook (lua-mode . eglot-ensure)
+    :config
+          ;; Use a 2 space indent level for formatting
+    (setq lua-indent-level 2
+          ;; Use lua 5.4 for documentation
+          lua-documentation-url "https://www.lua.org/manual/5.4/manual.html"))
+
+  ;; Settings for lua_ls
+  (setq-default eglot-workspace-configuration
+                `(:Lua
+                  (:completion (:callSnippet "Replace")
+                   :runtime (:version "Lua 5.4"
+                             :path ["?.lua"
+                                    "?/init.lua"
+                                    "./stubs/?.lua"
+                                    "./stubs/?/init.lua"])
+                   :workspace (:library [,(concat (getenv "HOME") "/.luarocks/share/lua/5.4")
+                                         "./stubs"])
+                   :diagnostics (:enable t))))
+
+  ; TODO Try fix this only for lua-mode as that is where the bug is
+  (setq eglot-ignored-server-capabilities
+        '(:documentOnTypeFormattingProvider))
+#+end_src
+
+** Nix
+#+begin_src emacs-lisp
+  (use-package nix-mode
+    :ensure t
+    :mode "\\.nix\\'"
+    :config
+    (add-hook 'nix-mode-hook #'eglot-ensure t)
+    (add-to-list 'eglot-server-programs '(nix-mode . ("nil"))))
+#+end_src
+
+** COMMENT ZK
+#+begin_src emacs-lisp
+  (use-package tomlparse
+    :ensure t)
+
+  (use-package zk4e
+    :ensure t
+    :after tomlparse
+    :vc ( :url "https://codeberg.org/mcookly/zk4e"
+          :branch "main"
+          :rev :newest)
+    :config
+    (setq zk4e-notebook-directories '(("Notes" . "~/Documents/Notes")))
+    (zk4e-select-notebook "Notes"))
+#+end_src
+
+** Denote
+#+begin_src emacs-lisp
+  (use-package denote
+    :ensure t
+    :hook (dired-mode . denote-dired-mode)
+    :bind
+    (("C-c n n" . denote)
+     ("C-c n N" . denote-type)
+     ("C-c n r" . denote-rename-file)
+     ("C-c n l f" . denote-link)
+     ("C-c n b" . denote-backlinks)
+     ("C-c n g" . denote-grep))
+    :config
+    (setq denote-directory (expand-file-name "~/Documents/Denotes/"))
+    (denote-rename-buffer-mode 1))
+
+  (use-package consult-denote
+    :ensure t
+    :bind
+    (("C-c n f" . consult-denote-find)
+     ("C-c n g" . consult-denote-grep))
+    :config
+    (consult-denote-mode 1))
+
+  ; TODO: Denote Explore https://lucidmanager.org/productivity/denote-explore/
+
+  (use-package denote-menu
+    :ensure t
+    :bind
+    (("C-c n d" . list-denotes))
+    :config
+    (add-hook 'denote-menu-mode-hook (lambda () (display-line-numbers-mode -1))))
+
+  (use-package denote-org
+    :ensure t
+    :bind
+    (("C-c n l h" . denote-org-link-to-heading)))
+#+end_src
diff --git a/config/emacs/early-init.el b/config/emacs/early-init.el
new file mode 100644
index 0000000..8ba547e
--- /dev/null
+++ b/config/emacs/early-init.el
@@ -0,0 +1,9 @@
+;; GC Perfomance Tweaks from DOOM Emacs
+(setq gc-cons-threshold most-positive-fixnum
+      gc-cons-percentage 1.0)
+(add-hook 'emacs-startup-hook
+          (lambda ()
+            (setq gc-cons-threshold (* 128 1024 1024) ;; 128MB
+                  gc-cons-percentage 1.0)))
+
+(setenv "LSP_USE_PLISTS" "true")
diff --git a/.emacs.d/init.el b/config/emacs/init.el
index e11d303..e11d303 100644
--- a/.emacs.d/init.el
+++ b/config/emacs/init.el
diff --git a/config/eza/theme.yml b/config/eza/theme.yml
new file mode 100644
index 0000000..f74a128
--- /dev/null
+++ b/config/eza/theme.yml
@@ -0,0 +1,147 @@
+# Modus Themes for eza
+# Auto generated with https://github.com/miikanissi/modus-themes.nvim/blob/master/lua/modus-themes/extras/eza.lua
+colourful: true
+
+# base colors
+define: &bg_main "#000000"
+define: &bg_dim = "#1e1e1e"
+define: &bg_alt = "#0f0f0f"
+define: &fg_main = "#ffffff"
+define: &fg_dim = "#989898"
+define: &fg_alt = "#c6daff"
+define: &border = "#646464"
+define: &border_highlight = "#C4C4C4"
+
+# foreground colors
+define: &red "#ff5f59"
+define: &red_warmer "#ff6b55"
+define: &red_cooler "#ff7f9f"
+define: &red_faint "#ff9580"
+define: &green "#44bc44"
+define: &green_warmer "#70b900"
+define: &green_cooler "#00c06f"
+define: &green_faint "#88ca9f"
+define: &yellow "#d0bc00"
+define: &yellow_warmer "#fec43f"
+define: &yellow_cooler "#dfaf7a"
+define: &yellow_faint "#d2b580"
+define: &blue "#2fafff"
+define: &blue_warmer "#79a8ff"
+define: &blue_cooler "#00bcff"
+define: &blue_faint "#82b0ec"
+define: &magenta "#feacd0"
+define: &magenta_warmer "#f78fe7"
+define: &magenta_cooler "#b6a0ff"
+define: &magenta_faint "#caa6df"
+define: &cyan "#00d3d0"
+define: &cyan_warmer "#4ae2f0"
+define: &cyan_cooler "#6ae4b9"
+define: &cyan_faint "#9ac8e0"
+define: &rust "#db7b5f"
+define: &gold "#c0965b"
+define: &olive "#9cbd6f"
+define: &slate "#76afbf"
+define: &indigo "#9099d9"
+define: &maroon "#cf7fa7"
+define: &pink "#d09dc0"
+
+filekinds:
+  normal: {foreground: *fg_main}
+  directory: {foreground: *blue_warmer}
+  symlink: {foreground: *blue}
+  pipe: {foreground: *fg_dim}
+  block_device: {foreground: *magenta_cooler}
+  char_device: {foreground: *yellow_warmer}
+  socket: {foreground: *magenta}
+  special: {foreground: *pink}
+  executable: {foreground: *green}
+  mount_point: {foreground: *cyan}
+
+perms:
+  user_read: {foreground: *fg_dim}
+  user_write: {foreground: *red}
+  user_execute_file: {foreground: *green}
+  user_execute_other: {foreground: *green}
+  group_read: {foreground: *fg_dim}
+  group_write: {foreground: *red}
+  group_execute: {foreground: *green}
+  other_read: {foreground: *fg_dim}
+  other_write: {foreground: *red}
+  other_execute: {foreground: *green}
+  special_user_file: {foreground: *magenta_cooler}
+  special_other: {foreground: *red}
+  attribute: {foreground: *pink}
+
+size:
+  major: {foreground: *fg_dim}
+  minor: {foreground: *blue_warmer}
+  number_byte: {foreground: *pink}
+  number_kilo: {foreground: *rust}
+  number_mega: {foreground: *blue_warmer}
+  number_giga: {foreground: *magenta_cooler}
+  number_huge: {foreground: *magenta}
+  unit_byte: {foreground: *pink}
+  unit_kilo: {foreground: *rust}
+  unit_mega: {foreground: *blue_warmer}
+  unit_giga: {foreground: *magenta_cooler}
+  unit_huge: {foreground: *magenta}
+
+users:
+  user_you: {foreground: *yellow_warmer}
+  user_root: {foreground: *red}
+  user_other: {foreground: *magenta_cooler}
+  group_yours: {foreground: *pink}
+  group_other: {foreground: *fg_dim}
+  group_root: {foreground: *red}
+
+links:
+  normal: {foreground: *blue}
+  multi_link_file: {foreground: *cyan}
+
+git:
+  new: {foreground: *green}
+  modified: {foreground: *yellow_warmer}
+  deleted: {foreground: *red}
+  renamed: {foreground: *cyan}
+  typechange: {foreground: *magenta_cooler}
+  ignored: {foreground: *pink}
+  conflicted: {foreground: *magenta}
+
+git_repo:
+  branch_main: {foreground: *fg_dim}
+  branch_other: {foreground: *magenta_cooler}
+  git_clean: {foreground: *green}
+  git_dirty: {foreground: *red}
+
+security_context:
+  colon: {foreground: *fg_dim}
+  user: {foreground: *blue_warmer}
+  role: {foreground: *magenta_cooler}
+  typ: {foreground: *pink}
+  range: {foreground: *magenta_cooler}
+
+file_type:
+  image: {foreground: *yellow_warmer}
+  video: {foreground: *magenta}
+  music: {foreground: *blue_warmer}
+  lossless: {foreground: *cyan}
+  crypto: {foreground: *pink}
+  document: {foreground: *fg_dim}
+  compressed: {foreground: *magenta_cooler}
+  temp: {foreground: *yellow_warmer}
+  compiled: {foreground: *cyan}
+  build: {foreground: *pink}
+  source: {foreground: *green}
+
+punctuation: {foreground: *pink}
+date: {foreground: *cyan}
+inode: {foreground: *fg_dim}
+blocks: {foreground: *pink}
+header: {foreground: *fg_dim}
+octal: {foreground: *blue_warmer}
+flags: {foreground: *magenta_cooler}
+
+symlink_path: {foreground: *blue}
+control_char: {foreground: *cyan}
+broken_symlink: {foreground: *red}
+broken_path_overlay: {foreground: *pink}
diff --git a/config/lazygit/.gitignore b/config/lazygit/.gitignore
new file mode 100644
index 0000000..ace2661
--- /dev/null
+++ b/config/lazygit/.gitignore
@@ -0,0 +1 @@
+state.yml
diff --git a/config/lazygit/config.yml b/config/lazygit/config.yml
new file mode 100644
index 0000000..0151f13
--- /dev/null
+++ b/config/lazygit/config.yml
@@ -0,0 +1,182 @@
+gui:
+  border: single
+
+keybinding:
+  universal:
+    quit: q
+    quit-alt1: <c-c>
+    suspendApp: <c-z>
+    return: <esc>
+    quitWithoutChangingDirectory: Q
+    togglePanel: <tab>
+    prevItem: <up>
+    nextItem: <down>
+    prevItem-alt: e
+    nextItem-alt: n
+    prevPage: ','
+    nextPage: .
+    scrollLeft: H
+    scrollRight: I
+    gotoTop: <
+    gotoBottom: '>'
+    gotoTop-alt: <home>
+    gotoBottom-alt: <end>
+    toggleRangeSelect: v
+    rangeSelectDown: <s-down>
+    rangeSelectUp: <s-up>
+    prevBlock: <left>
+    nextBlock: <right>
+    prevBlock-alt: h
+    nextBlock-alt: i
+    nextBlock-alt2: <tab>
+    prevBlock-alt2: <backtab>
+    jumpToBlock:
+      - "1"
+      - "2"
+      - "3"
+      - "4"
+      - "5"
+    focusMainView: "0"
+    nextMatch: "k"
+    prevMatch: "K"
+    startSearch: /
+    optionMenu: <disabled>
+    optionMenu-alt1: '?'
+    select: <space>
+    goInto: <enter>
+    confirm: <enter>
+    confirmMenu: <enter>
+    confirmSuggestion: <enter>
+    confirmInEditor: <a-enter>
+    confirmInEditor-alt: <c-s>
+    remove: d
+    new: "n"
+    edit: j
+    openFile: o
+    scrollUpMain: <pgup>
+    scrollDownMain: <pgdown>
+    scrollUpMain-alt1: E
+    scrollDownMain-alt1: N
+    scrollUpMain-alt2: <c-u>
+    scrollDownMain-alt2: <c-d>
+    executeShellCommand: ':'
+    createRebaseOptionsMenu: m
+
+    # 'Files' appended for legacy reasons
+    pushFiles: P
+
+    # 'Files' appended for legacy reasons
+    pullFiles: p
+    refresh: R
+    createPatchOptionsMenu: <c-p>
+    nextTab: ']'
+    prevTab: '['
+    nextScreenMode: +
+    prevScreenMode: _
+    cyclePagers: '|'
+    undo: z
+    redo: Z
+    filteringMenu: <c-s>
+    diffingMenu: W
+    diffingMenu-alt: <c-j>
+    copyToClipboard: <c-o>
+    openRecentRepos: <c-r>
+    submitEditorText: <enter>
+    extrasMenu: '@'
+    toggleWhitespaceInDiffView: <c-w>
+    increaseContextInDiffView: '}'
+    decreaseContextInDiffView: '{'
+    increaseRenameSimilarityThreshold: )
+    decreaseRenameSimilarityThreshold: (
+    openDiffTool: <c-t>
+  status:
+    checkForUpdate: u
+    recentRepos: <enter>
+    allBranchesLogGraph: a
+  files:
+    commitChanges: c
+    commitChangesWithoutHook: w
+    amendLastCommit: A
+    commitChangesWithEditor: C
+    findBaseCommitForFixup: <c-f>
+    confirmDiscard: x
+    ignoreFile: l
+    refreshFiles: r
+    stashAllChanges: s
+    viewStashOptions: S
+    toggleStagedAll: a
+    viewResetOptions: D
+    fetch: f
+    toggleTreeView: '`'
+    openMergeOptions: M
+    openStatusFilter: <c-b>
+    copyFileInfoToClipboard: "y"
+    collapseAll: '-'
+    expandAll: =
+  branches:
+    createPullRequest: o
+    viewPullRequestOptions: O
+    copyPullRequestURL: <c-y>
+    checkoutBranchByName: c
+    forceCheckoutBranch: F
+    checkoutPreviousBranch: '-'
+    rebaseBranch: r
+    renameBranch: R
+    mergeIntoCurrentBranch: M
+    moveCommitsToNewBranch: "K"
+    viewGitFlowOptions: l
+    fastForward: f
+    createTag: T
+    pushTag: P
+    setUpstream: u
+    fetchRemote: f
+    addForkRemote: F
+    sortOrder: s
+  worktrees:
+    viewWorktreeOptions: w
+  commits:
+    squashDown: s
+    renameCommit: r
+    renameCommitWithEditor: R
+    viewResetOptions: g
+    markCommitAsFixup: f
+    setFixupMessage: c
+    createFixupCommit: F
+    squashAboveCommits: S
+    moveDownCommit: <c-n>
+    moveUpCommit: <c-e>
+    amendToCommit: A
+    resetCommitAuthor: a
+    pickCommit: p
+    revertCommit: t
+    cherryPickCopy: C
+    pasteCommits: V
+    markCommitAsBaseForRebase: B
+    tagCommit: T
+    checkoutCommit: <space>
+    resetCherryPick: <c-R>
+    copyCommitAttributeToClipboard: "y"
+    openLogMenu: <c-l>
+    openInBrowser: o
+    viewBisectOptions: b
+    startInteractiveRebase: l
+    selectCommitsOfCurrentBranch: '*'
+  amendAttribute:
+    resetAuthor: a
+    setAuthor: A
+    addCoAuthor: c
+  stash:
+    popStash: g
+    renameStash: r
+  commitFiles:
+    checkoutCommitFile: c
+  main:
+    toggleSelectHunk: a
+    pickBothHunks: b
+    editSelectHunk: J
+  submodules:
+    init: l
+    update: u
+    bulkMenu: b
+  commitMessage:
+    commitMenu: <c-o>
diff --git a/config/nvim/.gitignore b/config/nvim/.gitignore
new file mode 100644
index 0000000..e033bc6
--- /dev/null
+++ b/config/nvim/.gitignore
@@ -0,0 +1 @@
+lazy-lock.json
diff --git a/config/nvim/.luarc.json b/config/nvim/.luarc.json
new file mode 100644
index 0000000..bd8a14b
--- /dev/null
+++ b/config/nvim/.luarc.json
@@ -0,0 +1,18 @@
+{
+    "$schema": "https://raw.githubusercontent.com/LuaLS/vscode-lua/master/setting/schema.json",
+    "Lua.runtime.version": "LuaJIT",
+    "diagnostics.globals": ["vim"],
+    "workspace.checkThirdParty": false,
+    "workspace.library": [
+        "$VIMRUNTIME"
+    ],
+    "Lua.diagnostics.enable": true,
+    "Lua.format.defaultConfig": {
+        "indent_style": "space",
+        "indent_size": "2"
+    },
+    "typeFormat.config": false,
+    "completion.callSnippet": "Replace",
+    "completion.showWord": "Disable",
+    "completion.workspaceWord": false
+}
diff --git a/config/nvim/ftplugin/markdown.lua b/config/nvim/ftplugin/markdown.lua
new file mode 100644
index 0000000..4f658e4
--- /dev/null
+++ b/config/nvim/ftplugin/markdown.lua
@@ -0,0 +1,10 @@
+vim.keymap.set('n', 'n', 'gj', { buffer = true, noremap = true })
+vim.keymap.set('n', 'e', 'gk', { buffer = true, noremap = true })
+
+vim.opt_local.wrap = true
+vim.opt_local.linebreak = true
+
+vim.opt_local.number = false
+vim.opt_local.relativenumber = false
+
+vim.treesitter.start(vim.api.nvim_get_current_buf(), 'markdown')
diff --git a/config/nvim/init.lua b/config/nvim/init.lua
new file mode 100644
index 0000000..4b53a96
--- /dev/null
+++ b/config/nvim/init.lua
@@ -0,0 +1,10 @@
+-- Setup Config
+require("config.colemak")
+require("config.options")
+require("config.keymaps")
+
+-- Setup Lazy Plugin Manager
+require("manager")
+
+-- Test Script
+require("scripts")
diff --git a/config/nvim/lua/config/colemak.lua b/config/nvim/lua/config/colemak.lua
new file mode 100644
index 0000000..e6ce33b
--- /dev/null
+++ b/config/nvim/lua/config/colemak.lua
@@ -0,0 +1,32 @@
+local function map(mode, lhs, rhs, opts)
+  local options = { noremap = true, silent = true }
+  if opts then
+    options = vim.tbl_extend("force", options, opts)
+  end
+  vim.keymap.set(mode, lhs, rhs, options)
+end
+
+map("", "n", "j")
+map("", "e", "k")
+map("", "i", "l")
+map("", "j", "n")
+map("", "k", "e")
+map("", "l", "i")
+map("", "K", "E")
+map("", "N", "J")
+map("", "E", "K") -- As in 'Explore' documentation
+map("", "L", "I")
+map("", "I", "L")
+map("", "J", "N")
+
+map("n", "<c-w>h", "<c-w>h")
+map("n", "<c-w>n", "<c-w>j")
+map("n", "<c-w>e", "<c-w>k")
+map("n", "<C-w>i", "<c-w>l")
+
+map ("", "gn", "gj")
+map ("", "ge", "gk")
+
+-- Kakoune Holdover
+map ("", "gh", "0")
+map ("", "gi", "$")
diff --git a/config/nvim/lua/config/keymaps.lua b/config/nvim/lua/config/keymaps.lua
new file mode 100644
index 0000000..514a311
--- /dev/null
+++ b/config/nvim/lua/config/keymaps.lua
@@ -0,0 +1,53 @@
+vim.g.mapleader = " "
+vim.keymap.set("n", "<leader>bk", vim.cmd.bdelete,
+  { desc = "Kill Buffer" })
+vim.keymap.set("n", "<leader>bn", vim.cmd.bnext,
+  { desc = "Next Buffer" })
+vim.keymap.set("n", "<leader>bp", vim.cmd.bprev,
+  { desc = "Previous Buffer" })
+
+vim.keymap.set("n", "E", vim.lsp.buf.hover)
+vim.keymap.set("n", "<C-e>", vim.diagnostic.open_float)
+vim.keymap.set("n", "<leader>ld", vim.lsp.buf.definition,
+  { desc = "Go to Definition" })
+vim.keymap.set("n", "<leader>lt", vim.lsp.buf.type_definition,
+  { desc = "Go to Type Definition"} )
+vim.keymap.set("n", "<leader>li", vim.lsp.buf.implementation,
+  { desc = "Go to Implementation" })
+vim.keymap.set("n", "<leader>la", vim.lsp.buf.code_action,
+  { desc = "Show Code Actions" })
+vim.keymap.set("n", "<leader>lf", vim.lsp.buf.format,
+  { desc = "Format Document" })
+vim.keymap.set("n", "<leader>lr", vim.lsp.buf.rename,
+  { desc = "Rename" })
+vim.keymap.set("n", "<leader>lk", function()
+  vim.diagnostic.jump({ count = 1, float = true })
+end,
+  { desc = "Next Error" })
+-- vim.keymap.set("n", "<leader>lh", vim.lsp.buf.hover,
+--   { desc = "Hover Diagnostics" })
+
+vim.keymap.set("n", "<leader>wh", vim.cmd.split,
+  { desc = "Split Window Horizontally" })
+vim.keymap.set("n", "<leader>wv", vim.cmd.vsplit,
+  { desc = "Split Window Vertically" })
+vim.keymap.set("n", "<leader>wc", "<C-w>q",
+  { desc = "Close Window" })
+vim.keymap.set("n", "<leader>ww", "<C-w>w",
+  { desc = "Next Window" })
+
+vim.keymap.set("n", "<leader>foc", function()
+  vim.cmd('edit ~/.config/nvim/init.lua')
+end, { desc = "Open Config File" })
+
+vim.keymap.set("n", "<leader>fot", function()
+  vim.cmd('edit ~/Documents/TODO.org')
+end, { desc = "Open Todo File" })
+
+vim.keymap.set("n", "<leader>fon", function()
+  vim.cmd('edit ~/Documents/Notes.org')
+end, { desc = "Open Notes File" })
+
+vim.keymap.set('n', '<Tab>', '==', { noremap = true, silent = true })
+
+vim.keymap.set('n', 'q:', ':q<CR>', { noremap = true })
diff --git a/config/nvim/lua/config/options.lua b/config/nvim/lua/config/options.lua
new file mode 100644
index 0000000..f7bc9d8
--- /dev/null
+++ b/config/nvim/lua/config/options.lua
@@ -0,0 +1,107 @@
+vim.opt.nu = true
+vim.opt.rnu = true
+
+vim.opt.tabstop = 2
+vim.opt.softtabstop = 2
+vim.opt.shiftwidth = 2
+vim.opt.expandtab = true
+vim.opt.autoindent = true
+
+vim.opt.smartindent = true
+
+vim.opt.wrap = false
+
+vim.opt.swapfile = false
+vim.opt.backup = false
+vim.opt.undodir = os.getenv("HOME") .. "/.nvim/undodir"
+vim.opt.undofile = true
+
+vim.opt.hlsearch = false
+vim.opt.incsearch = true
+
+vim.opt.termguicolors = true
+
+vim.opt.scrolloff = 12
+
+vim.opt.updatetime = 50
+
+vim.opt.splitbelow = true
+vim.opt.splitright = true
+
+vim.opt.encoding = "utf-8"
+
+vim.opt.shell = "zsh"
+
+vim.opt.mouse = "a"
+
+vim.opt.ignorecase = true
+vim.opt.smartcase = true
+vim.opt.incsearch = true
+
+-- vim.opt.cursorline = true
+
+vim.opt.title = true
+
+vim.opt.clipboard = "unnamedplus"
+
+-- vim.opt.colorcolumn = "80"
+
+vim.opt.signcolumn = 'no'
+
+vim.cmd "set showtabline=0 | set laststatus=0"
+
+vim.wo.fillchars='eob: '
+
+vim.opt.conceallevel = 3
+
+-- Window Borders
+vim.o.winborder = 'rounded'
+
+-- Remove Whitespaces on File Save
+vim.api.nvim_create_autocmd({ "BufWritePre" }, {
+  pattern = { "*" },
+  command = [[%s/\s\+$//e]],
+})
+
+-- Define highlight groups for line numbers with diagnostics
+vim.api.nvim_set_hl(0, "LineNrDiagnosticError", { bg = "#3f1d1d", fg = "#ff6c6b" })
+vim.api.nvim_set_hl(0, "LineNrDiagnosticWarn",  { bg = "#3f311d", fg = "#ECBE7B" })
+vim.api.nvim_set_hl(0, "LineNrDiagnosticInfo",  { bg = "#1d2d3f", fg = "#51afef" })
+vim.api.nvim_set_hl(0, "LineNrDiagnosticHint",  { bg = "#1d3f2d", fg = "#98be65" })
+
+local function set_line_number_highlight()
+  -- Clear existing highlights
+  vim.fn.sign_unplace("LineNrDiagnostics")
+
+  -- Get diagnostics per buffer
+  for _, diag in ipairs(vim.diagnostic.get(0)) do
+    local hl_group = nil
+    if diag.severity == vim.diagnostic.severity.ERROR then
+      hl_group = "LineNrDiagnosticError"
+    elseif diag.severity == vim.diagnostic.severity.WARN then
+      hl_group = "LineNrDiagnosticWarn"
+    elseif diag.severity == vim.diagnostic.severity.INFO then
+      hl_group = "LineNrDiagnosticInfo"
+    elseif diag.severity == vim.diagnostic.severity.HINT then
+      hl_group = "LineNrDiagnosticHint"
+    end
+
+    if hl_group then
+      vim.fn.sign_place(0, "LineNrDiagnostics", hl_group, vim.api.nvim_get_current_buf(), {
+        lnum = diag.lnum + 1, -- diagnostics are 0-indexed
+        priority = 10,
+      })
+    end
+  end
+end
+
+-- Create the sign definitions
+vim.fn.sign_define("LineNrDiagnosticError", { text = "", texthl = "LineNrDiagnosticError", numhl = "LineNrDiagnosticError" })
+vim.fn.sign_define("LineNrDiagnosticWarn",  { text = "", texthl = "LineNrDiagnosticWarn",  numhl = "LineNrDiagnosticWarn"  })
+vim.fn.sign_define("LineNrDiagnosticInfo",  { text = "", texthl = "LineNrDiagnosticInfo",  numhl = "LineNrDiagnosticInfo"  })
+vim.fn.sign_define("LineNrDiagnosticHint",  { text = "", texthl = "LineNrDiagnosticHint",  numhl = "LineNrDiagnosticHint"  })
+
+-- Update line numbers when diagnostics change
+vim.api.nvim_create_autocmd({ "DiagnosticChanged", "BufEnter", "CursorHold" }, {
+  callback = set_line_number_highlight,
+})
diff --git a/config/nvim/lua/manager.lua b/config/nvim/lua/manager.lua
new file mode 100644
index 0000000..f450d31
--- /dev/null
+++ b/config/nvim/lua/manager.lua
@@ -0,0 +1,26 @@
+local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim"
+if not (vim.uv or vim.loop).fs_stat(lazypath) then
+  local lazyrepo = "https://github.com/folke/lazy.nvim.git"
+  local out = vim.fn.system({ "git", "clone", "--filter=blob:none", "--branch=stable", lazyrepo, lazypath })
+  if vim.v.shell_error ~= 0 then
+    vim.api.nvim_echo({
+      { "Failed to clone lazy.nvim:\n", "ErrorMsg" },
+      { out, "WarningMsg" },
+      { "\nPress any key to exit..." },
+    }, true, {})
+    vim.fn.getchar()
+    os.exit(1)
+  end
+end
+vim.opt.rtp:prepend(lazypath)
+
+vim.g.mapleader = " "
+vim.g.maplocalleader = "\\"
+
+require("lazy").setup({
+  spec = {
+    { import = "plugins" },
+  },
+  install = { colorscheme = { "modus" } },
+  checker = { enabled = true, notify = false },
+})
diff --git a/config/nvim/lua/plugins/autopairs.lua b/config/nvim/lua/plugins/autopairs.lua
new file mode 100644
index 0000000..c37e301
--- /dev/null
+++ b/config/nvim/lua/plugins/autopairs.lua
@@ -0,0 +1,8 @@
+return {
+  "windwp/nvim-autopairs",
+  config = function()
+    require("nvim-autopairs").setup({
+      disable_filetype = { "TelescopePrompt" , "vim" }
+    })
+  end,
+}
diff --git a/config/nvim/lua/plugins/catppuccin.lua b/config/nvim/lua/plugins/catppuccin.lua
new file mode 100644
index 0000000..9b09225
--- /dev/null
+++ b/config/nvim/lua/plugins/catppuccin.lua
@@ -0,0 +1,15 @@
+return {
+  'catppuccin/nvim',
+  name = 'catppuccin',
+  priority = 1000,
+  config = function()
+    require('catppuccin').setup({
+      flavour = 'mocha',
+      transparent_background = true,
+      float = {
+        transparent = true,
+      },
+    })
+    vim.cmd.colorscheme('catppuccin')
+  end,
+}
diff --git a/config/nvim/lua/plugins/cmp.lua b/config/nvim/lua/plugins/cmp.lua
new file mode 100644
index 0000000..69a2396
--- /dev/null
+++ b/config/nvim/lua/plugins/cmp.lua
@@ -0,0 +1,99 @@
+return {
+  'hrsh7th/nvim-cmp',
+  dependencies = {
+    'neovim/nvim-lspconfig',
+    'hrsh7th/cmp-nvim-lsp',
+    'hrsh7th/cmp-buffer',
+    'hrsh7th/cmp-path',
+    'lukas-reineke/cmp-rg',
+    'onsails/lspkind.nvim'
+  },
+  config = function()
+    local cmp = require('cmp')
+    local lspkind = require('lspkind')
+    cmp.setup({
+      -- preselect = cmp.PreselectMode.None,
+      completion = {
+        completeopt = "menu,menuone,noinsert",
+        callSnippet = "Replace",
+        keywordSnippet = "Replace",
+      },
+      window = {
+        completion = cmp.config.window.bordered({}),
+        documentation = cmp.config.window.bordered({}),
+      },
+      snippet = {
+        expand = function(arg)
+          vim.snippet.expand(arg.body)
+        end
+      },
+      mapping = cmp.mapping.preset.insert({
+        ['<Tab>'] = cmp.mapping.confirm({ select = true }),
+        ['<C-n>'] = cmp.mapping.select_next_item(),
+        ['<C-p>'] = cmp.mapping.select_prev_item(),
+        ['<C-g>'] = cmp.mapping.abort(),
+      }),
+      sources = cmp.config.sources(
+        {
+          { name = 'nvim_lsp' },
+        },
+        {
+          { name = 'path' },
+        }
+      -- {
+      --   { name = 'buffer' },
+      --   { name = 'rg',    keyword_length = 3 }
+      -- }
+      ),
+      formatting = {
+        format = lspkind.cmp_format({
+          mode = 'symbol'
+        })
+      },
+      -- view = {
+      --   entries = 'native'
+      -- },
+    })
+
+    local capabilities = require('cmp_nvim_lsp').default_capabilities()
+    vim.lsp.config('lua_ls', {
+      -- cmd = { '/home/venomade/.local/share/lua-language-server/bin/lua-language-server' },
+      capabilities = capabilities,
+      root_markers = {
+        ".luarc.json",
+        ".luarc.jsonc",
+        ".git",
+      },
+      settings = {
+        Lua = {
+          runtime = {
+            version = 'Lua 5.4',
+            path = vim.list_extend(
+              vim.split(package.path, ';'),
+              {
+                '?.lua',
+                '?/init.lua',
+                './stubs/?.lua',
+                './stubs/?/init.lua'
+              }),
+          },
+          workspace = {
+            library = {
+              vim.env.HOME .. '/.luarocks/share/lua/5.4',
+              './stubs'
+            },
+          },
+          diagnostics = {
+            enable = true,
+          },
+        },
+      },
+    })
+
+    vim.lsp.enable('lua_ls')
+    vim.lsp.config('clangd', {
+      capabilities = capabilities
+    })
+    vim.lsp.enable('clangd')
+  end
+}
diff --git a/config/nvim/lua/plugins/colorizer.lua b/config/nvim/lua/plugins/colorizer.lua
new file mode 100644
index 0000000..460eb5c
--- /dev/null
+++ b/config/nvim/lua/plugins/colorizer.lua
@@ -0,0 +1,15 @@
+return {
+  'norcalli/nvim-colorizer.lua',
+  config = function()
+    require("colorizer").setup({ "*" }, {
+      RGB = true,
+      RRGGBB = true,
+      names = false,
+      RRGGBBAA = true,
+      rgb_fn = true,
+      hsl_fn = true,
+      css = false,
+      css_fn = false,
+    })
+  end
+}
diff --git a/config/nvim/lua/plugins/compile.lua b/config/nvim/lua/plugins/compile.lua
new file mode 100644
index 0000000..8d824de
--- /dev/null
+++ b/config/nvim/lua/plugins/compile.lua
@@ -0,0 +1,20 @@
+return {
+  "ej-shafran/compile-mode.nvim",
+  branch = "latest",
+  dependencies = {
+    "nvim-lua/plenary.nvim",
+  },
+  config = function()
+    vim.g.compile_mode = {}
+
+    local compile_mode = require("compile-mode")
+
+    vim.keymap.set("n", "<leader>cc", compile_mode.compile,
+      { desc = "Compile" })
+    vim.keymap.set("n", "<leader>cr", compile_mode.recompile,
+      { desc = "Recompile" })
+    vim.keymap.set("n", "<leader>cq", compile_mode.interrupt,
+      { desc = "Quit Compile (Interrupt)" })
+
+  end
+}
diff --git a/config/nvim/lua/plugins/image.lua b/config/nvim/lua/plugins/image.lua
new file mode 100644
index 0000000..1ab0f9a
--- /dev/null
+++ b/config/nvim/lua/plugins/image.lua
@@ -0,0 +1,20 @@
+return {
+  '3rd/image.nvim',
+  config = function()
+    require("image").setup({
+      backend = "sixel",
+      processor = "magick_cli",
+      integrations = {
+        markdown = {
+          enabled = true,
+          only_render_image_at_cursor = true,
+          only_render_image_at_cursor_mode = "popup", -- or "inline"
+          floating_windows = true,                    -- if true, images will be rendered in floating markdown windows
+        },
+      },
+      window_overlap_clear_ft_ignore = { "cmp_menu", "cmp_docs" },
+      editor_only_render_when_focused = true, -- auto show/hide images when the editor gains/looses focus
+    })
+  end,
+  build = false,
+}
diff --git a/config/nvim/lua/plugins/lazygit.lua b/config/nvim/lua/plugins/lazygit.lua
new file mode 100644
index 0000000..f9ddc84
--- /dev/null
+++ b/config/nvim/lua/plugins/lazygit.lua
@@ -0,0 +1,20 @@
+return {
+    "kdheepak/lazygit.nvim",
+    lazy = true,
+    cmd = {
+        "LazyGit",
+        "LazyGitConfig",
+        "LazyGitCurrentFile",
+        "LazyGitFilter",
+        "LazyGitFilterCurrentFile",
+    },
+    -- optional for floating window border decoration
+    dependencies = {
+        "nvim-lua/plenary.nvim",
+    },
+    -- setting the keybinding for LazyGit with 'keys' is recommended in
+    -- order to load the plugin when the command is run for the first time
+    keys = {
+        { "<leader>g", "<cmd>LazyGit<cr>", desc = "LazyGit" }
+    }
+}
diff --git a/config/nvim/lua/plugins/lualine.lua b/config/nvim/lua/plugins/lualine.lua
new file mode 100644
index 0000000..5412061
--- /dev/null
+++ b/config/nvim/lua/plugins/lualine.lua
@@ -0,0 +1,38 @@
+return {
+  "nvim-lualine/lualine.nvim",
+  dependencies = { 'nvim-tree/nvim-web-devicons' },
+  config = function()
+    require("lualine").setup({
+      options = {
+        icons_enabled = true,
+        component_separators = { left = '|', right = '|'},
+        section_separators = { left = '', right = ''},
+        theme = {
+          normal = {
+            a = { bg = '#000000' },
+            b = { bg = '#000000' },
+            c = { bg = '#000000' },
+          },
+          inactive = {
+            a = { bg = '#000000' },
+            b = { bg = '#000000' },
+            c = { bg = '#000000' },
+          }
+        },
+      },
+      sections = {
+        lualine_a = {"mode", {
+          "filetype",
+          icon_only = true,
+          separator = "",
+          padding = { right = 0, left = 1 },
+        }, "filename" },
+        lualine_b = {},
+        lualine_c = {},
+        lualine_x = {"diagnostics"},
+        lualine_y = {},
+        lualine_z = {}
+      }
+    })
+  end,
+}
diff --git a/config/nvim/lua/plugins/oil.lua b/config/nvim/lua/plugins/oil.lua
new file mode 100644
index 0000000..3eb396d
--- /dev/null
+++ b/config/nvim/lua/plugins/oil.lua
@@ -0,0 +1,28 @@
+return {
+  'stevearc/oil.nvim',
+  dependencies = { "nvim-tree/nvim-web-devicons" },
+  config = function()
+
+    function _G.get_oil_winbar()
+      local bufnr = vim.api.nvim_win_get_buf(vim.g.statusline_winid)
+      local dir = require("oil").get_current_dir(bufnr)
+      if dir then
+        return vim.fn.fnamemodify(dir, ":~")
+      else
+        -- If there is no current directory (e.g. over ssh), just show the buffer name
+        return vim.api.nvim_buf_get_name(0)
+      end
+    end
+
+    require('oil').setup({
+      win_options = {
+        winbar = "%!v:lua.get_oil_winbar()",
+      },
+      view_options = {
+        show_hidden = true
+      }
+    })
+    vim.keymap.set('n', '-', '<CMD>Oil<CR>', {desc = "Open Dir in Oil"})
+  end,
+  lazy = false,
+}
diff --git a/config/nvim/lua/plugins/rainbow-delimiters.lua b/config/nvim/lua/plugins/rainbow-delimiters.lua
new file mode 100644
index 0000000..9fe4a06
--- /dev/null
+++ b/config/nvim/lua/plugins/rainbow-delimiters.lua
@@ -0,0 +1,6 @@
+return {
+  "hiphish/rainbow-delimiters.nvim",
+  config =  function()
+    require('rainbow-delimiters.setup').setup({})
+  end,
+}
diff --git a/config/nvim/lua/plugins/remember.lua b/config/nvim/lua/plugins/remember.lua
new file mode 100644
index 0000000..911d9c6
--- /dev/null
+++ b/config/nvim/lua/plugins/remember.lua
@@ -0,0 +1,7 @@
+return {
+  'vladdoster/remember.nvim',
+  config = function()
+    require'remember'.setup({})
+  end
+}
+
diff --git a/config/nvim/lua/plugins/render-markdown.lua b/config/nvim/lua/plugins/render-markdown.lua
new file mode 100644
index 0000000..b87f8a1
--- /dev/null
+++ b/config/nvim/lua/plugins/render-markdown.lua
@@ -0,0 +1,114 @@
+return {
+  'MeanderingProgrammer/render-markdown.nvim',
+  dependencies = { 'nvim-treesitter/nvim-treesitter', 'nvim-tree/nvim-web-devicons' },
+  config = function()
+    require('render-markdown').setup({
+      link = {
+        enabled = true,
+        render_modes = false,
+        footnote = {
+          enabled = true,
+          superscript = true,
+          prefix = '',
+          suffix = '',
+        },
+        image = '󰥶 ',
+        email = '󰀓 ',
+        hyperlink = '󰌹 ',
+        highlight = 'RenderMarkdownLink',
+        wiki = {
+          icon = '󱗖 ',
+          body = function()
+            return nil
+          end,
+          highlight = 'RenderMarkdownWikiLink',
+        },
+        custom = {
+          web           = { pattern = '^http', icon = '󰖟 ' },
+          github        = { pattern = 'github%.com', icon = '󰊤 ' },
+          stackoverflow = { pattern = 'stackoverflow%.com', icon = '󰓌 ' },
+          wikipedia     = { pattern = 'wikipedia%.org', icon = '󰖬 ' },
+          youtube       = { pattern = 'youtube%.com', icon = '󰗃 ' },
+          reddit        = { pattern = 'reddit%.com', icon = '󰑍 ' },
+          old_reddit    = { pattern = 'old.reddit%.com', icon = '󰑍 ' },
+          gvc           = { pattern = 'git%.venomade%.com', icon = '󰊢 ' },
+          catechism     = { pattern = 'ccc%.directory', icon = '󰅄 ' },
+          bible         = { pattern = 'biblenow%.net', icon = '󰂢 ' },
+          luarocks      = { pattern = 'luarocks%.org', icon = '󰢱 ' },
+        },
+      },
+      callout = {
+        note      = { raw = '[!NOTE]', rendered = '󰋽 Note', highlight = 'RenderMarkdownInfo' },
+        tip       = { raw = '[!TIP]', rendered = '󰌶 Tip', highlight = 'RenderMarkdownSuccess' },
+        important = { raw = '[!IMPORTANT]', rendered = '󰅾 Important', highlight = 'RenderMarkdownHint' },
+        warning   = { raw = '[!WARNING]', rendered = '󰀪 Warning', highlight = 'RenderMarkdownWarn' },
+        caution   = { raw = '[!CAUTION]', rendered = '󰳦 Caution', highlight = 'RenderMarkdownError' },
+        abstract  = { raw = '[!ABSTRACT]', rendered = '󰨸 Abstract', highlight = 'RenderMarkdownInfo' },
+        summary   = { raw = '[!SUMMARY]', rendered = '󰨸 Summary', highlight = 'RenderMarkdownInfo' },
+        tldr      = { raw = '[!TLDR]', rendered = '󰨸 Tldr', highlight = 'RenderMarkdownInfo' },
+        info      = { raw = '[!INFO]', rendered = '󰋽 Info', highlight = 'RenderMarkdownInfo' },
+        todo      = { raw = '[!TODO]', rendered = '󰗡 Todo', highlight = 'RenderMarkdownInfo' },
+        hint      = { raw = '[!HINT]', rendered = '󰌶 Hint', highlight = 'RenderMarkdownSuccess' },
+        success   = { raw = '[!SUCCESS]', rendered = '󰄬 Success', highlight = 'RenderMarkdownSuccess' },
+        check     = { raw = '[!CHECK]', rendered = '󰄬 Check', highlight = 'RenderMarkdownSuccess' },
+        done      = { raw = '[!DONE]', rendered = '󰄬 Done', highlight = 'RenderMarkdownSuccess' },
+        question  = { raw = '[!QUESTION]', rendered = '󰘥 Question', highlight = 'RenderMarkdownWarn' },
+        help      = { raw = '[!HELP]', rendered = '󰘥 Help', highlight = 'RenderMarkdownWarn' },
+        faq       = { raw = '[!FAQ]', rendered = '󰘥 Faq', highlight = 'RenderMarkdownWarn' },
+        attention = { raw = '[!ATTENTION]', rendered = '󰀪 Attention', highlight = 'RenderMarkdownWarn' },
+        failure   = { raw = '[!FAILURE]', rendered = '󰅖 Failure', highlight = 'RenderMarkdownError' },
+        fail      = { raw = '[!FAIL]', rendered = '󰅖 Fail', highlight = 'RenderMarkdownError' },
+        missing   = { raw = '[!MISSING]', rendered = '󰅖 Missing', highlight = 'RenderMarkdownError' },
+        danger    = { raw = '[!DANGER]', rendered = '󱐌 Danger', highlight = 'RenderMarkdownError' },
+        error     = { raw = '[!ERROR]', rendered = '󱐌 Error', highlight = 'RenderMarkdownError' },
+        bug       = { raw = '[!BUG]', rendered = '󰨰 Bug', highlight = 'RenderMarkdownError' },
+        example   = { raw = '[!EXAMPLE]', rendered = '󰉹 Example', highlight = 'RenderMarkdownHint' },
+        quote     = { raw = '[!QUOTE]', rendered = '󱆨 Quote', highlight = 'RenderMarkdownQuote' },
+        cite      = { raw = '[!CITE]', rendered = '󱆨 Cite', highlight = 'RenderMarkdownQuote' },
+      },
+      checkbox = {
+        enabled = true,
+        render_modes = false,
+        bullet = false,
+        right_pad = 1,
+        unchecked = {
+          icon = '󰄱 ',
+          highlight = 'RenderMarkdownUnchecked',
+          scope_highlight = nil,
+        },
+        checked = {
+          icon = '󰱒 ',
+          highlight = 'RenderMarkdownChecked',
+          scope_highlight = nil,
+        },
+        custom = {
+          todo = { raw = '[-]', rendered = '󰥔 ', highlight = 'RenderMarkdownTodo', scope_highlight = nil },
+        },
+      },
+      bullet = {
+        enabled = true,
+        render_modes = false,
+        icons = { '●', '○', '◆', '◇' },
+        ordered_icons = function(ctx)
+          local value = vim.trim(ctx.value)
+          local index = tonumber(value:sub(1, #value - 1))
+          return ('%d.'):format(index > 1 and index or ctx.index)
+        end,
+        left_pad = 0,
+        right_pad = 0,
+        highlight = 'RenderMarkdownBullet',
+        scope_highlight = {},
+      },
+      quote = { icon = '▋' },
+      anti_conceal = {
+        enabled = false,
+      },
+      heading = {
+        icons = { '󰫎 ', '󰫎 ', '󰫎 ', '󰫎 ', '󰫎 ', '󰫎 ' },
+        backgrounds = {},
+      },
+      nested = false,
+    })
+  end,
+}
+
diff --git a/config/nvim/lua/plugins/telescope.lua b/config/nvim/lua/plugins/telescope.lua
new file mode 100644
index 0000000..7cfe5c5
--- /dev/null
+++ b/config/nvim/lua/plugins/telescope.lua
@@ -0,0 +1,40 @@
+return {
+  "nvim-telescope/telescope.nvim",
+  dependencies = { "nvim-lua/plenary.nvim" },
+  config = function()
+    require("telescope").setup({
+      -- defaults = {
+      --   borderchars = { "─", "│", "─", "│", "┌", "┐", "┘", "└" },
+      -- },
+    })
+
+    local tscope = require('telescope.builtin')
+    vim.keymap.set("n", "<leader>ff", function()
+      local cwd
+      if vim.bo.filetype == "oil" then
+        cwd = require("oil").get_current_dir()
+      else
+        cwd = vim.fn.expand("%:p:h")
+      end
+      tscope.find_files({ cwd = cwd })
+    end, { desc = "Find File" })
+
+    vim.keymap.set("n", "<leader>fp", function()
+      tscope.find_files({
+        cwd = vim.loop.cwd(),
+      })
+    end, { desc = "Find Project File" })
+    vim.keymap.set('n', '<leader>bb', tscope.buffers,
+      { desc = "Find Buffer" })
+    vim.keymap.set('n', '<leader>fh', tscope.help_tags,
+      { desc = "Find Help" })
+    vim.keymap.set('n', '<leader>fg', tscope.live_grep,
+      { desc = "Find by Grep" })
+    vim.keymap.set('n', '<leader>fr', tscope.oldfiles,
+      { desc = "Find Recent Files" })
+    vim.keymap.set('n', '<leader>lw', tscope.diagnostics,
+      { desc = "Search Diagnostics" })
+    vim.keymap.set('n', '<leader>lg', tscope.lsp_references,
+      { desc = "Search References" })
+  end,
+}
diff --git a/config/nvim/lua/plugins/todo-comments.lua b/config/nvim/lua/plugins/todo-comments.lua
new file mode 100644
index 0000000..69f907e
--- /dev/null
+++ b/config/nvim/lua/plugins/todo-comments.lua
@@ -0,0 +1,14 @@
+return {
+  "folke/todo-comments.nvim",
+  dependencies = { "nvim-lua/plenary.nvim" },
+  opts = {
+
+  },
+  config = function()
+    require('todo-comments').setup({})
+    vim.keymap.set('n', '<leader>ft', function()
+        vim.cmd('TodoTelescope')
+      end,
+      { desc = "Find Buffer" })
+  end,
+}
diff --git a/config/nvim/lua/plugins/ui.lua b/config/nvim/lua/plugins/ui.lua
new file mode 100644
index 0000000..5df6f44
--- /dev/null
+++ b/config/nvim/lua/plugins/ui.lua
@@ -0,0 +1,27 @@
+return {
+  "OXY2DEV/ui.nvim",
+  lazy = false,
+  config = function()
+    require("ui").setup({
+      cmdline = {
+        enable = true,
+        row_offset = 0,
+      },
+      messages = {
+        enable = true,
+      },
+      popupmenu = {
+        enable = false,
+      },
+    });
+
+    local spec = require("ui.spec")
+
+    spec.config.message.showcmd.modifier = function(_, lines)
+      return {
+        lines = { "" },
+        extmarks = { {} },
+      }
+    end
+  end,
+};
diff --git a/config/nvim/lua/plugins/which-key.lua b/config/nvim/lua/plugins/which-key.lua
new file mode 100644
index 0000000..c068002
--- /dev/null
+++ b/config/nvim/lua/plugins/which-key.lua
@@ -0,0 +1,17 @@
+return {
+  'folke/which-key.nvim',
+  event = 'VeryLazy',
+  opts = {
+    icons = { mappings = false },
+    delay = 1000
+  },
+  keys = {
+    {
+      '<leader>?',
+      function()
+        require('which-key').show({ global = false })
+      end,
+      desc = 'Buffer Local Keymaps',
+    },
+  },
+}
diff --git a/config/nvim/lua/plugins/zk.lua b/config/nvim/lua/plugins/zk.lua
new file mode 100644
index 0000000..ce2e11a
--- /dev/null
+++ b/config/nvim/lua/plugins/zk.lua
@@ -0,0 +1,26 @@
+return {
+  "zk-org/zk-nvim",
+  lazy = false,
+  config = function()
+    require("zk").setup({
+      picker = "telescope",
+      lsp = {
+        config = {
+          name = "zk",
+          cmd = { "zk", "lsp" },
+          filetypes = { "markdown" },
+        },
+        auto_attach = {
+          enabled = true,
+        },
+      },
+    })
+  end,
+  keys = {
+    { "<leader>zz", "<cmd>ZkNotes<cr>", desc = "Notes" },
+    { "<leader>zl", "<cmd>ZkLinks<cr>", desc = "Links" },
+    { "<leader>zb", "<cmd>ZkBacklinks<cr>", desc = "Backlinks" },
+    { "<leader>zi", "<cmd>ZkInsertLink<cr>", desc = "Insert Link" },
+    { "<leader>zd", "<cmd>ZkCd<cr>", desc = "Enter Directory" },
+  }
+}
diff --git a/config/nvim/lua/scripts/diagnostics.lua b/config/nvim/lua/scripts/diagnostics.lua
new file mode 100644
index 0000000..0855af1
--- /dev/null
+++ b/config/nvim/lua/scripts/diagnostics.lua
@@ -0,0 +1,760 @@
+--[[
+*Fancy* diagnostics for `Neovim`.
+
+## Usage
+
+```lua
+require("diagnostics").setup();
+```
+
+You can then hit `D` to show diagnostics for the current line.
+
+## Highlight groups
+
+This script uses highlight groups provided by [highlights.lua](https://github.com/OXY2DEV/nvim/blob/main/lua/scripts/highlights.lua).
+
+The used groups are,
+- `FancyDiagnostic`, Default group for diagnostics.
+- `FancyDiagnosticIcon`, Default group for the icons of diagnostics.
+- `FancyDiagnosticInfo`, Group for `information` diagnostics.
+- `FancyDiagnosticInfoIcon`, Group for the icons of `information` diagnostics.
+- `FancyDiagnosticHint`, Group for `hint` diagnostics.
+- `FancyDiagnosticHintIcon`, Group for the icons of `hint` diagnostics.
+- `FancyDiagnosticWarn`, Group for `warning` diagnostics.
+- `FancyDiagnosticWarnIcon`, Group for the icons of `warning` diagnostics.
+- `FancyDiagnosticError`, Group for `error` diagnostics.
+- `FancyDiagnosticErrorIcon`, Group for the icons of `error` diagnostics.
+
+## Dependencies
+
+- [beacon.lua](https://github.com/OXY2DEV/nvim/blob/main/lua/scripts/beacon.lua), For highlighting cursor.
+- [highlights.lua](https://github.com/OXY2DEV/nvim/blob/main/lua/scripts/highlights.lua), For highlight groups.
+- [types/diagnostics.lua](https://github.com/OXY2DEV/nvim/blob/main/lua/scripts/types/diagnostics.lua), For type definition.
+
+## Configuration
+
+Use `setup()` for setting configuration. See [types/diagnostics.lua#diagnostics.config](https://github.com/OXY2DEV/nvim/blob/main/lua/scripts/types/diagnostics.lua#L3-L19) for the type definition.
+]]
+local diagnostics = {};
+
+---@param level string
+---@param icon string
+---@return table
+local function handle_diagnostic_level (level, icon)
+	---|fS
+
+	local default = string.format("FancyDiagnostic%s", "Default");
+	local default_icon_hl = string.format("FancyDiagnostic%sIcon", "Default");
+
+	local bg = string.format("FancyDiagnostic%s", level);
+	local icon_hl = string.format("FancyDiagnostic%sIcon", level);
+
+	return {
+		width = 3,
+
+		line_hl_group = function (_, current)
+			return current and bg or default;
+		end,
+		icon = function (_, current)
+			return {
+				{ "▌", current and icon_hl or default_icon_hl },
+				{ icon, current and icon_hl or default_icon_hl },
+				{ " ", current and bg or default },
+			}
+		end,
+		padding = function (_, current)
+			return {
+				{ "▌", current and icon_hl or default_icon_hl },
+				{ "  ", current and icon_hl or default_icon_hl },
+				{ " ", current and bg or default },
+			}
+		end
+	};
+
+	---|fE
+end
+
+---@class diagnostics.config
+diagnostics.config = {
+	---|fS
+
+	keymap = "D",
+
+	decoration_width = 4,
+	width = function (items)
+		local max = math.floor(vim.o.columns * 0.4);
+		local use = 1
+
+		for _, item in ipairs(items) do
+			local width = vim.fn.strdisplaywidth(item.message or "");
+
+			use = math.min(
+				math.max(width, 0),
+				max
+			);
+		end
+
+		return use;
+	end,
+
+	max_height = function ()
+		return math.floor(vim.o.lines * 0.4);
+	end,
+
+	beacon = {
+		---|fS
+
+		default = {
+			from = function ()
+				local fg = vim.api.nvim_get_hl(0, { name = "@comment", link = false }).fg;
+				return fg and string.format("#%06x", fg) or "#9399b2";
+			end,
+			to = function ()
+				local bg = vim.api.nvim_get_hl(0, { name = vim.o.statusline and "Cursorline" or "Normal", link = false }).bg;
+				return bg and string.format("#%06x", bg) or "#1e1e2e";
+			end,
+
+			steps = 10,
+			interval = 100,
+		},
+
+		[vim.diagnostic.severity.INFO] = {
+			from = function ()
+				local fg = vim.api.nvim_get_hl(0, { name = "FancyDiagnosticInfoIcon", link = false }).fg;
+				return fg and string.format("#%06x", fg) or "#94e2d5";
+			end
+		},
+		[vim.diagnostic.severity.HINT] = {
+			from = function ()
+				local fg = vim.api.nvim_get_hl(0, { name = "FancyDiagnosticHintIcon", link = false }).fg;
+				return fg and string.format("#%06x", fg) or "#94e2d5";
+			end
+		},
+		[vim.diagnostic.severity.WARN] = {
+			from = function ()
+				local fg = vim.api.nvim_get_hl(0, { name = "FancyDiagnosticWarnIcon", link = false }).fg;
+				return fg and string.format("#%06x", fg) or "#f9e2af";
+			end
+		},
+		[vim.diagnostic.severity.ERROR] = {
+			from = function ()
+				local fg = vim.api.nvim_get_hl(0, { name = "FancyDiagnosticErrorIcon", link = false }).fg;
+				return fg and string.format("#%06x", fg) or "#f38ba8";
+			end
+		},
+
+		---|fE
+	},
+
+	decorations = {
+		---|fS
+
+		[vim.diagnostic.severity.INFO] = handle_diagnostic_level("Info", "󰀨 "),
+		[vim.diagnostic.severity.HINT] = handle_diagnostic_level("Hint", "󰁨 "),
+		[vim.diagnostic.severity.WARN] = handle_diagnostic_level("Warn", " "),
+		[vim.diagnostic.severity.ERROR] = handle_diagnostic_level("Error", "󰅙 "),
+
+		---|fE
+	},
+
+	---|fE
+};
+
+--[[ Evaluates `val`. ]]
+---@param val any
+---@param ... any
+---@return any
+local function eval(val, ...)
+	---|fS
+
+	if type(val) ~= "function" then
+		return val;
+	else
+		local can_call, new_val = pcall(val, ...);
+
+		if can_call and new_val ~= nil then
+			return new_val;
+		end
+	end
+
+	---|fE
+end
+
+--[[ Gets diagnostic item `decoration`. ]]
+---@param level vim.diagnostic.Severity | "default" Diagnostic severity.
+---@param ... any Extra arguments to be used for value evaluation.
+---@return diagnostics.decorations__static decoration Static version of the diagnostic item's decoration.
+local function get_decorations (level, ...)
+	---|fS
+
+	local output = {};
+
+	for k, v in pairs(diagnostics.config.decorations[level]) do
+		output[k] = eval(v, ...);
+	end
+
+	return output;
+
+	---|fE
+end
+
+--[[ Gets `beacon` configuration. ]]
+---@param level? vim.diagnostic.Severity | "default" Diagnostic level.
+---@param ... any Extra arguments to be used for value evaluation.
+---@return table?
+local function get_beacon_config (level, ...)
+	---|fS
+
+	if not level or not diagnostics.config.beacon then
+		return;
+	end
+
+	local output = {};
+
+	for k, v in pairs(diagnostics.config.beacon[level]) do
+		output[k] = eval(v, ...);
+	end
+
+	return output;
+
+	---|fE
+end
+
+--[[ Turns given **virtual text** into **format string** for the statusline. ]]
+---@param virt_text diagnostics.decoration_fragment[] Virtual text.
+---@return string sign Virtual text as a sign(use in `statuscolumn`, `statusline`, `tabline` or `winbar`)
+local function virt_text_to_sign (virt_text)
+	---|fS
+
+	local output = "";
+
+	for _, item in ipairs(virt_text) do
+		if type(item[2]) == "string" then
+			output = output .. string.format("%%#%s#%s", item[2], item[1]) .. "%#Normal#";
+		else
+			output = output .. item[1];
+		end
+	end
+
+	return output;
+
+	---|fE
+end
+
+------------------------------------------------------------------------------
+
+---@type integer Decoration namespace.
+diagnostics.ns = vim.api.nvim_create_namespace("fancy_diagnostics");
+
+---@type integer, integer Diagnostics buffer & window.
+diagnostics.buffer, diagnostics.window = nil, nil;
+
+--[[ Which *quadrant* the diagnostics window is currently using? ]]
+---@type
+---| "top_left"
+---| "top_right"
+---| "bottom_left"
+---| "bottom_right"
+---| "center"
+diagnostics.quad = nil;
+
+---@type diagnostics.signs.entry[]
+diagnostics.sign_data = {};
+
+--[[ Prepares the buffer for the diagnostics window. ]]
+diagnostics.__prepare = function ()
+	---|fS
+
+	if not diagnostics.buffer or not vim.api.nvim_buf_is_valid(diagnostics.buffer) then
+		diagnostics.buffer = vim.api.nvim_create_buf(false, true);
+	end
+
+	---|fE
+end
+
+--[[ Updates the *quadrant* which is being used by the diagnostics window. ]]
+---@param quad
+---| "top_left"
+---| "top_right"
+---| "bottom_left"
+---| "bottom_right"
+---| "center"
+---@param state boolean
+diagnostics.update_quad = function (quad, state)
+	---|fS
+
+	if not _G.__used_quads then
+		-- NIT: Should this set a default state value?
+		return;
+	end
+
+	_G.__used_quads[quad] = state;
+
+	---|fE
+end
+
+--[[ Returns `{opts}` for `nvim_open_win()` based on the parameters. ]]
+---@param window integer Window ID.
+---@param w integer Window width.
+---@param h integer Window height.
+---@return string | string[] border Window border.
+---@return "editor" | "cursor" relative Relative position for floating window.
+---@return "NE" | "NW" | "SE" | "SW" anchor Anchor position.
+---@return integer row Window position in Y-axis.
+---@return integer col Window position in X-axis.
+diagnostics.__win_args = function (window, w, h)
+	---|fS
+
+	---@type [ integer, integer ]
+	local cursor = vim.api.nvim_win_get_cursor(window);
+	---@type table<string, integer>
+	local screenpos = vim.fn.screenpos(window, cursor[1], cursor[2]);
+
+	local screen_width = vim.o.columns - 2;
+	local screen_height = vim.o.lines - vim.o.cmdheight - 2;
+
+	local quad_pref = { "bottom_right", "top_right", "bottom_left", "top_left" };
+	local quads = {
+		---|fS
+
+		center = {
+			relative = "editor",
+			anchor = "NW",
+
+			row = math.ceil((vim.o.lines - h) / 2),
+			col = math.ceil((vim.o.columns - w) / 2),
+			border = "rounded"
+		},
+
+		top_left = {
+			condition = function ()
+				if h >= screenpos.row then
+					-- Not enough space above.
+					return false;
+				elseif screenpos.curscol <= w then
+					-- Not enough space before.
+					return false;
+				end
+
+				return true;
+			end,
+
+			relative = "cursor",
+			border = { "╭", "─", "╮", "│", "┤", "─", "╰", "│" },
+			anchor = "SE",
+			row = 0,
+			col = 1
+		},
+		top_right = {
+			condition = function ()
+				if h >= screenpos.row then
+					-- Not enough space above.
+					return false;
+				elseif screenpos.curscol + w > screen_width then
+					-- Not enough space after.
+					return false;
+				end
+
+				return true;
+			end,
+
+			relative = "cursor",
+			border = { "╭", "─", "╮", "│", "╯", "─", "├", "│" },
+			anchor = "SW",
+			row = 0,
+			col = 0
+		},
+
+		bottom_left = {
+			condition = function ()
+				if screenpos.row + h > screen_height then
+					-- Not enough space below.
+					return false;
+				elseif screenpos.curscol <= w then
+					-- Not enough space before.
+					return false;
+				end
+
+				return true;
+			end,
+
+			relative = "cursor",
+			border = { "╭", "─", "┤", "│", "╯", "─", "╰", "│" },
+			anchor = "NE",
+			row = 1,
+			col = 1
+		},
+		bottom_right = {
+			condition = function ()
+				if screenpos.row + h > screen_height then
+					-- Not enough space below.
+					return false;
+				elseif screenpos.curscol + w > screen_width then
+					-- Nor enough space after.
+					return false;
+				end
+
+				return true;
+			end,
+
+			relative = "cursor",
+			border = { "├", "─", "╮", "│", "╯", "─", "╰", "│" },
+			anchor = "NW",
+			row = 1,
+			col = 0
+		}
+
+		---|fE
+	};
+
+	for _, pref in ipairs(quad_pref) do
+		if _G.__used_quads and _G.__used_quads[pref] == true then
+			goto continue;
+		elseif not quads[pref] then
+			goto continue;
+		end
+
+		local quad = quads[pref];
+		local ran_cond, cond = pcall(quad.condition);
+
+		if ran_cond and cond then
+			diagnostics.quad = pref;
+			return quad.border, quad.cursor, quad.anchor, quad.row, quad.col;
+		end
+
+		::continue::
+	end
+
+	diagnostics.quad = "center";
+
+	local fallback = quads.center;
+	return fallback.border, fallback.cursor, fallback.anchor, fallback.row, fallback.col;
+
+	---|fE
+end
+
+------------------------------------------------------------------------------
+
+--[[ Closes diagnostics window. ]]
+diagnostics.close = function ()
+	---|fS
+
+	if diagnostics.window and vim.api.nvim_win_is_valid(diagnostics.window) then
+		pcall(vim.api.nvim_win_close, diagnostics.window, true);
+		diagnostics.window = nil;
+
+		if diagnostics.quad then
+			diagnostics.update_quad(diagnostics.quad, false);
+			diagnostics.quad = nil;
+		end
+	end
+
+	---|fE
+end
+
+---@type beacon.instance Beacon instance to use for the Cursor.
+diagnostics.__beacon = nil;
+
+--[[ External integrations. ]]
+---@param window integer Window Id.
+---@param beacon_config beacon.instance.config Configuration for `beacon`.
+diagnostics.__integration = function (window, beacon_config)
+	---|fS
+
+	-- Markdown rendering.
+	if package.loaded["markview"] then
+		package.loaded["markview"].render(diagnostics.buffer, {
+			enable = true,
+			hybrid_mode = false
+		}, {
+			markdown_inline = {
+				inline_codes = {
+					virtual = true
+				}
+			}
+		});
+	end
+
+	-- Beacon.
+	if package.loaded["scripts.beacon"] then
+		if not diagnostics.__beacon then
+			diagnostics.__beacon = require("scripts.beacon").new(window, beacon_config);
+		else
+			diagnostics.__beacon:update(window, beacon_config);
+		end
+
+		diagnostics.__beacon:start();
+	end
+
+	---|fE
+end
+
+--- Custom statuscolumn.
+---@return string
+_G.fancy_diagnostics_statuscolumn = function ()
+	---|fS
+
+	if vim.tbl_isempty(diagnostics.sign_data) then
+		return "";
+	end
+
+	local lnum = vim.v.lnum;
+
+	local data = diagnostics.sign_data[lnum];
+	local start = data.start_row;
+
+	if not data then
+		return "";
+	elseif vim.v.virtnum == 0 and start == lnum then
+		return virt_text_to_sign(data.icon);
+	else
+		return virt_text_to_sign(data.padding or data.icon);
+	end
+
+	---|fE
+end
+
+--- Hover function for diagnostics.
+---@param window integer
+diagnostics.hover = function (window)
+	---|fS
+
+	window = window or vim.api.nvim_get_current_win();
+
+	---@type integer Source buffer.
+	local buffer = vim.api.nvim_win_get_buf(window);
+	---@type [ integer, integer ]
+	local cursor = vim.api.nvim_win_get_cursor(window);
+
+	local items = vim.diagnostic.get(buffer, { lnum = cursor[1] - 1 });
+
+	---@type boolean Is the window already open?
+	local already_open = diagnostics.window and vim.api.nvim_win_is_valid(diagnostics.window);
+
+	if #items == 0 then
+		-- No diagnostics available.
+		diagnostics.close();
+		vim.api.nvim_echo({
+			{ " 󰾕 diagnostics.lua ", "DiagnosticVirtualTextWarn" },
+			{ ": ", "@comment" },
+			{ "No diagnostic under cursor", "@comment" },
+		}, true, {});
+		return;
+	elseif already_open then
+		vim.api.nvim_set_current_win(diagnostics.window);
+		return;
+	end
+
+	if diagnostics.quad then
+		-- If the old window's quadrant wasn't freed, we free it here.
+		diagnostics.update_quad(diagnostics.quad, false)
+	end
+
+	diagnostics.__prepare();
+	vim.bo[diagnostics.buffer].ft = "markdown";
+
+	-- Clear old decorations.
+	vim.api.nvim_buf_clear_namespace(diagnostics.buffer, diagnostics.ns, 0, -1);
+	vim.api.nvim_buf_set_lines(diagnostics.buffer, 0, -1, false, {});
+
+	local W = eval(diagnostics.config.width, items);
+	local D = eval(diagnostics.config.decoration_width, items);
+
+	---@type table Configuration used for calculating window height.
+	local height_calc_config = {
+		relative = "editor",
+
+		row = 0, col = 1,
+		width = W - D, height = 2,
+
+		style = "minimal",
+		hide = true,
+	};
+
+	if not diagnostics.window or not vim.api.nvim_win_is_valid(diagnostics.window) then
+		diagnostics.window = vim.api.nvim_open_win(diagnostics.buffer, false, height_calc_config);
+	else
+		vim.api.nvim_win_set_config(diagnostics.window, height_calc_config);
+	end
+
+	vim.wo[diagnostics.window].wrap = true;
+	vim.wo[diagnostics.window].linebreak = true;
+	vim.wo[diagnostics.window].breakindent = true;
+
+	local diagnostic_lines = 0;
+
+	---@type integer Line where the cursor should be placed.
+	local cursor_y = 1;
+	local ranges = {};
+
+	local start_row = 1;
+	---@type vim.diagnostic.Severity | nil
+	local level;
+
+	diagnostics.sign_data = {};
+
+	for i, item in ipairs(items) do
+		---|fS
+
+		local from = i == 1 and 0 or -1;
+		local lines = vim.split(item.message, "\n", { trimempty = true })
+
+		local start = item.col;
+		local stop = item.end_col;
+
+		local current = false;
+
+		if cursor[2] >= start and cursor[2] <= stop then
+			cursor_y = i;
+			current = true;
+		end
+
+		vim.api.nvim_buf_set_lines(diagnostics.buffer, from, -1, false, lines);
+		local decorations = get_decorations(item.severity, item, current);
+
+		ranges[i] = { item.lnum, item.col };
+
+		vim.api.nvim_buf_set_extmark(diagnostics.buffer, diagnostics.ns, diagnostic_lines, 0, {
+			end_row = diagnostic_lines + #lines,
+			line_hl_group = decorations.line_hl_group,
+		});
+
+		diagnostic_lines = diagnostic_lines + #lines;
+
+		if current == true and ( not level or item.severity < level ) then
+			level = item.severity;
+		end
+
+		for _ = 1, #lines do
+			-- Signs
+			table.insert(diagnostics.sign_data, {
+				start_row = start_row,
+
+				current = current,
+				width = decorations.width,
+
+				icon = decorations.icon,
+				line_hl_group = decorations.line_hl_group,
+				padding = decorations.padding,
+			});
+		end
+
+		start_row = start_row + #lines;
+
+		---|fE
+	end
+
+	local beacon_config = vim.tbl_extend("force",
+		get_beacon_config("default", {}, true),
+		get_beacon_config(level, {}, true) or {}
+	);
+
+	local H = vim.api.nvim_win_text_height(diagnostics.window, { start_row = 0, end_row = -1 }).all;
+
+	local _, relative, anchor, row, col = diagnostics.__win_args(window, W, H);
+
+	local win_config = {
+		relative = relative or "cursor",
+
+		row = row or 0, col = col or 0,
+		width = W, height = H,
+
+		anchor = anchor,
+		border = "none",
+
+		style = "minimal",
+		hide = false,
+	};
+
+	vim.api.nvim_win_set_config(diagnostics.window, win_config);
+	vim.api.nvim_win_set_cursor(diagnostics.window, { cursor_y, 0 });
+
+	-- Update quadrant state.
+	diagnostics.update_quad(diagnostics.quad, true);
+
+	-- Set necessary options.
+	vim.wo[diagnostics.window].signcolumn = "no";
+	vim.wo[diagnostics.window].statuscolumn = "%!v:lua.fancy_diagnostics_statuscolumn()";
+
+	vim.wo[diagnostics.window].conceallevel = 3;
+	vim.wo[diagnostics.window].concealcursor = "ncv";
+
+	vim.wo[diagnostics.window].winhl = "FloatBorder:@comment,Normal:Normal";
+
+	diagnostics.__integration(window, beacon_config);
+
+	---|fS
+
+
+	vim.api.nvim_buf_set_keymap(diagnostics.buffer, "n", "<CR>", "", {
+		desc = "Go to diagnostic location",
+		callback = function ()
+			---|fS
+
+			---@type [ integer, integer ] Selected item.
+			local _cursor = vim.api.nvim_win_get_cursor(diagnostics.window);
+			---@type [ integer, integer ]? Diagnostic location.
+			local location = ranges[_cursor[1]];
+
+			if location then
+				location[1] = location[1] + 1;
+
+				vim.api.nvim_win_set_cursor(window, location);
+				vim.api.nvim_set_current_win(window);
+
+				diagnostics.close();
+			end
+
+			---|fE
+		end
+	});
+
+	vim.api.nvim_buf_set_keymap(diagnostics.buffer, "n", "q", "", {
+		desc = "Exit diagnostics window",
+		callback = function ()
+			pcall(vim.api.nvim_set_current_win, window);
+			diagnostics.close();
+		end
+	});
+
+	---|fE
+
+	---|fE
+end
+
+--- Configuration for the diagnostics module.
+---@param config? diagnostics.config
+diagnostics.setup = function (config)
+	---|fS
+
+	if type(config) == "table" then
+		diagnostics.config = vim.tbl_extend("force", diagnostics.config, config);
+	end
+
+	if diagnostics.config.keymap then
+		vim.api.nvim_set_keymap("n", diagnostics.config.keymap, "", {
+			callback = diagnostics.hover
+		});
+	end
+
+	vim.api.nvim_create_autocmd({
+		"CursorMoved", "CursorMovedI"
+	}, {
+		callback = function ()
+			local win = vim.api.nvim_get_current_win();
+
+			if diagnostics.window and win ~= diagnostics.window then
+				diagnostics.close();
+
+				if diagnostics.quad then
+					diagnostics.update_quad(diagnostics.quad, false);
+					diagnostics.quad = nil;
+				end
+			end
+		end
+	});
+
+	---|fE
+end
+
+return diagnostics;
diff --git a/config/nvim/lua/scripts/init.lua b/config/nvim/lua/scripts/init.lua
new file mode 100644
index 0000000..0933bb0
--- /dev/null
+++ b/config/nvim/lua/scripts/init.lua
@@ -0,0 +1,4 @@
+require("scripts.diagnostics").setup({
+  keymap = '<leader>le'
+  -- TODO: Find out how to which-key this
+})
diff --git a/config/shell/alias b/config/shell/alias
new file mode 100644
index 0000000..8c17329
--- /dev/null
+++ b/config/shell/alias
@@ -0,0 +1,10 @@
+alias rgf='rg --files | rg'
+alias ls='eza --icons=auto'
+alias md='mkdir'
+alias cat='bat -pp'
+alias man='batman'
+alias diff='batdiff'
+alias fzf="fzf --preview 'bat --style=numbers --color=always {}'"
+alias vi="nvim"
+alias vim="nvim"
+alias em="emacs -nw"
diff --git a/config/shell/functions b/config/shell/functions
new file mode 100644
index 0000000..a300316
--- /dev/null
+++ b/config/shell/functions
@@ -0,0 +1,16 @@
+gvc() {
+    if [[ $1 == "clone" ]]; then
+        shift
+        git clone git@git.venomade.com:"$@"
+    else
+        ssh git@git.venomade.com "$@"
+    fi
+}
+
+function y() {
+	local tmp="$(mktemp -t "yazi-cwd.XXXXXX")" cwd
+	command yazi "$@" --cwd-file="$tmp"
+	IFS= read -r -d '' cwd < "$tmp"
+	[ "$cwd" != "$PWD" ] && [ -d "$cwd" ] && builtin cd -- "$cwd"
+	rm -f -- "$tmp"
+}
diff --git a/config/shell/vars b/config/shell/vars
new file mode 100644
index 0000000..b74f722
--- /dev/null
+++ b/config/shell/vars
@@ -0,0 +1,5 @@
+export EDITOR=nvim
+export ZK_NOTEBOOK_DIR=$HOME/Documents/Notes
+export XDG_CONFIG_HOME=$HOME/.config
+export GOPATH=$HOME/.go
+export LIMA_SHELL=/bin/zsh
diff --git a/config/starship/config.toml b/config/starship/config.toml
new file mode 100644
index 0000000..d9cd4d2
--- /dev/null
+++ b/config/starship/config.toml
@@ -0,0 +1,97 @@
+# Get editor completions based on the config schema
+"$schema" = 'https://starship.rs/config-schema.json'
+
+# Inserts a blank line between shell prompts
+add_newline = true
+
+format = """
+${custom.linux}
+$nix_shell\
+$directory\
+$git_branch\
+$git_status\
+$git_commit\
+$status\
+$fill\
+$lua\
+$rust\
+$golang\
+$haskell\
+$jobs\
+$cmd_duration\
+$line_break\
+$character"""
+
+[custom.linux]
+format = '[$symbol \[$output\]]($style) '
+symbol = ' '
+command = "cat /etc/os-release | grep '^ID=' | sed 's/ID=//' | sed 's/^./\\U&/'"
+os = 'linux'
+style = 'bold #f5e0dc'
+when = true
+
+[nix_shell]
+format = '[$symbol]($style) '
+symbol = '󱄅 '
+style = 'bold #74c7ec'
+
+[directory]
+style = '#b2bbfb'
+truncation_length = 2
+
+[git_branch]
+symbol = ' '
+format = '[$symbol$branch(:$remote_branch)]($style) '
+style = 'bold #eba0ac'
+ignore_branches = ['master', 'main']
+
+[git_status]
+format = '([\[$all_status$ahead_behind\]]($style) )'
+style = 'bold #89dceb'
+
+[git_commit]
+format = '[\[#$hash$tag\]]($style) '
+style = 'bold #94e2d5'
+
+[status]
+format = '[\[$status\]]($style)'
+disabled = false
+
+[fill]
+symbol = ' '
+
+[lua]
+format = '[$symbol($version )]($style)'
+version_format = '$major.$minor'
+symbol = '󰢱 '
+detect_files = ['.lua-version', '.luarc.json']
+
+[rust]
+format = '[$symbol($version )]($style)'
+version_format = '$major.$minor'
+symbol = ' '
+style = 'bold #fab387'
+
+[golang]
+format = '[$symbol($version )]($style)'
+version_format = '$major.$minor'
+symbol = ' '
+style = 'bold #94e2d5'
+
+[haskell]
+format = '[$symbol($ghc_version )]($style)'
+symbol = ' '
+style = 'bold #cba6f7'
+
+[cmd_duration]
+format = '[󰔚 $duration]($style) '
+style = 'bold #f9e2af'
+
+# Replace the '❯' symbol in the prompt with '➜'
+[character] # The name of the module we are configuring is 'character'
+success_symbol = '[󰘧](bold #a6e3a1)'
+error_symbol = '[󰘧](bold #f38ba8)'
+
+# TODO
+# - [direnv]
+
diff --git a/config/yazi/keymap.toml b/config/yazi/keymap.toml
new file mode 100644
index 0000000..27da4fc
--- /dev/null
+++ b/config/yazi/keymap.toml
@@ -0,0 +1,164 @@
+"$schema" = "https://yazi-rs.github.io/schemas/keymap.json"
+
+# Manager / File list layer
+[[mgr.prepend_keymap]]
+on  = [ "e" ]
+run = "arrow -1"
+
+[[mgr.prepend_keymap]]
+on  = [ "n" ]
+run = "arrow 1"
+
+[[mgr.prepend_keymap]]
+on  = [ "E" ]
+run = "arrow -5"
+
+[[mgr.prepend_keymap]]
+on  = [ "N" ]
+run = "arrow 5"
+
+[[mgr.prepend_keymap]]
+on  = [ "h" ]
+run = "leave"
+
+[[mgr.prepend_keymap]]
+on  = [ "i" ]
+run = "enter"
+
+[[mgr.prepend_keymap]]
+on  = [ "H" ]
+run = "back"
+
+[[mgr.prepend_keymap]]
+on  = [ "I" ]
+run = "forward"
+
+[[mgr.prepend_keymap]]
+on  = [ "<C-e>" ]
+run = "seek -5"
+
+[[mgr.prepend_keymap]]
+on  = [ "<C-n>" ]
+run = "seek 5"
+
+[[mgr.prepend_keymap]]
+on  = [ "k" ]
+run = "link"
+
+[[mgr.prepend_keymap]]
+on  = [ "K" ]
+run = "link --relative"
+
+[[mgr.prepend_keymap]]
+on  = [ "j" ]
+run = "find_arrow"
+
+[[mgr.prepend_keymap]]
+on  = [ "J" ]
+run = "find_arrow --previous"
+
+
+# Tasks layer
+[[tasks.prepend_keymap]]
+on  = [ "W" ]
+run = "close"
+
+[[tasks.prepend_keymap]]
+on  = [ "e" ]
+run = "arrow -1"
+
+[[tasks.prepend_keymap]]
+on  = [ "n" ]
+run = "arrow 1"
+
+
+# Select layer (spot/picker remnants)
+[[spot.prepend_keymap]]
+on  = [ "e" ]
+run = "arrow -1"
+
+[[spot.prepend_keymap]]
+on  = [ "n" ]
+run = "arrow 1"
+
+[[spot.prepend_keymap]]
+on  = [ "E" ]
+run = "arrow -5"
+
+[[spot.prepend_keymap]]
+on  = [ "N" ]
+run = "arrow 5"
+
+
+# Input layer
+[[input.prepend_keymap]]
+on  = [ "l" ]
+run = "insert"
+
+[[input.prepend_keymap]]
+on  = [ "<C-h>" ]
+run = [ "move -999", "insert" ]
+
+[[input.prepend_keymap]]
+on  = [ "<C-i>" ]
+run = [ "move 999", "insert --append" ]
+
+[[input.prepend_keymap]]
+on  = [ "h" ]
+run = "move -1"
+
+[[input.prepend_keymap]]
+on  = [ "i" ]
+run = "move 1"
+
+[[input.prepend_keymap]]
+on  = [ "=" ]
+run = "forward --end-of-word"
+
+[[input.prepend_keymap]]
+on  = [ "H" ]
+run = "move -999"
+
+[[input.prepend_keymap]]
+on  = [ "I" ]
+run = "move 999"
+
+[[input.prepend_keymap]]
+on  = [ "x" ]
+run = [ "delete", "move 1 --in-operating" ]
+
+[[input.prepend_keymap]]
+on  = [ "u" ]
+run = "undo"
+
+[[input.prepend_keymap]]
+on  = [ "U" ]
+run = "redo"
+
+
+# Completion layer
+[[cmp.prepend_keymap]]
+on  = [ "<C-e>" ]
+run = "arrow -1"
+
+[[cmp.prepend_keymap]]
+on  = [ "<C-n>" ]
+run = "arrow 1"
+
+
+# Help layer
+[[help.prepend_keymap]]
+on  = [ "e" ]
+run = "arrow -1"
+
+[[help.prepend_keymap]]
+on  = [ "n" ]
+run = "arrow 1"
+
+[[help.prepend_keymap]]
+on  = [ "E" ]
+run = "arrow -5"
+
+[[help.prepend_keymap]]
+on  = [ "N" ]
+run = "arrow 5"
diff --git a/config/yazi/modus_vivendi.tmTheme b/config/yazi/modus_vivendi.tmTheme
new file mode 100644
index 0000000..15d2429
--- /dev/null
+++ b/config/yazi/modus_vivendi.tmTheme
@@ -0,0 +1,439 @@
+<!-- Modus Themes for Bat -->
+<!-- Auto generated with https://github.com/miikanissi/modus-themes.nvim/blob/master/lua/modus-themes/extras/bat.lua -->
+
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+  <dict>
+    <key>name</key>
+    <string>modus_vivendi</string>
+    <key>settings</key>
+    <array>
+      <dict>
+        <key>settings</key>
+        <dict>
+          <key>background</key>
+          <string>#000000</string>
+          <key>caret</key>
+          <string>#989898</string>
+          <key>foreground</key>
+          <string>#ffffff</string>
+          <key>invisibles</key>
+          <string>#989898</string>
+          <key>lineHighlight</key>
+          <string>#2f3849</string>
+          <key>selection</key>
+          <string>#7030af</string>
+          <key>findHighlight</key>
+          <string>#7a6100</string>
+          <key>selectionBorder</key>
+          <string>#646464</string>
+          <key>gutterForeground</key>
+          <string>#989898</string>
+        </dict>
+      </dict>
+      <dict>
+        <key>name</key>
+        <string>Comment</string>
+        <key>scope</key>
+        <string>comment</string>
+        <key>settings</key>
+        <dict>
+          <key>fontStyle</key>
+          <string>italic</string>
+          <key>foreground</key>
+          <string>#989898</string>
+        </dict>
+      </dict>
+      <dict>
+        <key>name</key>
+        <string>String</string>
+        <key>scope</key>
+        <string>string</string>
+        <key>settings</key>
+        <dict>
+          <key>foreground</key>
+          <string>#79a8ff</string>
+        </dict>
+      </dict>
+      <dict>
+        <key>name</key>
+        <string>Number</string>
+        <key>scope</key>
+        <string>constant.numeric</string>
+        <key>settings</key>
+        <dict>
+          <key>foreground</key>
+          <string>#82b0ec</string>
+        </dict>
+      </dict>
+      <dict>
+        <key>name</key>
+        <string>Built-in constant</string>
+        <key>scope</key>
+        <string>constant.language</string>
+        <key>settings</key>
+        <dict>
+          <key>foreground</key>
+          <string>#6ae4b9</string>
+        </dict>
+      </dict>
+      <dict>
+        <key>name</key>
+        <string>User-defined constant</string>
+        <key>scope</key>
+        <string>constant.character, constant.other</string>
+        <key>settings</key>
+        <dict>
+          <key>foreground</key>
+          <string>#ffffff</string>
+        </dict>
+      </dict>
+      <dict>
+        <key>name</key>
+        <string>Variable</string>
+        <key>scope</key>
+        <string>variable</string>
+        <key>settings</key>
+        <dict>
+          <key>fontStyle</key>
+          <string>#00d3d0</string>
+        </dict>
+      </dict>
+      <dict>
+        <key>name</key>
+        <string>Ruby's @variable</string>
+        <key>scope</key>
+        <string>variable.other.readwrite.instance</string>
+        <key>settings</key>
+        <dict>
+          <key>foreground</key>
+          <string>#00d3d0</string>
+        </dict>
+      </dict>
+      <dict>
+        <key>name</key>
+        <string>String interpolation</string>
+        <key>scope</key>
+        <string>constant.character.escaped, constant.character.escape, string source, string source.ruby</string>
+        <key>settings</key>
+        <dict>
+          <key>foreground</key>
+          <string>#d2b580</string>
+        </dict>
+      </dict>
+      <dict>
+        <key>name</key>
+        <string>Keyword</string>
+        <key>scope</key>
+        <string>keyword</string>
+        <key>settings</key>
+        <dict>
+          <key>fontStyle</key>
+          <string>italic</string>
+          <key>foreground</key>
+          <string>#b6a0ff</string>
+        </dict>
+      </dict>
+      <dict>
+        <key>name</key>
+        <string>Storage</string>
+        <key>scope</key>
+        <string>storage</string>
+        <key>settings</key>
+        <dict>
+          <key>foreground</key>
+          <string>#b6a0ff</string>
+        </dict>
+      </dict>
+      <dict>
+        <key>name</key>
+        <string>Storage type</string>
+        <key>scope</key>
+        <string>storage.type</string>
+        <key>settings</key>
+        <dict>
+          <key>foreground</key>
+          <string>#b6a0ff</string>
+        </dict>
+      </dict>
+      <dict>
+        <key>name</key>
+        <string>Class name</string>
+        <key>scope</key>
+        <string>entity.name.class</string>
+        <key>settings</key>
+        <dict>
+          <key>foreground</key>
+          <string>#b6a0ff</string>
+        </dict>
+      </dict>
+      <dict>
+        <key>name</key>
+        <string>Inherited class</string>
+        <key>scope</key>
+        <string>entity.other.inherited-class</string>
+        <key>settings</key>
+        <dict>
+          <key>foreground</key>
+          <string>#b6a0ff</string>
+        </dict>
+      </dict>
+      <dict>
+        <key>name</key>
+        <string>Function name</string>
+        <key>scope</key>
+        <string>entity.name.function</string>
+        <key>settings</key>
+        <dict>
+          <key>foreground</key>
+          <string>#feacd0</string>
+        </dict>
+      </dict>
+      <dict>
+        <key>name</key>
+        <string>Function argument</string>
+        <key>scope</key>
+        <string>variable.parameter</string>
+        <key>settings</key>
+        <dict>
+          <key>foreground</key>
+          <string>#00d3d0</string>
+        </dict>
+      </dict>
+      <dict>
+        <key>name</key>
+        <string>Tag name</string>
+        <key>scope</key>
+        <string>entity.name.tag</string>
+        <key>settings</key>
+        <dict>
+          <key>foreground</key>
+          <string>#00d3d0</string>
+        </dict>
+      </dict>
+      <dict>
+        <key>name</key>
+        <string>Tag attribute</string>
+        <key>scope</key>
+        <string>entity.other.attribute-name</string>
+        <key>settings</key>
+        <dict>
+          <key>foreground</key>
+          <string>#00d3d0</string>
+        </dict>
+      </dict>
+      <dict>
+        <key>name</key>
+        <string>Library function</string>
+        <key>scope</key>
+        <string>support.function</string>
+        <key>settings</key>
+        <dict>
+          <key>foreground</key>
+          <string>#feacd0</string>
+        </dict>
+      </dict>
+      <dict>
+        <key>name</key>
+        <string>Library constant</string>
+        <key>scope</key>
+        <string>support.constant</string>
+        <key>settings</key>
+        <dict>
+          <key>foreground</key>
+          <string>#6ae4b9</string>
+        </dict>
+      </dict>
+      <dict>
+        <key>name</key>
+        <string>Library class/type</string>
+        <key>scope</key>
+        <string>support.type, support.class</string>
+        <key>settings</key>
+        <dict>
+          <key>foreground</key>
+          <string>#6ae4b9</string>
+        </dict>
+      </dict>
+      <dict>
+        <key>name</key>
+        <string>Library variable</string>
+        <key>scope</key>
+        <string>support.other.variable</string>
+        <key>settings</key>
+        <dict>
+          <key>foreground</key>
+          <string>#00d3d0</string>
+        </dict>
+      </dict>
+      <dict>
+        <key>name</key>
+        <string>Invalid</string>
+        <key>scope</key>
+        <string>invalid</string>
+        <key>settings</key>
+        <dict>
+          <key>foreground</key>
+          <string>#989898</string>
+        </dict>
+      </dict>
+      <dict>
+        <key>name</key>
+        <string>Invalid deprecated</string>
+        <key>scope</key>
+        <string>invalid.deprecated</string>
+        <key>settings</key>
+        <dict>
+          <key>foreground</key>
+          <string>#989898</string>
+        </dict>
+      </dict>
+      <dict>
+        <key>name</key>
+        <string>JSON String</string>
+        <key>scope</key>
+        <string>meta.structure.dictionary.json string.quoted.double.json</string>
+        <key>settings</key>
+        <dict>
+          <key>foreground</key>
+          <string>#79a8ff</string>
+        </dict>
+      </dict>
+      <dict>
+        <key>name</key>
+        <string>diff.header</string>
+        <key>scope</key>
+        <string>meta.diff, meta.diff.header</string>
+        <key>settings</key>
+        <dict>
+          <key>foreground</key>
+          <string>#feacd0</string>
+        </dict>
+      </dict>
+      <dict>
+        <key>name</key>
+        <string>diff.deleted</string>
+        <key>scope</key>
+        <string>markup.deleted</string>
+        <key>settings</key>
+        <dict>
+          <key>background</key>
+          <string>#4f1119</string>
+        </dict>
+      </dict>
+      <dict>
+        <key>name</key>
+        <string>diff.inserted</string>
+        <key>scope</key>
+        <string>markup.inserted</string>
+        <key>settings</key>
+        <dict>
+          <key>background</key>
+          <string>#00381f</string>
+        </dict>
+      </dict>
+      <dict>
+        <key>name</key>
+        <string>diff.changed</string>
+        <key>scope</key>
+        <string>markup.changed</string>
+        <key>settings</key>
+        <dict>
+          <key>background</key>
+          <string>#363300</string>
+        </dict>
+      </dict>
+      <dict>
+        <key>scope</key>
+        <string>constant.numeric.line-number.find-in-files - match</string>
+        <key>settings</key>
+        <dict>
+          <key>foreground</key>
+          <string>#82b0ec</string>
+        </dict>
+      </dict>
+      <dict>
+        <key>scope</key>
+        <string>entity.name.filename</string>
+        <key>settings</key>
+        <dict>
+          <key>foreground</key>
+          <string>#2fafff</string>
+        </dict>
+      </dict>
+      <dict>
+        <key>scope</key>
+        <string>message.error</string>
+        <key>settings</key>
+        <dict>
+          <key>fontStyle</key>
+          <string>bold</string>
+          <key>foreground</key>
+          <string>#ff7f9f</string>
+        </dict>
+      </dict>
+      <dict>
+        <key>name</key>
+        <string>JSON Punctuation</string>
+        <key>scope</key>
+        <string>punctuation.definition.string.begin.json - meta.structure.dictionary.value.json, punctuation.definition.string.end.json - meta.structure.dictionary.value.json</string>
+        <key>settings</key>
+        <dict>
+          <key>foreground</key>
+          <string>#ffffff</string>
+        </dict>
+      </dict>
+      <dict>
+        <key>name</key>
+        <string>JSON Structure</string>
+        <key>scope</key>
+        <string>meta.structure.dictionary.json string.quoted.double.json</string>
+        <key>settings</key>
+        <dict>
+          <key>foreground</key>
+          <string>#79a8ff</string>
+        </dict>
+      </dict>
+      <dict>
+        <key>name</key>
+        <string>JSON String</string>
+        <key>scope</key>
+        <string>meta.structure.dictionary.value.json string.quoted.double.json</string>
+        <key>settings</key>
+        <dict>
+          <key>foreground</key>
+          <string>#79a8ff</string>
+        </dict>
+      </dict>
+      <dict>
+        <key>name</key>
+        <string>Escape Characters</string>
+        <key>scope</key>
+        <string>constant.character.escape</string>
+        <key>settings</key>
+        <dict>
+          <key>foreground</key>
+          <string>#d2b580</string>
+        </dict>
+      </dict>
+      <dict>
+        <key>name</key>
+        <string>Regular Expressions</string>
+        <key>scope</key>
+        <string>string.regexp</string>
+        <key>settings</key>
+        <dict>
+          <key>foreground</key>
+          <string>#00c06f</string>
+        </dict>
+      </dict>
+    </array>
+    <key>uuid</key>
+    <string>09CE9B40-0137-442C-8512-7CEAFC78C153</string>
+    <key>colorSpaceName</key>
+    <string>sRGB</string>
+    <key>semanticClass</key>
+    <string>Modus Vivendi</string>
+  </dict>
+</plist>
diff --git a/config/yazi/theme.toml b/config/yazi/theme.toml
new file mode 100644
index 0000000..7e83248
--- /dev/null
+++ b/config/yazi/theme.toml
@@ -0,0 +1,135 @@
+# Modus Themes for Yazi
+# Auto generated with https://github.com/miikanissi/modus-themes.nvim/blob/master/lua/modus-themes/extras/yazi.lua
+
+[manager]
+# NOTE: can combined with tmTheme (sublime colorshceme file) for preview code highlight
+highlight = "~/.config/yazi/modus_vivendi.tmTheme"
+
+cwd = { fg = "#00d3d0", italic = true }
+
+# Hovered
+hovered         = { bg = "#2f3849" }
+preview_hovered = { bg = "#2f3849" }
+
+# Find
+find_keyword  = { fg = "#ffffff", bg = "#7030af", bold = true }
+find_position = { fg = "#79a8ff", bg = "#1e1e1e", bold = true }
+
+# Marker
+marker_copied   = { fg = "#70b900", bg = "#70b900" }
+marker_cut      = { fg = "#ff5f59", bg = "#ff5f59" }
+marker_marked   = { fg = "#feacd0", bg = "#feacd0" }
+marker_selected = { fg = "#2fafff", bg = "#2fafff" }
+
+# Tab
+tab_active   = { fg = "#000000", bg = "#2fafff" }
+tab_inactive = { fg = "#989898", bg = "#000000" }
+tab_width    = 1
+
+# Count
+count_copied   = { fg = "#000000", bg = "#70b900" }
+count_cut      = { fg = "#000000", bg = "#ff6b55" }
+count_selected = { fg = "#000000", bg = "#79a8ff" }
+
+# Border
+border_symbol = "│"
+border_style  = { fg = "#C4C4C4" }
+
+[status]
+separator_open  = ""
+separator_close = ""
+separator_style = { fg = "#0f0f0f", bg = "#0f0f0f" }
+
+# Mode
+mode_normal = { fg = "#000000", bg = "#2fafff", bold = true }
+mode_select = { fg = "#000000", bg = "#f78fe7", bold = true }
+mode_unset  = { fg = "#000000", bg = "#db7b5f", bold = true }
+
+# Progress
+progress_label  = { fg = "#989898", bold = true }
+progress_normal = { fg = "#000000" }
+progress_error  = { fg = "#ff5f59" }
+
+# Permissions
+permissions_t = { fg = "#2fafff" }
+permissions_r = { fg = "#d0bc00" }
+permissions_w = { fg = "#ff5f59" }
+permissions_x = { fg = "#44bc44" }
+permissions_s = { fg = "#989898" }
+
+[select]
+border   = { fg = "#C4C4C4" }
+active   = { fg = "#ffffff",  bg = "#646464" }
+inactive = { fg = "#ffffff" }
+
+# Input
+[input]
+border   = { fg = "#00bcff" }
+title    = {}
+value    = { fg = "#f78fe7" }
+selected = { bg = "#646464" }
+
+# Completion
+[completion]
+border   = { fg = "#00bcff" }
+active   = { fg = "#ffffff", bg = "#646464" }
+inactive = { fg = "#ffffff" }
+
+# Tasks
+[tasks]
+border  = { fg = "#C4C4C4" }
+title   = {}
+hovered = { fg = "#ffffff", bg="#646464" }
+
+# Which
+[which]
+cols = 3
+mask            = { bg = "#0f0f0f" }
+cand            = { fg = "#00d3d0" }
+rest            = { fg = "#2fafff" }
+desc            = { fg = "#feacd0" }
+separator       = "  "
+separator_style = { fg = "#989898" }
+
+# Notify
+[notify]
+title_info  = { fg = "#00bcff" }
+title_warn  = { fg = "#d0bc00" }
+title_error = { fg = "#ff5f59" }
+
+# Help
+[help]
+on      = { fg = "#44bc44" }
+run     = { fg = "#feacd0" }
+hovered = { bg = "#646464" }
+footer  = { fg = "#ffffff", bg = "#0f0f0f" }
+
+[filetype]
+
+rules = [
+	# Images
+	{ mime = "image/*", fg = "#00d3d0" },
+
+	# Media
+	{ mime = "{audio,video}/*", fg = "#fec43f" },
+
+	# Archives
+	{ mime = "application/*zip", fg = "#feacd0" },
+	{ mime = "application/x-{tar,bzip*,7z-compressed,xz,rar}", fg = "#feacd0" },
+
+	# Documents
+	{ mime = "application/{pdf,doc,rtf,vnd.*}", fg = "#00d3d0" },
+
+	# Empty files
+	# { mime = "inode/x-empty", fg = "#ff5f59" },
+
+	# Special files
+	{ name = "*", is = "orphan", bg = "#ff5f59" },
+	{ name = "*", is = "exec"  , fg = "#44bc44" },
+
+	{ name = "*.rs", fg = "#db7b5f" },
+
+	# Fallback
+	{ name = "*/", fg = "#2fafff" }
+]
+
diff --git a/config/yazi/yazi.toml b/config/yazi/yazi.toml
new file mode 100644
index 0000000..4f05c94
--- /dev/null
+++ b/config/yazi/yazi.toml
@@ -0,0 +1,7 @@
+[mgr]
+sort_by = "mtime"
+sort_reverse = true
+show_hidden = true
+linemode = "size"
+scrolloff = 12
+ratio = [1,2,0]
diff --git a/config/zk/config.toml b/config/zk/config.toml
new file mode 100644
index 0000000..b9d3ca2
--- /dev/null
+++ b/config/zk/config.toml
@@ -0,0 +1,35 @@
+[notebook]
+dir = "~/Documents/Notes"
+
+[note]
+filename = "{{slug title}}"
+template = "note.md"
+
+[extra]
+author = "Venomade"
+
+[format.markdown]
+link-format = "wiki"
+hashtags = true
+colon-tags = false
+multiword-tags = true
+
+[tool]
+editor = "nvim"
+shell = "/bin/zsh"
+fzf-preview = "bat -p --color always {-1}"
+
+[alias]
+todo = "zk edit TODO"
+
+push = "git fetch && if [ \"$(git rev-parse @)\" = \"$(git rev-parse @{u})\" ]; then git add -A && git commit -m \"Update: $(date '+%Y-%m-%d %H:%M:%S')\" && git push; else echo \"Local branch is not up‑to‑date with the remote; aborting.\"; fi"
+pull = "git pull"
+history = "git log --pretty=format:\"%s\" | tail -10; echo"
+
+rm = "rm -i $@.md"
+
+[lsp]
+[lsp.diagnostics]
+wiki-title = "hint"
+dead-link = "error"
+missing-backlink = { level = "warning", position = "bottom" }
diff --git a/config/zk/templates/note.md b/config/zk/templates/note.md
new file mode 100644
index 0000000..be4c1d2
--- /dev/null
+++ b/config/zk/templates/note.md
@@ -0,0 +1,6 @@
+---
+title: {{title}}
+tags: []
+---
+
+{{content}}
diff --git a/flake.lock b/flake.lock
new file mode 100644
index 0000000..0d96965
--- /dev/null
+++ b/flake.lock
@@ -0,0 +1,48 @@
+{
+  "nodes": {
+    "home-manager": {
+      "inputs": {
+        "nixpkgs": [
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1771102945,
+        "narHash": "sha256-e5NfW8NhC3qChR8bHVni/asrig/ZFzd1wzpq+cEE/tg=",
+        "owner": "nix-community",
+        "repo": "home-manager",
+        "rev": "ff5e5d882c51f9a032479595cbab40fd04f56399",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-community",
+        "repo": "home-manager",
+        "type": "github"
+      }
+    },
+    "nixpkgs": {
+      "locked": {
+        "lastModified": 1771008912,
+        "narHash": "sha256-gf2AmWVTs8lEq7z/3ZAsgnZDhWIckkb+ZnAo5RzSxJg=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "a82ccc39b39b621151d6732718e3e250109076fa",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "root": {
+      "inputs": {
+        "home-manager": "home-manager",
+        "nixpkgs": "nixpkgs"
+      }
+    }
+  },
+  "root": "root",
+  "version": 7
+}
diff --git a/flake.nix b/flake.nix
new file mode 100644
index 0000000..93a558c
--- /dev/null
+++ b/flake.nix
@@ -0,0 +1,31 @@
+{
+  description = "Home Manager configuration of venomade";
+
+  inputs = {
+    # Specify the source of Home Manager and Nixpkgs.
+    nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
+    home-manager = {
+      url = "github:nix-community/home-manager";
+      inputs.nixpkgs.follows = "nixpkgs";
+    };
+  };
+
+  outputs =
+    { nixpkgs, home-manager, ... }:
+    let
+      system = "aarch64-darwin";
+      pkgs = nixpkgs.legacyPackages.${system};
+    in
+    {
+      homeConfigurations."venomade" = home-manager.lib.homeManagerConfiguration {
+        inherit pkgs;
+
+        # Specify your home configuration modules here, for example,
+        # the path to your home.nix.
+        modules = [ ./home.nix ];
+
+        # Optionally use extraSpecialArgs
+        # to pass through arguments to home.nix
+      };
+    };
+}
diff --git a/home.nix b/home.nix
new file mode 100644
index 0000000..49dd79a
--- /dev/null
+++ b/home.nix
@@ -0,0 +1,66 @@
+{ config, lib, pkgs, ... }:
+
+let
+  emacsFlake = builtins.getFlake "github:nix-giant/nix-darwin-emacs/065050b9e06a30c01b41539b75464fff972fecd6";
+in
+{
+  home.username = "venomade";
+  home.homeDirectory = "/Users/venomade";
+
+  home.packages = with pkgs; [
+
+    # Neovim
+    neovim
+    imagemagick
+    fzf
+    ripgrep
+
+    # Emacs
+    (emacsFlake.packages.${system}.emacs-30)
+
+    # Nix
+    nil
+
+    # Lua
+    lua-language-server
+    lua5_4
+    lua5_4.pkgs.luarocks
+
+    # Personal
+    bat
+    eza
+    jellyfin-tui
+    lazygit
+    starship
+    yazi
+    zk
+    lima
+
+    ];
+
+  programs.git = {
+    enable = true;
+    settings.user = {
+      name = "venomade";
+      email = "venomade@venomade.com";
+    };
+  };
+
+  home.stateVersion = "25.11";
+
+  programs.home-manager.enable = true;
+
+  home.file =
+    let
+      dir = "${config.home.homeDirectory}/.dotfiles/config";
+    in
+      lib.mapAttrs
+        (name: _: {
+          target = ".config/${name}";
+          source = config.lib.file.mkOutOfStoreSymlink "${dir}/${name}";
+          recursive = true;
+        })
+        (lib.filterAttrs
+          (name: type: type == "directory")
+          (builtins.readDir ./config));
+}