summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitmodules6
-rw-r--r--aerospace/.aerospace.toml158
-rw-r--r--alacritty/.config/alacritty/alacritty.toml44
-rw-r--r--alacritty/.config/alacritty/theme.toml4
-rwxr-xr-xcleanup.sh5
-rw-r--r--git/.config/git/rootignore7
-rw-r--r--git/.gitconfig10
-rwxr-xr-xgpg/.gnupg/common.conf1
-rwxr-xr-xgpg/.gnupg/gpg-agent.conf2
-rw-r--r--home/Documents/pubkey.asc0
-rw-r--r--home/Pictures/pfp/bubblegum.pngbin0 -> 443498 bytes
-rw-r--r--home/Pictures/pfp/eejypenguin.pngbin0 -> 175119 bytes
-rw-r--r--home/Pictures/pfp/gus.jpgbin0 -> 31578 bytes
-rw-r--r--home/Pictures/pfp/mefr.pngbin0 -> 1265644 bytes
-rw-r--r--home/Pictures/pfp/shoppingpenguin.pngbin0 -> 277623 bytes
-rw-r--r--home/Pictures/wallpapers/5m5kLI9.pngbin0 -> 313297 bytes
-rw-r--r--home/Pictures/wallpapers/Flight1.webpbin0 -> 62148 bytes
-rw-r--r--home/Pictures/wallpapers/Pages.pngbin0 -> 1133976 bytes
-rw-r--r--home/Pictures/wallpapers/beach.jpgbin0 -> 169847 bytes
-rw-r--r--home/Pictures/wallpapers/maciek-sulkowski-fJ-22PLNGvE.jpgbin0 -> 1283226 bytes
-rw-r--r--home/Pictures/wallpapers/rose01.pngbin0 -> 1508642 bytes
-rw-r--r--home/Pictures/wallpapers/table.pngbin0 -> 608017 bytes
-rw-r--r--home/Pictures/wallpapers/wall.jpgbin0 -> 275592 bytes
-rwxr-xr-xhome/scripts/greet.sh29
-rwxr-xr-xhome/scripts/log.sh32
-rwxr-xr-xhome/scripts/pinentry.sh20
-rwxr-xr-xhome/scripts/platform.sh11
-rwxr-xr-xhome/scripts/system_name.sh14
-rwxr-xr-xhome/scripts/theme.sh22
-rwxr-xr-xinit.sh5
-rw-r--r--mise/.config/mise/config.toml4
-rw-r--r--nvim/.config/nvim/config/lazy.lua35
-rw-r--r--nvim/.config/nvim/config/options.lua39
-rw-r--r--nvim/.config/nvim/init.lua9
-rw-r--r--nvim/.config/nvim/lua/.gitkeep0
-rw-r--r--nvim/.config/nvim/lua/autopairs.lua16
-rw-r--r--nvim/.config/nvim/lua/comment.lua6
-rw-r--r--nvim/.config/nvim/lua/lualine.lua34
-rw-r--r--nvim/.config/nvim/lua/telescope.lua25
-rw-r--r--nvim/.config/nvim/lua/theme.lua9
-rw-r--r--nvim/.config/nvim/lua/whichkey.lua6
-rw-r--r--ssh/.ssh/config14
-rw-r--r--starship/.config/starship.toml53
-rw-r--r--theme/.config/theme/alacritty.toml4
-rw-r--r--tmux/.config/tmux/tmux.conf26
-rw-r--r--tmux/.tmux/plugins/tpm/.gitattributes9
-rw-r--r--tmux/.tmux/plugins/tpm/.gitignore4
-rw-r--r--tmux/.tmux/plugins/tpm/.gitmodules3
-rw-r--r--tmux/.tmux/plugins/tpm/.travis.yml19
-rw-r--r--tmux/.tmux/plugins/tpm/CHANGELOG.md86
-rw-r--r--tmux/.tmux/plugins/tpm/HOW_TO_PLUGIN.md2
-rw-r--r--tmux/.tmux/plugins/tpm/LICENSE.md20
-rw-r--r--tmux/.tmux/plugins/tpm/README.md101
-rwxr-xr-xtmux/.tmux/plugins/tpm/bin/clean_plugins14
-rwxr-xr-xtmux/.tmux/plugins/tpm/bin/install_plugins14
-rwxr-xr-xtmux/.tmux/plugins/tpm/bin/update_plugins24
-rwxr-xr-xtmux/.tmux/plugins/tpm/bindings/clean_plugins19
-rwxr-xr-xtmux/.tmux/plugins/tpm/bindings/install_plugins19
-rwxr-xr-xtmux/.tmux/plugins/tpm/bindings/update_plugins49
-rw-r--r--tmux/.tmux/plugins/tpm/docs/automatic_tpm_installation.md12
-rw-r--r--tmux/.tmux/plugins/tpm/docs/changing_plugins_install_dir.md16
-rw-r--r--tmux/.tmux/plugins/tpm/docs/how_to_create_plugin.md108
-rw-r--r--tmux/.tmux/plugins/tpm/docs/managing_plugins_via_cmd_line.md36
-rw-r--r--tmux/.tmux/plugins/tpm/docs/tpm_not_working.md102
-rwxr-xr-xtmux/.tmux/plugins/tpm/scripts/check_tmux_version.sh78
-rwxr-xr-xtmux/.tmux/plugins/tpm/scripts/clean_plugins.sh41
-rw-r--r--tmux/.tmux/plugins/tpm/scripts/helpers/plugin_functions.sh104
-rw-r--r--tmux/.tmux/plugins/tpm/scripts/helpers/shell_echo_functions.sh7
-rw-r--r--tmux/.tmux/plugins/tpm/scripts/helpers/tmux_echo_functions.sh28
-rw-r--r--tmux/.tmux/plugins/tpm/scripts/helpers/tmux_utils.sh6
-rw-r--r--tmux/.tmux/plugins/tpm/scripts/helpers/utility.sh17
-rwxr-xr-xtmux/.tmux/plugins/tpm/scripts/install_plugins.sh75
-rwxr-xr-xtmux/.tmux/plugins/tpm/scripts/source_plugins.sh42
-rwxr-xr-xtmux/.tmux/plugins/tpm/scripts/update_plugin.sh78
-rwxr-xr-xtmux/.tmux/plugins/tpm/scripts/update_plugin_prompt_handler.sh18
-rw-r--r--tmux/.tmux/plugins/tpm/scripts/variables.sh13
-rwxr-xr-xtmux/.tmux/plugins/tpm/tests/expect_failed_plugin_download36
-rwxr-xr-xtmux/.tmux/plugins/tpm/tests/expect_successful_clean_plugins35
-rwxr-xr-xtmux/.tmux/plugins/tpm/tests/expect_successful_multiple_plugins_download44
-rwxr-xr-xtmux/.tmux/plugins/tpm/tests/expect_successful_plugin_download50
-rwxr-xr-xtmux/.tmux/plugins/tpm/tests/expect_successful_update_of_a_single_plugin55
-rwxr-xr-xtmux/.tmux/plugins/tpm/tests/expect_successful_update_of_all_plugins59
-rw-r--r--tmux/.tmux/plugins/tpm/tests/helpers/tpm.sh13
-rwxr-xr-xtmux/.tmux/plugins/tpm/tests/test_plugin_clean.sh67
-rwxr-xr-xtmux/.tmux/plugins/tpm/tests/test_plugin_installation.sh284
-rwxr-xr-xtmux/.tmux/plugins/tpm/tests/test_plugin_installation_legacy.sh100
-rwxr-xr-xtmux/.tmux/plugins/tpm/tests/test_plugin_sourcing.sh78
-rwxr-xr-xtmux/.tmux/plugins/tpm/tests/test_plugin_update.sh60
-rwxr-xr-xtmux/.tmux/plugins/tpm/tpm81
-rw-r--r--zed/.config/zed/settings.json57
-rw-r--r--zsh/.config/zsh/greetings/00_art/another_penguin15
-rw-r--r--zsh/.config/zsh/greetings/00_art/butterfly9
-rw-r--r--zsh/.config/zsh/greetings/00_art/eebjy9
-rw-r--r--zsh/.config/zsh/greetings/00_art/heart8
-rw-r--r--zsh/.config/zsh/greetings/00_art/penguin16
-rw-r--r--zsh/.config/zsh/greetings/00_art/puppy10
-rw-r--r--zsh/.config/zsh/greetings/00_art/totoro13
-rw-r--r--zsh/.config/zsh/greetings/01_prompts/aww_motivation_lost1
-rw-r--r--zsh/.config/zsh/greetings/01_prompts/bashful1
-rw-r--r--zsh/.config/zsh/greetings/01_prompts/bby1
-rw-r--r--zsh/.config/zsh/greetings/01_prompts/bot1
-rw-r--r--zsh/.config/zsh/greetings/01_prompts/break_stuff1
-rw-r--r--zsh/.config/zsh/greetings/01_prompts/compiling_feelings1
-rw-r--r--zsh/.config/zsh/greetings/01_prompts/crashin1
-rw-r--r--zsh/.config/zsh/greetings/01_prompts/desu1
-rw-r--r--zsh/.config/zsh/greetings/01_prompts/hacker_friend1
-rw-r--r--zsh/.config/zsh/greetings/01_prompts/hai1
-rw-r--r--zsh/.config/zsh/greetings/01_prompts/input_output_love1
-rw-r--r--zsh/.config/zsh/greetings/01_prompts/love_letter1
-rw-r--r--zsh/.config/zsh/greetings/01_prompts/online1
-rw-r--r--zsh/.config/zsh/greetings/01_prompts/production1
-rw-r--r--zsh/.config/zsh/greetings/01_prompts/sammich1
-rw-r--r--zsh/.config/zsh/greetings/01_prompts/shell_yeah1
-rw-r--r--zsh/.config/zsh/greetings/01_prompts/time_to_hack1
-rw-r--r--zsh/.config/zsh/greetings/01_prompts/typing1
-rw-r--r--zsh/.config/zsh/greetings/01_prompts/yeehaw1
-rwxr-xr-xzsh/.config/zsh/linux/init.zsh6
-rwxr-xr-xzsh/.config/zsh/osx/armin.zsh3
l---------zsh/.config/zsh/osx/bcd074b37296.zsh1
-rwxr-xr-xzsh/.config/zsh/osx/init.zsh20
-rwxr-xr-xzsh/.config/zsh/osx/work.zsh32
-rwxr-xr-xzsh/.config/zsh/setup/aliases.zsh27
-rwxr-xr-xzsh/.config/zsh/setup/device.zsh30
-rwxr-xr-xzsh/.config/zsh/setup/git.zsh8
-rwxr-xr-xzsh/.config/zsh/setup/gpg.zsh23
-rwxr-xr-xzsh/.config/zsh/setup/history.zsh14
-rwxr-xr-xzsh/.config/zsh/setup/misc.zsh11
-rwxr-xr-xzsh/.config/zsh/setup/tools.zsh15
-rw-r--r--zsh/.hushlogin0
-rw-r--r--zsh/.zshrc38
130 files changed, 3160 insertions, 0 deletions
diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 0000000..9a042b9
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,6 @@
+[submodule "alacritty/.config/alacritty/alacritty-theme"]
+ path = alacritty/.config/alacritty/alacritty-theme
+ url = https://github.com/alacritty/alacritty-theme
+[submodule "tmux/.tmux/plugins/tpm"]
+ path = tmux/.tmux/plugins/tpm
+ url = https://github.com/tmux-plugins/tpm
diff --git a/aerospace/.aerospace.toml b/aerospace/.aerospace.toml
new file mode 100644
index 0000000..81162d9
--- /dev/null
+++ b/aerospace/.aerospace.toml
@@ -0,0 +1,158 @@
+after-login-command = []
+after-startup-command = [
+ 'exec-and-forget borders active_color=0xffe1e3e4 inactive_color=0xff494d64 width=4.0'
+]
+
+start-at-login = true
+
+# Normalizations. See: https://nikitabobko.github.io/AeroSpace/guide#normalization
+enable-normalization-flatten-containers = true
+enable-normalization-opposite-orientation-for-nested-containers = true
+
+# See: https://nikitabobko.github.io/AeroSpace/guide#layouts
+# The 'accordion-padding' specifies the size of accordion padding
+# You can set 0 to disable the padding feature
+accordion-padding = 30
+
+# Possible values: tiles|accordion
+default-root-container-layout = 'tiles'
+
+# Possible values: horizontal|vertical|auto
+# 'auto' means: wide monitor (anything wider than high) gets horizontal orientation,
+# tall monitor (anything higher than wide) gets vertical orientation
+default-root-container-orientation = 'auto'
+
+on-focus-changed = ['move-mouse window-lazy-center']
+
+# You can effectively turn off macOS "Hide application" (cmd-h) feature by toggling this flag
+# Useful if you don't use this macOS feature, but accidentally hit cmd-h or cmd-alt-h key
+# Also see: https://nikitabobko.github.io/AeroSpace/goodies#disable-hide-app
+automatically-unhide-macos-hidden-apps = true
+
+# Possible values: (qwerty|dvorak|colemak)
+# See https://nikitabobko.github.io/AeroSpace/guide#key-mapping
+[key-mapping]
+ preset = 'qwerty'
+
+# Gaps between windows (inner-*) and between monitor edges (outer-*).
+# Possible values:
+# - Constant: gaps.outer.top = 8
+# - Per monitor: gaps.outer.top = [{ monitor.main = 16 }, { monitor."some-pattern" = 32 }, 24]
+# In this example, 24 is a default value when there is no match.
+# Monitor pattern is the same as for 'workspace-to-monitor-force-assignment'.
+# See:
+# https://nikitabobko.github.io/AeroSpace/guide#assign-workspaces-to-monitors
+[gaps]
+ inner.horizontal = 8
+ inner.vertical = 8
+ outer.left = 8
+ outer.bottom = 8
+ outer.top = 8
+ outer.right = 8
+
+[mode.main.binding]
+ # All possible commands: https://nikitabobko.github.io/AeroSpace/commands
+
+ # See: https://nikitabobko.github.io/AeroSpace/commands#layout
+ alt-slash = 'layout tiles horizontal vertical'
+ alt-comma = 'layout accordion horizontal vertical'
+
+ alt-ctrl-d = 'close'
+ alt-h = 'focus left'
+ alt-j = 'focus down'
+ alt-k = 'focus up'
+ alt-l = 'focus right'
+
+ alt-shift-h = 'move left'
+ alt-shift-j = 'move down'
+ alt-shift-k = 'move up'
+ alt-shift-l = 'move right'
+
+ alt-ctrl-space = ['mode main']
+ alt-ctrl-h = ['join-with left', 'mode main']
+ alt-ctrl-j = ['join-with down', 'mode main']
+ alt-ctrl-k = ['join-with up', 'mode main']
+ alt-ctrl-l = ['join-with right', 'mode main']
+
+ alt-minus = 'resize smart -50'
+ alt-equal = 'resize smart +50'
+
+ # Monitor One Workspaces
+ alt-1 = 'workspace 1'
+ alt-2 = 'workspace 2'
+ alt-3 = 'workspace 3'
+ alt-4 = 'workspace 4'
+ alt-5 = 'workspace 5'
+ alt-q = 'workspace 1'
+ alt-w = 'workspace 2'
+ alt-e = 'workspace 3'
+ alt-r = 'workspace 4'
+ alt-t = 'workspace 5'
+ alt-shift-1 = 'move-node-to-workspace 1'
+ alt-shift-2 = 'move-node-to-workspace 2'
+ alt-shift-3 = 'move-node-to-workspace 3'
+ alt-shift-4 = 'move-node-to-workspace 4'
+ alt-shift-5 = 'move-node-to-workspace 5'
+ alt-shift-a = 'move-node-to-workspace 1'
+ alt-shift-s = 'move-node-to-workspace 2'
+ alt-shift-d = 'move-node-to-workspace 3'
+ alt-shift-f = 'move-node-to-workspace 4'
+ alt-shift-g = 'move-node-to-workspace 5'
+
+ # Monitor Two Workspaces
+ alt-6 = 'workspace 6'
+ alt-7 = 'workspace 7'
+ alt-8 = 'workspace 8'
+ alt-9 = 'workspace 9'
+ alt-0 = 'workspace 10'
+ alt-y = 'workspace 6'
+ alt-u = 'workspace 7'
+ alt-i = 'workspace 8'
+ alt-o = 'workspace 9'
+ alt-p = 'workspace 10'
+ alt-shift-6 = 'move-node-to-workspace 6'
+ alt-shift-7 = 'move-node-to-workspace 7'
+ alt-shift-8 = 'move-node-to-workspace 8'
+ alt-shift-9 = 'move-node-to-workspace 9'
+ alt-shift-0 = 'move-node-to-workspace 10'
+ alt-shift-y = 'move-node-to-workspace 6'
+ alt-shift-u = 'move-node-to-workspace 7'
+ alt-shift-i = 'move-node-to-workspace 8'
+ alt-shift-o = 'move-node-to-workspace 9'
+ alt-shift-p = 'move-node-to-workspace 10'
+
+ # See: https://nikitabobko.github.io/AeroSpace/commands#workspace-back-and-forth
+ alt-tab = 'workspace-back-and-forth'
+ # See: https://nikitabobko.github.io/AeroSpace/commands#move-workspace-to-monitor
+ alt-shift-tab = 'move-workspace-to-monitor --wrap-around next'
+
+ # See: https://nikitabobko.github.io/AeroSpace/commands#mode
+ alt-shift-semicolon = 'mode service'
+
+[workspace-to-monitor-force-assignment]
+ 1 = 'main'
+ 2 = 'main'
+ 3 = 'main'
+ 4 = 'main'
+ 5 = 'main'
+ 6 = 'secondary'
+ 7 = 'secondary'
+ 8 = 'secondary'
+ 9 = 'secondary'
+ 10 = 'secondary'
+
+# 'service' binding mode declaration.
+# See: https://nikitabobko.github.io/AeroSpace/guide#binding-modes
+[mode.service.binding]
+ esc = ['reload-config', 'mode main']
+ r = ['flatten-workspace-tree', 'mode main'] # reset layout
+ f = ['layout floating tiling', 'mode main'] # Toggle between floating and tiling layout
+ backspace = ['close-all-windows-but-current', 'mode main']
+
+ # sticky is not yet supported https://github.com/nikitabobko/AeroSpace/issues/2
+ #s = ['layout sticky tiling', 'mode main']
+
+ down = 'volume down'
+ up = 'volume up'
+ shift-down = ['volume set 0', 'mode main']
+
diff --git a/alacritty/.config/alacritty/alacritty.toml b/alacritty/.config/alacritty/alacritty.toml
new file mode 100644
index 0000000..f742d05
--- /dev/null
+++ b/alacritty/.config/alacritty/alacritty.toml
@@ -0,0 +1,44 @@
+[cursor]
+style = "Block"
+unfocused_hollow = false
+
+[font]
+size = 14.0
+
+[font.glyph_offset]
+x = 0
+y = 0
+
+[font.bold]
+family = "Lekton Nerd Font Mono"
+style = "Bold"
+
+[font.italic]
+family = "Lekton Nerd Font Mono"
+style = "Italic"
+
+[font.normal]
+family = "Lekton Nerd Font Mono"
+style = "Regular"
+
+[font.offset]
+x = 0
+y = 1
+
+[window]
+dynamic_padding = true
+option_as_alt = "Both"
+decorations = "Buttonless"
+opacity = 0.91
+blur = true
+
+[window.padding]
+x = 12
+y = 4
+
+[env]
+TERM = "alacritty-direct"
+
+[general]
+import = ["~/.theme/alacritty.toml"]
+
diff --git a/alacritty/.config/alacritty/theme.toml b/alacritty/.config/alacritty/theme.toml
new file mode 100644
index 0000000..b8631a4
--- /dev/null
+++ b/alacritty/.config/alacritty/theme.toml
@@ -0,0 +1,4 @@
+[general]
+import = [
+ "/tmp/alacritty_theme.toml"
+]
diff --git a/cleanup.sh b/cleanup.sh
new file mode 100755
index 0000000..4b208c1
--- /dev/null
+++ b/cleanup.sh
@@ -0,0 +1,5 @@
+#!/bin/sh
+
+find . -type d -mindepth 1 -maxdepth 1 -not -path '*/.*' \
+ | sed "s/^\.\///" \
+ | while read dir; do stow -D "$dir"; done
diff --git a/git/.config/git/rootignore b/git/.config/git/rootignore
new file mode 100644
index 0000000..136db89
--- /dev/null
+++ b/git/.config/git/rootignore
@@ -0,0 +1,7 @@
+.classpath
+.factorypath
+.project
+.settings
+.idea
+.cache
+.vscode
diff --git a/git/.gitconfig b/git/.gitconfig
new file mode 100644
index 0000000..575b008
--- /dev/null
+++ b/git/.gitconfig
@@ -0,0 +1,10 @@
+[user]
+ signingkey = 7BB52F7036FA7C18
+[commit]
+ gpgsign = true
+[core]
+ excludesFile = ~/.config/git/rootignore
+[push]
+ autoSetupRemote = true
+[pull]
+ rebase = true
diff --git a/gpg/.gnupg/common.conf b/gpg/.gnupg/common.conf
new file mode 100755
index 0000000..5add401
--- /dev/null
+++ b/gpg/.gnupg/common.conf
@@ -0,0 +1 @@
+use-keyboxd
diff --git a/gpg/.gnupg/gpg-agent.conf b/gpg/.gnupg/gpg-agent.conf
new file mode 100755
index 0000000..3578512
--- /dev/null
+++ b/gpg/.gnupg/gpg-agent.conf
@@ -0,0 +1,2 @@
+pinentry-program /tmp/pinentry
+enable-ssh-support
diff --git a/home/Documents/pubkey.asc b/home/Documents/pubkey.asc
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/home/Documents/pubkey.asc
diff --git a/home/Pictures/pfp/bubblegum.png b/home/Pictures/pfp/bubblegum.png
new file mode 100644
index 0000000..171bc62
--- /dev/null
+++ b/home/Pictures/pfp/bubblegum.png
Binary files differ
diff --git a/home/Pictures/pfp/eejypenguin.png b/home/Pictures/pfp/eejypenguin.png
new file mode 100644
index 0000000..2ae47cb
--- /dev/null
+++ b/home/Pictures/pfp/eejypenguin.png
Binary files differ
diff --git a/home/Pictures/pfp/gus.jpg b/home/Pictures/pfp/gus.jpg
new file mode 100644
index 0000000..8073311
--- /dev/null
+++ b/home/Pictures/pfp/gus.jpg
Binary files differ
diff --git a/home/Pictures/pfp/mefr.png b/home/Pictures/pfp/mefr.png
new file mode 100644
index 0000000..46e6948
--- /dev/null
+++ b/home/Pictures/pfp/mefr.png
Binary files differ
diff --git a/home/Pictures/pfp/shoppingpenguin.png b/home/Pictures/pfp/shoppingpenguin.png
new file mode 100644
index 0000000..02c14ec
--- /dev/null
+++ b/home/Pictures/pfp/shoppingpenguin.png
Binary files differ
diff --git a/home/Pictures/wallpapers/5m5kLI9.png b/home/Pictures/wallpapers/5m5kLI9.png
new file mode 100644
index 0000000..bf7b60d
--- /dev/null
+++ b/home/Pictures/wallpapers/5m5kLI9.png
Binary files differ
diff --git a/home/Pictures/wallpapers/Flight1.webp b/home/Pictures/wallpapers/Flight1.webp
new file mode 100644
index 0000000..c59bd58
--- /dev/null
+++ b/home/Pictures/wallpapers/Flight1.webp
Binary files differ
diff --git a/home/Pictures/wallpapers/Pages.png b/home/Pictures/wallpapers/Pages.png
new file mode 100644
index 0000000..3e4cf16
--- /dev/null
+++ b/home/Pictures/wallpapers/Pages.png
Binary files differ
diff --git a/home/Pictures/wallpapers/beach.jpg b/home/Pictures/wallpapers/beach.jpg
new file mode 100644
index 0000000..e2e3949
--- /dev/null
+++ b/home/Pictures/wallpapers/beach.jpg
Binary files differ
diff --git a/home/Pictures/wallpapers/maciek-sulkowski-fJ-22PLNGvE.jpg b/home/Pictures/wallpapers/maciek-sulkowski-fJ-22PLNGvE.jpg
new file mode 100644
index 0000000..c2f6350
--- /dev/null
+++ b/home/Pictures/wallpapers/maciek-sulkowski-fJ-22PLNGvE.jpg
Binary files differ
diff --git a/home/Pictures/wallpapers/rose01.png b/home/Pictures/wallpapers/rose01.png
new file mode 100644
index 0000000..0b11bcb
--- /dev/null
+++ b/home/Pictures/wallpapers/rose01.png
Binary files differ
diff --git a/home/Pictures/wallpapers/table.png b/home/Pictures/wallpapers/table.png
new file mode 100644
index 0000000..bb86417
--- /dev/null
+++ b/home/Pictures/wallpapers/table.png
Binary files differ
diff --git a/home/Pictures/wallpapers/wall.jpg b/home/Pictures/wallpapers/wall.jpg
new file mode 100644
index 0000000..f9df8f1
--- /dev/null
+++ b/home/Pictures/wallpapers/wall.jpg
Binary files differ
diff --git a/home/scripts/greet.sh b/home/scripts/greet.sh
new file mode 100755
index 0000000..00b6be5
--- /dev/null
+++ b/home/scripts/greet.sh
@@ -0,0 +1,29 @@
+#!/bin/bash
+source log.sh "greet.sh"
+
+pick_greeting() {
+ path="$1"
+ greetings=("$1"/*)
+ greeting="${greetings[$RANDOM % ${#greetings[@]}]}"
+ echo "$greeting"
+}
+
+GREETINGS_LIST="$XDG_CONFIG_HOME/zsh/greetings"
+if [ ! -d "$GREETINGS_LIST" ]; then
+ log DEBUG "no such file $GREETINGS_LIST"
+ exit 0
+fi
+
+for greetings in $(ls "$GREETINGS_LIST" | sort); do
+ echo
+ log DEBUG "greeting $greetings"
+
+ path="$GREETINGS_LIST/$greetings"
+ if [ ! -d "$path" ]; then
+ log DEBUG "greetings $path is not a directory"
+ continue
+ fi
+
+ greeting=$(pick_greeting "$path")
+ cat "$greeting"
+done
diff --git a/home/scripts/log.sh b/home/scripts/log.sh
new file mode 100755
index 0000000..8895097
--- /dev/null
+++ b/home/scripts/log.sh
@@ -0,0 +1,32 @@
+#!/bin/sh
+
+# usage:
+# > source log.sh <CALLER>
+# > log INFO "hello"
+# > log "this is epic"
+# > log DEBUG "yo"
+
+_LOG_CALLER=$(basename "$1")
+
+log() {
+ LEVEL=$1
+ shift
+
+ case "$LEVEL" in
+ INFO|DEBUG|ERROR)
+ ;;
+ *)
+ set -- "INFO" "$LEVEL" "$@"
+ LEVEL="INFO"
+ ;;
+ esac
+
+ TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
+ MESSAGE="$*"
+
+ if [ "$LEVEL" = "DEBUG" ] && [ -z "$DEBUG" ]; then
+ return
+ fi
+
+ echo "[$TIMESTAMP] [$_LOG_CALLER] [$LEVEL] $MESSAGE"
+}
diff --git a/home/scripts/pinentry.sh b/home/scripts/pinentry.sh
new file mode 100755
index 0000000..f02ee6f
--- /dev/null
+++ b/home/scripts/pinentry.sh
@@ -0,0 +1,20 @@
+#!/bin/bash
+
+source log.sh "pinentry.sh"
+
+#-- <gpg> --
+bin="${HOMEBREW_PREFIX:-"/usr"}/bin"
+case "$PINENTRY_USER_DATA" in
+ *USE_TTY*) pe=$bin/pinentry-tty ;;
+ *USE_CURSES*) pe=$bin/pinentry-curses ;;
+ *USE_QT*) pe=$bin/pinentry-qt ;;
+ *USE_MAC*) pe=$bin/pinentry-mac ;;
+ *USE_GTK2*) pe=$bin/pinentry-gtk-2 ;;
+ *USE_GNOME3*) pe=$bin/pinentry-gnome3 ;;
+ *USE_X11*) pe=$bin/pinentry-x11 ;;
+esac
+
+log DEBUG "$pe"
+
+exec $pe "$@"
+#-- </gpg> --
diff --git a/home/scripts/platform.sh b/home/scripts/platform.sh
new file mode 100755
index 0000000..9449ceb
--- /dev/null
+++ b/home/scripts/platform.sh
@@ -0,0 +1,11 @@
+#!/bin/sh
+
+case "$OSTYPE" in
+ solaris*) echo "solaris" ;;
+ darwin*) echo "osx" ;;
+ linux*) echo "linux" ;;
+ bsd*) echo "bsd" ;;
+ msys*) echo "windows" ;;
+ cygwin*) echo "windows" ;;
+ *) echo "unknown" ;;
+esac
diff --git a/home/scripts/system_name.sh b/home/scripts/system_name.sh
new file mode 100755
index 0000000..92b714a
--- /dev/null
+++ b/home/scripts/system_name.sh
@@ -0,0 +1,14 @@
+#!/bin/sh
+
+platform="$(platform.sh)"
+
+MACHINE="$HOST"
+if [ "$platform" = "osx" ]; then
+ MACHINE="$(scutil --get ComputerName)"
+elif [ "$platform" = "linux" ]; then
+ MACHINE="$(cat /proc/sys/kernel/hostname)"
+fi
+
+echo $MACHINE | awk -F\. '{print $1}' \
+ | tr '[:upper:]' '[:lower:]' \
+ | tr ' ' '-'
diff --git a/home/scripts/theme.sh b/home/scripts/theme.sh
new file mode 100755
index 0000000..3608c14
--- /dev/null
+++ b/home/scripts/theme.sh
@@ -0,0 +1,22 @@
+#!/bin/bash
+
+# usage: theme.sh <theme_name>
+
+source log.sh "theme.sh"
+
+THEME="$1"
+log DEBUG "setting theme $THEME"
+
+THEME_SRC="$XDG_CONFIG_HOME/theme"
+THEME_DEST="$HOME/.theme"
+log DEBUG "src $THEME_SRC -> dest $THEME_DEST"
+
+THEME_TEMPL="{{THEME}}"
+
+find "$THEME_SRC/" -type f | while read source_file; do
+ destination_file=`echo "$source_file" | sed "s|^$THEME_SRC|$THEME_DEST|g"`
+ mkdir -p `dirname $destination_file`
+ log DEBUG "src $source_file -> dest $dest_file"
+ cat "$source_file" | sed "s|$THEME_TEMPL|$THEME|g" > $destination_file
+done
+
diff --git a/init.sh b/init.sh
new file mode 100755
index 0000000..e6856de
--- /dev/null
+++ b/init.sh
@@ -0,0 +1,5 @@
+#!/bin/sh
+
+find . -type d -mindepth 1 -maxdepth 1 -not -path '*/.*' \
+ | sed "s/^\.\///" \
+ | while read dir; do stow --no-folding "$dir"; done
diff --git a/mise/.config/mise/config.toml b/mise/.config/mise/config.toml
new file mode 100644
index 0000000..adb8f3f
--- /dev/null
+++ b/mise/.config/mise/config.toml
@@ -0,0 +1,4 @@
+[tools]
+node = "lts"
+python = "3.12"
+deno = "2.3.3"
diff --git a/nvim/.config/nvim/config/lazy.lua b/nvim/.config/nvim/config/lazy.lua
new file mode 100644
index 0000000..f5ee74c
--- /dev/null
+++ b/nvim/.config/nvim/config/lazy.lua
@@ -0,0 +1,35 @@
+-- Bootstrap lazy.nvim
+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)
+
+-- Make sure to setup `mapleader` and `maplocalleader` before
+-- loading lazy.nvim so that mappings are correct.
+-- This is also a good place to setup other settings (vim.opt)
+vim.g.mapleader = " "
+vim.g.maplocalleader = "\\"
+
+-- Setup lazy.nvim
+require("lazy").setup({
+ spec = {
+ -- import your plugins
+ { import = "plugins" },
+ },
+ -- Configure any other settings here. See the documentation for more details.
+ -- colorscheme that will be used when installing plugins.
+ install = { colorscheme = { "habamax" } },
+ -- automatically check for plugin updates
+ checker = { enabled = true },
+})
diff --git a/nvim/.config/nvim/config/options.lua b/nvim/.config/nvim/config/options.lua
new file mode 100644
index 0000000..01489f0
--- /dev/null
+++ b/nvim/.config/nvim/config/options.lua
@@ -0,0 +1,39 @@
+local options = {
+ cmdheight = 0,
+
+ number = true,
+ relativenumber = true,
+
+ clipboard = "unnamedplus",
+
+ breakindent = true,
+ tabstop = 4,
+ softtabstop = 4,
+ shiftwidth = 4,
+ expandtab = true,
+
+ undofile = true,
+
+ hlsearch = false,
+ ignorecase = true,
+ smartcase = true,
+
+ completeopt = "menuone,noselect",
+
+ timeout = true,
+ timeoutlen = 500,
+
+ foldcolumn = "0",
+ foldlevel = 99,
+ foldlevelstart = 99,
+ foldenable = true,
+
+ spelllang = { "nb", "en" },
+ spellcapcheck = "",
+}
+
+vim.g.spellfile_URL = "https://ftp.nluug.nl/pub/vim/runtime/spell/"
+
+for k, v in pairs(options) do
+ vim.opt[k] = v
+end
diff --git a/nvim/.config/nvim/init.lua b/nvim/.config/nvim/init.lua
new file mode 100644
index 0000000..ae56b98
--- /dev/null
+++ b/nvim/.config/nvim/init.lua
@@ -0,0 +1,9 @@
+-- <leader> --
+vim.g.mapleader = " "
+vim.g.maplocalleader = "\\"
+-- </leader> --
+
+-- <init.config> --
+require("config.lazy")
+require("config.options")
+-- </init.config> --
diff --git a/nvim/.config/nvim/lua/.gitkeep b/nvim/.config/nvim/lua/.gitkeep
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/nvim/.config/nvim/lua/.gitkeep
diff --git a/nvim/.config/nvim/lua/autopairs.lua b/nvim/.config/nvim/lua/autopairs.lua
new file mode 100644
index 0000000..cd78d93
--- /dev/null
+++ b/nvim/.config/nvim/lua/autopairs.lua
@@ -0,0 +1,16 @@
+return {
+ "windwp/nvim-autopairs",
+ config = function()
+ require("nvim-autopairs").setup({})
+
+ local cmp_autopairs = require("nvim-autopairs.completion.cmp")
+ local cmp = require("cmp")
+
+ cmp.event:on(
+ "confirm_done",
+ cmp_autopairs.on_confirm_done()
+ )
+
+ end,
+}
+
diff --git a/nvim/.config/nvim/lua/comment.lua b/nvim/.config/nvim/lua/comment.lua
new file mode 100644
index 0000000..fe9adbe
--- /dev/null
+++ b/nvim/.config/nvim/lua/comment.lua
@@ -0,0 +1,6 @@
+return {
+ "numToStr/Comment.nvim",
+ opts = {},
+ lazy = false,
+}
+
diff --git a/nvim/.config/nvim/lua/lualine.lua b/nvim/.config/nvim/lua/lualine.lua
new file mode 100644
index 0000000..a5c341d
--- /dev/null
+++ b/nvim/.config/nvim/lua/lualine.lua
@@ -0,0 +1,34 @@
+return {
+ {
+ 'nvim-lualine/lualine.nvim',
+ event = 'VeryLazy',
+ opts = function()
+ return {
+ options = {
+ icons_enabled = true,
+ theme = 'gruvbox',
+ component_separators = { left = '', right = ''},
+ section_separators = { left = '', right = ''},
+ },
+ sections = {
+ lualine_c = {
+ { 'filename', path = 1 },
+ },
+ lualine_y = {
+ {
+ require('tmux-status').tmux_windows,
+ cond = require('tmux-status').show,
+ padding = { left = 1, right = 1 },
+ },
+ }
+ },
+ }
+ end,
+ },
+ {
+ "christopher-francisco/tmux-status.nvim",
+-- lazy = true,
+ opts = {},
+ },
+}
+
diff --git a/nvim/.config/nvim/lua/telescope.lua b/nvim/.config/nvim/lua/telescope.lua
new file mode 100644
index 0000000..47b0b36
--- /dev/null
+++ b/nvim/.config/nvim/lua/telescope.lua
@@ -0,0 +1,25 @@
+return {
+ "nvim-telescope/telescope.nvim",
+ branch = "0.1.x",
+ dependencies = {
+ "nvim-lua/plenary.nvim",
+ {
+ "nvim-telescope/telescope-fzf-native.nvim",
+ build = "make",
+ cond = function()
+ return vim.fn.executable "make" == 1
+ end,
+ },
+ },
+ config = function ()
+ pcall(require("telescope").load_extension, "fzf")
+ end,
+ opt = {
+ pickers = {
+ colorscheme = {
+ enable_preview = true
+ }
+ }
+ },
+}
+
diff --git a/nvim/.config/nvim/lua/theme.lua b/nvim/.config/nvim/lua/theme.lua
new file mode 100644
index 0000000..7f53fa8
--- /dev/null
+++ b/nvim/.config/nvim/lua/theme.lua
@@ -0,0 +1,9 @@
+return {
+ "ellisonleao/gruvbox.nvim",
+ opts = {
+ transparent_mode = true,
+ },
+ init = function()
+ vim.cmd("colorscheme gruvbox")
+ end
+}
diff --git a/nvim/.config/nvim/lua/whichkey.lua b/nvim/.config/nvim/lua/whichkey.lua
new file mode 100644
index 0000000..1173e06
--- /dev/null
+++ b/nvim/.config/nvim/lua/whichkey.lua
@@ -0,0 +1,6 @@
+return {
+ "folke/which-key.nvim",
+ event = "VeryLazy",
+ opts = {},
+}
+
diff --git a/ssh/.ssh/config b/ssh/.ssh/config
new file mode 100644
index 0000000..6470283
--- /dev/null
+++ b/ssh/.ssh/config
@@ -0,0 +1,14 @@
+Host coffee
+ User serve
+ ForwardAgent yes
+ Hostname outbound.liz.coffee
+
+Host coffee-one
+ User serve
+ ForwardAgent yes
+ Hostname outbound-one.liz.coffee
+
+Host coffee-src
+ User liz
+ Hostname src.liz.coffee
+ Port 2222
diff --git a/starship/.config/starship.toml b/starship/.config/starship.toml
new file mode 100644
index 0000000..1967fe4
--- /dev/null
+++ b/starship/.config/starship.toml
@@ -0,0 +1,53 @@
+format = """
+${custom.tztime} \
+$username\
+$hostname\
+$directory\
+$git_branch\
+$git_state\
+$git_status\
+$cmd_duration\
+$line_break\
+$character"""
+
+[username]
+show_always = true
+
+[hostname]
+ssh_only = false
+
+[directory]
+style = "blue"
+
+[character]
+success_symbol = "[λ](blue)"
+error_symbol = "[λ](red)"
+vimcmd_symbol = "[λ](green)"
+
+[git_branch]
+format = "[$branch]($style)"
+style = "bright-black"
+
+[git_status]
+format = "[[(*$conflicted$untracked$modified$staged$renamed$deleted)](218) ($ahead_behind$stashed)]($style)"
+style = "cyan"
+conflicted = "​"
+untracked = "​"
+modified = "​"
+staged = "​"
+renamed = "​"
+deleted = "​"
+stashed = "≡"
+
+[git_state]
+format = '\([$state( $progress_current/$progress_total)]($style)\) '
+style = "bright-black"
+
+[cmd_duration]
+format = "[$duration]($style) "
+style = "yellow"
+
+[custom.tztime]
+command = 'date +"%a %b %d %Y %l:%M%p (%Z%z)"'
+when = "true"
+format = '[\[$symbol($output)\]](green)'
diff --git a/theme/.config/theme/alacritty.toml b/theme/.config/theme/alacritty.toml
new file mode 100644
index 0000000..d3c158b
--- /dev/null
+++ b/theme/.config/theme/alacritty.toml
@@ -0,0 +1,4 @@
+[general]
+import = [
+ "~/.config/alacritty/alacritty-theme/themes/{{THEME}}.toml"
+]
diff --git a/tmux/.config/tmux/tmux.conf b/tmux/.config/tmux/tmux.conf
new file mode 100644
index 0000000..3f2862a
--- /dev/null
+++ b/tmux/.config/tmux/tmux.conf
@@ -0,0 +1,26 @@
+#-- <keybinds> --
+set -g prefix C-s
+
+unbind r
+bind r source-file ~/.config/tmux/tmux.conf
+
+bind-key h select-pane -L
+bind-key j select-pane -D
+bind-key k select-pane -U
+bind-key l select-pane -R
+#-- </keybinds> --
+
+#-- <plugins> --
+set -g @plugin 'tmux-plugins/tpm'
+set -g @plugin 'tmux-plugins/tmux-sensible'
+#-- </plugins> --
+
+#-- <theme> --
+set -g @plugin 'egel/tmux-gruvbox'
+set -g @tmux-gruvbox 'dark'
+#-- </theme> --
+
+#-- <tpm> --
+# keep at bottom
+run '~/.tmux/plugins/tpm/tpm'
+#-- </tpm> --
diff --git a/tmux/.tmux/plugins/tpm/.gitattributes b/tmux/.tmux/plugins/tpm/.gitattributes
new file mode 100644
index 0000000..80772e4
--- /dev/null
+++ b/tmux/.tmux/plugins/tpm/.gitattributes
@@ -0,0 +1,9 @@
+# Force text files to have unix eols, so Windows/Cygwin does not break them
+*.* eol=lf
+
+# These files are unfortunately not recognized as text files so
+# explicitly listing them here
+tpm eol=lf
+bin/* eol=lf
+bindings/* eol=lf
+tests/* eol=lf
diff --git a/tmux/.tmux/plugins/tpm/.gitignore b/tmux/.tmux/plugins/tpm/.gitignore
new file mode 100644
index 0000000..8a94156
--- /dev/null
+++ b/tmux/.tmux/plugins/tpm/.gitignore
@@ -0,0 +1,4 @@
+**/.vagrant/
+run_tests
+tests/run_tests_in_isolation
+tests/helpers/helpers.sh
diff --git a/tmux/.tmux/plugins/tpm/.gitmodules b/tmux/.tmux/plugins/tpm/.gitmodules
new file mode 100644
index 0000000..5e44e3c
--- /dev/null
+++ b/tmux/.tmux/plugins/tpm/.gitmodules
@@ -0,0 +1,3 @@
+[submodule "lib/tmux-test"]
+ path = lib/tmux-test
+ url = https://github.com/tmux-plugins/tmux-test.git
diff --git a/tmux/.tmux/plugins/tpm/.travis.yml b/tmux/.tmux/plugins/tpm/.travis.yml
new file mode 100644
index 0000000..ac45d8b
--- /dev/null
+++ b/tmux/.tmux/plugins/tpm/.travis.yml
@@ -0,0 +1,19 @@
+# generic packages and tmux
+before_install:
+ - sudo apt-get update
+ - sudo apt-get install -y git-core expect
+ - sudo apt-get install -y python-software-properties software-properties-common
+ - sudo apt-get install -y libevent-dev libncurses-dev
+ - git clone https://github.com/tmux/tmux.git
+ - cd tmux
+ - git checkout 2.0
+ - sh autogen.sh
+ - ./configure && make && sudo make install
+
+install:
+ - git fetch --unshallow --recurse-submodules || git fetch --recurse-submodules
+ # manual `git clone` required for testing `tmux-test` plugin itself
+ - git clone https://github.com/tmux-plugins/tmux-test lib/tmux-test; true
+ - lib/tmux-test/setup
+
+script: ./tests/run_tests_in_isolation
diff --git a/tmux/.tmux/plugins/tpm/CHANGELOG.md b/tmux/.tmux/plugins/tpm/CHANGELOG.md
new file mode 100644
index 0000000..a9ce81e
--- /dev/null
+++ b/tmux/.tmux/plugins/tpm/CHANGELOG.md
@@ -0,0 +1,86 @@
+# Changelog
+
+### master
+
+### v3.1.0, 2023-01-03
+- upgrade to new version of `tmux-test`
+- bug: when using `emacs` copy mode, Enter does not quit screen after tpm
+ installation/update. Fix by making `Escape` the key for emacs mode.
+- add a doc with troubleshooting instructions
+- add `.gitattributes` file that forces linefeed characters (classic `\n`) as
+ line endings - helps with misconfigured git on windows/cygwin
+- readme update: announce Cygwin support
+- un-deprecate old plugin definition syntax: `set -g @tpm_plugins`
+- More stuff, check `git log`.
+
+### v3.0.0, 2015-08-03
+- refactor `shared_set_tpm_path_constant` function
+- move all instructions to `docs/` dir
+- add `bin/install_plugins` cli executable script
+- improved test runner function
+- switch to using [tmux-test](https://github.com/tmux-plugins/tmux-test)
+ framework
+- add `bin/update_plugins` cli executable script
+- refactor test `expect` scripts, make them simpler and ensure they properly
+ assert expectations
+- refactor code that sets 'TMUX_PLUGIN_MANAGER_PATH' global env var
+- stop using global variable for 'tpm path'
+- support defining plugins via `set -g @plugin` in sourced files as well
+
+### v2.0.0, 2015-07-07
+- enable overriding default key bindings
+- start using `C-c` to clear screen
+- add uninstall/clean procedure and keybinding (prefix+alt+u) (@chilicuil)
+- add new `set @plugin 'repo'` plugin definition syntax (@chilicuil)
+- revert back to using `-g` flag in new plugin definition syntax
+- permit leading whitespace with new plugin definition syntax (thanks @chilicuil)
+- make sure `TMUX_PLUGIN_MANAGER_PATH` always has trailng slash
+- ensure old/deprecated plugin syntax `set -g @tpm_plugins` works alongside new
+ `set -g @plugin` syntax
+
+### v1.2.2, 2015-02-08
+- set GIT_TERMINAL_PROMPT=0 when doing `git clone`, `pull` or `submodule update`
+ to ensure git does not prompt for username/password in any case
+
+### v1.2.1, 2014-11-21
+- change the way plugin name is expanded. It now uses the http username
+ and password by default, like this: `https://git::@github.com/`. This prevents
+ username and password prompt (and subsequently tmux install hanging) with old
+ git versions. Fixes #7.
+
+### v1.2.0, 2014-11-20
+- refactor tests so they can be used on travis
+- add travis.yml, add travis badge to the readme
+
+### v1.1.0, 2014-11-19
+- if the plugin is not downloaded do not source it
+- remove `PLUGINS.md`, an obsolete list of plugins
+- update readme with instructions about uninstalling plugins
+- tilde char and `$HOME` in `TMUX_SHARED_MANAGER_PATH` couldn't be used because
+ they are just plain strings. Fixing the problem by manually expanding them.
+- bugfix: fragile `*.tmux` file globbing (@majutsushi)
+
+### v1.0.0, 2014-08-05
+- update readme because of github organization change to
+ [tmux-plugins](https://github.com/tmux-plugins)
+- update tests to pass
+- update README to suggest different first plugin
+- update list of plugins in the README
+- remove README 'about' section
+- move key binding to the main file. Delete `key_binding.sh`.
+- rename `display_message` -> `echo_message`
+- installing plugins installs just new plugins. Already installed plugins aren't
+ updated.
+- add 'update plugin' binding and functionality
+- add test for updating a plugin
+
+### v0.0.2, 2014-07-17
+- run all *.tmux plugin files as executables
+- fix all redirects to /dev/null
+- fix bug: TPM shared path is created before sync (cloning plugins from github
+ is done)
+- add test suite running in Vagrant
+- add Tmux version check. `TPM` won't run if Tmux version is less than 1.9.
+
+### v0.0.1, 2014-05-21
+- get TPM up and running
diff --git a/tmux/.tmux/plugins/tpm/HOW_TO_PLUGIN.md b/tmux/.tmux/plugins/tpm/HOW_TO_PLUGIN.md
new file mode 100644
index 0000000..9901619
--- /dev/null
+++ b/tmux/.tmux/plugins/tpm/HOW_TO_PLUGIN.md
@@ -0,0 +1,2 @@
+Instructions moved to
+[docs/how_to_create_plugin.md](docs/how_to_create_plugin.md).
diff --git a/tmux/.tmux/plugins/tpm/LICENSE.md b/tmux/.tmux/plugins/tpm/LICENSE.md
new file mode 100644
index 0000000..1222865
--- /dev/null
+++ b/tmux/.tmux/plugins/tpm/LICENSE.md
@@ -0,0 +1,20 @@
+MIT license
+Copyright (C) 2014 Bruno Sutic
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the "Software"),
+to deal in the Software without restriction, including without limitation
+the rights to use, copy, modify, merge, publish, distribute, sublicense,
+and/or sell copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
+OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/tmux/.tmux/plugins/tpm/README.md b/tmux/.tmux/plugins/tpm/README.md
new file mode 100644
index 0000000..2371863
--- /dev/null
+++ b/tmux/.tmux/plugins/tpm/README.md
@@ -0,0 +1,101 @@
+# Tmux Plugin Manager
+
+[![Build Status](https://travis-ci.org/tmux-plugins/tpm.svg?branch=master)](https://travis-ci.org/tmux-plugins/tpm)
+
+Installs and loads `tmux` plugins.
+
+Tested and working on Linux, OSX, and Cygwin.
+
+See list of plugins [here](https://github.com/tmux-plugins/list).
+
+### Installation
+
+Requirements: `tmux` version 1.9 (or higher), `git`, `bash`.
+
+Clone TPM:
+
+```bash
+git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm
+```
+
+Put this at the bottom of `~/.tmux.conf` (`$XDG_CONFIG_HOME/tmux/tmux.conf`
+works too):
+
+```bash
+# List of plugins
+set -g @plugin 'tmux-plugins/tpm'
+set -g @plugin 'tmux-plugins/tmux-sensible'
+
+# Other examples:
+# set -g @plugin 'github_username/plugin_name'
+# set -g @plugin 'github_username/plugin_name#branch'
+# set -g @plugin 'git@github.com:user/plugin'
+# set -g @plugin 'git@bitbucket.com:user/plugin'
+
+# Initialize TMUX plugin manager (keep this line at the very bottom of tmux.conf)
+run '~/.tmux/plugins/tpm/tpm'
+```
+
+Reload TMUX environment so TPM is sourced:
+
+```bash
+# type this in terminal if tmux is already running
+tmux source ~/.tmux.conf
+```
+
+That's it!
+
+### Installing plugins
+
+1. Add new plugin to `~/.tmux.conf` with `set -g @plugin '...'`
+2. Press `prefix` + <kbd>I</kbd> (capital i, as in **I**nstall) to fetch the plugin.
+
+You're good to go! The plugin was cloned to `~/.tmux/plugins/` dir and sourced.
+
+### Uninstalling plugins
+
+1. Remove (or comment out) plugin from the list.
+2. Press `prefix` + <kbd>alt</kbd> + <kbd>u</kbd> (lowercase u as in **u**ninstall) to remove the plugin.
+
+All the plugins are installed to `~/.tmux/plugins/` so alternatively you can
+find plugin directory there and remove it.
+
+### Key bindings
+
+`prefix` + <kbd>I</kbd>
+- Installs new plugins from GitHub or any other git repository
+- Refreshes TMUX environment
+
+`prefix` + <kbd>U</kbd>
+- updates plugin(s)
+
+`prefix` + <kbd>alt</kbd> + <kbd>u</kbd>
+- remove/uninstall plugins not on the plugin list
+
+### Docs
+
+- [Help, tpm not working](docs/tpm_not_working.md) - problem solutions
+
+More advanced features and instructions, regular users probably do not need
+this:
+
+- [How to create a plugin](docs/how_to_create_plugin.md). It's easy.
+- [Managing plugins via the command line](docs/managing_plugins_via_cmd_line.md)
+- [Changing plugins install dir](docs/changing_plugins_install_dir.md)
+- [Automatic TPM installation on a new machine](docs/automatic_tpm_installation.md)
+
+### Tests
+
+Tests for this project run on [Travis CI](https://travis-ci.org/tmux-plugins/tpm).
+
+When run locally, [vagrant](https://www.vagrantup.com/) is required.
+Run tests with:
+
+```bash
+# within project directory
+./run_tests
+```
+
+### License
+
+[MIT](LICENSE.md)
diff --git a/tmux/.tmux/plugins/tpm/bin/clean_plugins b/tmux/.tmux/plugins/tpm/bin/clean_plugins
new file mode 100755
index 0000000..12f8730
--- /dev/null
+++ b/tmux/.tmux/plugins/tpm/bin/clean_plugins
@@ -0,0 +1,14 @@
+#!/usr/bin/env bash
+
+# Script intended for use via the command line.
+#
+# `.tmux.conf` needs to be set for TPM. Tmux has to be installed on the system,
+# but does not need to be started in order to run this script.
+
+CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
+SCRIPTS_DIR="$CURRENT_DIR/../scripts"
+
+main() {
+ "$SCRIPTS_DIR/clean_plugins.sh" # has correct exit code
+}
+main
diff --git a/tmux/.tmux/plugins/tpm/bin/install_plugins b/tmux/.tmux/plugins/tpm/bin/install_plugins
new file mode 100755
index 0000000..c66b15b
--- /dev/null
+++ b/tmux/.tmux/plugins/tpm/bin/install_plugins
@@ -0,0 +1,14 @@
+#!/usr/bin/env bash
+
+# Script intended for use via the command line.
+#
+# `.tmux.conf` needs to be set for TPM. Tmux has to be installed on the system,
+# but does not need to be started in order to run this script.
+
+CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
+SCRIPTS_DIR="$CURRENT_DIR/../scripts"
+
+main() {
+ "$SCRIPTS_DIR/install_plugins.sh" # has correct exit code
+}
+main
diff --git a/tmux/.tmux/plugins/tpm/bin/update_plugins b/tmux/.tmux/plugins/tpm/bin/update_plugins
new file mode 100755
index 0000000..30a5646
--- /dev/null
+++ b/tmux/.tmux/plugins/tpm/bin/update_plugins
@@ -0,0 +1,24 @@
+#!/usr/bin/env bash
+
+# Script intended for use via the command line.
+#
+# `.tmux.conf` needs to be set for TPM. Tmux has to be installed on the system,
+# but does not need to be started in order to run this script.
+
+CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
+SCRIPTS_DIR="$CURRENT_DIR/../scripts"
+PROGRAM_NAME="$0"
+
+if [ $# -eq 0 ]; then
+ echo "usage:"
+ echo " $PROGRAM_NAME all update all plugins"
+ echo " $PROGRAM_NAME tmux-foo update plugin 'tmux-foo'"
+ echo " $PROGRAM_NAME tmux-bar tmux-baz update multiple plugins"
+ exit 1
+fi
+
+main() {
+ "$SCRIPTS_DIR/update_plugin.sh" --shell-echo "$*" # has correct exit code
+}
+main "$*"
+
diff --git a/tmux/.tmux/plugins/tpm/bindings/clean_plugins b/tmux/.tmux/plugins/tpm/bindings/clean_plugins
new file mode 100755
index 0000000..9a0d5d7
--- /dev/null
+++ b/tmux/.tmux/plugins/tpm/bindings/clean_plugins
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+
+# Tmux key-binding script.
+# Scripts intended to be used via the command line are in `bin/` directory.
+
+CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
+SCRIPTS_DIR="$CURRENT_DIR/../scripts"
+HELPERS_DIR="$SCRIPTS_DIR/helpers"
+
+source "$HELPERS_DIR/tmux_echo_functions.sh"
+source "$HELPERS_DIR/tmux_utils.sh"
+
+main() {
+ reload_tmux_environment
+ "$SCRIPTS_DIR/clean_plugins.sh" --tmux-echo >/dev/null 2>&1
+ reload_tmux_environment
+ end_message
+}
+main
diff --git a/tmux/.tmux/plugins/tpm/bindings/install_plugins b/tmux/.tmux/plugins/tpm/bindings/install_plugins
new file mode 100755
index 0000000..3ade3c4
--- /dev/null
+++ b/tmux/.tmux/plugins/tpm/bindings/install_plugins
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+
+# Tmux key-binding script.
+# Scripts intended to be used via the command line are in `bin/` directory.
+
+CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
+SCRIPTS_DIR="$CURRENT_DIR/../scripts"
+HELPERS_DIR="$SCRIPTS_DIR/helpers"
+
+source "$HELPERS_DIR/tmux_echo_functions.sh"
+source "$HELPERS_DIR/tmux_utils.sh"
+
+main() {
+ reload_tmux_environment
+ "$SCRIPTS_DIR/install_plugins.sh" --tmux-echo >/dev/null 2>&1
+ reload_tmux_environment
+ end_message
+}
+main
diff --git a/tmux/.tmux/plugins/tpm/bindings/update_plugins b/tmux/.tmux/plugins/tpm/bindings/update_plugins
new file mode 100755
index 0000000..28cc281
--- /dev/null
+++ b/tmux/.tmux/plugins/tpm/bindings/update_plugins
@@ -0,0 +1,49 @@
+#!/usr/bin/env bash
+
+# Tmux key-binding script.
+# Scripts intended to be used via the command line are in `bin/` directory.
+
+# This script:
+# - shows a list of installed plugins
+# - starts a prompt to enter the name of the plugin that will be updated
+
+CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
+SCRIPTS_DIR="$CURRENT_DIR/../scripts"
+HELPERS_DIR="$SCRIPTS_DIR/helpers"
+
+source "$HELPERS_DIR/plugin_functions.sh"
+source "$HELPERS_DIR/tmux_echo_functions.sh"
+source "$HELPERS_DIR/tmux_utils.sh"
+
+display_plugin_update_list() {
+ local plugins="$(tpm_plugins_list_helper)"
+ tmux_echo "Installed plugins:"
+ tmux_echo ""
+
+ for plugin in $plugins; do
+ # displaying only installed plugins
+ if plugin_already_installed "$plugin"; then
+ local plugin_name="$(plugin_name_helper "$plugin")"
+ tmux_echo " $plugin_name"
+ fi
+ done
+
+ tmux_echo ""
+ tmux_echo "Type plugin name to update it."
+ tmux_echo ""
+ tmux_echo "- \"all\" - updates all plugins"
+ tmux_echo "- ENTER - cancels"
+}
+
+update_plugin_prompt() {
+ tmux command-prompt -p 'plugin update:' " \
+ send-keys C-c; \
+ run-shell '$SCRIPTS_DIR/update_plugin_prompt_handler.sh %1'"
+}
+
+main() {
+ reload_tmux_environment
+ display_plugin_update_list
+ update_plugin_prompt
+}
+main
diff --git a/tmux/.tmux/plugins/tpm/docs/automatic_tpm_installation.md b/tmux/.tmux/plugins/tpm/docs/automatic_tpm_installation.md
new file mode 100644
index 0000000..630573f
--- /dev/null
+++ b/tmux/.tmux/plugins/tpm/docs/automatic_tpm_installation.md
@@ -0,0 +1,12 @@
+# Automatic tpm installation
+
+One of the first things we do on a new machine is cloning our dotfiles. Not everything comes with them though, so for example `tpm` most likely won't be installed.
+
+If you want to install `tpm` and plugins automatically when tmux is started, put the following snippet in `.tmux.conf` before the final `run '~/.tmux/plugins/tpm/tpm'`:
+
+```
+if "test ! -d ~/.tmux/plugins/tpm" \
+ "run 'git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm && ~/.tmux/plugins/tpm/bin/install_plugins'"
+```
+
+This useful tip was submitted by @acr4 and narfman0.
diff --git a/tmux/.tmux/plugins/tpm/docs/changing_plugins_install_dir.md b/tmux/.tmux/plugins/tpm/docs/changing_plugins_install_dir.md
new file mode 100644
index 0000000..27de96d
--- /dev/null
+++ b/tmux/.tmux/plugins/tpm/docs/changing_plugins_install_dir.md
@@ -0,0 +1,16 @@
+# Changing plugins install dir
+
+By default, TPM installs plugins in a subfolder named `plugins/` inside
+`$XDG_CONFIG_HOME/tmux/` if a `tmux.conf` file was found at that location, or
+inside `~/.tmux/` otherwise.
+
+You can change the install path by putting this in `.tmux.conf`:
+
+ set-environment -g TMUX_PLUGIN_MANAGER_PATH '/some/other/path/'
+
+Tmux plugin manager initialization in `.tmux.conf` should also be updated:
+
+ # initializes TMUX plugin manager in a new path
+ run /some/other/path/tpm/tpm
+
+Please make sure that the `run` line is at the very bottom of `.tmux.conf`.
diff --git a/tmux/.tmux/plugins/tpm/docs/how_to_create_plugin.md b/tmux/.tmux/plugins/tpm/docs/how_to_create_plugin.md
new file mode 100644
index 0000000..f7d9c13
--- /dev/null
+++ b/tmux/.tmux/plugins/tpm/docs/how_to_create_plugin.md
@@ -0,0 +1,108 @@
+# How to create Tmux plugins
+
+Creating a new plugin is easy.
+
+For demonstration purposes we'll create a simple plugin that lists all
+installed TPM plugins. Yes, a plugin that lists plugins :) We'll bind that to
+`prefix + T`.
+
+The source code for this example plugin can be found
+[here](https://github.com/tmux-plugins/tmux-example-plugin).
+
+### 1. create a new git project
+
+TPM depends on git for downloading and updating plugins.
+
+To create a new git project:
+
+ $ mkdir tmux_my_plugin
+ $ cd tmux_my_plugin
+ $ git init
+
+### 2. create a `*.tmux` plugin run file
+
+When it sources a plugin, TPM executes all `*.tmux` files in your plugins'
+directory. That's how plugins are run.
+
+Create a plugin run file in plugin directory:
+
+ $ touch my_plugin.tmux
+ $ chmod u+x my_plugin.tmux
+
+You can have more than one `*.tmux` file, and all will get executed. However, usually
+you'll need just one.
+
+### 3. create a plugin key binding
+
+We want the behavior of the plugin to trigger when a user hits `prefix + T`.
+
+Key `T` is chosen because:
+ - it's "kind of" a mnemonic for `TPM`
+ - the key is not used by Tmux natively. Tmux man page, KEY BINDINGS section
+ contains a list of all the bindings Tmux uses. There's plenty of unused keys
+ and we don't want to override any of Tmux default key bindings.
+
+Open the plugin run file in your favorite text editor:
+
+ $ vim my_plugin.tmux
+ # or
+ $ subl my_plugin.tmux
+
+Put the following content in the file:
+
+ #!/usr/bin/env bash
+
+ CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
+ tmux bind-key T run-shell "$CURRENT_DIR/scripts/tmux_list_plugins.sh"
+
+As you can see, plugin run file is a simple bash script that sets up the binding.
+
+When pressed, `prefix + T` will execute another shell script:
+`tmux_list_plugins.sh`. That script should be in `scripts/` directory -
+relative to the plugin run file.
+
+
+### 4. listing plugins
+
+Now that we have the binding, let's create a script that's invoked with
+`prefix + T`.
+
+ $ mkdir scripts
+ $ touch scripts/tmux_list_plugins.sh
+ $ chmod u+x scripts/tmux_list_plugins.sh
+
+And here's the script content:
+
+ #!/usr/bin/env bash
+
+ # fetching the directory where plugins are installed
+ plugin_path="$(tmux show-env -g TMUX_PLUGIN_MANAGER_PATH | cut -f2 -d=)"
+
+ # listing installed plugins
+ ls -1 "$plugin_path"
+
+### 5. try it out
+
+To see if this works, execute the plugin run file:
+
+ $ ./my_plugin.tmux
+
+That should set up the key binding. Now hit `prefix + T` and see if it works.
+
+### 6. publish the plugin
+
+When everything is ready, push the plugin to an online git repository,
+preferably GitHub.
+
+Other users can install your plugin by just adding plugin git URL to the
+`@plugin` list in their `.tmux.conf`.
+
+If the plugin is on GitHub, your users will be able to use the shorthand of
+`github_username/repository`.
+
+### Conclusion
+
+Hopefully, that was easy. As you can see, it's mostly shell scripting.
+
+You can use other scripting languages (ruby, python etc) but plain old shell
+is preferred because of portability.
diff --git a/tmux/.tmux/plugins/tpm/docs/managing_plugins_via_cmd_line.md b/tmux/.tmux/plugins/tpm/docs/managing_plugins_via_cmd_line.md
new file mode 100644
index 0000000..7aefd7d
--- /dev/null
+++ b/tmux/.tmux/plugins/tpm/docs/managing_plugins_via_cmd_line.md
@@ -0,0 +1,36 @@
+# Managing plugins via the command line
+
+Aside from tmux key bindings, TPM provides shell interface for managing plugins
+via scripts located in [bin/](../bin/) directory.
+
+Tmux does not need to be started in order to run scripts (but it's okay if it
+is). If you [changed tpm install dir](../docs/changing_plugins_install_dir.md)
+in `.tmux.conf` that should work fine too.
+
+Prerequisites:
+
+- tmux installed on the system (doh)
+- `.tmux.conf` set up for TPM
+
+### Installing plugins
+
+As usual, plugins need to be specified in `.tmux.conf`. Run the following
+command to install plugins:
+
+ ~/.tmux/plugins/tpm/bin/install_plugins
+
+### Updating plugins
+
+To update all installed plugins:
+
+ ~/.tmux/plugins/tpm/bin/update_plugins all
+
+or update a single plugin:
+
+ ~/.tmux/plugins/tpm/bin/update_plugins tmux-sensible
+
+### Removing plugins
+
+To remove plugins not on the plugin list:
+
+ ~/.tmux/plugins/tpm/bin/clean_plugins
diff --git a/tmux/.tmux/plugins/tpm/docs/tpm_not_working.md b/tmux/.tmux/plugins/tpm/docs/tpm_not_working.md
new file mode 100644
index 0000000..6680291
--- /dev/null
+++ b/tmux/.tmux/plugins/tpm/docs/tpm_not_working.md
@@ -0,0 +1,102 @@
+# Help, tpm not working!
+
+Here's the list of issues users had with `tpm`:
+
+<hr />
+
+> Nothing works. `tpm` key bindings `prefix + I`, `prefix + U` not even
+ defined.
+
+Related [issue #22](https://github.com/tmux-plugins/tpm/issues/22)
+
+- Do you have required `tmux` version to run `tpm`?<br/>
+ Check `tmux` version with `$ tmux -V` command and make sure it's higher or
+ equal to the required version for `tpm` as stated in the readme.
+
+- ZSH tmux plugin might be causing issues.<br/>
+ If you have it installed, try disabling it and see if `tpm` works then.
+
+<hr />
+
+> Help, I'm using custom config file with `tmux -f /path/to/my_tmux.conf`
+to start Tmux and for some reason plugins aren't loaded!?
+
+Related [issue #57](https://github.com/tmux-plugins/tpm/issues/57)
+
+`tpm` has a known issue when using custom config file with `-f` option.
+The solution is to use alternative plugin definition syntax. Here are the steps
+to make it work:
+
+1. remove all `set -g @plugin` lines from tmux config file
+2. in the config file define the plugins in the following way:
+
+ # List of plugins
+ set -g @tpm_plugins ' \
+ tmux-plugins/tpm \
+ tmux-plugins/tmux-sensible \
+ tmux-plugins/tmux-resurrect \
+ '
+
+ # Initialize TMUX plugin manager (keep this line at the very bottom of tmux.conf)
+ run '~/.tmux/plugins/tpm/tpm'
+
+3. Reload TMUX environment so TPM is sourced: `$ tmux source /path/to/my_tmux.conf`
+
+The plugins should now be working.
+
+<hr />
+
+> Weird sequence of characters show up when installing or updating plugins
+
+Related: [issue #25](https://github.com/tmux-plugins/tpm/issues/25)
+
+- This could be caused by [tmuxline.vim](https://github.com/edkolev/tmuxline.vim)
+ plugin. Uninstall it and see if things work.
+
+<hr />
+
+> "failed to connect to server" error when sourcing .tmux.conf
+
+Related: [issue #48](https://github.com/tmux-plugins/tpm/issues/48)
+
+- Make sure `tmux source ~/.tmux.conf` command is ran from inside `tmux`.
+
+<hr />
+
+> tpm not working: '~/.tmux/plugins/tpm/tpm' returned 2 (Windows / Cygwin)
+
+Related: [issue #81](https://github.com/tmux-plugins/tpm/issues/81)
+
+This issue is most likely caused by Windows line endings. For example, if you
+have git's `core.autocrlf` option set to `true`, git will automatically convert
+all the files to Windows line endings which might cause a problem.
+
+The solution is to convert all line ending to Unix newline characters. This
+command handles that for all files under `.tmux/` dir (skips `.git`
+subdirectories):
+
+```bash
+find ~/.tmux -type d -name '.git*' -prune -o -type f -print0 | xargs -0 dos2unix
+```
+
+<hr />
+
+> '~/.tmux/plugins/tpm/tpm' returned 127 (on macOS, w/ tmux installed using brew)
+
+Related: [issue #67](https://github.com/tmux-plugins/tpm/issues/67)
+
+This problem is because tmux's `run-shell` command runs a shell which doesn't read from user configs, thus tmux installed in a brew prefix (e.g. `/usr/local/bin`) will not be found.
+
+The solution is to find your brew prefix
+
+```sh
+> echo "$(brew --prefix)/bin"
+/opt/homebrew/bin
+```
+
+And prepend it to the `PATH` environment variable
+```
+set-environment -g PATH "/opt/homebrew/bin:/bin:/usr/bin"
+```
+
+before any `run-shell`/`run` commands in `~/.tmux.conf`.
diff --git a/tmux/.tmux/plugins/tpm/scripts/check_tmux_version.sh b/tmux/.tmux/plugins/tpm/scripts/check_tmux_version.sh
new file mode 100755
index 0000000..b0aedec
--- /dev/null
+++ b/tmux/.tmux/plugins/tpm/scripts/check_tmux_version.sh
@@ -0,0 +1,78 @@
+#!/usr/bin/env bash
+
+VERSION="$1"
+UNSUPPORTED_MSG="$2"
+
+get_tmux_option() {
+ local option=$1
+ local default_value=$2
+ local option_value=$(tmux show-option -gqv "$option")
+ if [ -z "$option_value" ]; then
+ echo "$default_value"
+ else
+ echo "$option_value"
+ fi
+}
+
+# Ensures a message is displayed for 5 seconds in tmux prompt.
+# Does not override the 'display-time' tmux option.
+display_message() {
+ local message="$1"
+
+ # display_duration defaults to 5 seconds, if not passed as an argument
+ if [ "$#" -eq 2 ]; then
+ local display_duration="$2"
+ else
+ local display_duration="5000"
+ fi
+
+ # saves user-set 'display-time' option
+ local saved_display_time=$(get_tmux_option "display-time" "750")
+
+ # sets message display time to 5 seconds
+ tmux set-option -gq display-time "$display_duration"
+
+ # displays message
+ tmux display-message "$message"
+
+ # restores original 'display-time' value
+ tmux set-option -gq display-time "$saved_display_time"
+}
+
+# this is used to get "clean" integer version number. Examples:
+# `tmux 1.9` => `19`
+# `1.9a` => `19`
+get_digits_from_string() {
+ local string="$1"
+ local only_digits="$(echo "$string" | tr -dC '[:digit:]')"
+ echo "$only_digits"
+}
+
+tmux_version_int() {
+ local tmux_version_string=$(tmux -V)
+ echo "$(get_digits_from_string "$tmux_version_string")"
+}
+
+unsupported_version_message() {
+ if [ -n "$UNSUPPORTED_MSG" ]; then
+ echo "$UNSUPPORTED_MSG"
+ else
+ echo "Error, Tmux version unsupported! Please install Tmux version $VERSION or greater!"
+ fi
+}
+
+exit_if_unsupported_version() {
+ local current_version="$1"
+ local supported_version="$2"
+ if [ "$current_version" -lt "$supported_version" ]; then
+ display_message "$(unsupported_version_message)"
+ exit 1
+ fi
+}
+
+main() {
+ local supported_version_int="$(get_digits_from_string "$VERSION")"
+ local current_version_int="$(tmux_version_int)"
+ exit_if_unsupported_version "$current_version_int" "$supported_version_int"
+}
+main
diff --git a/tmux/.tmux/plugins/tpm/scripts/clean_plugins.sh b/tmux/.tmux/plugins/tpm/scripts/clean_plugins.sh
new file mode 100755
index 0000000..a025524
--- /dev/null
+++ b/tmux/.tmux/plugins/tpm/scripts/clean_plugins.sh
@@ -0,0 +1,41 @@
+#!/usr/bin/env bash
+
+CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
+HELPERS_DIR="$CURRENT_DIR/helpers"
+
+source "$HELPERS_DIR/plugin_functions.sh"
+source "$HELPERS_DIR/utility.sh"
+
+if [ "$1" == "--tmux-echo" ]; then # tmux-specific echo functions
+ source "$HELPERS_DIR/tmux_echo_functions.sh"
+else # shell output functions
+ source "$HELPERS_DIR/shell_echo_functions.sh"
+fi
+
+clean_plugins() {
+ local plugins plugin plugin_directory
+ plugins="$(tpm_plugins_list_helper)"
+
+ for plugin_directory in "$(tpm_path)"/*; do
+ [ -d "${plugin_directory}" ] || continue
+ plugin="$(plugin_name_helper "${plugin_directory}")"
+ case "${plugins}" in
+ *"${plugin}"*) : ;;
+ *)
+ [ "${plugin}" = "tpm" ] && continue
+ echo_ok "Removing \"$plugin\""
+ rm -rf "${plugin_directory}" >/dev/null 2>&1
+ [ -d "${plugin_directory}" ] &&
+ echo_err " \"$plugin\" clean fail" ||
+ echo_ok " \"$plugin\" clean success"
+ ;;
+ esac
+ done
+}
+
+main() {
+ ensure_tpm_path_exists
+ clean_plugins
+ exit_value_helper
+}
+main
diff --git a/tmux/.tmux/plugins/tpm/scripts/helpers/plugin_functions.sh b/tmux/.tmux/plugins/tpm/scripts/helpers/plugin_functions.sh
new file mode 100644
index 0000000..f33d215
--- /dev/null
+++ b/tmux/.tmux/plugins/tpm/scripts/helpers/plugin_functions.sh
@@ -0,0 +1,104 @@
+# using @tpm_plugins is now deprecated in favor of using @plugin syntax
+tpm_plugins_variable_name="@tpm_plugins"
+
+# manually expanding tilde char or `$HOME` variable.
+_manual_expansion() {
+ local path="$1"
+ local expanded_tilde="${path/#\~/$HOME}"
+ echo "${expanded_tilde/#\$HOME/$HOME}"
+}
+
+_tpm_path() {
+ local string_path="$(tmux start-server\; show-environment -g TMUX_PLUGIN_MANAGER_PATH | cut -f2 -d=)/"
+ _manual_expansion "$string_path"
+}
+
+_CACHED_TPM_PATH="$(_tpm_path)"
+
+# Get the absolute path to the users configuration file of TMux.
+# This includes a prioritized search on different locations.
+#
+_get_user_tmux_conf() {
+ # Define the different possible locations.
+ xdg_location="${XDG_CONFIG_HOME:-$HOME/.config}/tmux/tmux.conf"
+ default_location="$HOME/.tmux.conf"
+
+ # Search for the correct configuration file by priority.
+ if [ -f "$xdg_location" ]; then
+ echo "$xdg_location"
+
+ else
+ echo "$default_location"
+ fi
+}
+
+_tmux_conf_contents() {
+ user_config=$(_get_user_tmux_conf)
+ cat /etc/tmux.conf "$user_config" 2>/dev/null
+ if [ "$1" == "full" ]; then # also output content from sourced files
+ local file
+ for file in $(_sourced_files); do
+ cat $(_manual_expansion "$file") 2>/dev/null
+ done
+ fi
+}
+
+# return files sourced from tmux config files
+_sourced_files() {
+ _tmux_conf_contents |
+ sed -E -n -e "s/^[[:space:]]*source(-file)?[[:space:]]+(-q+[[:space:]]+)?['\"]?([^'\"]+)['\"]?/\3/p"
+}
+
+# Want to be able to abort in certain cases
+trap "exit 1" TERM
+export TOP_PID=$$
+
+_fatal_error_abort() {
+ echo >&2 "Aborting."
+ kill -s TERM $TOP_PID
+}
+
+# PUBLIC FUNCTIONS BELOW
+
+tpm_path() {
+ if [ "$_CACHED_TPM_PATH" == "/" ]; then
+ echo >&2 "FATAL: Tmux Plugin Manager not configured in tmux.conf"
+ _fatal_error_abort
+ fi
+ echo "$_CACHED_TPM_PATH"
+}
+
+tpm_plugins_list_helper() {
+ # lists plugins from @tpm_plugins option
+ echo "$(tmux start-server\; show-option -gqv "$tpm_plugins_variable_name")"
+
+ # read set -g @plugin "tmux-plugins/tmux-example-plugin" entries
+ _tmux_conf_contents "full" |
+ awk '/^[ \t]*set(-option)? +-g +@plugin/ { gsub(/'\''/,""); gsub(/'\"'/,""); print $4 }'
+}
+
+# Allowed plugin name formats:
+# 1. "git://github.com/user/plugin_name.git"
+# 2. "user/plugin_name"
+plugin_name_helper() {
+ local plugin="$1"
+ # get only the part after the last slash, e.g. "plugin_name.git"
+ local plugin_basename="$(basename "$plugin")"
+ # remove ".git" extension (if it exists) to get only "plugin_name"
+ local plugin_name="${plugin_basename%.git}"
+ echo "$plugin_name"
+}
+
+plugin_path_helper() {
+ local plugin="$1"
+ local plugin_name="$(plugin_name_helper "$plugin")"
+ echo "$(tpm_path)${plugin_name}/"
+}
+
+plugin_already_installed() {
+ local plugin="$1"
+ local plugin_path="$(plugin_path_helper "$plugin")"
+ [ -d "$plugin_path" ] &&
+ cd "$plugin_path" &&
+ git remote >/dev/null 2>&1
+}
diff --git a/tmux/.tmux/plugins/tpm/scripts/helpers/shell_echo_functions.sh b/tmux/.tmux/plugins/tpm/scripts/helpers/shell_echo_functions.sh
new file mode 100644
index 0000000..ecaa37e
--- /dev/null
+++ b/tmux/.tmux/plugins/tpm/scripts/helpers/shell_echo_functions.sh
@@ -0,0 +1,7 @@
+echo_ok() {
+ echo "$*"
+}
+
+echo_err() {
+ fail_helper "$*"
+}
diff --git a/tmux/.tmux/plugins/tpm/scripts/helpers/tmux_echo_functions.sh b/tmux/.tmux/plugins/tpm/scripts/helpers/tmux_echo_functions.sh
new file mode 100644
index 0000000..7a6ef0a
--- /dev/null
+++ b/tmux/.tmux/plugins/tpm/scripts/helpers/tmux_echo_functions.sh
@@ -0,0 +1,28 @@
+_has_emacs_mode_keys() {
+ $(tmux show -gw mode-keys | grep -q emacs)
+}
+
+tmux_echo() {
+ local message="$1"
+ tmux run-shell "echo '$message'"
+}
+
+echo_ok() {
+ tmux_echo "$*"
+}
+
+echo_err() {
+ tmux_echo "$*"
+}
+
+end_message() {
+ if _has_emacs_mode_keys; then
+ local continue_key="ESCAPE"
+ else
+ local continue_key="ENTER"
+ fi
+ tmux_echo ""
+ tmux_echo "TMUX environment reloaded."
+ tmux_echo ""
+ tmux_echo "Done, press $continue_key to continue."
+}
diff --git a/tmux/.tmux/plugins/tpm/scripts/helpers/tmux_utils.sh b/tmux/.tmux/plugins/tpm/scripts/helpers/tmux_utils.sh
new file mode 100644
index 0000000..238952d
--- /dev/null
+++ b/tmux/.tmux/plugins/tpm/scripts/helpers/tmux_utils.sh
@@ -0,0 +1,6 @@
+HELPERS_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
+source "$HELPERS_DIR/plugin_functions.sh"
+
+reload_tmux_environment() {
+ tmux source-file $(_get_user_tmux_conf) >/dev/null 2>&1
+}
diff --git a/tmux/.tmux/plugins/tpm/scripts/helpers/utility.sh b/tmux/.tmux/plugins/tpm/scripts/helpers/utility.sh
new file mode 100644
index 0000000..de6eb35
--- /dev/null
+++ b/tmux/.tmux/plugins/tpm/scripts/helpers/utility.sh
@@ -0,0 +1,17 @@
+ensure_tpm_path_exists() {
+ mkdir -p "$(tpm_path)"
+}
+
+fail_helper() {
+ local message="$1"
+ echo "$message" >&2
+ FAIL="true"
+}
+
+exit_value_helper() {
+ if [ "$FAIL" == "true" ]; then
+ exit 1
+ else
+ exit 0
+ fi
+}
diff --git a/tmux/.tmux/plugins/tpm/scripts/install_plugins.sh b/tmux/.tmux/plugins/tpm/scripts/install_plugins.sh
new file mode 100755
index 0000000..e2450ac
--- /dev/null
+++ b/tmux/.tmux/plugins/tpm/scripts/install_plugins.sh
@@ -0,0 +1,75 @@
+#!/usr/bin/env bash
+
+CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
+HELPERS_DIR="$CURRENT_DIR/helpers"
+
+source "$HELPERS_DIR/plugin_functions.sh"
+source "$HELPERS_DIR/utility.sh"
+
+if [ "$1" == "--tmux-echo" ]; then # tmux-specific echo functions
+ source "$HELPERS_DIR/tmux_echo_functions.sh"
+else # shell output functions
+ source "$HELPERS_DIR/shell_echo_functions.sh"
+fi
+
+clone() {
+ local plugin="$1"
+ local branch="$2"
+ if [ -n "$branch" ]; then
+ cd "$(tpm_path)" &&
+ GIT_TERMINAL_PROMPT=0 git clone -b "$branch" --single-branch --recursive "$plugin" >/dev/null 2>&1
+ else
+ cd "$(tpm_path)" &&
+ GIT_TERMINAL_PROMPT=0 git clone --single-branch --recursive "$plugin" >/dev/null 2>&1
+ fi
+}
+
+# tries cloning:
+# 1. plugin name directly - works if it's a valid git url
+# 2. expands the plugin name to point to a GitHub repo and tries cloning again
+clone_plugin() {
+ local plugin="$1"
+ local branch="$2"
+ clone "$plugin" "$branch" ||
+ clone "https://git::@github.com/$plugin" "$branch"
+}
+
+# clone plugin and produce output
+install_plugin() {
+ local plugin="$1"
+ local branch="$2"
+ local plugin_name="$(plugin_name_helper "$plugin")"
+
+ if plugin_already_installed "$plugin"; then
+ echo_ok "Already installed \"$plugin_name\""
+ else
+ echo_ok "Installing \"$plugin_name\""
+ clone_plugin "$plugin" "$branch" &&
+ echo_ok " \"$plugin_name\" download success" ||
+ echo_err " \"$plugin_name\" download fail"
+ fi
+}
+
+install_plugins() {
+ local plugins="$(tpm_plugins_list_helper)"
+ for plugin in $plugins; do
+ IFS='#' read -ra plugin <<< "$plugin"
+ install_plugin "${plugin[0]}" "${plugin[1]}"
+ done
+}
+
+verify_tpm_path_permissions() {
+ local path="$(tpm_path)"
+ # check the write permission flag for all users to ensure
+ # that we have proper access
+ [ -w "$path" ] ||
+ echo_err "$path is not writable!"
+}
+
+main() {
+ ensure_tpm_path_exists
+ verify_tpm_path_permissions
+ install_plugins
+ exit_value_helper
+}
+main
diff --git a/tmux/.tmux/plugins/tpm/scripts/source_plugins.sh b/tmux/.tmux/plugins/tpm/scripts/source_plugins.sh
new file mode 100755
index 0000000..6381d54
--- /dev/null
+++ b/tmux/.tmux/plugins/tpm/scripts/source_plugins.sh
@@ -0,0 +1,42 @@
+#!/usr/bin/env bash
+
+CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
+HELPERS_DIR="$CURRENT_DIR/helpers"
+
+source "$HELPERS_DIR/plugin_functions.sh"
+
+plugin_dir_exists() {
+ [ -d "$1" ]
+}
+
+# Runs all *.tmux files from the plugin directory.
+# Files are ran as executables.
+# No errors if the plugin dir does not exist.
+silently_source_all_tmux_files() {
+ local plugin_path="$1"
+ local plugin_tmux_files="$plugin_path*.tmux"
+ if plugin_dir_exists "$plugin_path"; then
+ for tmux_file in $plugin_tmux_files; do
+ # if the glob didn't find any files this will be the
+ # unexpanded glob which obviously doesn't exist
+ [ -f "$tmux_file" ] || continue
+ # runs *.tmux file as an executable
+ $tmux_file >/dev/null 2>&1
+ done
+ fi
+}
+
+source_plugins() {
+ local plugin plugin_path
+ local plugins="$(tpm_plugins_list_helper)"
+ for plugin in $plugins; do
+ IFS='#' read -ra plugin <<< "$plugin"
+ plugin_path="$(plugin_path_helper "${plugin[0]}")"
+ silently_source_all_tmux_files "$plugin_path"
+ done
+}
+
+main() {
+ source_plugins
+}
+main
diff --git a/tmux/.tmux/plugins/tpm/scripts/update_plugin.sh b/tmux/.tmux/plugins/tpm/scripts/update_plugin.sh
new file mode 100755
index 0000000..e533664
--- /dev/null
+++ b/tmux/.tmux/plugins/tpm/scripts/update_plugin.sh
@@ -0,0 +1,78 @@
+#!/usr/bin/env bash
+
+# this script handles core logic of updating plugins
+
+CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
+HELPERS_DIR="$CURRENT_DIR/helpers"
+
+source "$HELPERS_DIR/plugin_functions.sh"
+source "$HELPERS_DIR/utility.sh"
+
+if [ "$1" == "--tmux-echo" ]; then # tmux-specific echo functions
+ source "$HELPERS_DIR/tmux_echo_functions.sh"
+else # shell output functions
+ source "$HELPERS_DIR/shell_echo_functions.sh"
+fi
+
+# from now on ignore first script argument
+shift
+
+pull_changes() {
+ local plugin="$1"
+ local plugin_path="$(plugin_path_helper "$plugin")"
+ cd "$plugin_path" &&
+ GIT_TERMINAL_PROMPT=0 git pull &&
+ GIT_TERMINAL_PROMPT=0 git submodule update --init --recursive
+}
+
+update() {
+ local plugin="$1" output
+ output=$(pull_changes "$plugin" 2>&1)
+ if (( $? == 0 )); then
+ echo_ok " \"$plugin\" update success"
+ echo_ok "$(echo "$output" | sed -e 's/^/ | /')"
+ else
+ echo_err " \"$plugin\" update fail"
+ echo_err "$(echo "$output" | sed -e 's/^/ | /')"
+ fi
+}
+
+update_all() {
+ echo_ok "Updating all plugins!"
+ echo_ok ""
+ local plugins="$(tpm_plugins_list_helper)"
+ for plugin in $plugins; do
+ IFS='#' read -ra plugin <<< "$plugin"
+ local plugin_name="$(plugin_name_helper "${plugin[0]}")"
+ # updating only installed plugins
+ if plugin_already_installed "$plugin_name"; then
+ update "$plugin_name" &
+ fi
+ done
+ wait
+}
+
+update_plugins() {
+ local plugins="$*"
+ for plugin in $plugins; do
+ IFS='#' read -ra plugin <<< "$plugin"
+ local plugin_name="$(plugin_name_helper "${plugin[0]}")"
+ if plugin_already_installed "$plugin_name"; then
+ update "$plugin_name" &
+ else
+ echo_err "$plugin_name not installed!" &
+ fi
+ done
+ wait
+}
+
+main() {
+ ensure_tpm_path_exists
+ if [ "$1" == "all" ]; then
+ update_all
+ else
+ update_plugins "$*"
+ fi
+ exit_value_helper
+}
+main "$*"
diff --git a/tmux/.tmux/plugins/tpm/scripts/update_plugin_prompt_handler.sh b/tmux/.tmux/plugins/tpm/scripts/update_plugin_prompt_handler.sh
new file mode 100755
index 0000000..5e1f7d9
--- /dev/null
+++ b/tmux/.tmux/plugins/tpm/scripts/update_plugin_prompt_handler.sh
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+
+CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
+HELPERS_DIR="$CURRENT_DIR/helpers"
+
+if [ $# -eq 0 ]; then
+ exit 0
+fi
+
+source "$HELPERS_DIR/tmux_echo_functions.sh"
+source "$HELPERS_DIR/tmux_utils.sh"
+
+main() {
+ "$CURRENT_DIR/update_plugin.sh" --tmux-echo "$*"
+ reload_tmux_environment
+ end_message
+}
+main "$*"
diff --git a/tmux/.tmux/plugins/tpm/scripts/variables.sh b/tmux/.tmux/plugins/tpm/scripts/variables.sh
new file mode 100644
index 0000000..5601a86
--- /dev/null
+++ b/tmux/.tmux/plugins/tpm/scripts/variables.sh
@@ -0,0 +1,13 @@
+install_key_option="@tpm-install"
+default_install_key="I"
+
+update_key_option="@tpm-update"
+default_update_key="U"
+
+clean_key_option="@tpm-clean"
+default_clean_key="M-u"
+
+SUPPORTED_TMUX_VERSION="1.9"
+
+DEFAULT_TPM_ENV_VAR_NAME="TMUX_PLUGIN_MANAGER_PATH"
+DEFAULT_TPM_PATH="$HOME/.tmux/plugins/"
diff --git a/tmux/.tmux/plugins/tpm/tests/expect_failed_plugin_download b/tmux/.tmux/plugins/tpm/tests/expect_failed_plugin_download
new file mode 100755
index 0000000..b970477
--- /dev/null
+++ b/tmux/.tmux/plugins/tpm/tests/expect_failed_plugin_download
@@ -0,0 +1,36 @@
+#!/usr/bin/env expect
+
+# disables script output
+log_user 0
+
+spawn tmux
+
+# Waiting for tmux to attach. If this is not done, next command, `send` will
+# not work properly.
+sleep 1
+
+# this is tmux prefix + I
+send "I"
+
+# cloning might take a while
+set timeout 20
+
+expect_after {
+ timeout { exit 1 }
+}
+
+expect {
+ "Installing \"non-existing-plugin\""
+}
+
+expect {
+ "\"non-existing-plugin\" download fail"
+}
+
+expect {
+ "Done, press ENTER to continue" {
+ exit 0
+ }
+}
+
+exit 1
diff --git a/tmux/.tmux/plugins/tpm/tests/expect_successful_clean_plugins b/tmux/.tmux/plugins/tpm/tests/expect_successful_clean_plugins
new file mode 100755
index 0000000..987c49d
--- /dev/null
+++ b/tmux/.tmux/plugins/tpm/tests/expect_successful_clean_plugins
@@ -0,0 +1,35 @@
+#!/usr/bin/env expect
+
+# disables script output
+log_user 0
+
+spawn tmux
+
+# Waiting for tmux to attach. If this is not done, next command, `send` will
+# not work properly.
+sleep 1
+
+# this is tmux prefix + alt + u
+send "u"
+
+set timeout 5
+
+expect_after {
+ timeout { exit 1 }
+}
+
+expect {
+ "Removing \"tmux-example-plugin\""
+}
+
+expect {
+ "\"tmux-example-plugin\" clean success"
+}
+
+expect {
+ "Done, press ENTER to continue." {
+ exit 0
+ }
+}
+
+exit 1
diff --git a/tmux/.tmux/plugins/tpm/tests/expect_successful_multiple_plugins_download b/tmux/.tmux/plugins/tpm/tests/expect_successful_multiple_plugins_download
new file mode 100755
index 0000000..cc87a26
--- /dev/null
+++ b/tmux/.tmux/plugins/tpm/tests/expect_successful_multiple_plugins_download
@@ -0,0 +1,44 @@
+#!/usr/bin/env expect
+
+# disables script output
+log_user 0
+
+spawn tmux
+
+# Waiting for tmux to attach. If this is not done, next command, `send` will
+# not work properly.
+sleep 1
+
+# this is tmux prefix + I
+send "I"
+
+# cloning might take a while
+set timeout 15
+
+expect_after {
+ timeout { exit 1 }
+}
+
+expect {
+ "Installing \"tmux-example-plugin\""
+}
+
+expect {
+ "\"tmux-example-plugin\" download success"
+}
+
+expect {
+ "Installing \"tmux-copycat\""
+}
+
+expect {
+ "\"tmux-copycat\" download success"
+}
+
+expect {
+ "Done, press ENTER to continue." {
+ exit 0
+ }
+}
+
+exit 1
diff --git a/tmux/.tmux/plugins/tpm/tests/expect_successful_plugin_download b/tmux/.tmux/plugins/tpm/tests/expect_successful_plugin_download
new file mode 100755
index 0000000..388f05d
--- /dev/null
+++ b/tmux/.tmux/plugins/tpm/tests/expect_successful_plugin_download
@@ -0,0 +1,50 @@
+#!/usr/bin/env expect
+
+# disables script output
+log_user 0
+
+spawn tmux
+
+# Waiting for tmux to attach. If this is not done, next command, `send` will
+# not work properly.
+sleep 1
+
+# this is tmux prefix + I
+send "I"
+
+# cloning might take a while
+set timeout 15
+
+expect_after {
+ timeout { exit 1 }
+}
+
+expect {
+ "Installing \"tmux-example-plugin\""
+}
+
+expect {
+ "\"tmux-example-plugin\" download success"
+}
+
+expect {
+ "Done, press ENTER to continue" {
+ send " "
+ }
+}
+
+sleep 1
+# this is tmux prefix + I
+send "I"
+
+expect {
+ "Already installed \"tmux-example-plugin\""
+}
+
+expect {
+ "Done, press ENTER to continue" {
+ exit 0
+ }
+}
+
+exit 1
diff --git a/tmux/.tmux/plugins/tpm/tests/expect_successful_update_of_a_single_plugin b/tmux/.tmux/plugins/tpm/tests/expect_successful_update_of_a_single_plugin
new file mode 100755
index 0000000..bcd64fe
--- /dev/null
+++ b/tmux/.tmux/plugins/tpm/tests/expect_successful_update_of_a_single_plugin
@@ -0,0 +1,55 @@
+#!/usr/bin/env expect
+
+# disables script output
+log_user 0
+
+spawn tmux
+
+# Waiting for tmux to attach. If this is not done, next command, `send` will
+# not work properly.
+sleep 1
+
+# this is tmux prefix + U
+send "U"
+
+set timeout 15
+
+expect_after {
+ timeout { exit 1 }
+}
+
+expect {
+ "Installed plugins"
+}
+
+expect {
+ "tmux-example-plugin"
+}
+
+expect {
+ "\"all\" - updates all plugins"
+}
+
+expect {
+ "ENTER - cancels"
+}
+
+# wait for tmux to display prompt before sending characters
+sleep 1
+send "tmux-example-plugin\r"
+
+expect {
+ "Updating \"tmux-example-plugin\""
+}
+
+expect {
+ "\"tmux-example-plugin\" update success"
+}
+
+expect {
+ "Done, press ENTER to continue." {
+ exit 0
+ }
+}
+
+exit 1
diff --git a/tmux/.tmux/plugins/tpm/tests/expect_successful_update_of_all_plugins b/tmux/.tmux/plugins/tpm/tests/expect_successful_update_of_all_plugins
new file mode 100755
index 0000000..4f3a4a3
--- /dev/null
+++ b/tmux/.tmux/plugins/tpm/tests/expect_successful_update_of_all_plugins
@@ -0,0 +1,59 @@
+#!/usr/bin/env expect
+
+# disables script output
+log_user 0
+
+spawn tmux
+
+# Waiting for tmux to attach. If this is not done, next command, `send` will
+# not work properly.
+sleep 1
+
+# this is tmux prefix + U
+send "U"
+
+set timeout 5
+
+expect_after {
+ timeout { exit 1 }
+}
+
+expect {
+ "Installed plugins"
+}
+
+expect {
+ "tmux-example-plugin"
+}
+
+expect {
+ "\"all\" - updates all plugins"
+}
+
+expect {
+ "ENTER - cancels"
+}
+
+# wait for tmux to display prompt before sending characters
+sleep 1
+send "all\r"
+
+expect {
+ "Updating all plugins!"
+}
+
+expect {
+ "Updating \"tmux-example-plugin\""
+}
+
+expect {
+ "\"tmux-example-plugin\" update success"
+}
+
+expect {
+ "Done, press ENTER to continue." {
+ exit 0
+ }
+}
+
+exit 1
diff --git a/tmux/.tmux/plugins/tpm/tests/helpers/tpm.sh b/tmux/.tmux/plugins/tpm/tests/helpers/tpm.sh
new file mode 100644
index 0000000..1594afb
--- /dev/null
+++ b/tmux/.tmux/plugins/tpm/tests/helpers/tpm.sh
@@ -0,0 +1,13 @@
+check_dir_exists_helper() {
+ [ -d "$1" ]
+}
+
+# runs the scripts and asserts it has the correct output and exit code
+script_run_helper() {
+ local script="$1"
+ local expected_output="$2"
+ local expected_exit_code="${3:-0}"
+ $script 2>&1 |
+ grep "$expected_output" >/dev/null 2>&1 && # grep -q flag quits the script early
+ [ "${PIPESTATUS[0]}" -eq "$expected_exit_code" ]
+}
diff --git a/tmux/.tmux/plugins/tpm/tests/test_plugin_clean.sh b/tmux/.tmux/plugins/tpm/tests/test_plugin_clean.sh
new file mode 100755
index 0000000..d36c468
--- /dev/null
+++ b/tmux/.tmux/plugins/tpm/tests/test_plugin_clean.sh
@@ -0,0 +1,67 @@
+#!/usr/bin/env bash
+
+CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
+TPM_DIR="$PWD"
+PLUGINS_DIR="$HOME/.tmux/plugins"
+
+source "$CURRENT_DIR/helpers/helpers.sh"
+source "$CURRENT_DIR/helpers/tpm.sh"
+
+manually_install_the_plugin() {
+ rm -rf "$PLUGINS_DIR"
+ mkdir -p "$PLUGINS_DIR"
+ cd "$PLUGINS_DIR"
+ git clone --quiet https://github.com/tmux-plugins/tmux-example-plugin
+}
+
+# TMUX KEY-BINDING TESTS
+
+test_plugin_uninstallation_via_tmux_key_binding() {
+ set_tmux_conf_helper <<- HERE
+ set -g mode-keys vi
+ run-shell "$TPM_DIR/tpm"
+ HERE
+
+ manually_install_the_plugin
+
+ "$CURRENT_DIR/expect_successful_clean_plugins" ||
+ fail_helper "[key-binding] clean fails"
+
+ teardown_helper
+}
+
+# SCRIPT TESTS
+
+test_plugin_uninstallation_via_script() {
+ set_tmux_conf_helper <<- HERE
+ set -g mode-keys vi
+ run-shell "$TPM_DIR/tpm"
+ HERE
+
+ manually_install_the_plugin
+
+ script_run_helper "$TPM_DIR/bin/clean_plugins" '"tmux-example-plugin" clean success' ||
+ fail_helper "[script] plugin cleaning fails"
+
+ teardown_helper
+}
+
+test_unsuccessful_plugin_uninstallation_via_script() {
+ set_tmux_conf_helper <<- HERE
+ set -g mode-keys vi
+ run-shell "$TPM_DIR/tpm"
+ HERE
+
+ manually_install_the_plugin
+ chmod 000 "$PLUGINS_DIR/tmux-example-plugin" # disable directory deletion
+
+ local expected_exit_code=1
+ script_run_helper "$TPM_DIR/bin/clean_plugins" '"tmux-example-plugin" clean fail' "$expected_exit_code" ||
+ fail_helper "[script] unsuccessful plugin cleaning doesn't fail"
+
+ chmod 755 "$PLUGINS_DIR/tmux-example-plugin" # enable directory deletion
+
+ teardown_helper
+}
+
+run_tests
diff --git a/tmux/.tmux/plugins/tpm/tests/test_plugin_installation.sh b/tmux/.tmux/plugins/tpm/tests/test_plugin_installation.sh
new file mode 100755
index 0000000..94fb674
--- /dev/null
+++ b/tmux/.tmux/plugins/tpm/tests/test_plugin_installation.sh
@@ -0,0 +1,284 @@
+#!/usr/bin/env bash
+
+CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
+PLUGINS_DIR="$HOME/.tmux/plugins"
+TPM_DIR="$PWD"
+
+CUSTOM_PLUGINS_DIR="$HOME/foo/plugins"
+ADDITIONAL_CONFIG_FILE_1="$HOME/.tmux/additional_config_file_1"
+ADDITIONAL_CONFIG_FILE_2="$HOME/.tmux/additional_config_file_2"
+
+source "$CURRENT_DIR/helpers/helpers.sh"
+source "$CURRENT_DIR/helpers/tpm.sh"
+
+# TMUX KEY-BINDING TESTS
+
+test_plugin_installation_via_tmux_key_binding() {
+ set_tmux_conf_helper <<- HERE
+ set -g mode-keys vi
+ set -g @plugin "tmux-plugins/tmux-example-plugin"
+ run-shell "$TPM_DIR/tpm"
+ HERE
+
+ "$CURRENT_DIR/expect_successful_plugin_download" ||
+ fail_helper "[key-binding] plugin installation fails"
+
+ check_dir_exists_helper "$PLUGINS_DIR/tmux-example-plugin/" ||
+ fail_helper "[key-binding] plugin download fails"
+
+ teardown_helper
+}
+
+test_plugin_installation_via_tmux_key_binding_set_option() {
+ set_tmux_conf_helper <<- HERE
+ set -g mode-keys vi
+ set-option -g @plugin "tmux-plugins/tmux-example-plugin"
+ run-shell "$TPM_DIR/tpm"
+ HERE
+
+ "$CURRENT_DIR/expect_successful_plugin_download" ||
+ fail_helper "[key-binding][set-option] plugin installation fails"
+
+ check_dir_exists_helper "$PLUGINS_DIR/tmux-example-plugin/" ||
+ fail_helper "[key-binding][set-option] plugin download fails"
+
+ teardown_helper
+}
+
+test_plugin_installation_custom_dir_via_tmux_key_binding() {
+ set_tmux_conf_helper <<- HERE
+ set -g mode-keys vi
+ set-environment -g TMUX_PLUGIN_MANAGER_PATH '$CUSTOM_PLUGINS_DIR'
+
+ set -g @plugin "tmux-plugins/tmux-example-plugin"
+ run-shell "$TPM_DIR/tpm"
+ HERE
+
+ "$CURRENT_DIR/expect_successful_plugin_download" ||
+ fail_helper "[key-binding][custom dir] plugin installation fails"
+
+ check_dir_exists_helper "$CUSTOM_PLUGINS_DIR/tmux-example-plugin/" ||
+ fail_helper "[key-binding][custom dir] plugin download fails"
+
+ teardown_helper
+ rm -rf "$CUSTOM_PLUGINS_DIR"
+}
+
+test_non_existing_plugin_installation_via_tmux_key_binding() {
+ set_tmux_conf_helper <<- HERE
+ set -g mode-keys vi
+ set -g @plugin "tmux-plugins/non-existing-plugin"
+ run-shell "$TPM_DIR/tpm"
+ HERE
+
+ "$CURRENT_DIR/expect_failed_plugin_download" ||
+ fail_helper "[key-binding] non existing plugin installation doesn't fail"
+
+ teardown_helper
+}
+
+test_multiple_plugins_installation_via_tmux_key_binding() {
+ set_tmux_conf_helper <<- HERE
+ set -g mode-keys vi
+ set -g @plugin "tmux-plugins/tmux-example-plugin"
+ \ \ set -g @plugin 'tmux-plugins/tmux-copycat'
+ run-shell "$TPM_DIR/tpm"
+ HERE
+
+ "$CURRENT_DIR/expect_successful_multiple_plugins_download" ||
+ fail_helper "[key-binding] multiple plugins installation fails"
+
+ check_dir_exists_helper "$PLUGINS_DIR/tmux-example-plugin/" ||
+ fail_helper "[key-binding] plugin download fails (tmux-example-plugin)"
+
+ check_dir_exists_helper "$PLUGINS_DIR/tmux-copycat/" ||
+ fail_helper "[key-binding] plugin download fails (tmux-copycat)"
+
+ teardown_helper
+}
+
+test_plugins_installation_from_sourced_file_via_tmux_key_binding() {
+ set_tmux_conf_helper <<- HERE
+ set -g mode-keys vi
+ source '$ADDITIONAL_CONFIG_FILE_1'
+ set -g @plugin 'tmux-plugins/tmux-example-plugin'
+ run-shell "$TPM_DIR/tpm"
+ HERE
+
+ mkdir ~/.tmux
+ echo "set -g @plugin 'tmux-plugins/tmux-copycat'" > "$ADDITIONAL_CONFIG_FILE_1"
+
+ "$CURRENT_DIR/expect_successful_multiple_plugins_download" ||
+ fail_helper "[key-binding][sourced file] plugins installation fails"
+
+ check_dir_exists_helper "$PLUGINS_DIR/tmux-example-plugin/" ||
+ fail_helper "[key-binding][sourced file] plugin download fails (tmux-example-plugin)"
+
+ check_dir_exists_helper "$PLUGINS_DIR/tmux-copycat/" ||
+ fail_helper "[key-binding][sourced file] plugin download fails (tmux-copycat)"
+
+ teardown_helper
+}
+
+test_plugins_installation_from_multiple_sourced_files_via_tmux_key_binding() {
+ set_tmux_conf_helper <<- HERE
+ set -g mode-keys vi
+ \ \ source '$ADDITIONAL_CONFIG_FILE_1'
+ source-file '$ADDITIONAL_CONFIG_FILE_2'
+ run-shell "$TPM_DIR/tpm"
+ HERE
+
+ mkdir ~/.tmux
+ echo "set -g @plugin 'tmux-plugins/tmux-example-plugin'" > "$ADDITIONAL_CONFIG_FILE_1"
+ echo " set -g @plugin 'tmux-plugins/tmux-copycat'" > "$ADDITIONAL_CONFIG_FILE_2"
+
+ "$CURRENT_DIR/expect_successful_multiple_plugins_download" ||
+ fail_helper "[key-binding][multiple sourced files] plugins installation fails"
+
+ check_dir_exists_helper "$PLUGINS_DIR/tmux-example-plugin/" ||
+ fail_helper "[key-binding][multiple sourced files] plugin download fails (tmux-example-plugin)"
+
+ check_dir_exists_helper "$PLUGINS_DIR/tmux-copycat/" ||
+ fail_helper "[key-binding][multiple sourced files] plugin download fails (tmux-copycat)"
+
+ teardown_helper
+}
+
+# SCRIPT TESTS
+
+test_plugin_installation_via_script() {
+ set_tmux_conf_helper <<- HERE
+ set -g mode-keys vi
+ set -g @plugin "tmux-plugins/tmux-example-plugin"
+ run-shell "$TPM_DIR/tpm"
+ HERE
+
+ script_run_helper "$TPM_DIR/bin/install_plugins" '"tmux-example-plugin" download success' ||
+ fail_helper "[script] plugin installation fails"
+
+ check_dir_exists_helper "$PLUGINS_DIR/tmux-example-plugin/" ||
+ fail_helper "[script] plugin download fails"
+
+ script_run_helper "$TPM_DIR/bin/install_plugins" 'Already installed "tmux-example-plugin"' ||
+ fail_helper "[script] plugin already installed message fail"
+
+ teardown_helper
+}
+
+test_plugin_installation_custom_dir_via_script() {
+ set_tmux_conf_helper <<- HERE
+ set -g mode-keys vi
+ set-environment -g TMUX_PLUGIN_MANAGER_PATH '$CUSTOM_PLUGINS_DIR'
+
+ set -g @plugin "tmux-plugins/tmux-example-plugin"
+ run-shell "$TPM_DIR/tpm"
+ HERE
+
+ script_run_helper "$TPM_DIR/bin/install_plugins" '"tmux-example-plugin" download success' ||
+ fail_helper "[script][custom dir] plugin installation fails"
+
+ check_dir_exists_helper "$CUSTOM_PLUGINS_DIR/tmux-example-plugin/" ||
+ fail_helper "[script][custom dir] plugin download fails"
+
+ script_run_helper "$TPM_DIR/bin/install_plugins" 'Already installed "tmux-example-plugin"' ||
+ fail_helper "[script][custom dir] plugin already installed message fail"
+
+ teardown_helper
+ rm -rf "$CUSTOM_PLUGINS_DIR"
+}
+
+test_non_existing_plugin_installation_via_script() {
+ set_tmux_conf_helper <<- HERE
+ set -g mode-keys vi
+ set -g @plugin "tmux-plugins/non-existing-plugin"
+ run-shell "$TPM_DIR/tpm"
+ HERE
+
+ local expected_exit_code=1
+ script_run_helper "$TPM_DIR/bin/install_plugins" '"non-existing-plugin" download fail' "$expected_exit_code" ||
+ fail_helper "[script] non existing plugin installation doesn't fail"
+
+ teardown_helper
+}
+
+test_multiple_plugins_installation_via_script() {
+ set_tmux_conf_helper <<- HERE
+ set -g mode-keys vi
+ set -g @plugin "tmux-plugins/tmux-example-plugin"
+ \ \ set -g @plugin 'tmux-plugins/tmux-copycat'
+ run-shell "$TPM_DIR/tpm"
+ HERE
+
+ script_run_helper "$TPM_DIR/bin/install_plugins" '"tmux-example-plugin" download success' ||
+ fail_helper "[script] multiple plugins installation fails"
+
+ check_dir_exists_helper "$PLUGINS_DIR/tmux-example-plugin/" ||
+ fail_helper "[script] plugin download fails (tmux-example-plugin)"
+
+ check_dir_exists_helper "$PLUGINS_DIR/tmux-copycat/" ||
+ fail_helper "[script] plugin download fails (tmux-copycat)"
+
+ script_run_helper "$TPM_DIR/bin/install_plugins" 'Already installed "tmux-copycat"' ||
+ fail_helper "[script] multiple plugins already installed message fail"
+
+ teardown_helper
+}
+
+test_plugins_installation_from_sourced_file_via_script() {
+ set_tmux_conf_helper <<- HERE
+ set -g mode-keys vi
+ source '$ADDITIONAL_CONFIG_FILE_1'
+ set -g @plugin 'tmux-plugins/tmux-example-plugin'
+ run-shell "$TPM_DIR/tpm"
+ HERE
+
+ mkdir ~/.tmux
+ echo "set -g @plugin 'tmux-plugins/tmux-copycat'" > "$ADDITIONAL_CONFIG_FILE_1"
+
+ script_run_helper "$TPM_DIR/bin/install_plugins" '"tmux-copycat" download success' ||
+ fail_helper "[script][sourced file] plugins installation fails"
+
+ check_dir_exists_helper "$PLUGINS_DIR/tmux-example-plugin/" ||
+ fail_helper "[script][sourced file] plugin download fails (tmux-example-plugin)"
+
+ check_dir_exists_helper "$PLUGINS_DIR/tmux-copycat/" ||
+ fail_helper "[script][sourced file] plugin download fails (tmux-copycat)"
+
+ script_run_helper "$TPM_DIR/bin/install_plugins" 'Already installed "tmux-copycat"' ||
+ fail_helper "[script][sourced file] plugins already installed message fail"
+
+ teardown_helper
+}
+
+test_plugins_installation_from_multiple_sourced_files_via_script() {
+ set_tmux_conf_helper <<- HERE
+ set -g mode-keys vi
+ \ \ source '$ADDITIONAL_CONFIG_FILE_1'
+ source-file '$ADDITIONAL_CONFIG_FILE_2'
+ set -g @plugin 'tmux-plugins/tmux-example-plugin'
+ run-shell "$TPM_DIR/tpm"
+ HERE
+
+ mkdir ~/.tmux
+ echo " set -g @plugin 'tmux-plugins/tmux-copycat'" > "$ADDITIONAL_CONFIG_FILE_1"
+ echo "set -g @plugin 'tmux-plugins/tmux-sensible'" > "$ADDITIONAL_CONFIG_FILE_2"
+
+ script_run_helper "$TPM_DIR/bin/install_plugins" '"tmux-sensible" download success' ||
+ fail_helper "[script][multiple sourced files] plugins installation fails"
+
+ check_dir_exists_helper "$PLUGINS_DIR/tmux-example-plugin/" ||
+ fail_helper "[script][multiple sourced files] plugin download fails (tmux-example-plugin)"
+
+ check_dir_exists_helper "$PLUGINS_DIR/tmux-copycat/" ||
+ fail_helper "[script][multiple sourced files] plugin download fails (tmux-copycat)"
+
+ check_dir_exists_helper "$PLUGINS_DIR/tmux-sensible/" ||
+ fail_helper "[script][multiple sourced files] plugin download fails (tmux-sensible)"
+
+ script_run_helper "$TPM_DIR/bin/install_plugins" 'Already installed "tmux-sensible"' ||
+ fail_helper "[script][multiple sourced files] plugins already installed message fail"
+
+ teardown_helper
+}
+
+run_tests
diff --git a/tmux/.tmux/plugins/tpm/tests/test_plugin_installation_legacy.sh b/tmux/.tmux/plugins/tpm/tests/test_plugin_installation_legacy.sh
new file mode 100755
index 0000000..b1d0cf6
--- /dev/null
+++ b/tmux/.tmux/plugins/tpm/tests/test_plugin_installation_legacy.sh
@@ -0,0 +1,100 @@
+#!/usr/bin/env bash
+
+CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
+PLUGINS_DIR="$HOME/.tmux/plugins"
+TPM_DIR="$PWD"
+
+source "$CURRENT_DIR/helpers/helpers.sh"
+source "$CURRENT_DIR/helpers/tpm.sh"
+
+# TMUX KEY-BINDING TESTS
+
+test_plugin_installation_via_tmux_key_binding() {
+ set_tmux_conf_helper <<- HERE
+ set -g mode-keys vi
+ set -g @tpm_plugins "tmux-plugins/tmux-example-plugin"
+ run-shell "$TPM_DIR/tpm"
+ HERE
+
+ # opens tmux and test it with `expect`
+ $CURRENT_DIR/expect_successful_plugin_download ||
+ fail_helper "[key-binding] plugin installation fails"
+
+ # check plugin dir exists after download
+ check_dir_exists_helper "$PLUGINS_DIR/tmux-example-plugin/" ||
+ fail_helper "[key-binding] plugin download fails"
+
+ teardown_helper
+}
+
+test_legacy_and_new_syntax_for_plugin_installation_work_via_tmux_key_binding() {
+ set_tmux_conf_helper <<- HERE
+ set -g mode-keys vi
+ set -g @tpm_plugins " \
+ tmux-plugins/tmux-example-plugin \
+ "
+ set -g @plugin 'tmux-plugins/tmux-copycat'
+ run-shell "$TPM_DIR/tpm"
+ HERE
+
+ # opens tmux and test it with `expect`
+ "$CURRENT_DIR"/expect_successful_multiple_plugins_download ||
+ fail_helper "[key-binding] multiple plugins installation fails"
+
+ # check plugin dir exists after download
+ check_dir_exists_helper "$PLUGINS_DIR/tmux-example-plugin/" ||
+ fail_helper "[key-binding] plugin download fails (tmux-example-plugin)"
+
+ check_dir_exists_helper "$PLUGINS_DIR/tmux-copycat/" ||
+ fail_helper "[key-binding] plugin download fails (tmux-copycat)"
+
+ teardown_helper
+}
+
+# SCRIPT TESTS
+
+test_plugin_installation_via_script() {
+ set_tmux_conf_helper <<- HERE
+ set -g mode-keys vi
+ set -g @tpm_plugins "tmux-plugins/tmux-example-plugin"
+ run-shell "$TPM_DIR/tpm"
+ HERE
+
+ script_run_helper "$TPM_DIR/bin/install_plugins" '"tmux-example-plugin" download success' ||
+ fail_helper "[script] plugin installation fails"
+
+ check_dir_exists_helper "$PLUGINS_DIR/tmux-example-plugin/" ||
+ fail_helper "[script] plugin download fails"
+
+ script_run_helper "$TPM_DIR/bin/install_plugins" 'Already installed "tmux-example-plugin"' ||
+ fail_helper "[script] plugin already installed message fail"
+
+ teardown_helper
+}
+
+test_legacy_and_new_syntax_for_plugin_installation_work_via_script() {
+ set_tmux_conf_helper <<- HERE
+ set -g mode-keys vi
+ set -g @tpm_plugins " \
+ tmux-plugins/tmux-example-plugin \
+ "
+ set -g @plugin 'tmux-plugins/tmux-copycat'
+ run-shell "$TPM_DIR/tpm"
+ HERE
+
+ script_run_helper "$TPM_DIR/bin/install_plugins" '"tmux-example-plugin" download success' ||
+ fail_helper "[script] multiple plugin installation fails"
+
+ check_dir_exists_helper "$PLUGINS_DIR/tmux-example-plugin/" ||
+ fail_helper "[script] plugin download fails (tmux-example-plugin)"
+
+ check_dir_exists_helper "$PLUGINS_DIR/tmux-copycat/" ||
+ fail_helper "[script] plugin download fails (tmux-copycat)"
+
+ script_run_helper "$TPM_DIR/bin/install_plugins" 'Already installed "tmux-copycat"' ||
+ fail_helper "[script] multiple plugins already installed message fail"
+
+ teardown_helper
+}
+
+run_tests
diff --git a/tmux/.tmux/plugins/tpm/tests/test_plugin_sourcing.sh b/tmux/.tmux/plugins/tpm/tests/test_plugin_sourcing.sh
new file mode 100755
index 0000000..c06f1fe
--- /dev/null
+++ b/tmux/.tmux/plugins/tpm/tests/test_plugin_sourcing.sh
@@ -0,0 +1,78 @@
+#!/usr/bin/env bash
+
+CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
+TPM_DIR="$PWD"
+PLUGINS_DIR="$HOME/.tmux/plugins"
+
+CUSTOM_PLUGINS_DIR="$HOME/foo/plugins"
+
+source "$CURRENT_DIR/helpers/helpers.sh"
+source "$CURRENT_DIR/helpers/tpm.sh"
+
+check_binding_defined() {
+ local binding="$1"
+ tmux list-keys | grep -q "$binding"
+}
+
+create_test_plugin_helper() {
+ local plugin_path="$PLUGINS_DIR/tmux_test_plugin/"
+ rm -rf "$plugin_path"
+ mkdir -p "$plugin_path"
+
+ while read line; do
+ echo "$line" >> "$plugin_path/test_plugin.tmux"
+ done
+ chmod +x "$plugin_path/test_plugin.tmux"
+}
+
+check_tpm_path() {
+ local correct_tpm_path="$1"
+ local tpm_path="$(tmux start-server\; show-environment -g TMUX_PLUGIN_MANAGER_PATH | cut -f2 -d=)"
+ [ "$correct_tpm_path" == "$tpm_path" ]
+}
+
+test_plugin_sourcing() {
+ set_tmux_conf_helper <<- HERE
+ set -g mode-keys vi
+ set -g @plugin "doesnt_matter/tmux_test_plugin"
+ run-shell "$TPM_DIR/tpm"
+ HERE
+
+ # manually creates a local tmux plugin
+ create_test_plugin_helper <<- HERE
+ tmux bind-key R run-shell foo_command
+ HERE
+
+ tmux new-session -d # tmux starts detached
+ check_binding_defined "R run-shell foo_command" ||
+ fail_helper "Plugin sourcing fails"
+
+ teardown_helper
+}
+
+test_default_tpm_path() {
+ set_tmux_conf_helper <<- HERE
+ set -g mode-keys vi
+ run-shell "$TPM_DIR/tpm"
+ HERE
+
+ check_tpm_path "${PLUGINS_DIR}/" ||
+ fail_helper "Default TPM path not correct"
+
+ teardown_helper
+}
+
+test_custom_tpm_path() {
+ set_tmux_conf_helper <<- HERE
+ set -g mode-keys vi
+ set-environment -g TMUX_PLUGIN_MANAGER_PATH '$CUSTOM_PLUGINS_DIR'
+ run-shell "$TPM_DIR/tpm"
+ HERE
+
+ check_tpm_path "$CUSTOM_PLUGINS_DIR" ||
+ fail_helper "Custom TPM path not correct"
+
+ teardown_helper
+}
+
+run_tests
diff --git a/tmux/.tmux/plugins/tpm/tests/test_plugin_update.sh b/tmux/.tmux/plugins/tpm/tests/test_plugin_update.sh
new file mode 100755
index 0000000..4924d16
--- /dev/null
+++ b/tmux/.tmux/plugins/tpm/tests/test_plugin_update.sh
@@ -0,0 +1,60 @@
+#!/usr/bin/env bash
+
+CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
+TPM_DIR="$PWD"
+PLUGINS_DIR="$HOME/.tmux/plugins"
+
+source "$CURRENT_DIR/helpers/helpers.sh"
+source "$CURRENT_DIR/helpers/tpm.sh"
+
+manually_install_the_plugin() {
+ mkdir -p "$PLUGINS_DIR"
+ cd "$PLUGINS_DIR"
+ git clone --quiet https://github.com/tmux-plugins/tmux-example-plugin
+}
+
+# TMUX KEY-BINDING TESTS
+
+test_plugin_update_via_tmux_key_binding() {
+ set_tmux_conf_helper <<- HERE
+ set -g mode-keys vi
+ set -g @plugin "tmux-plugins/tmux-example-plugin"
+ run-shell "$TPM_DIR/tpm"
+ HERE
+
+ manually_install_the_plugin
+
+ "$CURRENT_DIR/expect_successful_update_of_all_plugins" ||
+ fail_helper "[key-binding] 'update all plugins' fails"
+
+ "$CURRENT_DIR/expect_successful_update_of_a_single_plugin" ||
+ fail_helper "[key-binding] 'update single plugin' fails"
+
+ teardown_helper
+}
+
+# SCRIPT TESTS
+
+test_plugin_update_via_script() {
+ set_tmux_conf_helper <<- HERE
+ set -g mode-keys vi
+ set -g @plugin "tmux-plugins/tmux-example-plugin"
+ run-shell "$TPM_DIR/tpm"
+ HERE
+
+ manually_install_the_plugin
+
+ local expected_exit_code=1
+ script_run_helper "$TPM_DIR/bin/update_plugins" 'usage' "$expected_exit_code" ||
+ fail_helper "[script] running update plugins without args should fail"
+
+ script_run_helper "$TPM_DIR/bin/update_plugins tmux-example-plugin" '"tmux-example-plugin" update success' ||
+ fail_helper "[script] plugin update fails"
+
+ script_run_helper "$TPM_DIR/bin/update_plugins all" '"tmux-example-plugin" update success' ||
+ fail_helper "[script] update all plugins fails"
+
+ teardown_helper
+}
+
+run_tests
diff --git a/tmux/.tmux/plugins/tpm/tpm b/tmux/.tmux/plugins/tpm/tpm
new file mode 100755
index 0000000..7ad4b99
--- /dev/null
+++ b/tmux/.tmux/plugins/tpm/tpm
@@ -0,0 +1,81 @@
+#!/usr/bin/env bash
+
+CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
+BINDINGS_DIR="$CURRENT_DIR/bindings"
+SCRIPTS_DIR="$CURRENT_DIR/scripts"
+
+source "$SCRIPTS_DIR/variables.sh"
+
+get_tmux_option() {
+ local option="$1"
+ local default_value="$2"
+ local option_value="$(tmux show-option -gqv "$option")"
+ if [ -z "$option_value" ]; then
+ echo "$default_value"
+ else
+ echo "$option_value"
+ fi
+}
+
+tpm_path_set() {
+ tmux show-environment -g "$DEFAULT_TPM_ENV_VAR_NAME" >/dev/null 2>&1
+}
+
+# Check if configuration file exists at an XDG-compatible location, if so use
+# that directory for TMUX_PLUGIN_MANAGER_PATH. Otherwise use $DEFAULT_TPM_PATH.
+set_default_tpm_path() {
+ local xdg_tmux_path="${XDG_CONFIG_HOME:-$HOME/.config}/tmux"
+ local tpm_path="$DEFAULT_TPM_PATH"
+
+ if [ -f "$xdg_tmux_path/tmux.conf" ]; then
+ tpm_path="$xdg_tmux_path/plugins/"
+ fi
+
+ tmux set-environment -g "$DEFAULT_TPM_ENV_VAR_NAME" "$tpm_path"
+}
+
+# Ensures TMUX_PLUGIN_MANAGER_PATH global env variable is set.
+#
+# Put this in `.tmux.conf` to override the default:
+# `set-environment -g TMUX_PLUGIN_MANAGER_PATH "/some/other/path/"`
+set_tpm_path() {
+ if ! tpm_path_set; then
+ set_default_tpm_path
+ fi
+}
+
+# 1. Fetches plugin names from `@plugin` variables
+# 2. Creates full plugin path
+# 3. Sources all *.tmux files from each of the plugin directories
+# - no errors raised if directory does not exist
+# Files are sourced as tmux config files, not as shell scripts!
+source_plugins() {
+ "$SCRIPTS_DIR/source_plugins.sh" >/dev/null 2>&1
+}
+
+# prefix + I - downloads TPM plugins and reloads TMUX environment
+# prefix + U - updates a plugin (or all of them) and reloads TMUX environment
+# prefix + alt + u - remove unused TPM plugins and reloads TMUX environment
+set_tpm_key_bindings() {
+ local install_key="$(get_tmux_option "$install_key_option" "$default_install_key")"
+ tmux bind-key "$install_key" run-shell "$BINDINGS_DIR/install_plugins"
+
+ local update_key="$(get_tmux_option "$update_key_option" "$default_update_key")"
+ tmux bind-key "$update_key" run-shell "$BINDINGS_DIR/update_plugins"
+
+ local clean_key="$(get_tmux_option "$clean_key_option" "$default_clean_key")"
+ tmux bind-key "$clean_key" run-shell "$BINDINGS_DIR/clean_plugins"
+}
+
+supported_tmux_version_ok() {
+ "$SCRIPTS_DIR/check_tmux_version.sh" "$SUPPORTED_TMUX_VERSION"
+}
+
+main() {
+ if supported_tmux_version_ok; then
+ set_tpm_path
+ set_tpm_key_bindings
+ source_plugins
+ fi
+}
+main
diff --git a/zed/.config/zed/settings.json b/zed/.config/zed/settings.json
new file mode 100644
index 0000000..09270d5
--- /dev/null
+++ b/zed/.config/zed/settings.json
@@ -0,0 +1,57 @@
+{
+ "project_panel": {
+ "dock": "right"
+ },
+ "agent": {
+ "dock": "left",
+ "version": "1"
+ },
+ "telemetry": {
+ "metrics": false,
+ "diagnostics": false
+ },
+ "vim_mode": true,
+ "base_keymap": "JetBrains",
+ "ui_font_size": 14,
+ "tab_size": 4,
+ "buffer_font_size": 14,
+ "ui_font_family": "Agave Nerd Font Mono",
+ "buffer_font_family": "Agave Nerd Font Mono",
+ "show_whitespaces": "all",
+ "theme": {
+ "mode": "system",
+ "light": "Gruvbox Light Hard",
+ "dark": "Gruvbox Dark Soft"
+ },
+ "format_on_save": "on",
+ "relative_line_numbers": true,
+ "lsp": {
+ "deno": {
+ "settings": {
+ "deno": {
+ "enable": true
+ }
+ }
+ }
+ },
+ "languages": {
+ "TypeScript": {
+ "language_servers": [
+ "deno",
+ "!typescript-language-server",
+ "!vtsls",
+ "!eslint"
+ ],
+ "formatter": "language_server"
+ },
+ "TSX": {
+ "language_servers": [
+ "deno",
+ "!typescript-language-server",
+ "!vtsls",
+ "!eslint"
+ ],
+ "formatter": "language_server"
+ }
+ }
+}
diff --git a/zsh/.config/zsh/greetings/00_art/another_penguin b/zsh/.config/zsh/greetings/00_art/another_penguin
new file mode 100644
index 0000000..00f43e3
--- /dev/null
+++ b/zsh/.config/zsh/greetings/00_art/another_penguin
@@ -0,0 +1,15 @@
+⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣀⣀⣀⠀⠀⠀⠀⠀⠀⠀
+⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣠⣖⣫⠵⠔⢿⣿⣿⣿⡄⠀⠀⠀⠀
+⠀⠀⠀⠀⠀⠀⠀⠀⢠⠾⠯⣾⠃⠀⢀⣸⡿⠛⠻⢿⣆⠀⠀⠀
+⠀⠀⠀⠀⠀⠀⠀⠀⠆⣀⡀⠹⣶⣀⣨⡏⢀⣀⡀⠈⣿⠀⠀⠀
+⠀⠀⠀⠀⠀⠀⠀⢸⠀⠛⠃⢰⠋⠉⢻⠀⠘⠛⠃⠀⣿⡄⠀⠀
+⠀⠀⠀⠀⠀⢀⣀⣘⡀⠀⠀⠀⠀⠒⠉⠀⠀⠀⢀⣼⡟⠀⠀⠀
+⣠⣶⣶⣾⣿⣿⣿⣿⣯⡶⡀⠀⠀⠀⠀⢀⣀⢴⡻⣗⡄⠀⠀⠀
+⠹⡿⠿⠛⢿⣿⣿⣿⣟⣥⡈⠉⠁⠀⠀⠀⠀⢀⣵⢊⠨⠢⠀⠀
+⠀⠀⠀⠀⠘⠻⠿⠿⠿⠁⠘⠋⠒⠂⠀⠐⠊⠉⠈⠎⣦⡀⠱⡀
+⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⠘⠟⢧⣱
+⠀⠀⠀⠀⠀⠀⠀⢸⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣸⠀⢸⠀⠀
+⠀⠀⠀⠀⠀⠀⠀⢸⣇⠀⡀⠀⠀⠀⠀⠀⠀⠀⡰⠁⠀⢺⠆⠀
+⠀⠀⠀⠀⠀⠀⠀⠀⠻⣆⠳⢄⣀⠠⠀⠀⠐⡄⡇⠀⣠⡯⠟⠀
+⠀⠀⠀⠀⠀⠀⠀⣤⣎⣟⡖⣺⠗⠉⠉⠉⠉⠉⡖⡶⣟⢢⣐⠶
+⠀⠀⠀⠀⠀⠀⠀⠈⠉⠉⠉⠁⠒⠒⠒⠒⠒⠂⠉⠉⠉⠁⠀⠀ \ No newline at end of file
diff --git a/zsh/.config/zsh/greetings/00_art/butterfly b/zsh/.config/zsh/greetings/00_art/butterfly
new file mode 100644
index 0000000..cea5d72
--- /dev/null
+++ b/zsh/.config/zsh/greetings/00_art/butterfly
@@ -0,0 +1,9 @@
+⠀⠀⠀⠀⊹
+⢶⢻⣑⣒⢤⡀⠀⢄⠀⠀⡠⠀⢀⡤⣆⣊⡿⡷
+⠀⠹⠹⣚⣣⠻⣦⡀⠀⠀⢀⣴⠟⣸⢓⢎⠏⠀
+⠀⠀⢡⣱⣖⣢⡾⢿⣾⣷⡿⢷⣖⣒⣎⡎⠀⠀
+⠀⠀⠀⣠⠓⢬⠅⡺⢻⡟⢗⠨⡥⠚⣄⠀⠀⠀
+⠀⠀⠀⣿⡆⠘⠆⢇⢸⡇⠸⠰⠃⢰⣿⠀⠀⠀
+⠀⠀⠀⠐⡻⣮⣬⠞⠈⠁⠳⣤⣴⢿⠂⠀⠀⠀
+⠀⠀⠀⡜⠀⠁⠉⠀⠀⠀⠀⠈⠈⠀⢣⠀⠀⠀⊹
+⊹ \ No newline at end of file
diff --git a/zsh/.config/zsh/greetings/00_art/eebjy b/zsh/.config/zsh/greetings/00_art/eebjy
new file mode 100644
index 0000000..6e6bbcf
--- /dev/null
+++ b/zsh/.config/zsh/greetings/00_art/eebjy
@@ -0,0 +1,9 @@
+⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡀⠀⠀⠀⠀
+⠀⠀⠀⠀⢀⡴⣆⠀⠀⠀⠀⠀⣠⡀ ᶻ 𝗓 𐰁 .ᐟ ⣼⣿⡗⠀⠀⠀⠀
+⠀⠀⠀⣠⠟⠀⠘⠷⠶⠶⠶⠾⠉⢳⡄⠀⠀⠀⠀⠀⣧⣿⠀⠀⠀⠀⠀
+⠀⠀⣰⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢻⣤⣤⣤⣤⣤⣿⢿⣄⠀⠀⠀⠀
+⠀⠀⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣧⠀⠀⠀⠀⠀⠀⠙⣷⡴⠶⣦
+⠀⠀⢱⡀⠀⠉⠉⠀⠀⠀⠀⠛⠃⠀⢠⡟⠀⠀⠀⢀⣀⣠⣤⠿⠞⠛⠋
+⣠⠾⠋⠙⣶⣤⣤⣤⣤⣤⣀⣠⣤⣾⣿⠴⠶⠚⠋⠉⠁⠀⠀⠀⠀⠀⠀
+⠛⠒⠛⠉⠉⠀⠀⠀⣴⠟⢃⡴⠛⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
+⠀⠀⠀⠀⠀⠀⠀⠀⠛⠛⠋⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
diff --git a/zsh/.config/zsh/greetings/00_art/heart b/zsh/.config/zsh/greetings/00_art/heart
new file mode 100644
index 0000000..3394514
--- /dev/null
+++ b/zsh/.config/zsh/greetings/00_art/heart
@@ -0,0 +1,8 @@
+.  +⠀ ⠀
+⠀˚⠀ ⣴⠟⠉⠉⠛⢦⡀⢀⣴⠛⠉⠈⠙⠻⣄
+⠀⠀⣼⠃⠀⠀⠀⠀⠀⠙⠋⠀⠀⠀⠀⠀⠀⠹⣦
+⠀⠀⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿
+⠀⠀⠿⣆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣰⡆
+⠀⠀⠀⢻⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡼⠃
+⠀⠀⠀⠀⠀⠻⢦⣄⠀⠀⠀⠀⠀⣠⡴⠛
+⠀⠀⠀⠀⠀⠀⠀⠉⠛⠶⣄⠶⠋ ⠀⠀⠀+. * \ No newline at end of file
diff --git a/zsh/.config/zsh/greetings/00_art/penguin b/zsh/.config/zsh/greetings/00_art/penguin
new file mode 100644
index 0000000..6389d00
--- /dev/null
+++ b/zsh/.config/zsh/greetings/00_art/penguin
@@ -0,0 +1,16 @@
+⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⡤⠴⠒⠒⠒⠶⢤⣄⡀⠀⠀⠀⠀⠀⠀⠀
+⠀⠀⠀⠀⠀⠀⠀⣠⠞⠁⠀⠀⠀⠀⠀⠀⠀⠈⠙⢦⡀⠀⠀⠀⠀⠀
+⠀⠀⠀⠀⠀⠀⡼⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⢳⡀⠀⠀⠀⠀
+⠀⠀⠀⠀⠀⢸⠁⠀⠀⣠⠖⠛⠛⠲⢤⠀⠀⠀⣰⠚⠛⢷⠀⠀⠀⠀
+⠀⠀⠀⠀⠀⣿⠀⠀⣸⠃⠀⠀⢀⣀⠈⢧⣠⣤⣯⢠⣤⠘⣆⠀⠀⠀
+⠀⠀⠀⠀⠀⣿⠀⠀⡇⠀⠀⠀⠻⠟⠠⣏⣀⣀⣨⡇⠉⢀⣿⠀⠀⠀
+⠀⠀⠀⠀⢀⡟⠀⠀⠹⡄⠀⠀⠀⠀⠀⠉⠑⠚⠉⠀⣠⡞⢿⠀⠀⠀
+⠀⠀⠀⢀⡼⠁⠀⠀⠀⠙⠳⢤⡄⠀⠀⠀⠀⠀⠀⠀⠁⠙⢦⠳⣄⠀
+⠀⠀⢀⡾⠁⠀⠀⠀⠀⠀⠤⣏⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣸⠃⠙⡆
+⠀⠀⣼⠁⠀⠀⠀⠀⠀⠀⠀⠈⠳⣄⠀⠀⠀⠀⠀⠀⠀⢠⡏⠀⠀⡇
+⠀⠀⣏⠀⠀⠀⠀⠲⣄⡀⠀⠀⠀⠸⡄⠀⠀⠀⠀⠀⠀⢸⠀⢀⡼⠁
+⢀⡴⢿⠀⠀⠀⠀⠀⢸⠟⢦⡀⠀⢀⡇⠀⠀⠀⠀⠀⠀⠘⠗⣿⠁⠀
+⠸⣦⡘⣦⠀⠀⠀⠀⣸⣄⠀⡉⠓⠚⠀⠀⠀⠀⠀⠀⠀⠀⡴⢹⣦⡀
+⠀⠀⠉⠛⠳⢤⣴⠾⠁⠈⠟⠉⣇⠀⠀⠀⠀⠀⠀⠀⣠⠞⠁⣠⠞⠁
+⠀⠀⠀⠀⠀⠀⠙⢧⣀⠀⠀⣠⠏⠀⠀⢀⣀⣠⠴⠛⠓⠚⠋⠀⠀⠀
+⠀⠀⠀⠀⠀⠀⠀⠀⠉⠙⠋⠉⠉⠉⠉⠉⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀
diff --git a/zsh/.config/zsh/greetings/00_art/puppy b/zsh/.config/zsh/greetings/00_art/puppy
new file mode 100644
index 0000000..c4d7fbb
--- /dev/null
+++ b/zsh/.config/zsh/greetings/00_art/puppy
@@ -0,0 +1,10 @@
+⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣄⢀⡀⠀⠀⠀⠀
+⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢿⣿⣿⡿⠀⠀⠀⠀
+⠀⠀⠀⠀⣀⣀⣤⠖⠛⠉⠉⠉⠉⠉⠙⠒⠦⣿⣏⣀⠀⠀⠀⠀
+⠀⠀⣠⠞⠁⠀⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⢵⡄⠀⠀
+⠀⢰⣯⠀⠀⢀⠂⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⠀⠀⣿⠀⠀
+⠀⠈⣇⢀⢠⠇⠀⣶⡶⠄⠀⠀⠀⢠⣶⡶⠀⠀⣸⣀⣼⠟⠀⠀
+⠀⠀⠙⠛⠾⡆⠀⠙⠛⠃⠀⠀⠀⠀⠙⠋⠀⠀⣹⠟⠁⠀⠀⠀
+⢀⡴⠚⠉⠛⢿⠀⠀⠀⠀⢿⣿⠆⠀⠀⠀⠀⢀⣿⠋⠉⠉⢳⡄
+⢾⡀⡄⠀⣄⡼⠻⢧⠤⣤⠤⠤⣤⣠⣦⣾⠶⠞⢿⣤⡄⣠⣀⡷
+⠈⠙⠛⠋⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠉⠉⠉⠀ \ No newline at end of file
diff --git a/zsh/.config/zsh/greetings/00_art/totoro b/zsh/.config/zsh/greetings/00_art/totoro
new file mode 100644
index 0000000..9a1ba92
--- /dev/null
+++ b/zsh/.config/zsh/greetings/00_art/totoro
@@ -0,0 +1,13 @@
+⠀⠀⠀⠀⣶⣄⠀⠀⠀⠀⠀⠀⢀⣶⡆⠀⠀⠀
+⠀⠀⠀⢸⣿⣿⡆⠀⠀⠀⠀⢀⣾⣿⡇⠀⠀⠀
+⠀⠀⠀⠘⣿⣿⣿⠀⠀⠀⠀⢸⣿⣿⡇⠀⠀⠀
+⠀⠀⠀⠀⢿⣿⣿⣤⣤⣤⣤⣼⣿⡿⠃⠀⠀⠀
+⠀⠀⠀⢠⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣆⠀⠀⠀
+⠀⠀⢠⣿⡃⣦⢹⣿⣟⣙⣿⣿⠰⡀⣿⣇⠀⠀
+⠠⠬⣿⣿⣷⣶⣿⣿⣿⣿⣿⣿⣷⣾⣿⣿⡭⠤
+⠀⣼⣿⣿⣿⣿⠿⠛⠛⠛⠛⠻⢿⣿⣿⣿⣿⡀
+⢰⣿⣿⣿⠋⠀⠀⠀⢀⣀⠀⠀⠀⠉⢿⣿⣿⣧
+⢸⣿⣿⠃⠜⠛⠂⠀⠋⠉⠃⠐⠛⠻⠄⢿⣿⣿
+⢸⣿⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⣿
+⠘⣿⣿⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣾⣿⡏
+⠀⠈⠻⠿⣤⣀⡀⠀⠀⠀⠀⠀⣀⣠⠾⠟⠋⠀ \ No newline at end of file
diff --git a/zsh/.config/zsh/greetings/01_prompts/aww_motivation_lost b/zsh/.config/zsh/greetings/01_prompts/aww_motivation_lost
new file mode 100644
index 0000000..59aeae6
--- /dev/null
+++ b/zsh/.config/zsh/greetings/01_prompts/aww_motivation_lost
@@ -0,0 +1 @@
+404: motivation not found~ try again (︶︹︶)
diff --git a/zsh/.config/zsh/greetings/01_prompts/bashful b/zsh/.config/zsh/greetings/01_prompts/bashful
new file mode 100644
index 0000000..5a9bf7e
--- /dev/null
+++ b/zsh/.config/zsh/greetings/01_prompts/bashful
@@ -0,0 +1 @@
+lil shell says hai~ (,,>﹏<,,)
diff --git a/zsh/.config/zsh/greetings/01_prompts/bby b/zsh/.config/zsh/greetings/01_prompts/bby
new file mode 100644
index 0000000..b0378bb
--- /dev/null
+++ b/zsh/.config/zsh/greetings/01_prompts/bby
@@ -0,0 +1 @@
+welcome back bby, whatcha codin~? ◝(˶˃ ᵕ ˂˶) ◜ ♡
diff --git a/zsh/.config/zsh/greetings/01_prompts/bot b/zsh/.config/zsh/greetings/01_prompts/bot
new file mode 100644
index 0000000..9f1bfe5
--- /dev/null
+++ b/zsh/.config/zsh/greetings/01_prompts/bot
@@ -0,0 +1 @@
+beep boop i’m ur smol shell bot~ (≧ ◡ ≦)
diff --git a/zsh/.config/zsh/greetings/01_prompts/break_stuff b/zsh/.config/zsh/greetings/01_prompts/break_stuff
new file mode 100644
index 0000000..38fba6b
--- /dev/null
+++ b/zsh/.config/zsh/greetings/01_prompts/break_stuff
@@ -0,0 +1 @@
+──⋆⋅☆⋅⋆── what are u gonna break today? ──⋆⋅☆⋅⋆──
diff --git a/zsh/.config/zsh/greetings/01_prompts/compiling_feelings b/zsh/.config/zsh/greetings/01_prompts/compiling_feelings
new file mode 100644
index 0000000..beeb049
--- /dev/null
+++ b/zsh/.config/zsh/greetings/01_prompts/compiling_feelings
@@ -0,0 +1 @@
+current mood: compiling feelings... (っ´ω `)ノ(╥ ω ╥ )
diff --git a/zsh/.config/zsh/greetings/01_prompts/crashin b/zsh/.config/zsh/greetings/01_prompts/crashin
new file mode 100644
index 0000000..78ce202
--- /dev/null
+++ b/zsh/.config/zsh/greetings/01_prompts/crashin
@@ -0,0 +1 @@
+lowkey bashin’ and highkey crashin~ (∩^o^)⊃━☆゚.*・。゚
diff --git a/zsh/.config/zsh/greetings/01_prompts/desu b/zsh/.config/zsh/greetings/01_prompts/desu
new file mode 100644
index 0000000..210ca3c
--- /dev/null
+++ b/zsh/.config/zsh/greetings/01_prompts/desu
@@ -0,0 +1 @@
+terminal-chan desu~ ( ^・ω・^ )
diff --git a/zsh/.config/zsh/greetings/01_prompts/hacker_friend b/zsh/.config/zsh/greetings/01_prompts/hacker_friend
new file mode 100644
index 0000000..8daadee
--- /dev/null
+++ b/zsh/.config/zsh/greetings/01_prompts/hacker_friend
@@ -0,0 +1 @@
+hewwwooo hacker friend~ ( ˶ˆᗜ ˆ˵ )͜♡ ready 2 typey type?
diff --git a/zsh/.config/zsh/greetings/01_prompts/hai b/zsh/.config/zsh/greetings/01_prompts/hai
new file mode 100644
index 0000000..487c866
--- /dev/null
+++ b/zsh/.config/zsh/greetings/01_prompts/hai
@@ -0,0 +1 @@
+ahh!! it’s you again~ kyaaa~!! (,,> ᴗ <,,)
diff --git a/zsh/.config/zsh/greetings/01_prompts/input_output_love b/zsh/.config/zsh/greetings/01_prompts/input_output_love
new file mode 100644
index 0000000..9d3964d
--- /dev/null
+++ b/zsh/.config/zsh/greetings/01_prompts/input_output_love
@@ -0,0 +1 @@
+input accepted, output is love (´。• ω •。) ♡`
diff --git a/zsh/.config/zsh/greetings/01_prompts/love_letter b/zsh/.config/zsh/greetings/01_prompts/love_letter
new file mode 100644
index 0000000..b2556fe
--- /dev/null
+++ b/zsh/.config/zsh/greetings/01_prompts/love_letter
@@ -0,0 +1 @@
+shell prompt... or love letter? (⸝⸝๑﹏๑⸝⸝)
diff --git a/zsh/.config/zsh/greetings/01_prompts/online b/zsh/.config/zsh/greetings/01_prompts/online
new file mode 100644
index 0000000..0201fde
--- /dev/null
+++ b/zsh/.config/zsh/greetings/01_prompts/online
@@ -0,0 +1 @@
+system online... awaiting ur magic~ ૮ ˶ᵔ ᵕ ᵔ˶ ა
diff --git a/zsh/.config/zsh/greetings/01_prompts/production b/zsh/.config/zsh/greetings/01_prompts/production
new file mode 100644
index 0000000..4deab12
--- /dev/null
+++ b/zsh/.config/zsh/greetings/01_prompts/production
@@ -0,0 +1 @@
+plz don't break the server... or do, whatever ( ¬ ⤙ ¬ )
diff --git a/zsh/.config/zsh/greetings/01_prompts/sammich b/zsh/.config/zsh/greetings/01_prompts/sammich
new file mode 100644
index 0000000..f22df0a
--- /dev/null
+++ b/zsh/.config/zsh/greetings/01_prompts/sammich
@@ -0,0 +1 @@
+sudo make me a sandwich? (・∀・) 🥪 ✧₊˚ʚ
diff --git a/zsh/.config/zsh/greetings/01_prompts/shell_yeah b/zsh/.config/zsh/greetings/01_prompts/shell_yeah
new file mode 100644
index 0000000..7826b64
--- /dev/null
+++ b/zsh/.config/zsh/greetings/01_prompts/shell_yeah
@@ -0,0 +1 @@
+shell yeah!! let’s do some scripts~ (ノ≧ ڡ ≦)
diff --git a/zsh/.config/zsh/greetings/01_prompts/time_to_hack b/zsh/.config/zsh/greetings/01_prompts/time_to_hack
new file mode 100644
index 0000000..afc0cb6
--- /dev/null
+++ b/zsh/.config/zsh/greetings/01_prompts/time_to_hack
@@ -0,0 +1 @@
+*clickity clack* time 2 hack~ (。•̀ᴗ-)✧
diff --git a/zsh/.config/zsh/greetings/01_prompts/typing b/zsh/.config/zsh/greetings/01_prompts/typing
new file mode 100644
index 0000000..6d4c0d0
--- /dev/null
+++ b/zsh/.config/zsh/greetings/01_prompts/typing
@@ -0,0 +1 @@
+typing together forever~~ (づ。◕‿‿◕。)づ
diff --git a/zsh/.config/zsh/greetings/01_prompts/yeehaw b/zsh/.config/zsh/greetings/01_prompts/yeehaw
new file mode 100644
index 0000000..53eb098
--- /dev/null
+++ b/zsh/.config/zsh/greetings/01_prompts/yeehaw
@@ -0,0 +1 @@
+rootin' and tootin' with sudo~ yeehaw~ (⌒ ▽ ⌒) ☆
diff --git a/zsh/.config/zsh/linux/init.zsh b/zsh/.config/zsh/linux/init.zsh
new file mode 100755
index 0000000..49db77e
--- /dev/null
+++ b/zsh/.config/zsh/linux/init.zsh
@@ -0,0 +1,6 @@
+#!/bin/zsh
+
+#-- <gpg> --
+export PINENTRY_USER_DATA="PINENTRY_USE_QT"
+#-- </gpg> --
+
diff --git a/zsh/.config/zsh/osx/armin.zsh b/zsh/.config/zsh/osx/armin.zsh
new file mode 100755
index 0000000..cc54a2e
--- /dev/null
+++ b/zsh/.config/zsh/osx/armin.zsh
@@ -0,0 +1,3 @@
+#!/bin/zsh
+
+
diff --git a/zsh/.config/zsh/osx/bcd074b37296.zsh b/zsh/.config/zsh/osx/bcd074b37296.zsh
new file mode 120000
index 0000000..f99643e
--- /dev/null
+++ b/zsh/.config/zsh/osx/bcd074b37296.zsh
@@ -0,0 +1 @@
+work.zsh \ No newline at end of file
diff --git a/zsh/.config/zsh/osx/init.zsh b/zsh/.config/zsh/osx/init.zsh
new file mode 100755
index 0000000..40a3d8d
--- /dev/null
+++ b/zsh/.config/zsh/osx/init.zsh
@@ -0,0 +1,20 @@
+#!/bin/zsh
+
+#-- <brew> --
+# HOMEBREW_PREFIX, MANPATH, INFOPATH, etc.
+eval "$(/opt/homebrew/bin/brew shellenv)"
+
+# use gnu coreutils
+export PATH="$HOMEBREW_PREFIX/opt/coreutils/libexec/gnubin:$PATH"
+#-- </brew> --
+
+#-- <gpg> --
+export PINENTRY_USER_DATA="PINENTRY_USE_MAC"
+#-- </gpg> --
+
+#-- <zsh> --
+# brew install zsh-syntax-highlighting
+source $HOMEBREW_PREFIX/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh
+# brew install zsh-autosuggestions
+source $HOMEBREW_PREFIX/share/zsh-autosuggestions/zsh-autosuggestions.zsh
+#-- </zsh>
diff --git a/zsh/.config/zsh/osx/work.zsh b/zsh/.config/zsh/osx/work.zsh
new file mode 100755
index 0000000..9091c91
--- /dev/null
+++ b/zsh/.config/zsh/osx/work.zsh
@@ -0,0 +1,32 @@
+#!/bin/zsh
+
+#-- <amzn> --
+# git authorship
+export GIT_AUTHOR_NAME=Elizabeth Hunt
+export GIT_AUTHOR_EMAIL=lizhunt@amazon.com
+export GIT_COMMITTER_NAME=$GIT_AUTHOR_NAME
+export GIT_COMMITTER_EMAIL=$GIT_AUTHOR_EMAIL
+
+# finch
+export DOCKER_HOST=unix:///Applications/Finch/lima/data/finch/sock/finch.sock
+
+# run java repl with class path of package! :D
+alias jshell='jshell --class-path "`brazil-path build.classpath`:`brazil-path run.classpath`"'
+
+# bb ...
+alias bb=brazil-build
+alias bba='brazil-build apollo-pkg'
+alias bre='brazil-runtime-exec'
+alias brc='brazil-recursive-cmd'
+alias bws='brazil ws'
+alias bwsuse='bws use --gitMode -p'
+alias bwscreate='bws create -n'
+alias brc=brazil-recursive-cmd
+alias bbr='brc brazil-build'
+alias bball='brc --allPackages'
+alias bbb='brc --allPackages brazil-build'
+alias bbra='bbr apollo-pkg'
+alias bbcr='bb && cr'
+alias brazil-recursive-cmd='brazil-recursive-cmd-parallel'
+#-- </amzn> --
+
diff --git a/zsh/.config/zsh/setup/aliases.zsh b/zsh/.config/zsh/setup/aliases.zsh
new file mode 100755
index 0000000..73b09b3
--- /dev/null
+++ b/zsh/.config/zsh/setup/aliases.zsh
@@ -0,0 +1,27 @@
+#!/bin/sh
+
+#-- <git> --
+alias gc="git checkout"
+alias gcb="git checkout -b"
+alias gcm="git commit -m"
+alias ga="git add"
+alias gaa="git add ."
+alias gpl="git pull"
+alias gps="git push"
+alias gr="git rebase"
+alias gss="git status"
+alias gsa="git stash"
+alias gsr="git stash pop"
+alias gl="git log --oneline"
+#-- </git> --
+
+#-- <misc> --
+alias fuckuctl="journalctl --user -fu"
+alias fuckctl="journalctl -fu"
+
+alias ..="cd .."
+#-- </misc> --
+
+#-- <neovim> --
+alias vim="nvim"
+#-- </neovim> --
diff --git a/zsh/.config/zsh/setup/device.zsh b/zsh/.config/zsh/setup/device.zsh
new file mode 100755
index 0000000..d3f8c4b
--- /dev/null
+++ b/zsh/.config/zsh/setup/device.zsh
@@ -0,0 +1,30 @@
+#!/bin/zsh
+
+source log.sh "setup/device.zsh"
+
+#-- <os_init> --
+platform="$(platform.sh)"
+platform_setup="$ZDOTDIR/$platform"
+init_platform="$platform_setup/init.zsh"
+if [ ! -d "$platform_setup" ]; then
+ log ERROR "misconfigured platform $platform: $platform_setup is not a directory"
+ exit 1
+fi
+if [ -e "$init_platform" ]; then
+ log DEBUG "executing $init_platform"
+ . "$init_platform"
+else
+ log DEBUG "no platform-specific init for $platform at $init_platform"
+fi
+#-- </os_init> --
+
+#-- <machine_init> --
+machine="$(system_name.sh)"
+machine_init="$platform_setup/$machine.zsh"
+if [ -e "$machine_init" ]; then
+ log DEBUG "executing $platform.$machine $machine_init"
+ . "$machine_init"
+else
+ log WARN "no machine-specific init for $platform.$machine at $machine_init"
+fi
+#-- </machine_init> --
diff --git a/zsh/.config/zsh/setup/git.zsh b/zsh/.config/zsh/setup/git.zsh
new file mode 100755
index 0000000..e88cafc
--- /dev/null
+++ b/zsh/.config/zsh/setup/git.zsh
@@ -0,0 +1,8 @@
+#!/bin/zsh
+
+#-- <git> --
+export GIT_AUTHOR_NAME=Elizabeth Alexander Hunt
+export GIT_AUTHOR_EMAIL=me@liz.coffee
+export GIT_COMMITTER_NAME=$GIT_AUTHOR_NAME
+export GIT_COMMITTER_EMAIL=$GIT_AUTHOR_EMAIL
+#-- </git> --
diff --git a/zsh/.config/zsh/setup/gpg.zsh b/zsh/.config/zsh/setup/gpg.zsh
new file mode 100755
index 0000000..171b9d8
--- /dev/null
+++ b/zsh/.config/zsh/setup/gpg.zsh
@@ -0,0 +1,23 @@
+#!/bin/zsh
+
+
+# -- <gpg> --
+KEY_ID="DC4323D1738F27358793D6E87BB52F7036FA7C18"
+gpg -k "$KEY_ID" >/dev/null 2>&1 || gpg --import "$HOME/Documents/pubkey"
+
+cp $HOME/scripts/pinentry.sh /tmp/pinentry
+
+
+export PINENTRY_USER_DATA="${PINENTRY_USER_DATA:-PINENTRY_USE_TTY}"
+if [ "$SSH_CLIENT" ]; then
+ export PINENTRY_USER_DATA=PINENTRY_USE_CURSES
+ exit 0
+fi
+
+# yubikey!
+unset SSH_AGENT_PID
+export GPG_TTY=$(tty)
+export SSH_AUTH_SOCK=$(gpgconf --list-dirs agent-ssh-socket)
+gpgconf --launch gpg-agent
+gpg-connect-agent updatestartuptty /bye > /dev/null
+# -- </gpg> --
diff --git a/zsh/.config/zsh/setup/history.zsh b/zsh/.config/zsh/setup/history.zsh
new file mode 100755
index 0000000..ea8ab9c
--- /dev/null
+++ b/zsh/.config/zsh/setup/history.zsh
@@ -0,0 +1,14 @@
+#!/bin/zsh
+
+HISTSIZE=2000000
+SAVEHIST=$HISTSIZE
+: ${HISTFILE=$ZDOTDIR/zsh_history}
+
+setopt EXTENDED_HISTORY # Write the history file in the ':start:elapsed;command' format.
+setopt HIST_EXPIRE_DUPS_FIRST # Expire a duplicate event first when trimming history.
+setopt HIST_FIND_NO_DUPS # Do not display a previously found event.
+setopt HIST_IGNORE_ALL_DUPS # Delete an old recorded event if a new event is a duplicate.
+setopt HIST_IGNORE_DUPS # Do not record an event that was just recorded again.
+setopt HIST_IGNORE_SPACE # Do not record an event starting with a space.
+setopt HIST_SAVE_NO_DUPS # Do not write a duplicate event to the history file.
+setopt SHARE_HISTORY # Share history between all sessions.
diff --git a/zsh/.config/zsh/setup/misc.zsh b/zsh/.config/zsh/setup/misc.zsh
new file mode 100755
index 0000000..f301dcc
--- /dev/null
+++ b/zsh/.config/zsh/setup/misc.zsh
@@ -0,0 +1,11 @@
+#!/bin/zsh
+
+backward-kill-dir () {
+ local WORDCHARS=${WORDCHARS/\/}
+ zle backward-kill-word
+ zle -f kill
+}
+zle -N backward-kill-dir
+bindkey '^[^?' backward-kill-dir
+
+bindkey \^K kill-line
diff --git a/zsh/.config/zsh/setup/tools.zsh b/zsh/.config/zsh/setup/tools.zsh
new file mode 100755
index 0000000..1fc8844
--- /dev/null
+++ b/zsh/.config/zsh/setup/tools.zsh
@@ -0,0 +1,15 @@
+#!/bin/zsh
+
+#-- <mise> --
+eval "$(mise activate zsh)"
+#-- </mise> --
+
+#-- <zoxide> --
+eval "$(zoxide init --cmd z zsh)"
+alias cd="z"
+#-- </zoxide> --
+
+#-- <starship> --
+eval "$(starship init zsh)"
+#-- </starship> --
+
diff --git a/zsh/.hushlogin b/zsh/.hushlogin
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/zsh/.hushlogin
diff --git a/zsh/.zshrc b/zsh/.zshrc
new file mode 100644
index 0000000..a2376b7
--- /dev/null
+++ b/zsh/.zshrc
@@ -0,0 +1,38 @@
+#!/bin/zsh
+
+#-- <startup> --
+export XDG_CONFIG_HOME="$HOME/.config"
+export ZDOTDIR=${XDG_CONFIG_HOME:-$HOME/.config}/zsh
+export PATH=$PATH:$HOME/scripts:$HOME/.local/bin
+
+source log.sh ".zshrc"
+greet.sh
+#-- </startup> --
+
+#-- <misc> --
+. "$ZDOTDIR/setup/misc.zsh"
+#-- </misc> --
+
+#-- <common_aliases> --
+. "$ZDOTDIR/setup/aliases.zsh"
+#-- </common_aliases> --
+
+#-- <shell_opts> --
+. "$ZDOTDIR/setup/history.zsh"
+#-- </shell_opts> --
+
+#-- <misc> --
+. "$ZDOTDIR/setup/git.zsh"
+#-- </misc> --
+
+#-- <device> --
+. "$ZDOTDIR/setup/device.zsh"
+#-- </device> --
+
+#-- <tools> --
+. "$ZDOTDIR/setup/tools.zsh"
+#-- </tools> --
+
+#-- <gpg> --
+. "$ZDOTDIR/setup/gpg.zsh"
+#-- </gpg> --