to the shell
+ if key_binding_not_set "$prefix"; then
+ tmux bind-key "$prefix" send-prefix
+ fi
+ fi
+
+ # If Ctrl-a is prefix then `Ctrl-a + a` switches between alternate windows.
+ # Works for any prefix character.
+ if key_binding_not_set "$prefix_without_ctrl"; then
+ tmux bind-key "$prefix_without_ctrl" last-window
+ fi
+
+ # easier switching between next/prev window
+ if key_binding_not_set "C-p"; then
+ tmux bind-key C-p previous-window
+ fi
+ if key_binding_not_set "C-n"; then
+ tmux bind-key C-n next-window
+ fi
+
+ # source `.tmux.conf` file - as suggested in `man tmux`
+ if key_binding_not_set "R"; then
+ local tmux_config=$(get_tmux_config)
+
+ tmux bind-key R run-shell " \
+ tmux source-file ${tmux_config} > /dev/null; \
+ tmux display-message 'Sourced ${tmux_config}!'"
+ fi
+}
+main
diff --git a/dot_tmux/plugins/tmux/LICENSE b/dot_tmux/plugins/tmux/LICENSE
new file mode 100644
index 0000000..006383b
--- /dev/null
+++ b/dot_tmux/plugins/tmux/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2021 Catppuccin
+
+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/dot_tmux/plugins/tmux/README.md b/dot_tmux/plugins/tmux/README.md
new file mode 100644
index 0000000..9f3d10d
--- /dev/null
+++ b/dot_tmux/plugins/tmux/README.md
@@ -0,0 +1,133 @@
+
+
+
+ Catppuccin for Tmux
+
+
+
+
+
+
+
+
+
+
+
+
+
+## Themes
+
+- 🌻 [Latte](./catppuccin-latte.tmuxtheme)
+- 🪴 [Frappé](./catppuccin-frappe.tmuxtheme)
+- 🌺 [Macchiato](./catppuccin-macchiato.tmuxtheme)
+- 🌿 [Mocha](./catppuccin-mocha.tmuxtheme)
+
+## Usage
+
+### TPM
+
+1. Install [TPM](https://github.com/tmux-plugins/tpm)
+2. Add the Catppuccin plugin:
+
+```bash
+set -g @plugin 'catppuccin/tmux'
+# ...alongside
+set -g @plugin 'tmux-plugins/tpm'
+```
+
+3. (Optional) Set your preferred flavour, it defaults to `"mocha"`:
+
+```bash
+set -g @catppuccin_flavour 'latte' # or frappe, macchiato, mocha
+```
+
+### Manual
+
+1. Copy your desired theme's configuration contents into your Tmux config (usually stored at `~/.tmux.conf`)
+2. Reload Tmux by either restarting the session or reloading it with `tmux source-file ~/.tmux.conf`
+
+#### Configuration options
+
+All flavours support certain levels of customization that match our [Catppuccin
+Style Guide][style-guide]. To add these customizations, add any of the following
+options to your Tmux configuration.
+
+In order to have the correct icons displayed please use your favorite nerd fonts patched font.
+
+##### Enable window tabs
+
+By default, the theme places the `window-status` in the `status-right`. With
+`@catppuccin_window_tabs_enabled` set to `on`, the theme will place the
+directory within the `status-right` and move the window names to the
+`window-status` format variables.
+
+```sh
+set -g @catppuccin_window_tabs_enabled on # or off to disable window_tabs
+```
+
+##### Configure separator
+
+By default, the theme will use a round separator for left and right.
+To overwrite it use `@catppuccin_left_separator` and `@catppuccin_right_separator`
+
+```sh
+set -g @catppuccin_left_separator "█"
+set -g @catppuccin_right_separator "█"
+```
+
+##### Enable DateTime
+
+By default, the `date_time` component is set to off.
+It can be enabled by specifying any tmux date and time format.
+
+```sh
+set -g @catppuccin_date_time "%Y-%m-%d %H:%M"
+```
+
+##### Enable User
+
+By default, the `user` component is set to off.
+It can be enabled by toggling it on.
+
+```sh
+set -g @catppuccin_user "on"
+```
+
+##### Enable Host
+
+By default, the `host` component is set to off.
+It can be enabled by toggling it on.
+
+```sh
+set -g @catppuccin_host "on"
+```
+
+##### Customize Icons
+
+Each of the components comes with their own default icon, which
+can be changed to fit your preference or requirements of your font.
+
+*Note: NerdFont Icons do not render properly in the Github UI, so the below example
+does not use them*
+```sh
+set -g @catppuccin_datetime_icon "A"
+set -g @catppuccin_user_icon "B"
+set -g @catppuccin_directory_icon "C"
+set -g @catppuccin_window_icon "D"
+set -g @catppuccin_session_icon "E"
+set -g @catppuccin_host_icon "F"
+```
+
+[style-guide]: https://github.com/catppuccin/catppuccin/blob/main/docs/style-guide.md
+
+## 💝 Thanks to
+
+- [Pocco81](https://github.com/catppuccin)
+- [vinnyA3](https://github.com/vinnyA3)
+- [rogeruiz](https://github.com/rogeruiz)
+
+
+
+
+Copyright © 2021-present Catppuccin Org
+
diff --git a/dot_tmux/plugins/tmux/assets/frappe.webp b/dot_tmux/plugins/tmux/assets/frappe.webp
new file mode 100644
index 0000000..64c14f8
Binary files /dev/null and b/dot_tmux/plugins/tmux/assets/frappe.webp differ
diff --git a/dot_tmux/plugins/tmux/assets/latte.webp b/dot_tmux/plugins/tmux/assets/latte.webp
new file mode 100644
index 0000000..6e48ac9
Binary files /dev/null and b/dot_tmux/plugins/tmux/assets/latte.webp differ
diff --git a/dot_tmux/plugins/tmux/assets/macchiato.webp b/dot_tmux/plugins/tmux/assets/macchiato.webp
new file mode 100644
index 0000000..df3aa04
Binary files /dev/null and b/dot_tmux/plugins/tmux/assets/macchiato.webp differ
diff --git a/dot_tmux/plugins/tmux/assets/mocha.webp b/dot_tmux/plugins/tmux/assets/mocha.webp
new file mode 100644
index 0000000..d9ee469
Binary files /dev/null and b/dot_tmux/plugins/tmux/assets/mocha.webp differ
diff --git a/dot_tmux/plugins/tmux/assets/preview.webp b/dot_tmux/plugins/tmux/assets/preview.webp
new file mode 100644
index 0000000..3224dc1
Binary files /dev/null and b/dot_tmux/plugins/tmux/assets/preview.webp differ
diff --git a/dot_tmux/plugins/tmux/catppuccin-frappe.tmuxtheme b/dot_tmux/plugins/tmux/catppuccin-frappe.tmuxtheme
new file mode 100644
index 0000000..a38a73f
--- /dev/null
+++ b/dot_tmux/plugins/tmux/catppuccin-frappe.tmuxtheme
@@ -0,0 +1,17 @@
+# NOTE: you can use vars with $ and ${} as long as the str is double quoted: ""
+# WARNING: hex colors can't contain capital letters
+
+# --> Catppuccin (Frappe)
+thm_bg="#303446"
+thm_fg="#c6d0f5"
+thm_cyan="#99d1db"
+thm_black="#292c3c"
+thm_gray="#414559"
+thm_magenta="#ca9ee6"
+thm_pink="#f4b8e4"
+thm_red="#e78284"
+thm_green="#a6d189"
+thm_yellow="#e5c890"
+thm_blue="#8caaee"
+thm_orange="#ef9f76"
+thm_black4="#626880"
diff --git a/dot_tmux/plugins/tmux/catppuccin-latte.tmuxtheme b/dot_tmux/plugins/tmux/catppuccin-latte.tmuxtheme
new file mode 100644
index 0000000..16f078f
--- /dev/null
+++ b/dot_tmux/plugins/tmux/catppuccin-latte.tmuxtheme
@@ -0,0 +1,17 @@
+# NOTE: you can use vars with $ and ${} as long as the str is double quoted: ""
+# WARNING: hex colors can't contain capital letters
+
+# --> Catppuccin (Latte)
+thm_bg="#dce0e8"
+thm_fg="#4c4f69"
+thm_cyan="#179299"
+thm_black="#e6e9ef"
+thm_gray="#bcc0cc"
+thm_magenta="#ea76cb"
+thm_pink="#8839ef"
+thm_red="#d20f39"
+thm_green="#40a02b"
+thm_yellow="#df8e1d"
+thm_blue="#1e66f5"
+thm_orange="#fe640b"
+thm_black4="#acb0be"
diff --git a/dot_tmux/plugins/tmux/catppuccin-macchiato.tmuxtheme b/dot_tmux/plugins/tmux/catppuccin-macchiato.tmuxtheme
new file mode 100644
index 0000000..c90bf76
--- /dev/null
+++ b/dot_tmux/plugins/tmux/catppuccin-macchiato.tmuxtheme
@@ -0,0 +1,17 @@
+# NOTE: you can use vars with $ and ${} as long as the str is double quoted: ""
+# WARNING: hex colors can't contain capital letters
+
+# --> Catppuccin (Macchiato)
+thm_bg="#24273a"
+thm_fg="#cad3f5"
+thm_cyan="#91d7e3"
+thm_black="#1e2030"
+thm_gray="#363a4f"
+thm_magenta="#c6a0f6"
+thm_pink="#f5bde6"
+thm_red="#ed8796"
+thm_green="#a6da95"
+thm_yellow="#eed49f"
+thm_blue="#8aadf4"
+thm_orange="#f5a97f"
+thm_black4="#5b6078"
diff --git a/dot_tmux/plugins/tmux/catppuccin-mocha.tmuxtheme b/dot_tmux/plugins/tmux/catppuccin-mocha.tmuxtheme
new file mode 100644
index 0000000..41e6369
--- /dev/null
+++ b/dot_tmux/plugins/tmux/catppuccin-mocha.tmuxtheme
@@ -0,0 +1,17 @@
+# NOTE: you can use vars with $ and ${} as long as the str is double quoted: ""
+# WARNING: hex colors can't contain capital letters
+
+# --> Catppuccin (Mocha)
+thm_bg="#1e1e2e"
+thm_fg="#cdd6f4"
+thm_cyan="#89dceb"
+thm_black="#181825"
+thm_gray="#313244"
+thm_magenta="#cba6f7"
+thm_pink="#f5c2e7"
+thm_red="#f38ba8"
+thm_green="#a6e3a1"
+thm_yellow="#f9e2af"
+thm_blue="#89b4fa"
+thm_orange="#fab387"
+thm_black4="#585b70"
diff --git a/dot_tmux/plugins/tmux/dot_editorconfig b/dot_tmux/plugins/tmux/dot_editorconfig
new file mode 100644
index 0000000..d86ac02
--- /dev/null
+++ b/dot_tmux/plugins/tmux/dot_editorconfig
@@ -0,0 +1,34 @@
+# EditorConfig helps developers define and maintain consistent
+# coding styles between different editors and IDEs
+# EditorConfig is awesome: https://EditorConfig.org
+
+root = true
+
+[*]
+charset = utf-8
+indent_size = 2
+indent_style = space
+end_of_line = lf
+insert_final_newline = true
+trim_trailing_whitespace = true
+
+# go
+[*.go]
+indent_style = tab
+indent_size = 4
+
+# python
+[*.{ini,py,py.tpl,rst}]
+indent_size = 4
+
+# rust
+[*.rs]
+indent_size = 4
+
+# documentation, utils
+[*.{md,mdx,diff}]
+trim_trailing_whitespace = false
+
+# windows shell scripts
+[*.{cmd,bat,ps1}]
+end_of_line = crlf
diff --git a/dot_tmux/plugins/tmux/dot_git/HEAD b/dot_tmux/plugins/tmux/dot_git/HEAD
new file mode 100644
index 0000000..b870d82
--- /dev/null
+++ b/dot_tmux/plugins/tmux/dot_git/HEAD
@@ -0,0 +1 @@
+ref: refs/heads/main
diff --git a/dot_tmux/plugins/tmux/dot_git/config b/dot_tmux/plugins/tmux/dot_git/config
new file mode 100644
index 0000000..9c0d906
--- /dev/null
+++ b/dot_tmux/plugins/tmux/dot_git/config
@@ -0,0 +1,15 @@
+[core]
+ repositoryformatversion = 0
+ filemode = true
+ bare = false
+ logallrefupdates = true
+ ignorecase = true
+ precomposeunicode = true
+[submodule]
+ active = .
+[remote "origin"]
+ url = https://git::@github.com/catppuccin/tmux
+ fetch = +refs/heads/main:refs/remotes/origin/main
+[branch "main"]
+ remote = origin
+ merge = refs/heads/main
diff --git a/dot_tmux/plugins/tmux/dot_git/description b/dot_tmux/plugins/tmux/dot_git/description
new file mode 100644
index 0000000..498b267
--- /dev/null
+++ b/dot_tmux/plugins/tmux/dot_git/description
@@ -0,0 +1 @@
+Unnamed repository; edit this file 'description' to name the repository.
diff --git a/dot_tmux/plugins/tmux/dot_git/hooks/executable_applypatch-msg.sample b/dot_tmux/plugins/tmux/dot_git/hooks/executable_applypatch-msg.sample
new file mode 100644
index 0000000..a5d7b84
--- /dev/null
+++ b/dot_tmux/plugins/tmux/dot_git/hooks/executable_applypatch-msg.sample
@@ -0,0 +1,15 @@
+#!/bin/sh
+#
+# An example hook script to check the commit log message taken by
+# applypatch from an e-mail message.
+#
+# The hook should exit with non-zero status after issuing an
+# appropriate message if it wants to stop the commit. The hook is
+# allowed to edit the commit message file.
+#
+# To enable this hook, rename this file to "applypatch-msg".
+
+. git-sh-setup
+commitmsg="$(git rev-parse --git-path hooks/commit-msg)"
+test -x "$commitmsg" && exec "$commitmsg" ${1+"$@"}
+:
diff --git a/dot_tmux/plugins/tmux/dot_git/hooks/executable_commit-msg.sample b/dot_tmux/plugins/tmux/dot_git/hooks/executable_commit-msg.sample
new file mode 100644
index 0000000..b58d118
--- /dev/null
+++ b/dot_tmux/plugins/tmux/dot_git/hooks/executable_commit-msg.sample
@@ -0,0 +1,24 @@
+#!/bin/sh
+#
+# An example hook script to check the commit log message.
+# Called by "git commit" with one argument, the name of the file
+# that has the commit message. The hook should exit with non-zero
+# status after issuing an appropriate message if it wants to stop the
+# commit. The hook is allowed to edit the commit message file.
+#
+# To enable this hook, rename this file to "commit-msg".
+
+# Uncomment the below to add a Signed-off-by line to the message.
+# Doing this in a hook is a bad idea in general, but the prepare-commit-msg
+# hook is more suited to it.
+#
+# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p')
+# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1"
+
+# This example catches duplicate Signed-off-by lines.
+
+test "" = "$(grep '^Signed-off-by: ' "$1" |
+ sort | uniq -c | sed -e '/^[ ]*1[ ]/d')" || {
+ echo >&2 Duplicate Signed-off-by lines.
+ exit 1
+}
diff --git a/dot_tmux/plugins/tmux/dot_git/hooks/executable_fsmonitor-watchman.sample b/dot_tmux/plugins/tmux/dot_git/hooks/executable_fsmonitor-watchman.sample
new file mode 100644
index 0000000..23e856f
--- /dev/null
+++ b/dot_tmux/plugins/tmux/dot_git/hooks/executable_fsmonitor-watchman.sample
@@ -0,0 +1,174 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+use IPC::Open2;
+
+# An example hook script to integrate Watchman
+# (https://facebook.github.io/watchman/) with git to speed up detecting
+# new and modified files.
+#
+# The hook is passed a version (currently 2) and last update token
+# formatted as a string and outputs to stdout a new update token and
+# all files that have been modified since the update token. Paths must
+# be relative to the root of the working tree and separated by a single NUL.
+#
+# To enable this hook, rename this file to "query-watchman" and set
+# 'git config core.fsmonitor .git/hooks/query-watchman'
+#
+my ($version, $last_update_token) = @ARGV;
+
+# Uncomment for debugging
+# print STDERR "$0 $version $last_update_token\n";
+
+# Check the hook interface version
+if ($version ne 2) {
+ die "Unsupported query-fsmonitor hook version '$version'.\n" .
+ "Falling back to scanning...\n";
+}
+
+my $git_work_tree = get_working_dir();
+
+my $retry = 1;
+
+my $json_pkg;
+eval {
+ require JSON::XS;
+ $json_pkg = "JSON::XS";
+ 1;
+} or do {
+ require JSON::PP;
+ $json_pkg = "JSON::PP";
+};
+
+launch_watchman();
+
+sub launch_watchman {
+ my $o = watchman_query();
+ if (is_work_tree_watched($o)) {
+ output_result($o->{clock}, @{$o->{files}});
+ }
+}
+
+sub output_result {
+ my ($clockid, @files) = @_;
+
+ # Uncomment for debugging watchman output
+ # open (my $fh, ">", ".git/watchman-output.out");
+ # binmode $fh, ":utf8";
+ # print $fh "$clockid\n@files\n";
+ # close $fh;
+
+ binmode STDOUT, ":utf8";
+ print $clockid;
+ print "\0";
+ local $, = "\0";
+ print @files;
+}
+
+sub watchman_clock {
+ my $response = qx/watchman clock "$git_work_tree"/;
+ die "Failed to get clock id on '$git_work_tree'.\n" .
+ "Falling back to scanning...\n" if $? != 0;
+
+ return $json_pkg->new->utf8->decode($response);
+}
+
+sub watchman_query {
+ my $pid = open2(\*CHLD_OUT, \*CHLD_IN, 'watchman -j --no-pretty')
+ or die "open2() failed: $!\n" .
+ "Falling back to scanning...\n";
+
+ # In the query expression below we're asking for names of files that
+ # changed since $last_update_token but not from the .git folder.
+ #
+ # To accomplish this, we're using the "since" generator to use the
+ # recency index to select candidate nodes and "fields" to limit the
+ # output to file names only. Then we're using the "expression" term to
+ # further constrain the results.
+ my $last_update_line = "";
+ if (substr($last_update_token, 0, 1) eq "c") {
+ $last_update_token = "\"$last_update_token\"";
+ $last_update_line = qq[\n"since": $last_update_token,];
+ }
+ my $query = <<" END";
+ ["query", "$git_work_tree", {$last_update_line
+ "fields": ["name"],
+ "expression": ["not", ["dirname", ".git"]]
+ }]
+ END
+
+ # Uncomment for debugging the watchman query
+ # open (my $fh, ">", ".git/watchman-query.json");
+ # print $fh $query;
+ # close $fh;
+
+ print CHLD_IN $query;
+ close CHLD_IN;
+ my $response = do {local $/; };
+
+ # Uncomment for debugging the watch response
+ # open ($fh, ">", ".git/watchman-response.json");
+ # print $fh $response;
+ # close $fh;
+
+ die "Watchman: command returned no output.\n" .
+ "Falling back to scanning...\n" if $response eq "";
+ die "Watchman: command returned invalid output: $response\n" .
+ "Falling back to scanning...\n" unless $response =~ /^\{/;
+
+ return $json_pkg->new->utf8->decode($response);
+}
+
+sub is_work_tree_watched {
+ my ($output) = @_;
+ my $error = $output->{error};
+ if ($retry > 0 and $error and $error =~ m/unable to resolve root .* directory (.*) is not watched/) {
+ $retry--;
+ my $response = qx/watchman watch "$git_work_tree"/;
+ die "Failed to make watchman watch '$git_work_tree'.\n" .
+ "Falling back to scanning...\n" if $? != 0;
+ $output = $json_pkg->new->utf8->decode($response);
+ $error = $output->{error};
+ die "Watchman: $error.\n" .
+ "Falling back to scanning...\n" if $error;
+
+ # Uncomment for debugging watchman output
+ # open (my $fh, ">", ".git/watchman-output.out");
+ # close $fh;
+
+ # Watchman will always return all files on the first query so
+ # return the fast "everything is dirty" flag to git and do the
+ # Watchman query just to get it over with now so we won't pay
+ # the cost in git to look up each individual file.
+ my $o = watchman_clock();
+ $error = $output->{error};
+
+ die "Watchman: $error.\n" .
+ "Falling back to scanning...\n" if $error;
+
+ output_result($o->{clock}, ("/"));
+ $last_update_token = $o->{clock};
+
+ eval { launch_watchman() };
+ return 0;
+ }
+
+ die "Watchman: $error.\n" .
+ "Falling back to scanning...\n" if $error;
+
+ return 1;
+}
+
+sub get_working_dir {
+ my $working_dir;
+ if ($^O =~ 'msys' || $^O =~ 'cygwin') {
+ $working_dir = Win32::GetCwd();
+ $working_dir =~ tr/\\/\//;
+ } else {
+ require Cwd;
+ $working_dir = Cwd::cwd();
+ }
+
+ return $working_dir;
+}
diff --git a/dot_tmux/plugins/tmux/dot_git/hooks/executable_post-update.sample b/dot_tmux/plugins/tmux/dot_git/hooks/executable_post-update.sample
new file mode 100644
index 0000000..ec17ec1
--- /dev/null
+++ b/dot_tmux/plugins/tmux/dot_git/hooks/executable_post-update.sample
@@ -0,0 +1,8 @@
+#!/bin/sh
+#
+# An example hook script to prepare a packed repository for use over
+# dumb transports.
+#
+# To enable this hook, rename this file to "post-update".
+
+exec git update-server-info
diff --git a/dot_tmux/plugins/tmux/dot_git/hooks/executable_pre-applypatch.sample b/dot_tmux/plugins/tmux/dot_git/hooks/executable_pre-applypatch.sample
new file mode 100644
index 0000000..4142082
--- /dev/null
+++ b/dot_tmux/plugins/tmux/dot_git/hooks/executable_pre-applypatch.sample
@@ -0,0 +1,14 @@
+#!/bin/sh
+#
+# An example hook script to verify what is about to be committed
+# by applypatch from an e-mail message.
+#
+# The hook should exit with non-zero status after issuing an
+# appropriate message if it wants to stop the commit.
+#
+# To enable this hook, rename this file to "pre-applypatch".
+
+. git-sh-setup
+precommit="$(git rev-parse --git-path hooks/pre-commit)"
+test -x "$precommit" && exec "$precommit" ${1+"$@"}
+:
diff --git a/dot_tmux/plugins/tmux/dot_git/hooks/executable_pre-commit.sample b/dot_tmux/plugins/tmux/dot_git/hooks/executable_pre-commit.sample
new file mode 100644
index 0000000..e144712
--- /dev/null
+++ b/dot_tmux/plugins/tmux/dot_git/hooks/executable_pre-commit.sample
@@ -0,0 +1,49 @@
+#!/bin/sh
+#
+# An example hook script to verify what is about to be committed.
+# Called by "git commit" with no arguments. The hook should
+# exit with non-zero status after issuing an appropriate message if
+# it wants to stop the commit.
+#
+# To enable this hook, rename this file to "pre-commit".
+
+if git rev-parse --verify HEAD >/dev/null 2>&1
+then
+ against=HEAD
+else
+ # Initial commit: diff against an empty tree object
+ against=$(git hash-object -t tree /dev/null)
+fi
+
+# If you want to allow non-ASCII filenames set this variable to true.
+allownonascii=$(git config --type=bool hooks.allownonascii)
+
+# Redirect output to stderr.
+exec 1>&2
+
+# Cross platform projects tend to avoid non-ASCII filenames; prevent
+# them from being added to the repository. We exploit the fact that the
+# printable range starts at the space character and ends with tilde.
+if [ "$allownonascii" != "true" ] &&
+ # Note that the use of brackets around a tr range is ok here, (it's
+ # even required, for portability to Solaris 10's /usr/bin/tr), since
+ # the square bracket bytes happen to fall in the designated range.
+ test $(git diff --cached --name-only --diff-filter=A -z $against |
+ LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0
+then
+ cat <<\EOF
+Error: Attempt to add a non-ASCII file name.
+
+This can cause problems if you want to work with people on other platforms.
+
+To be portable it is advisable to rename the file.
+
+If you know what you are doing you can disable this check using:
+
+ git config hooks.allownonascii true
+EOF
+ exit 1
+fi
+
+# If there are whitespace errors, print the offending file names and fail.
+exec git diff-index --check --cached $against --
diff --git a/dot_tmux/plugins/tmux/dot_git/hooks/executable_pre-merge-commit.sample b/dot_tmux/plugins/tmux/dot_git/hooks/executable_pre-merge-commit.sample
new file mode 100644
index 0000000..399eab1
--- /dev/null
+++ b/dot_tmux/plugins/tmux/dot_git/hooks/executable_pre-merge-commit.sample
@@ -0,0 +1,13 @@
+#!/bin/sh
+#
+# An example hook script to verify what is about to be committed.
+# Called by "git merge" with no arguments. The hook should
+# exit with non-zero status after issuing an appropriate message to
+# stderr if it wants to stop the merge commit.
+#
+# To enable this hook, rename this file to "pre-merge-commit".
+
+. git-sh-setup
+test -x "$GIT_DIR/hooks/pre-commit" &&
+ exec "$GIT_DIR/hooks/pre-commit"
+:
diff --git a/dot_tmux/plugins/tmux/dot_git/hooks/executable_pre-push.sample b/dot_tmux/plugins/tmux/dot_git/hooks/executable_pre-push.sample
new file mode 100644
index 0000000..4ce688d
--- /dev/null
+++ b/dot_tmux/plugins/tmux/dot_git/hooks/executable_pre-push.sample
@@ -0,0 +1,53 @@
+#!/bin/sh
+
+# An example hook script to verify what is about to be pushed. Called by "git
+# push" after it has checked the remote status, but before anything has been
+# pushed. If this script exits with a non-zero status nothing will be pushed.
+#
+# This hook is called with the following parameters:
+#
+# $1 -- Name of the remote to which the push is being done
+# $2 -- URL to which the push is being done
+#
+# If pushing without using a named remote those arguments will be equal.
+#
+# Information about the commits which are being pushed is supplied as lines to
+# the standard input in the form:
+#
+#
+#
+# This sample shows how to prevent push of commits where the log message starts
+# with "WIP" (work in progress).
+
+remote="$1"
+url="$2"
+
+zero=$(git hash-object --stdin &2 "Found WIP commit in $local_ref, not pushing"
+ exit 1
+ fi
+ fi
+done
+
+exit 0
diff --git a/dot_tmux/plugins/tmux/dot_git/hooks/executable_pre-rebase.sample b/dot_tmux/plugins/tmux/dot_git/hooks/executable_pre-rebase.sample
new file mode 100644
index 0000000..6cbef5c
--- /dev/null
+++ b/dot_tmux/plugins/tmux/dot_git/hooks/executable_pre-rebase.sample
@@ -0,0 +1,169 @@
+#!/bin/sh
+#
+# Copyright (c) 2006, 2008 Junio C Hamano
+#
+# The "pre-rebase" hook is run just before "git rebase" starts doing
+# its job, and can prevent the command from running by exiting with
+# non-zero status.
+#
+# The hook is called with the following parameters:
+#
+# $1 -- the upstream the series was forked from.
+# $2 -- the branch being rebased (or empty when rebasing the current branch).
+#
+# This sample shows how to prevent topic branches that are already
+# merged to 'next' branch from getting rebased, because allowing it
+# would result in rebasing already published history.
+
+publish=next
+basebranch="$1"
+if test "$#" = 2
+then
+ topic="refs/heads/$2"
+else
+ topic=`git symbolic-ref HEAD` ||
+ exit 0 ;# we do not interrupt rebasing detached HEAD
+fi
+
+case "$topic" in
+refs/heads/??/*)
+ ;;
+*)
+ exit 0 ;# we do not interrupt others.
+ ;;
+esac
+
+# Now we are dealing with a topic branch being rebased
+# on top of master. Is it OK to rebase it?
+
+# Does the topic really exist?
+git show-ref -q "$topic" || {
+ echo >&2 "No such branch $topic"
+ exit 1
+}
+
+# Is topic fully merged to master?
+not_in_master=`git rev-list --pretty=oneline ^master "$topic"`
+if test -z "$not_in_master"
+then
+ echo >&2 "$topic is fully merged to master; better remove it."
+ exit 1 ;# we could allow it, but there is no point.
+fi
+
+# Is topic ever merged to next? If so you should not be rebasing it.
+only_next_1=`git rev-list ^master "^$topic" ${publish} | sort`
+only_next_2=`git rev-list ^master ${publish} | sort`
+if test "$only_next_1" = "$only_next_2"
+then
+ not_in_topic=`git rev-list "^$topic" master`
+ if test -z "$not_in_topic"
+ then
+ echo >&2 "$topic is already up to date with master"
+ exit 1 ;# we could allow it, but there is no point.
+ else
+ exit 0
+ fi
+else
+ not_in_next=`git rev-list --pretty=oneline ^${publish} "$topic"`
+ /usr/bin/perl -e '
+ my $topic = $ARGV[0];
+ my $msg = "* $topic has commits already merged to public branch:\n";
+ my (%not_in_next) = map {
+ /^([0-9a-f]+) /;
+ ($1 => 1);
+ } split(/\n/, $ARGV[1]);
+ for my $elem (map {
+ /^([0-9a-f]+) (.*)$/;
+ [$1 => $2];
+ } split(/\n/, $ARGV[2])) {
+ if (!exists $not_in_next{$elem->[0]}) {
+ if ($msg) {
+ print STDERR $msg;
+ undef $msg;
+ }
+ print STDERR " $elem->[1]\n";
+ }
+ }
+ ' "$topic" "$not_in_next" "$not_in_master"
+ exit 1
+fi
+
+<<\DOC_END
+
+This sample hook safeguards topic branches that have been
+published from being rewound.
+
+The workflow assumed here is:
+
+ * Once a topic branch forks from "master", "master" is never
+ merged into it again (either directly or indirectly).
+
+ * Once a topic branch is fully cooked and merged into "master",
+ it is deleted. If you need to build on top of it to correct
+ earlier mistakes, a new topic branch is created by forking at
+ the tip of the "master". This is not strictly necessary, but
+ it makes it easier to keep your history simple.
+
+ * Whenever you need to test or publish your changes to topic
+ branches, merge them into "next" branch.
+
+The script, being an example, hardcodes the publish branch name
+to be "next", but it is trivial to make it configurable via
+$GIT_DIR/config mechanism.
+
+With this workflow, you would want to know:
+
+(1) ... if a topic branch has ever been merged to "next". Young
+ topic branches can have stupid mistakes you would rather
+ clean up before publishing, and things that have not been
+ merged into other branches can be easily rebased without
+ affecting other people. But once it is published, you would
+ not want to rewind it.
+
+(2) ... if a topic branch has been fully merged to "master".
+ Then you can delete it. More importantly, you should not
+ build on top of it -- other people may already want to
+ change things related to the topic as patches against your
+ "master", so if you need further changes, it is better to
+ fork the topic (perhaps with the same name) afresh from the
+ tip of "master".
+
+Let's look at this example:
+
+ o---o---o---o---o---o---o---o---o---o "next"
+ / / / /
+ / a---a---b A / /
+ / / / /
+ / / c---c---c---c B /
+ / / / \ /
+ / / / b---b C \ /
+ / / / / \ /
+ ---o---o---o---o---o---o---o---o---o---o---o "master"
+
+
+A, B and C are topic branches.
+
+ * A has one fix since it was merged up to "next".
+
+ * B has finished. It has been fully merged up to "master" and "next",
+ and is ready to be deleted.
+
+ * C has not merged to "next" at all.
+
+We would want to allow C to be rebased, refuse A, and encourage
+B to be deleted.
+
+To compute (1):
+
+ git rev-list ^master ^topic next
+ git rev-list ^master next
+
+ if these match, topic has not merged in next at all.
+
+To compute (2):
+
+ git rev-list master..topic
+
+ if this is empty, it is fully merged to "master".
+
+DOC_END
diff --git a/dot_tmux/plugins/tmux/dot_git/hooks/executable_pre-receive.sample b/dot_tmux/plugins/tmux/dot_git/hooks/executable_pre-receive.sample
new file mode 100644
index 0000000..a1fd29e
--- /dev/null
+++ b/dot_tmux/plugins/tmux/dot_git/hooks/executable_pre-receive.sample
@@ -0,0 +1,24 @@
+#!/bin/sh
+#
+# An example hook script to make use of push options.
+# The example simply echoes all push options that start with 'echoback='
+# and rejects all pushes when the "reject" push option is used.
+#
+# To enable this hook, rename this file to "pre-receive".
+
+if test -n "$GIT_PUSH_OPTION_COUNT"
+then
+ i=0
+ while test "$i" -lt "$GIT_PUSH_OPTION_COUNT"
+ do
+ eval "value=\$GIT_PUSH_OPTION_$i"
+ case "$value" in
+ echoback=*)
+ echo "echo from the pre-receive-hook: ${value#*=}" >&2
+ ;;
+ reject)
+ exit 1
+ esac
+ i=$((i + 1))
+ done
+fi
diff --git a/dot_tmux/plugins/tmux/dot_git/hooks/executable_prepare-commit-msg.sample b/dot_tmux/plugins/tmux/dot_git/hooks/executable_prepare-commit-msg.sample
new file mode 100644
index 0000000..10fa14c
--- /dev/null
+++ b/dot_tmux/plugins/tmux/dot_git/hooks/executable_prepare-commit-msg.sample
@@ -0,0 +1,42 @@
+#!/bin/sh
+#
+# An example hook script to prepare the commit log message.
+# Called by "git commit" with the name of the file that has the
+# commit message, followed by the description of the commit
+# message's source. The hook's purpose is to edit the commit
+# message file. If the hook fails with a non-zero status,
+# the commit is aborted.
+#
+# To enable this hook, rename this file to "prepare-commit-msg".
+
+# This hook includes three examples. The first one removes the
+# "# Please enter the commit message..." help message.
+#
+# The second includes the output of "git diff --name-status -r"
+# into the message, just before the "git status" output. It is
+# commented because it doesn't cope with --amend or with squashed
+# commits.
+#
+# The third example adds a Signed-off-by line to the message, that can
+# still be edited. This is rarely a good idea.
+
+COMMIT_MSG_FILE=$1
+COMMIT_SOURCE=$2
+SHA1=$3
+
+/usr/bin/perl -i.bak -ne 'print unless(m/^. Please enter the commit message/..m/^#$/)' "$COMMIT_MSG_FILE"
+
+# case "$COMMIT_SOURCE,$SHA1" in
+# ,|template,)
+# /usr/bin/perl -i.bak -pe '
+# print "\n" . `git diff --cached --name-status -r`
+# if /^#/ && $first++ == 0' "$COMMIT_MSG_FILE" ;;
+# *) ;;
+# esac
+
+# SOB=$(git var GIT_COMMITTER_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p')
+# git interpret-trailers --in-place --trailer "$SOB" "$COMMIT_MSG_FILE"
+# if test -z "$COMMIT_SOURCE"
+# then
+# /usr/bin/perl -i.bak -pe 'print "\n" if !$first_line++' "$COMMIT_MSG_FILE"
+# fi
diff --git a/dot_tmux/plugins/tmux/dot_git/hooks/executable_push-to-checkout.sample b/dot_tmux/plugins/tmux/dot_git/hooks/executable_push-to-checkout.sample
new file mode 100644
index 0000000..af5a0c0
--- /dev/null
+++ b/dot_tmux/plugins/tmux/dot_git/hooks/executable_push-to-checkout.sample
@@ -0,0 +1,78 @@
+#!/bin/sh
+
+# An example hook script to update a checked-out tree on a git push.
+#
+# This hook is invoked by git-receive-pack(1) when it reacts to git
+# push and updates reference(s) in its repository, and when the push
+# tries to update the branch that is currently checked out and the
+# receive.denyCurrentBranch configuration variable is set to
+# updateInstead.
+#
+# By default, such a push is refused if the working tree and the index
+# of the remote repository has any difference from the currently
+# checked out commit; when both the working tree and the index match
+# the current commit, they are updated to match the newly pushed tip
+# of the branch. This hook is to be used to override the default
+# behaviour; however the code below reimplements the default behaviour
+# as a starting point for convenient modification.
+#
+# The hook receives the commit with which the tip of the current
+# branch is going to be updated:
+commit=$1
+
+# It can exit with a non-zero status to refuse the push (when it does
+# so, it must not modify the index or the working tree).
+die () {
+ echo >&2 "$*"
+ exit 1
+}
+
+# Or it can make any necessary changes to the working tree and to the
+# index to bring them to the desired state when the tip of the current
+# branch is updated to the new commit, and exit with a zero status.
+#
+# For example, the hook can simply run git read-tree -u -m HEAD "$1"
+# in order to emulate git fetch that is run in the reverse direction
+# with git push, as the two-tree form of git read-tree -u -m is
+# essentially the same as git switch or git checkout that switches
+# branches while keeping the local changes in the working tree that do
+# not interfere with the difference between the branches.
+
+# The below is a more-or-less exact translation to shell of the C code
+# for the default behaviour for git's push-to-checkout hook defined in
+# the push_to_deploy() function in builtin/receive-pack.c.
+#
+# Note that the hook will be executed from the repository directory,
+# not from the working tree, so if you want to perform operations on
+# the working tree, you will have to adapt your code accordingly, e.g.
+# by adding "cd .." or using relative paths.
+
+if ! git update-index -q --ignore-submodules --refresh
+then
+ die "Up-to-date check failed"
+fi
+
+if ! git diff-files --quiet --ignore-submodules --
+then
+ die "Working directory has unstaged changes"
+fi
+
+# This is a rough translation of:
+#
+# head_has_history() ? "HEAD" : EMPTY_TREE_SHA1_HEX
+if git cat-file -e HEAD 2>/dev/null
+then
+ head=HEAD
+else
+ head=$(git hash-object -t tree --stdin &2
+ exit 1
+}
+
+unset GIT_DIR GIT_WORK_TREE
+cd "$worktree" &&
+
+if grep -q "^diff --git " "$1"
+then
+ validate_patch "$1"
+else
+ validate_cover_letter "$1"
+fi &&
+
+if test "$GIT_SENDEMAIL_FILE_COUNTER" = "$GIT_SENDEMAIL_FILE_TOTAL"
+then
+ git config --unset-all sendemail.validateWorktree &&
+ trap 'git worktree remove -ff "$worktree"' EXIT &&
+ validate_series
+fi
diff --git a/dot_tmux/plugins/tmux/dot_git/hooks/executable_update.sample b/dot_tmux/plugins/tmux/dot_git/hooks/executable_update.sample
new file mode 100644
index 0000000..c4d426b
--- /dev/null
+++ b/dot_tmux/plugins/tmux/dot_git/hooks/executable_update.sample
@@ -0,0 +1,128 @@
+#!/bin/sh
+#
+# An example hook script to block unannotated tags from entering.
+# Called by "git receive-pack" with arguments: refname sha1-old sha1-new
+#
+# To enable this hook, rename this file to "update".
+#
+# Config
+# ------
+# hooks.allowunannotated
+# This boolean sets whether unannotated tags will be allowed into the
+# repository. By default they won't be.
+# hooks.allowdeletetag
+# This boolean sets whether deleting tags will be allowed in the
+# repository. By default they won't be.
+# hooks.allowmodifytag
+# This boolean sets whether a tag may be modified after creation. By default
+# it won't be.
+# hooks.allowdeletebranch
+# This boolean sets whether deleting branches will be allowed in the
+# repository. By default they won't be.
+# hooks.denycreatebranch
+# This boolean sets whether remotely creating branches will be denied
+# in the repository. By default this is allowed.
+#
+
+# --- Command line
+refname="$1"
+oldrev="$2"
+newrev="$3"
+
+# --- Safety check
+if [ -z "$GIT_DIR" ]; then
+ echo "Don't run this script from the command line." >&2
+ echo " (if you want, you could supply GIT_DIR then run" >&2
+ echo " $0 [ )" >&2
+ exit 1
+fi
+
+if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then
+ echo "usage: $0 ][ " >&2
+ exit 1
+fi
+
+# --- Config
+allowunannotated=$(git config --type=bool hooks.allowunannotated)
+allowdeletebranch=$(git config --type=bool hooks.allowdeletebranch)
+denycreatebranch=$(git config --type=bool hooks.denycreatebranch)
+allowdeletetag=$(git config --type=bool hooks.allowdeletetag)
+allowmodifytag=$(git config --type=bool hooks.allowmodifytag)
+
+# check for no description
+projectdesc=$(sed -e '1q' "$GIT_DIR/description")
+case "$projectdesc" in
+"Unnamed repository"* | "")
+ echo "*** Project description file hasn't been set" >&2
+ exit 1
+ ;;
+esac
+
+# --- Check types
+# if $newrev is 0000...0000, it's a commit to delete a ref.
+zero=$(git hash-object --stdin &2
+ echo "*** Use 'git tag [ -a | -s ]' for tags you want to propagate." >&2
+ exit 1
+ fi
+ ;;
+ refs/tags/*,delete)
+ # delete tag
+ if [ "$allowdeletetag" != "true" ]; then
+ echo "*** Deleting a tag is not allowed in this repository" >&2
+ exit 1
+ fi
+ ;;
+ refs/tags/*,tag)
+ # annotated tag
+ if [ "$allowmodifytag" != "true" ] && git rev-parse $refname > /dev/null 2>&1
+ then
+ echo "*** Tag '$refname' already exists." >&2
+ echo "*** Modifying a tag is not allowed in this repository." >&2
+ exit 1
+ fi
+ ;;
+ refs/heads/*,commit)
+ # branch
+ if [ "$oldrev" = "$zero" -a "$denycreatebranch" = "true" ]; then
+ echo "*** Creating a branch is not allowed in this repository" >&2
+ exit 1
+ fi
+ ;;
+ refs/heads/*,delete)
+ # delete branch
+ if [ "$allowdeletebranch" != "true" ]; then
+ echo "*** Deleting a branch is not allowed in this repository" >&2
+ exit 1
+ fi
+ ;;
+ refs/remotes/*,commit)
+ # tracking branch
+ ;;
+ refs/remotes/*,delete)
+ # delete tracking branch
+ if [ "$allowdeletebranch" != "true" ]; then
+ echo "*** Deleting a tracking branch is not allowed in this repository" >&2
+ exit 1
+ fi
+ ;;
+ *)
+ # Anything else (is there anything else?)
+ echo "*** Update hook: unknown type of update to ref $refname of type $newrev_type" >&2
+ exit 1
+ ;;
+esac
+
+# --- Finished
+exit 0
diff --git a/dot_tmux/plugins/tmux/dot_git/index b/dot_tmux/plugins/tmux/dot_git/index
new file mode 100644
index 0000000..393f17c
Binary files /dev/null and b/dot_tmux/plugins/tmux/dot_git/index differ
diff --git a/dot_tmux/plugins/tmux/dot_git/info/exclude b/dot_tmux/plugins/tmux/dot_git/info/exclude
new file mode 100644
index 0000000..a5196d1
--- /dev/null
+++ b/dot_tmux/plugins/tmux/dot_git/info/exclude
@@ -0,0 +1,6 @@
+# git ls-files --others --exclude-from=.git/info/exclude
+# Lines that start with '#' are comments.
+# For a project mostly in C, the following would be a good set of
+# exclude patterns (uncomment them if you want to use them):
+# *.[oa]
+# *~
diff --git a/dot_tmux/plugins/tmux/dot_git/logs/HEAD b/dot_tmux/plugins/tmux/dot_git/logs/HEAD
new file mode 100644
index 0000000..cdac89b
--- /dev/null
+++ b/dot_tmux/plugins/tmux/dot_git/logs/HEAD
@@ -0,0 +1 @@
+0000000000000000000000000000000000000000 0f46a0fa14104d265e46b4cc4eec72ade3bf5998 kjuulh 1686060829 +0200 clone: from https://github.com/catppuccin/tmux
diff --git a/dot_tmux/plugins/tmux/dot_git/logs/refs/heads/main b/dot_tmux/plugins/tmux/dot_git/logs/refs/heads/main
new file mode 100644
index 0000000..cdac89b
--- /dev/null
+++ b/dot_tmux/plugins/tmux/dot_git/logs/refs/heads/main
@@ -0,0 +1 @@
+0000000000000000000000000000000000000000 0f46a0fa14104d265e46b4cc4eec72ade3bf5998 kjuulh 1686060829 +0200 clone: from https://github.com/catppuccin/tmux
diff --git a/dot_tmux/plugins/tmux/dot_git/logs/refs/remotes/origin/HEAD b/dot_tmux/plugins/tmux/dot_git/logs/refs/remotes/origin/HEAD
new file mode 100644
index 0000000..cdac89b
--- /dev/null
+++ b/dot_tmux/plugins/tmux/dot_git/logs/refs/remotes/origin/HEAD
@@ -0,0 +1 @@
+0000000000000000000000000000000000000000 0f46a0fa14104d265e46b4cc4eec72ade3bf5998 kjuulh 1686060829 +0200 clone: from https://github.com/catppuccin/tmux
diff --git a/dot_tmux/plugins/tmux/dot_git/objects/info/.keep b/dot_tmux/plugins/tmux/dot_git/objects/info/.keep
new file mode 100644
index 0000000..e69de29
diff --git a/dot_tmux/plugins/tmux/dot_git/objects/pack/readonly_pack-ca2499aaebdbbc41d6409686c32c5c7e0d6988c8.idx b/dot_tmux/plugins/tmux/dot_git/objects/pack/readonly_pack-ca2499aaebdbbc41d6409686c32c5c7e0d6988c8.idx
new file mode 100644
index 0000000..a53afa6
Binary files /dev/null and b/dot_tmux/plugins/tmux/dot_git/objects/pack/readonly_pack-ca2499aaebdbbc41d6409686c32c5c7e0d6988c8.idx differ
diff --git a/dot_tmux/plugins/tmux/dot_git/objects/pack/readonly_pack-ca2499aaebdbbc41d6409686c32c5c7e0d6988c8.pack b/dot_tmux/plugins/tmux/dot_git/objects/pack/readonly_pack-ca2499aaebdbbc41d6409686c32c5c7e0d6988c8.pack
new file mode 100644
index 0000000..b501d99
Binary files /dev/null and b/dot_tmux/plugins/tmux/dot_git/objects/pack/readonly_pack-ca2499aaebdbbc41d6409686c32c5c7e0d6988c8.pack differ
diff --git a/dot_tmux/plugins/tmux/dot_git/objects/pack/readonly_pack-ca2499aaebdbbc41d6409686c32c5c7e0d6988c8.rev b/dot_tmux/plugins/tmux/dot_git/objects/pack/readonly_pack-ca2499aaebdbbc41d6409686c32c5c7e0d6988c8.rev
new file mode 100644
index 0000000..25f665e
Binary files /dev/null and b/dot_tmux/plugins/tmux/dot_git/objects/pack/readonly_pack-ca2499aaebdbbc41d6409686c32c5c7e0d6988c8.rev differ
diff --git a/dot_tmux/plugins/tmux/dot_git/packed-refs b/dot_tmux/plugins/tmux/dot_git/packed-refs
new file mode 100644
index 0000000..76de05e
--- /dev/null
+++ b/dot_tmux/plugins/tmux/dot_git/packed-refs
@@ -0,0 +1,2 @@
+# pack-refs with: peeled fully-peeled sorted
+0f46a0fa14104d265e46b4cc4eec72ade3bf5998 refs/remotes/origin/main
diff --git a/dot_tmux/plugins/tmux/dot_git/refs/heads/main b/dot_tmux/plugins/tmux/dot_git/refs/heads/main
new file mode 100644
index 0000000..c9cd698
--- /dev/null
+++ b/dot_tmux/plugins/tmux/dot_git/refs/heads/main
@@ -0,0 +1 @@
+0f46a0fa14104d265e46b4cc4eec72ade3bf5998
diff --git a/dot_tmux/plugins/tmux/dot_git/refs/remotes/origin/HEAD b/dot_tmux/plugins/tmux/dot_git/refs/remotes/origin/HEAD
new file mode 100644
index 0000000..4b0a875
--- /dev/null
+++ b/dot_tmux/plugins/tmux/dot_git/refs/remotes/origin/HEAD
@@ -0,0 +1 @@
+ref: refs/remotes/origin/main
diff --git a/dot_tmux/plugins/tmux/dot_git/refs/tags/.keep b/dot_tmux/plugins/tmux/dot_git/refs/tags/.keep
new file mode 100644
index 0000000..e69de29
diff --git a/dot_tmux/plugins/tmux/empty_dot_gitignore b/dot_tmux/plugins/tmux/empty_dot_gitignore
new file mode 100644
index 0000000..e69de29
diff --git a/dot_tmux/plugins/tmux/executable_catppuccin.tmux b/dot_tmux/plugins/tmux/executable_catppuccin.tmux
new file mode 100644
index 0000000..36c5829
--- /dev/null
+++ b/dot_tmux/plugins/tmux/executable_catppuccin.tmux
@@ -0,0 +1,188 @@
+#!/usr/bin/env bash
+PLUGIN_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+
+get_tmux_option() {
+ local option value default
+ option="$1"
+ default="$2"
+ value="$(tmux show-option -gqv "$option")"
+
+ if [ -n "$value" ]; then
+ echo "$value"
+ else
+ echo "$default"
+ fi
+}
+
+set() {
+ local option=$1
+ local value=$2
+ tmux_commands+=(set-option -gq "$option" "$value" ";")
+}
+
+setw() {
+ local option=$1
+ local value=$2
+ tmux_commands+=(set-window-option -gq "$option" "$value" ";")
+}
+
+main() {
+ local theme
+ theme="$(get_tmux_option "@catppuccin_flavour" "mocha")"
+
+ # Aggregate all commands in one array
+ local tmux_commands=()
+
+ # NOTE: Pulling in the selected theme by the theme that's being set as local
+ # variables.
+ # shellcheck source=catppuccin-frappe.tmuxtheme
+ source /dev/stdin <<<"$(sed -e "/^[^#].*=/s/^/local /" "${PLUGIN_DIR}/catppuccin-${theme}.tmuxtheme")"
+
+ # status
+ set status "on"
+ set status-bg "${thm_bg}"
+ set status-justify "left"
+ set status-left-length "100"
+ set status-right-length "100"
+
+ # messages
+ set message-style "fg=${thm_cyan},bg=${thm_gray},align=centre"
+ set message-command-style "fg=${thm_cyan},bg=${thm_gray},align=centre"
+
+ # panes
+ set pane-border-style "fg=${thm_gray}"
+ set pane-active-border-style "fg=${thm_blue}"
+
+ # windows
+ setw window-status-activity-style "fg=${thm_fg},bg=${thm_bg},none"
+ setw window-status-separator ""
+ setw window-status-style "fg=${thm_fg},bg=${thm_bg},none"
+
+ # --------=== Statusline
+
+ # NOTE: Checking for the value of @catppuccin_window_tabs_enabled
+ local wt_enabled
+ wt_enabled="$(get_tmux_option "@catppuccin_window_tabs_enabled" "off")"
+ readonly wt_enabled
+
+ local right_separator
+ right_separator="$(get_tmux_option "@catppuccin_right_separator" "")"
+ readonly right_separator
+
+ local left_separator
+ left_separator="$(get_tmux_option "@catppuccin_left_separator" "")"
+ readonly left_separator
+
+ local user
+ user="$(get_tmux_option "@catppuccin_user" "off")"
+ readonly user
+
+ local user_icon
+ user_icon="$(get_tmux_option "@catppuccin_user_icon" "")"
+ readonly user_icon
+
+ local host
+ host="$(get_tmux_option "@catppuccin_host" "off")"
+ readonly host
+
+ local directory_icon
+ directory_icon="$(get_tmux_option "@catppuccin_directory_icon" "")"
+ readonly directory_icon
+
+ local window_icon
+ window_icon="$(get_tmux_option "@catppuccin_window_icon" "")"
+ readonly window_icon
+
+ local session_icon
+ session_icon="$(get_tmux_option "@catppuccin_session_icon" "")"
+ readonly session_icon
+
+ local host_icon
+ host_icon="$(get_tmux_option "@catppuccin_host_icon" "")"
+ readonly host_icon
+
+ local date_time
+ date_time="$(get_tmux_option "@catppuccin_date_time" "off")"
+ readonly date_time
+
+ local datetime_icon
+ datetime_icon="$(get_tmux_option "@catppuccin_datetime_icon" "")"
+ readonly datetime_icon
+
+ # These variables are the defaults so that the setw and set calls are easier to parse.
+ local show_directory
+ readonly show_directory="#[fg=$thm_pink,bg=$thm_bg,nobold,nounderscore,noitalics]$right_separator#[fg=$thm_bg,bg=$thm_pink,nobold,nounderscore,noitalics]$directory_icon #[fg=$thm_fg,bg=$thm_gray] #{b:pane_current_path} #{?client_prefix,#[fg=$thm_red]"
+
+ local show_window
+ readonly show_window="#[fg=$thm_pink,bg=$thm_bg,nobold,nounderscore,noitalics]$right_separator#[fg=$thm_bg,bg=$thm_pink,nobold,nounderscore,noitalics]$window_icon #[fg=$thm_fg,bg=$thm_gray] #W #{?client_prefix,#[fg=$thm_red]"
+
+ local show_session
+ readonly show_session="#[fg=$thm_green]}#[bg=$thm_gray]$right_separator#{?client_prefix,#[bg=$thm_red],#[bg=$thm_green]}#[fg=$thm_bg]$session_icon #[fg=$thm_fg,bg=$thm_gray] #S "
+
+ local show_directory_in_window_status
+ readonly show_directory_in_window_status="#[fg=$thm_bg,bg=$thm_blue] #I #[fg=$thm_fg,bg=$thm_gray] #{b:pane_current_path} "
+
+ local show_directory_in_window_status_current
+ readonly show_directory_in_window_status_current="#[fg=$thm_bg,bg=$thm_orange] #I #[fg=$thm_fg,bg=$thm_bg] #{b:pane_current_path} "
+
+ local show_window_in_window_status
+ readonly show_window_in_window_status="#[fg=$thm_fg,bg=$thm_bg] #W #[fg=$thm_bg,bg=$thm_blue] #I#[fg=$thm_blue,bg=$thm_bg]$left_separator#[fg=$thm_fg,bg=$thm_bg,nobold,nounderscore,noitalics] "
+
+ local show_window_in_window_status_current
+ readonly show_window_in_window_status_current="#[fg=$thm_fg,bg=$thm_gray] #W #[fg=$thm_bg,bg=$thm_orange] #I#[fg=$thm_orange,bg=$thm_bg]$left_separator#[fg=$thm_fg,bg=$thm_bg,nobold,nounderscore,noitalics] "
+
+ local show_user
+ readonly show_user="#[fg=$thm_blue,bg=$thm_gray]$right_separator#[fg=$thm_bg,bg=$thm_blue]$user_icon #[fg=$thm_fg,bg=$thm_gray] #(whoami) "
+
+ local show_host
+ readonly show_host="#[fg=$thm_blue,bg=$thm_gray]$right_separator#[fg=$thm_bg,bg=$thm_blue]$host_icon #[fg=$thm_fg,bg=$thm_gray] #H "
+
+ local show_date_time
+ readonly show_date_time="#[fg=$thm_blue,bg=$thm_gray]$right_separator#[fg=$thm_bg,bg=$thm_blue]$datetime_icon #[fg=$thm_fg,bg=$thm_gray] $date_time "
+
+ # Right column 1 by default shows the Window name.
+ local right_column1=$show_window
+
+ # Right column 2 by default shows the current Session name.
+ local right_column2=$show_session
+
+ # Window status by default shows the current directory basename.
+ local window_status_format=$show_directory_in_window_status
+ local window_status_current_format=$show_directory_in_window_status_current
+
+ # NOTE: With the @catppuccin_window_tabs_enabled set to on, we're going to
+ # update the right_column1 and the window_status_* variables.
+ if [[ "${wt_enabled}" == "on" ]]; then
+ right_column1=$show_directory
+ window_status_format=$show_window_in_window_status
+ window_status_current_format=$show_window_in_window_status_current
+ fi
+
+ if [[ "${user}" == "on" ]]; then
+ right_column2=$right_column2$show_user
+ fi
+
+ if [[ "${host}" == "on" ]]; then
+ right_column2=$right_column2$show_host
+ fi
+
+ if [[ "${date_time}" != "off" ]]; then
+ right_column2=$right_column2$show_date_time
+ fi
+
+ set status-left ""
+
+ set status-right "${right_column1},${right_column2}"
+
+ setw window-status-format "${window_status_format}"
+ setw window-status-current-format "${window_status_current_format}"
+
+ # --------=== Modes
+ #
+ setw clock-mode-colour "${thm_blue}"
+ setw mode-style "fg=${thm_pink} bg=${thm_black4} bold"
+
+ tmux "${tmux_commands[@]}"
+}
+
+main "$@"
diff --git a/dot_tmux/plugins/tpm/CHANGELOG.md b/dot_tmux/plugins/tpm/CHANGELOG.md
new file mode 100644
index 0000000..394758d
--- /dev/null
+++ b/dot_tmux/plugins/tpm/CHANGELOG.md
@@ -0,0 +1,83 @@
+# Changelog
+
+### master
+- 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`
+
+### 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/dot_tmux/plugins/tpm/HOW_TO_PLUGIN.md b/dot_tmux/plugins/tpm/HOW_TO_PLUGIN.md
new file mode 100644
index 0000000..9901619
--- /dev/null
+++ b/dot_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/dot_tmux/plugins/tpm/LICENSE.md b/dot_tmux/plugins/tpm/LICENSE.md
new file mode 100644
index 0000000..1222865
--- /dev/null
+++ b/dot_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/dot_tmux/plugins/tpm/README.md b/dot_tmux/plugins/tpm/README.md
new file mode 100644
index 0000000..fe90855
--- /dev/null
+++ b/dot_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` + I (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` + alt + u (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` + I
+- Installs new plugins from GitHub or any other git repository
+- Refreshes TMUX environment
+
+`prefix` + U
+- updates plugin(s)
+
+`prefix` + alt + u
+- 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/dot_tmux/plugins/tpm/bin/executable_clean_plugins b/dot_tmux/plugins/tpm/bin/executable_clean_plugins
new file mode 100644
index 0000000..12f8730
--- /dev/null
+++ b/dot_tmux/plugins/tpm/bin/executable_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/dot_tmux/plugins/tpm/bin/executable_install_plugins b/dot_tmux/plugins/tpm/bin/executable_install_plugins
new file mode 100644
index 0000000..c66b15b
--- /dev/null
+++ b/dot_tmux/plugins/tpm/bin/executable_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/dot_tmux/plugins/tpm/bin/executable_update_plugins b/dot_tmux/plugins/tpm/bin/executable_update_plugins
new file mode 100644
index 0000000..30a5646
--- /dev/null
+++ b/dot_tmux/plugins/tpm/bin/executable_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/dot_tmux/plugins/tpm/bindings/executable_clean_plugins b/dot_tmux/plugins/tpm/bindings/executable_clean_plugins
new file mode 100644
index 0000000..9a0d5d7
--- /dev/null
+++ b/dot_tmux/plugins/tpm/bindings/executable_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/dot_tmux/plugins/tpm/bindings/executable_install_plugins b/dot_tmux/plugins/tpm/bindings/executable_install_plugins
new file mode 100644
index 0000000..3ade3c4
--- /dev/null
+++ b/dot_tmux/plugins/tpm/bindings/executable_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/dot_tmux/plugins/tpm/bindings/executable_update_plugins b/dot_tmux/plugins/tpm/bindings/executable_update_plugins
new file mode 100644
index 0000000..28cc281
--- /dev/null
+++ b/dot_tmux/plugins/tpm/bindings/executable_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/dot_tmux/plugins/tpm/docs/automatic_tpm_installation.md b/dot_tmux/plugins/tpm/docs/automatic_tpm_installation.md
new file mode 100644
index 0000000..630573f
--- /dev/null
+++ b/dot_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/dot_tmux/plugins/tpm/docs/changing_plugins_install_dir.md b/dot_tmux/plugins/tpm/docs/changing_plugins_install_dir.md
new file mode 100644
index 0000000..27de96d
--- /dev/null
+++ b/dot_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/dot_tmux/plugins/tpm/docs/how_to_create_plugin.md b/dot_tmux/plugins/tpm/docs/how_to_create_plugin.md
new file mode 100644
index 0000000..f7d9c13
--- /dev/null
+++ b/dot_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/dot_tmux/plugins/tpm/docs/managing_plugins_via_cmd_line.md b/dot_tmux/plugins/tpm/docs/managing_plugins_via_cmd_line.md
new file mode 100644
index 0000000..7aefd7d
--- /dev/null
+++ b/dot_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/dot_tmux/plugins/tpm/docs/tpm_not_working.md b/dot_tmux/plugins/tpm/docs/tpm_not_working.md
new file mode 100644
index 0000000..bfa14ac
--- /dev/null
+++ b/dot_tmux/plugins/tpm/docs/tpm_not_working.md
@@ -0,0 +1,96 @@
+# Help, tpm not working!
+
+Here's the list of issues users had with `tpm`:
+
+]
+
+> 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`?
+ 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.
+ If you have it installed, try disabling it and see if `tpm` works then.
+
+
+
+> 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.
+
+
+
+> 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.
+
+
+
+> "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`.
+
+
+
+> 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
+```
+
+
+
+> '~/.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 `/usr/local/bin` will not be found.
+
+The solution is to insert the following line:
+
+```
+set-environment -g PATH "/usr/local/bin:/bin:/usr/bin"
+```
+
+before any `run-shell`/`run` commands in `~/.tmux.conf`.
diff --git a/dot_tmux/plugins/tpm/dot_git/HEAD b/dot_tmux/plugins/tpm/dot_git/HEAD
new file mode 100644
index 0000000..cb089cd
--- /dev/null
+++ b/dot_tmux/plugins/tpm/dot_git/HEAD
@@ -0,0 +1 @@
+ref: refs/heads/master
diff --git a/dot_tmux/plugins/tpm/dot_git/config b/dot_tmux/plugins/tpm/dot_git/config
new file mode 100644
index 0000000..4fdac76
--- /dev/null
+++ b/dot_tmux/plugins/tpm/dot_git/config
@@ -0,0 +1,13 @@
+[core]
+ repositoryformatversion = 0
+ filemode = true
+ bare = false
+ logallrefupdates = true
+ ignorecase = true
+ precomposeunicode = true
+[remote "origin"]
+ url = https://github.com/tmux-plugins/tpm
+ fetch = +refs/heads/*:refs/remotes/origin/*
+[branch "master"]
+ remote = origin
+ merge = refs/heads/master
diff --git a/dot_tmux/plugins/tpm/dot_git/description b/dot_tmux/plugins/tpm/dot_git/description
new file mode 100644
index 0000000..498b267
--- /dev/null
+++ b/dot_tmux/plugins/tpm/dot_git/description
@@ -0,0 +1 @@
+Unnamed repository; edit this file 'description' to name the repository.
diff --git a/dot_tmux/plugins/tpm/dot_git/hooks/executable_applypatch-msg.sample b/dot_tmux/plugins/tpm/dot_git/hooks/executable_applypatch-msg.sample
new file mode 100644
index 0000000..a5d7b84
--- /dev/null
+++ b/dot_tmux/plugins/tpm/dot_git/hooks/executable_applypatch-msg.sample
@@ -0,0 +1,15 @@
+#!/bin/sh
+#
+# An example hook script to check the commit log message taken by
+# applypatch from an e-mail message.
+#
+# The hook should exit with non-zero status after issuing an
+# appropriate message if it wants to stop the commit. The hook is
+# allowed to edit the commit message file.
+#
+# To enable this hook, rename this file to "applypatch-msg".
+
+. git-sh-setup
+commitmsg="$(git rev-parse --git-path hooks/commit-msg)"
+test -x "$commitmsg" && exec "$commitmsg" ${1+"$@"}
+:
diff --git a/dot_tmux/plugins/tpm/dot_git/hooks/executable_commit-msg.sample b/dot_tmux/plugins/tpm/dot_git/hooks/executable_commit-msg.sample
new file mode 100644
index 0000000..b58d118
--- /dev/null
+++ b/dot_tmux/plugins/tpm/dot_git/hooks/executable_commit-msg.sample
@@ -0,0 +1,24 @@
+#!/bin/sh
+#
+# An example hook script to check the commit log message.
+# Called by "git commit" with one argument, the name of the file
+# that has the commit message. The hook should exit with non-zero
+# status after issuing an appropriate message if it wants to stop the
+# commit. The hook is allowed to edit the commit message file.
+#
+# To enable this hook, rename this file to "commit-msg".
+
+# Uncomment the below to add a Signed-off-by line to the message.
+# Doing this in a hook is a bad idea in general, but the prepare-commit-msg
+# hook is more suited to it.
+#
+# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p')
+# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1"
+
+# This example catches duplicate Signed-off-by lines.
+
+test "" = "$(grep '^Signed-off-by: ' "$1" |
+ sort | uniq -c | sed -e '/^[ ]*1[ ]/d')" || {
+ echo >&2 Duplicate Signed-off-by lines.
+ exit 1
+}
diff --git a/dot_tmux/plugins/tpm/dot_git/hooks/executable_fsmonitor-watchman.sample b/dot_tmux/plugins/tpm/dot_git/hooks/executable_fsmonitor-watchman.sample
new file mode 100644
index 0000000..14ed0aa
--- /dev/null
+++ b/dot_tmux/plugins/tpm/dot_git/hooks/executable_fsmonitor-watchman.sample
@@ -0,0 +1,173 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+use IPC::Open2;
+
+# An example hook script to integrate Watchman
+# (https://facebook.github.io/watchman/) with git to speed up detecting
+# new and modified files.
+#
+# The hook is passed a version (currently 2) and last update token
+# formatted as a string and outputs to stdout a new update token and
+# all files that have been modified since the update token. Paths must
+# be relative to the root of the working tree and separated by a single NUL.
+#
+# To enable this hook, rename this file to "query-watchman" and set
+# 'git config core.fsmonitor .git/hooks/query-watchman'
+#
+my ($version, $last_update_token) = @ARGV;
+
+# Uncomment for debugging
+# print STDERR "$0 $version $last_update_token\n";
+
+# Check the hook interface version
+if ($version ne 2) {
+ die "Unsupported query-fsmonitor hook version '$version'.\n" .
+ "Falling back to scanning...\n";
+}
+
+my $git_work_tree = get_working_dir();
+
+my $retry = 1;
+
+my $json_pkg;
+eval {
+ require JSON::XS;
+ $json_pkg = "JSON::XS";
+ 1;
+} or do {
+ require JSON::PP;
+ $json_pkg = "JSON::PP";
+};
+
+launch_watchman();
+
+sub launch_watchman {
+ my $o = watchman_query();
+ if (is_work_tree_watched($o)) {
+ output_result($o->{clock}, @{$o->{files}});
+ }
+}
+
+sub output_result {
+ my ($clockid, @files) = @_;
+
+ # Uncomment for debugging watchman output
+ # open (my $fh, ">", ".git/watchman-output.out");
+ # binmode $fh, ":utf8";
+ # print $fh "$clockid\n@files\n";
+ # close $fh;
+
+ binmode STDOUT, ":utf8";
+ print $clockid;
+ print "\0";
+ local $, = "\0";
+ print @files;
+}
+
+sub watchman_clock {
+ my $response = qx/watchman clock "$git_work_tree"/;
+ die "Failed to get clock id on '$git_work_tree'.\n" .
+ "Falling back to scanning...\n" if $? != 0;
+
+ return $json_pkg->new->utf8->decode($response);
+}
+
+sub watchman_query {
+ my $pid = open2(\*CHLD_OUT, \*CHLD_IN, 'watchman -j --no-pretty')
+ or die "open2() failed: $!\n" .
+ "Falling back to scanning...\n";
+
+ # In the query expression below we're asking for names of files that
+ # changed since $last_update_token but not from the .git folder.
+ #
+ # To accomplish this, we're using the "since" generator to use the
+ # recency index to select candidate nodes and "fields" to limit the
+ # output to file names only. Then we're using the "expression" term to
+ # further constrain the results.
+ if (substr($last_update_token, 0, 1) eq "c") {
+ $last_update_token = "\"$last_update_token\"";
+ }
+ my $query = <<" END";
+ ["query", "$git_work_tree", {
+ "since": $last_update_token,
+ "fields": ["name"],
+ "expression": ["not", ["dirname", ".git"]]
+ }]
+ END
+
+ # Uncomment for debugging the watchman query
+ # open (my $fh, ">", ".git/watchman-query.json");
+ # print $fh $query;
+ # close $fh;
+
+ print CHLD_IN $query;
+ close CHLD_IN;
+ my $response = do {local $/; };
+
+ # Uncomment for debugging the watch response
+ # open ($fh, ">", ".git/watchman-response.json");
+ # print $fh $response;
+ # close $fh;
+
+ die "Watchman: command returned no output.\n" .
+ "Falling back to scanning...\n" if $response eq "";
+ die "Watchman: command returned invalid output: $response\n" .
+ "Falling back to scanning...\n" unless $response =~ /^\{/;
+
+ return $json_pkg->new->utf8->decode($response);
+}
+
+sub is_work_tree_watched {
+ my ($output) = @_;
+ my $error = $output->{error};
+ if ($retry > 0 and $error and $error =~ m/unable to resolve root .* directory (.*) is not watched/) {
+ $retry--;
+ my $response = qx/watchman watch "$git_work_tree"/;
+ die "Failed to make watchman watch '$git_work_tree'.\n" .
+ "Falling back to scanning...\n" if $? != 0;
+ $output = $json_pkg->new->utf8->decode($response);
+ $error = $output->{error};
+ die "Watchman: $error.\n" .
+ "Falling back to scanning...\n" if $error;
+
+ # Uncomment for debugging watchman output
+ # open (my $fh, ">", ".git/watchman-output.out");
+ # close $fh;
+
+ # Watchman will always return all files on the first query so
+ # return the fast "everything is dirty" flag to git and do the
+ # Watchman query just to get it over with now so we won't pay
+ # the cost in git to look up each individual file.
+ my $o = watchman_clock();
+ $error = $output->{error};
+
+ die "Watchman: $error.\n" .
+ "Falling back to scanning...\n" if $error;
+
+ output_result($o->{clock}, ("/"));
+ $last_update_token = $o->{clock};
+
+ eval { launch_watchman() };
+ return 0;
+ }
+
+ die "Watchman: $error.\n" .
+ "Falling back to scanning...\n" if $error;
+
+ return 1;
+}
+
+sub get_working_dir {
+ my $working_dir;
+ if ($^O =~ 'msys' || $^O =~ 'cygwin') {
+ $working_dir = Win32::GetCwd();
+ $working_dir =~ tr/\\/\//;
+ } else {
+ require Cwd;
+ $working_dir = Cwd::cwd();
+ }
+
+ return $working_dir;
+}
diff --git a/dot_tmux/plugins/tpm/dot_git/hooks/executable_post-update.sample b/dot_tmux/plugins/tpm/dot_git/hooks/executable_post-update.sample
new file mode 100644
index 0000000..ec17ec1
--- /dev/null
+++ b/dot_tmux/plugins/tpm/dot_git/hooks/executable_post-update.sample
@@ -0,0 +1,8 @@
+#!/bin/sh
+#
+# An example hook script to prepare a packed repository for use over
+# dumb transports.
+#
+# To enable this hook, rename this file to "post-update".
+
+exec git update-server-info
diff --git a/dot_tmux/plugins/tpm/dot_git/hooks/executable_pre-applypatch.sample b/dot_tmux/plugins/tpm/dot_git/hooks/executable_pre-applypatch.sample
new file mode 100644
index 0000000..4142082
--- /dev/null
+++ b/dot_tmux/plugins/tpm/dot_git/hooks/executable_pre-applypatch.sample
@@ -0,0 +1,14 @@
+#!/bin/sh
+#
+# An example hook script to verify what is about to be committed
+# by applypatch from an e-mail message.
+#
+# The hook should exit with non-zero status after issuing an
+# appropriate message if it wants to stop the commit.
+#
+# To enable this hook, rename this file to "pre-applypatch".
+
+. git-sh-setup
+precommit="$(git rev-parse --git-path hooks/pre-commit)"
+test -x "$precommit" && exec "$precommit" ${1+"$@"}
+:
diff --git a/dot_tmux/plugins/tpm/dot_git/hooks/executable_pre-commit.sample b/dot_tmux/plugins/tpm/dot_git/hooks/executable_pre-commit.sample
new file mode 100644
index 0000000..e144712
--- /dev/null
+++ b/dot_tmux/plugins/tpm/dot_git/hooks/executable_pre-commit.sample
@@ -0,0 +1,49 @@
+#!/bin/sh
+#
+# An example hook script to verify what is about to be committed.
+# Called by "git commit" with no arguments. The hook should
+# exit with non-zero status after issuing an appropriate message if
+# it wants to stop the commit.
+#
+# To enable this hook, rename this file to "pre-commit".
+
+if git rev-parse --verify HEAD >/dev/null 2>&1
+then
+ against=HEAD
+else
+ # Initial commit: diff against an empty tree object
+ against=$(git hash-object -t tree /dev/null)
+fi
+
+# If you want to allow non-ASCII filenames set this variable to true.
+allownonascii=$(git config --type=bool hooks.allownonascii)
+
+# Redirect output to stderr.
+exec 1>&2
+
+# Cross platform projects tend to avoid non-ASCII filenames; prevent
+# them from being added to the repository. We exploit the fact that the
+# printable range starts at the space character and ends with tilde.
+if [ "$allownonascii" != "true" ] &&
+ # Note that the use of brackets around a tr range is ok here, (it's
+ # even required, for portability to Solaris 10's /usr/bin/tr), since
+ # the square bracket bytes happen to fall in the designated range.
+ test $(git diff --cached --name-only --diff-filter=A -z $against |
+ LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0
+then
+ cat <<\EOF
+Error: Attempt to add a non-ASCII file name.
+
+This can cause problems if you want to work with people on other platforms.
+
+To be portable it is advisable to rename the file.
+
+If you know what you are doing you can disable this check using:
+
+ git config hooks.allownonascii true
+EOF
+ exit 1
+fi
+
+# If there are whitespace errors, print the offending file names and fail.
+exec git diff-index --check --cached $against --
diff --git a/dot_tmux/plugins/tpm/dot_git/hooks/executable_pre-merge-commit.sample b/dot_tmux/plugins/tpm/dot_git/hooks/executable_pre-merge-commit.sample
new file mode 100644
index 0000000..399eab1
--- /dev/null
+++ b/dot_tmux/plugins/tpm/dot_git/hooks/executable_pre-merge-commit.sample
@@ -0,0 +1,13 @@
+#!/bin/sh
+#
+# An example hook script to verify what is about to be committed.
+# Called by "git merge" with no arguments. The hook should
+# exit with non-zero status after issuing an appropriate message to
+# stderr if it wants to stop the merge commit.
+#
+# To enable this hook, rename this file to "pre-merge-commit".
+
+. git-sh-setup
+test -x "$GIT_DIR/hooks/pre-commit" &&
+ exec "$GIT_DIR/hooks/pre-commit"
+:
diff --git a/dot_tmux/plugins/tpm/dot_git/hooks/executable_pre-push.sample b/dot_tmux/plugins/tpm/dot_git/hooks/executable_pre-push.sample
new file mode 100644
index 0000000..4ce688d
--- /dev/null
+++ b/dot_tmux/plugins/tpm/dot_git/hooks/executable_pre-push.sample
@@ -0,0 +1,53 @@
+#!/bin/sh
+
+# An example hook script to verify what is about to be pushed. Called by "git
+# push" after it has checked the remote status, but before anything has been
+# pushed. If this script exits with a non-zero status nothing will be pushed.
+#
+# This hook is called with the following parameters:
+#
+# $1 -- Name of the remote to which the push is being done
+# $2 -- URL to which the push is being done
+#
+# If pushing without using a named remote those arguments will be equal.
+#
+# Information about the commits which are being pushed is supplied as lines to
+# the standard input in the form:
+#
+#
+#
+# This sample shows how to prevent push of commits where the log message starts
+# with "WIP" (work in progress).
+
+remote="$1"
+url="$2"
+
+zero=$(git hash-object --stdin &2 "Found WIP commit in $local_ref, not pushing"
+ exit 1
+ fi
+ fi
+done
+
+exit 0
diff --git a/dot_tmux/plugins/tpm/dot_git/hooks/executable_pre-rebase.sample b/dot_tmux/plugins/tpm/dot_git/hooks/executable_pre-rebase.sample
new file mode 100644
index 0000000..6cbef5c
--- /dev/null
+++ b/dot_tmux/plugins/tpm/dot_git/hooks/executable_pre-rebase.sample
@@ -0,0 +1,169 @@
+#!/bin/sh
+#
+# Copyright (c) 2006, 2008 Junio C Hamano
+#
+# The "pre-rebase" hook is run just before "git rebase" starts doing
+# its job, and can prevent the command from running by exiting with
+# non-zero status.
+#
+# The hook is called with the following parameters:
+#
+# $1 -- the upstream the series was forked from.
+# $2 -- the branch being rebased (or empty when rebasing the current branch).
+#
+# This sample shows how to prevent topic branches that are already
+# merged to 'next' branch from getting rebased, because allowing it
+# would result in rebasing already published history.
+
+publish=next
+basebranch="$1"
+if test "$#" = 2
+then
+ topic="refs/heads/$2"
+else
+ topic=`git symbolic-ref HEAD` ||
+ exit 0 ;# we do not interrupt rebasing detached HEAD
+fi
+
+case "$topic" in
+refs/heads/??/*)
+ ;;
+*)
+ exit 0 ;# we do not interrupt others.
+ ;;
+esac
+
+# Now we are dealing with a topic branch being rebased
+# on top of master. Is it OK to rebase it?
+
+# Does the topic really exist?
+git show-ref -q "$topic" || {
+ echo >&2 "No such branch $topic"
+ exit 1
+}
+
+# Is topic fully merged to master?
+not_in_master=`git rev-list --pretty=oneline ^master "$topic"`
+if test -z "$not_in_master"
+then
+ echo >&2 "$topic is fully merged to master; better remove it."
+ exit 1 ;# we could allow it, but there is no point.
+fi
+
+# Is topic ever merged to next? If so you should not be rebasing it.
+only_next_1=`git rev-list ^master "^$topic" ${publish} | sort`
+only_next_2=`git rev-list ^master ${publish} | sort`
+if test "$only_next_1" = "$only_next_2"
+then
+ not_in_topic=`git rev-list "^$topic" master`
+ if test -z "$not_in_topic"
+ then
+ echo >&2 "$topic is already up to date with master"
+ exit 1 ;# we could allow it, but there is no point.
+ else
+ exit 0
+ fi
+else
+ not_in_next=`git rev-list --pretty=oneline ^${publish} "$topic"`
+ /usr/bin/perl -e '
+ my $topic = $ARGV[0];
+ my $msg = "* $topic has commits already merged to public branch:\n";
+ my (%not_in_next) = map {
+ /^([0-9a-f]+) /;
+ ($1 => 1);
+ } split(/\n/, $ARGV[1]);
+ for my $elem (map {
+ /^([0-9a-f]+) (.*)$/;
+ [$1 => $2];
+ } split(/\n/, $ARGV[2])) {
+ if (!exists $not_in_next{$elem->[0]}) {
+ if ($msg) {
+ print STDERR $msg;
+ undef $msg;
+ }
+ print STDERR " $elem->[1]\n";
+ }
+ }
+ ' "$topic" "$not_in_next" "$not_in_master"
+ exit 1
+fi
+
+<<\DOC_END
+
+This sample hook safeguards topic branches that have been
+published from being rewound.
+
+The workflow assumed here is:
+
+ * Once a topic branch forks from "master", "master" is never
+ merged into it again (either directly or indirectly).
+
+ * Once a topic branch is fully cooked and merged into "master",
+ it is deleted. If you need to build on top of it to correct
+ earlier mistakes, a new topic branch is created by forking at
+ the tip of the "master". This is not strictly necessary, but
+ it makes it easier to keep your history simple.
+
+ * Whenever you need to test or publish your changes to topic
+ branches, merge them into "next" branch.
+
+The script, being an example, hardcodes the publish branch name
+to be "next", but it is trivial to make it configurable via
+$GIT_DIR/config mechanism.
+
+With this workflow, you would want to know:
+
+(1) ... if a topic branch has ever been merged to "next". Young
+ topic branches can have stupid mistakes you would rather
+ clean up before publishing, and things that have not been
+ merged into other branches can be easily rebased without
+ affecting other people. But once it is published, you would
+ not want to rewind it.
+
+(2) ... if a topic branch has been fully merged to "master".
+ Then you can delete it. More importantly, you should not
+ build on top of it -- other people may already want to
+ change things related to the topic as patches against your
+ "master", so if you need further changes, it is better to
+ fork the topic (perhaps with the same name) afresh from the
+ tip of "master".
+
+Let's look at this example:
+
+ o---o---o---o---o---o---o---o---o---o "next"
+ / / / /
+ / a---a---b A / /
+ / / / /
+ / / c---c---c---c B /
+ / / / \ /
+ / / / b---b C \ /
+ / / / / \ /
+ ---o---o---o---o---o---o---o---o---o---o---o "master"
+
+
+A, B and C are topic branches.
+
+ * A has one fix since it was merged up to "next".
+
+ * B has finished. It has been fully merged up to "master" and "next",
+ and is ready to be deleted.
+
+ * C has not merged to "next" at all.
+
+We would want to allow C to be rebased, refuse A, and encourage
+B to be deleted.
+
+To compute (1):
+
+ git rev-list ^master ^topic next
+ git rev-list ^master next
+
+ if these match, topic has not merged in next at all.
+
+To compute (2):
+
+ git rev-list master..topic
+
+ if this is empty, it is fully merged to "master".
+
+DOC_END
diff --git a/dot_tmux/plugins/tpm/dot_git/hooks/executable_pre-receive.sample b/dot_tmux/plugins/tpm/dot_git/hooks/executable_pre-receive.sample
new file mode 100644
index 0000000..a1fd29e
--- /dev/null
+++ b/dot_tmux/plugins/tpm/dot_git/hooks/executable_pre-receive.sample
@@ -0,0 +1,24 @@
+#!/bin/sh
+#
+# An example hook script to make use of push options.
+# The example simply echoes all push options that start with 'echoback='
+# and rejects all pushes when the "reject" push option is used.
+#
+# To enable this hook, rename this file to "pre-receive".
+
+if test -n "$GIT_PUSH_OPTION_COUNT"
+then
+ i=0
+ while test "$i" -lt "$GIT_PUSH_OPTION_COUNT"
+ do
+ eval "value=\$GIT_PUSH_OPTION_$i"
+ case "$value" in
+ echoback=*)
+ echo "echo from the pre-receive-hook: ${value#*=}" >&2
+ ;;
+ reject)
+ exit 1
+ esac
+ i=$((i + 1))
+ done
+fi
diff --git a/dot_tmux/plugins/tpm/dot_git/hooks/executable_prepare-commit-msg.sample b/dot_tmux/plugins/tpm/dot_git/hooks/executable_prepare-commit-msg.sample
new file mode 100644
index 0000000..10fa14c
--- /dev/null
+++ b/dot_tmux/plugins/tpm/dot_git/hooks/executable_prepare-commit-msg.sample
@@ -0,0 +1,42 @@
+#!/bin/sh
+#
+# An example hook script to prepare the commit log message.
+# Called by "git commit" with the name of the file that has the
+# commit message, followed by the description of the commit
+# message's source. The hook's purpose is to edit the commit
+# message file. If the hook fails with a non-zero status,
+# the commit is aborted.
+#
+# To enable this hook, rename this file to "prepare-commit-msg".
+
+# This hook includes three examples. The first one removes the
+# "# Please enter the commit message..." help message.
+#
+# The second includes the output of "git diff --name-status -r"
+# into the message, just before the "git status" output. It is
+# commented because it doesn't cope with --amend or with squashed
+# commits.
+#
+# The third example adds a Signed-off-by line to the message, that can
+# still be edited. This is rarely a good idea.
+
+COMMIT_MSG_FILE=$1
+COMMIT_SOURCE=$2
+SHA1=$3
+
+/usr/bin/perl -i.bak -ne 'print unless(m/^. Please enter the commit message/..m/^#$/)' "$COMMIT_MSG_FILE"
+
+# case "$COMMIT_SOURCE,$SHA1" in
+# ,|template,)
+# /usr/bin/perl -i.bak -pe '
+# print "\n" . `git diff --cached --name-status -r`
+# if /^#/ && $first++ == 0' "$COMMIT_MSG_FILE" ;;
+# *) ;;
+# esac
+
+# SOB=$(git var GIT_COMMITTER_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p')
+# git interpret-trailers --in-place --trailer "$SOB" "$COMMIT_MSG_FILE"
+# if test -z "$COMMIT_SOURCE"
+# then
+# /usr/bin/perl -i.bak -pe 'print "\n" if !$first_line++' "$COMMIT_MSG_FILE"
+# fi
diff --git a/dot_tmux/plugins/tpm/dot_git/hooks/executable_push-to-checkout.sample b/dot_tmux/plugins/tpm/dot_git/hooks/executable_push-to-checkout.sample
new file mode 100644
index 0000000..af5a0c0
--- /dev/null
+++ b/dot_tmux/plugins/tpm/dot_git/hooks/executable_push-to-checkout.sample
@@ -0,0 +1,78 @@
+#!/bin/sh
+
+# An example hook script to update a checked-out tree on a git push.
+#
+# This hook is invoked by git-receive-pack(1) when it reacts to git
+# push and updates reference(s) in its repository, and when the push
+# tries to update the branch that is currently checked out and the
+# receive.denyCurrentBranch configuration variable is set to
+# updateInstead.
+#
+# By default, such a push is refused if the working tree and the index
+# of the remote repository has any difference from the currently
+# checked out commit; when both the working tree and the index match
+# the current commit, they are updated to match the newly pushed tip
+# of the branch. This hook is to be used to override the default
+# behaviour; however the code below reimplements the default behaviour
+# as a starting point for convenient modification.
+#
+# The hook receives the commit with which the tip of the current
+# branch is going to be updated:
+commit=$1
+
+# It can exit with a non-zero status to refuse the push (when it does
+# so, it must not modify the index or the working tree).
+die () {
+ echo >&2 "$*"
+ exit 1
+}
+
+# Or it can make any necessary changes to the working tree and to the
+# index to bring them to the desired state when the tip of the current
+# branch is updated to the new commit, and exit with a zero status.
+#
+# For example, the hook can simply run git read-tree -u -m HEAD "$1"
+# in order to emulate git fetch that is run in the reverse direction
+# with git push, as the two-tree form of git read-tree -u -m is
+# essentially the same as git switch or git checkout that switches
+# branches while keeping the local changes in the working tree that do
+# not interfere with the difference between the branches.
+
+# The below is a more-or-less exact translation to shell of the C code
+# for the default behaviour for git's push-to-checkout hook defined in
+# the push_to_deploy() function in builtin/receive-pack.c.
+#
+# Note that the hook will be executed from the repository directory,
+# not from the working tree, so if you want to perform operations on
+# the working tree, you will have to adapt your code accordingly, e.g.
+# by adding "cd .." or using relative paths.
+
+if ! git update-index -q --ignore-submodules --refresh
+then
+ die "Up-to-date check failed"
+fi
+
+if ! git diff-files --quiet --ignore-submodules --
+then
+ die "Working directory has unstaged changes"
+fi
+
+# This is a rough translation of:
+#
+# head_has_history() ? "HEAD" : EMPTY_TREE_SHA1_HEX
+if git cat-file -e HEAD 2>/dev/null
+then
+ head=HEAD
+else
+ head=$(git hash-object -t tree --stdin &2
+ echo " (if you want, you could supply GIT_DIR then run" >&2
+ echo " $0 [ )" >&2
+ exit 1
+fi
+
+if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then
+ echo "usage: $0 ][ " >&2
+ exit 1
+fi
+
+# --- Config
+allowunannotated=$(git config --type=bool hooks.allowunannotated)
+allowdeletebranch=$(git config --type=bool hooks.allowdeletebranch)
+denycreatebranch=$(git config --type=bool hooks.denycreatebranch)
+allowdeletetag=$(git config --type=bool hooks.allowdeletetag)
+allowmodifytag=$(git config --type=bool hooks.allowmodifytag)
+
+# check for no description
+projectdesc=$(sed -e '1q' "$GIT_DIR/description")
+case "$projectdesc" in
+"Unnamed repository"* | "")
+ echo "*** Project description file hasn't been set" >&2
+ exit 1
+ ;;
+esac
+
+# --- Check types
+# if $newrev is 0000...0000, it's a commit to delete a ref.
+zero=$(git hash-object --stdin &2
+ echo "*** Use 'git tag [ -a | -s ]' for tags you want to propagate." >&2
+ exit 1
+ fi
+ ;;
+ refs/tags/*,delete)
+ # delete tag
+ if [ "$allowdeletetag" != "true" ]; then
+ echo "*** Deleting a tag is not allowed in this repository" >&2
+ exit 1
+ fi
+ ;;
+ refs/tags/*,tag)
+ # annotated tag
+ if [ "$allowmodifytag" != "true" ] && git rev-parse $refname > /dev/null 2>&1
+ then
+ echo "*** Tag '$refname' already exists." >&2
+ echo "*** Modifying a tag is not allowed in this repository." >&2
+ exit 1
+ fi
+ ;;
+ refs/heads/*,commit)
+ # branch
+ if [ "$oldrev" = "$zero" -a "$denycreatebranch" = "true" ]; then
+ echo "*** Creating a branch is not allowed in this repository" >&2
+ exit 1
+ fi
+ ;;
+ refs/heads/*,delete)
+ # delete branch
+ if [ "$allowdeletebranch" != "true" ]; then
+ echo "*** Deleting a branch is not allowed in this repository" >&2
+ exit 1
+ fi
+ ;;
+ refs/remotes/*,commit)
+ # tracking branch
+ ;;
+ refs/remotes/*,delete)
+ # delete tracking branch
+ if [ "$allowdeletebranch" != "true" ]; then
+ echo "*** Deleting a tracking branch is not allowed in this repository" >&2
+ exit 1
+ fi
+ ;;
+ *)
+ # Anything else (is there anything else?)
+ echo "*** Update hook: unknown type of update to ref $refname of type $newrev_type" >&2
+ exit 1
+ ;;
+esac
+
+# --- Finished
+exit 0
diff --git a/dot_tmux/plugins/tpm/dot_git/index b/dot_tmux/plugins/tpm/dot_git/index
new file mode 100644
index 0000000..5fb4dbb
Binary files /dev/null and b/dot_tmux/plugins/tpm/dot_git/index differ
diff --git a/dot_tmux/plugins/tpm/dot_git/info/exclude b/dot_tmux/plugins/tpm/dot_git/info/exclude
new file mode 100644
index 0000000..a5196d1
--- /dev/null
+++ b/dot_tmux/plugins/tpm/dot_git/info/exclude
@@ -0,0 +1,6 @@
+# git ls-files --others --exclude-from=.git/info/exclude
+# Lines that start with '#' are comments.
+# For a project mostly in C, the following would be a good set of
+# exclude patterns (uncomment them if you want to use them):
+# *.[oa]
+# *~
diff --git a/dot_tmux/plugins/tpm/dot_git/logs/HEAD b/dot_tmux/plugins/tpm/dot_git/logs/HEAD
new file mode 100644
index 0000000..8db65a0
--- /dev/null
+++ b/dot_tmux/plugins/tpm/dot_git/logs/HEAD
@@ -0,0 +1 @@
+0000000000000000000000000000000000000000 b699a7e01c253ffb7818b02d62bce24190ec1019 Kasper J. Hermansen 1657609139 +0200 clone: from https://github.com/tmux-plugins/tpm
diff --git a/dot_tmux/plugins/tpm/dot_git/logs/refs/heads/master b/dot_tmux/plugins/tpm/dot_git/logs/refs/heads/master
new file mode 100644
index 0000000..8db65a0
--- /dev/null
+++ b/dot_tmux/plugins/tpm/dot_git/logs/refs/heads/master
@@ -0,0 +1 @@
+0000000000000000000000000000000000000000 b699a7e01c253ffb7818b02d62bce24190ec1019 Kasper J. Hermansen 1657609139 +0200 clone: from https://github.com/tmux-plugins/tpm
diff --git a/dot_tmux/plugins/tpm/dot_git/logs/refs/remotes/origin/HEAD b/dot_tmux/plugins/tpm/dot_git/logs/refs/remotes/origin/HEAD
new file mode 100644
index 0000000..8db65a0
--- /dev/null
+++ b/dot_tmux/plugins/tpm/dot_git/logs/refs/remotes/origin/HEAD
@@ -0,0 +1 @@
+0000000000000000000000000000000000000000 b699a7e01c253ffb7818b02d62bce24190ec1019 Kasper J. Hermansen 1657609139 +0200 clone: from https://github.com/tmux-plugins/tpm
diff --git a/dot_tmux/plugins/tpm/dot_git/objects/info/.keep b/dot_tmux/plugins/tpm/dot_git/objects/info/.keep
new file mode 100644
index 0000000..e69de29
diff --git a/dot_tmux/plugins/tpm/dot_git/objects/pack/readonly_pack-17625ffcf71a446997741831332005307218a33a.idx b/dot_tmux/plugins/tpm/dot_git/objects/pack/readonly_pack-17625ffcf71a446997741831332005307218a33a.idx
new file mode 100644
index 0000000..f00608f
Binary files /dev/null and b/dot_tmux/plugins/tpm/dot_git/objects/pack/readonly_pack-17625ffcf71a446997741831332005307218a33a.idx differ
diff --git a/dot_tmux/plugins/tpm/dot_git/objects/pack/readonly_pack-17625ffcf71a446997741831332005307218a33a.pack b/dot_tmux/plugins/tpm/dot_git/objects/pack/readonly_pack-17625ffcf71a446997741831332005307218a33a.pack
new file mode 100644
index 0000000..3ede135
Binary files /dev/null and b/dot_tmux/plugins/tpm/dot_git/objects/pack/readonly_pack-17625ffcf71a446997741831332005307218a33a.pack differ
diff --git a/dot_tmux/plugins/tpm/dot_git/packed-refs b/dot_tmux/plugins/tpm/dot_git/packed-refs
new file mode 100644
index 0000000..f27c1bd
--- /dev/null
+++ b/dot_tmux/plugins/tpm/dot_git/packed-refs
@@ -0,0 +1,22 @@
+# pack-refs with: peeled fully-peeled sorted
+aeb196db5c13161defbac64314d47ca346b34826 refs/remotes/origin/fix-automatic-tpm-install
+bfc7a2c2cbbbb0c448b23396bdb7bf088b8c6dc3 refs/remotes/origin/fix_emacs_continue_key
+b699a7e01c253ffb7818b02d62bce24190ec1019 refs/remotes/origin/master
+e1bbcd6f8b7db9df823632d4140fb4bbd65798d3 refs/remotes/origin/travis_install_tmux_from_source
+aee1fbc949e1f68db3d8da7ac1b9bee5b4ac1595 refs/tags/v0.0.1
+e29045e1db9ad6e1e9cf72ab59b78f0ec72cafb8 refs/tags/v0.0.2
+^e68e4d52e4d0acb0691fb99d07de922142cc6759
+d520c6a47a40dc1ab0e7799d95514c5aab000a8f refs/tags/v1.0.0
+^f44ae34d112beceead7f09994cb057fe5b136b57
+0794614b55ea7c9b7c07306e64a09b8ac1207a2e refs/tags/v1.1.0
+^604cca0e8ae0479b850bf62e8030a8f421513598
+1e65a591ab5972ff9072f2c07608ee1dd0b88eb7 refs/tags/v1.2.0
+^7c10afc0612f1d1c69837cbc65b20f22c864141d
+92ba10978b6e9a7a767ed2ddb9c7190f9956789a refs/tags/v1.2.1
+^db8b06c509e44a60c4ec3132fc9839ebe1bbf08a
+5957fe6b4644e75ba0740a94faf97307eb31046d refs/tags/v1.2.2
+^330176355013884fa04caf7fbac0df8be2349273
+79c45e42bf525de25a12689f3770ff1f1d30a1aa refs/tags/v2.0.0
+^35161668d986d83c46cdcf870cfc549431db9f8f
+234002ad1c58e04b4e74853c7f1698874f69da60 refs/tags/v3.0.0
+^1ff32085b2b30956fbab58b1520d84d95f18d48d
diff --git a/dot_tmux/plugins/tpm/dot_git/refs/heads/master b/dot_tmux/plugins/tpm/dot_git/refs/heads/master
new file mode 100644
index 0000000..3a9849f
--- /dev/null
+++ b/dot_tmux/plugins/tpm/dot_git/refs/heads/master
@@ -0,0 +1 @@
+b699a7e01c253ffb7818b02d62bce24190ec1019
diff --git a/dot_tmux/plugins/tpm/dot_git/refs/remotes/origin/HEAD b/dot_tmux/plugins/tpm/dot_git/refs/remotes/origin/HEAD
new file mode 100644
index 0000000..6efe28f
--- /dev/null
+++ b/dot_tmux/plugins/tpm/dot_git/refs/remotes/origin/HEAD
@@ -0,0 +1 @@
+ref: refs/remotes/origin/master
diff --git a/dot_tmux/plugins/tpm/dot_git/refs/tags/.keep b/dot_tmux/plugins/tpm/dot_git/refs/tags/.keep
new file mode 100644
index 0000000..e69de29
diff --git a/dot_tmux/plugins/tpm/dot_gitattributes b/dot_tmux/plugins/tpm/dot_gitattributes
new file mode 100644
index 0000000..80772e4
--- /dev/null
+++ b/dot_tmux/plugins/tpm/dot_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/dot_tmux/plugins/tpm/dot_gitignore b/dot_tmux/plugins/tpm/dot_gitignore
new file mode 100644
index 0000000..8a94156
--- /dev/null
+++ b/dot_tmux/plugins/tpm/dot_gitignore
@@ -0,0 +1,4 @@
+**/.vagrant/
+run_tests
+tests/run_tests_in_isolation
+tests/helpers/helpers.sh
diff --git a/dot_tmux/plugins/tpm/dot_gitmodules b/dot_tmux/plugins/tpm/dot_gitmodules
new file mode 100644
index 0000000..5e44e3c
--- /dev/null
+++ b/dot_tmux/plugins/tpm/dot_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/dot_tmux/plugins/tpm/dot_travis.yml b/dot_tmux/plugins/tpm/dot_travis.yml
new file mode 100644
index 0000000..ac45d8b
--- /dev/null
+++ b/dot_tmux/plugins/tpm/dot_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/dot_tmux/plugins/tpm/executable_tpm b/dot_tmux/plugins/tpm/executable_tpm
new file mode 100644
index 0000000..7ad4b99
--- /dev/null
+++ b/dot_tmux/plugins/tpm/executable_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/dot_tmux/plugins/tpm/lib/tmux-test/.keep b/dot_tmux/plugins/tpm/lib/tmux-test/.keep
new file mode 100644
index 0000000..e69de29
diff --git a/dot_tmux/plugins/tpm/scripts/executable_check_tmux_version.sh b/dot_tmux/plugins/tpm/scripts/executable_check_tmux_version.sh
new file mode 100644
index 0000000..b0aedec
--- /dev/null
+++ b/dot_tmux/plugins/tpm/scripts/executable_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/dot_tmux/plugins/tpm/scripts/executable_clean_plugins.sh b/dot_tmux/plugins/tpm/scripts/executable_clean_plugins.sh
new file mode 100644
index 0000000..a025524
--- /dev/null
+++ b/dot_tmux/plugins/tpm/scripts/executable_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/dot_tmux/plugins/tpm/scripts/executable_install_plugins.sh b/dot_tmux/plugins/tpm/scripts/executable_install_plugins.sh
new file mode 100644
index 0000000..e2450ac
--- /dev/null
+++ b/dot_tmux/plugins/tpm/scripts/executable_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/dot_tmux/plugins/tpm/scripts/executable_source_plugins.sh b/dot_tmux/plugins/tpm/scripts/executable_source_plugins.sh
new file mode 100644
index 0000000..6381d54
--- /dev/null
+++ b/dot_tmux/plugins/tpm/scripts/executable_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/dot_tmux/plugins/tpm/scripts/executable_update_plugin.sh b/dot_tmux/plugins/tpm/scripts/executable_update_plugin.sh
new file mode 100644
index 0000000..68bf605
--- /dev/null
+++ b/dot_tmux/plugins/tpm/scripts/executable_update_plugin.sh
@@ -0,0 +1,73 @@
+#!/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"
+ $(pull_changes "$plugin" > /dev/null 2>&1) &&
+ echo_ok " \"$plugin\" update success" ||
+ echo_err " \"$plugin\" update fail"
+}
+
+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/dot_tmux/plugins/tpm/scripts/executable_update_plugin_prompt_handler.sh b/dot_tmux/plugins/tpm/scripts/executable_update_plugin_prompt_handler.sh
new file mode 100644
index 0000000..5e1f7d9
--- /dev/null
+++ b/dot_tmux/plugins/tpm/scripts/executable_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/dot_tmux/plugins/tpm/scripts/helpers/plugin_functions.sh b/dot_tmux/plugins/tpm/scripts/helpers/plugin_functions.sh
new file mode 100644
index 0000000..f33d215
--- /dev/null
+++ b/dot_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/dot_tmux/plugins/tpm/scripts/helpers/shell_echo_functions.sh b/dot_tmux/plugins/tpm/scripts/helpers/shell_echo_functions.sh
new file mode 100644
index 0000000..ecaa37e
--- /dev/null
+++ b/dot_tmux/plugins/tpm/scripts/helpers/shell_echo_functions.sh
@@ -0,0 +1,7 @@
+echo_ok() {
+ echo "$*"
+}
+
+echo_err() {
+ fail_helper "$*"
+}
diff --git a/dot_tmux/plugins/tpm/scripts/helpers/tmux_echo_functions.sh b/dot_tmux/plugins/tpm/scripts/helpers/tmux_echo_functions.sh
new file mode 100644
index 0000000..7a6ef0a
--- /dev/null
+++ b/dot_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/dot_tmux/plugins/tpm/scripts/helpers/tmux_utils.sh b/dot_tmux/plugins/tpm/scripts/helpers/tmux_utils.sh
new file mode 100644
index 0000000..238952d
--- /dev/null
+++ b/dot_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/dot_tmux/plugins/tpm/scripts/helpers/utility.sh b/dot_tmux/plugins/tpm/scripts/helpers/utility.sh
new file mode 100644
index 0000000..de6eb35
--- /dev/null
+++ b/dot_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/dot_tmux/plugins/tpm/scripts/variables.sh b/dot_tmux/plugins/tpm/scripts/variables.sh
new file mode 100644
index 0000000..5601a86
--- /dev/null
+++ b/dot_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/dot_tmux/plugins/tpm/tests/executable_expect_failed_plugin_download b/dot_tmux/plugins/tpm/tests/executable_expect_failed_plugin_download
new file mode 100644
index 0000000..b970477
--- /dev/null
+++ b/dot_tmux/plugins/tpm/tests/executable_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/dot_tmux/plugins/tpm/tests/executable_expect_successful_clean_plugins b/dot_tmux/plugins/tpm/tests/executable_expect_successful_clean_plugins
new file mode 100644
index 0000000..987c49d
--- /dev/null
+++ b/dot_tmux/plugins/tpm/tests/executable_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/dot_tmux/plugins/tpm/tests/executable_expect_successful_multiple_plugins_download b/dot_tmux/plugins/tpm/tests/executable_expect_successful_multiple_plugins_download
new file mode 100644
index 0000000..cc87a26
--- /dev/null
+++ b/dot_tmux/plugins/tpm/tests/executable_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/dot_tmux/plugins/tpm/tests/executable_expect_successful_plugin_download b/dot_tmux/plugins/tpm/tests/executable_expect_successful_plugin_download
new file mode 100644
index 0000000..388f05d
--- /dev/null
+++ b/dot_tmux/plugins/tpm/tests/executable_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/dot_tmux/plugins/tpm/tests/executable_expect_successful_update_of_a_single_plugin b/dot_tmux/plugins/tpm/tests/executable_expect_successful_update_of_a_single_plugin
new file mode 100644
index 0000000..bcd64fe
--- /dev/null
+++ b/dot_tmux/plugins/tpm/tests/executable_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/dot_tmux/plugins/tpm/tests/executable_expect_successful_update_of_all_plugins b/dot_tmux/plugins/tpm/tests/executable_expect_successful_update_of_all_plugins
new file mode 100644
index 0000000..4f3a4a3
--- /dev/null
+++ b/dot_tmux/plugins/tpm/tests/executable_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/dot_tmux/plugins/tpm/tests/executable_test_plugin_clean.sh b/dot_tmux/plugins/tpm/tests/executable_test_plugin_clean.sh
new file mode 100644
index 0000000..d36c468
--- /dev/null
+++ b/dot_tmux/plugins/tpm/tests/executable_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/dot_tmux/plugins/tpm/tests/executable_test_plugin_installation.sh b/dot_tmux/plugins/tpm/tests/executable_test_plugin_installation.sh
new file mode 100644
index 0000000..94fb674
--- /dev/null
+++ b/dot_tmux/plugins/tpm/tests/executable_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/dot_tmux/plugins/tpm/tests/executable_test_plugin_installation_legacy.sh b/dot_tmux/plugins/tpm/tests/executable_test_plugin_installation_legacy.sh
new file mode 100644
index 0000000..b1d0cf6
--- /dev/null
+++ b/dot_tmux/plugins/tpm/tests/executable_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/dot_tmux/plugins/tpm/tests/executable_test_plugin_sourcing.sh b/dot_tmux/plugins/tpm/tests/executable_test_plugin_sourcing.sh
new file mode 100644
index 0000000..c06f1fe
--- /dev/null
+++ b/dot_tmux/plugins/tpm/tests/executable_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/dot_tmux/plugins/tpm/tests/executable_test_plugin_update.sh b/dot_tmux/plugins/tpm/tests/executable_test_plugin_update.sh
new file mode 100644
index 0000000..4924d16
--- /dev/null
+++ b/dot_tmux/plugins/tpm/tests/executable_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/dot_tmux/plugins/tpm/tests/helpers/tpm.sh b/dot_tmux/plugins/tpm/tests/helpers/tpm.sh
new file mode 100644
index 0000000..1594afb
--- /dev/null
+++ b/dot_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/dot_tmux/plugins/vim-tmux-navigator/License.md b/dot_tmux/plugins/vim-tmux-navigator/License.md
new file mode 100644
index 0000000..046c81d
--- /dev/null
+++ b/dot_tmux/plugins/vim-tmux-navigator/License.md
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2017 Chris Toomey
+
+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/dot_tmux/plugins/vim-tmux-navigator/README.md b/dot_tmux/plugins/vim-tmux-navigator/README.md
new file mode 100644
index 0000000..63e5e7c
--- /dev/null
+++ b/dot_tmux/plugins/vim-tmux-navigator/README.md
@@ -0,0 +1,305 @@
+Vim Tmux Navigator
+==================
+
+This plugin is a repackaging of [Mislav Marohnić's](https://mislav.net/) tmux-navigator
+configuration described in [this gist][]. When combined with a set of tmux
+key bindings, the plugin will allow you to navigate seamlessly between
+vim and tmux splits using a consistent set of hotkeys.
+
+**NOTE**: This requires tmux v1.8 or higher.
+
+Usage
+-----
+
+This plugin provides the following mappings which allow you to move between
+Vim panes and tmux splits seamlessly.
+
+- `` => Left
+- `` => Down
+- `` => Up
+- `` => Right
+- `` => Previous split
+
+**Note** - you don't need to use your tmux `prefix` key sequence before using
+the mappings.
+
+If you want to use alternate key mappings, see the [configuration section
+below][].
+
+Installation
+------------
+
+### Vim
+
+If you don't have a preferred installation method, I recommend using [Vundle][].
+Assuming you have Vundle installed and configured, the following steps will
+install the plugin:
+
+Add the following line to your `~/.vimrc` file
+
+``` vim
+Plugin 'christoomey/vim-tmux-navigator'
+```
+
+Then run
+
+```
+:PluginInstall
+```
+
+If you are using Vim 8+, you don't need any plugin manager. Simply clone this repository inside `~/.vim/pack/plugin/start/` directory and restart Vim.
+
+```
+git clone git@github.com:christoomey/vim-tmux-navigator.git ~/.vim/pack/plugins/start/vim-tmux-navigator
+```
+
+
+### tmux
+
+To configure the tmux side of this customization there are two options:
+
+#### Add a snippet
+
+Add the following to your `~/.tmux.conf` file:
+
+``` tmux
+# Smart pane switching with awareness of Vim splits.
+# See: https://github.com/christoomey/vim-tmux-navigator
+is_vim="ps -o state= -o comm= -t '#{pane_tty}' \
+ | grep -iqE '^[^TXZ ]+ +(\\S+\\/)?g?(view|n?vim?x?)(diff)?$'"
+bind-key -n 'C-h' if-shell "$is_vim" 'send-keys C-h' 'select-pane -L'
+bind-key -n 'C-j' if-shell "$is_vim" 'send-keys C-j' 'select-pane -D'
+bind-key -n 'C-k' if-shell "$is_vim" 'send-keys C-k' 'select-pane -U'
+bind-key -n 'C-l' if-shell "$is_vim" 'send-keys C-l' 'select-pane -R'
+tmux_version='$(tmux -V | sed -En "s/^tmux ([0-9]+(.[0-9]+)?).*/\1/p")'
+if-shell -b '[ "$(echo "$tmux_version < 3.0" | bc)" = 1 ]' \
+ "bind-key -n 'C-\\' if-shell \"$is_vim\" 'send-keys C-\\' 'select-pane -l'"
+if-shell -b '[ "$(echo "$tmux_version >= 3.0" | bc)" = 1 ]' \
+ "bind-key -n 'C-\\' if-shell \"$is_vim\" 'send-keys C-\\\\' 'select-pane -l'"
+
+bind-key -T copy-mode-vi 'C-h' select-pane -L
+bind-key -T copy-mode-vi 'C-j' select-pane -D
+bind-key -T copy-mode-vi 'C-k' select-pane -U
+bind-key -T copy-mode-vi 'C-l' select-pane -R
+bind-key -T copy-mode-vi 'C-\' select-pane -l
+```
+
+#### TPM
+
+If you'd prefer, you can use the Tmux Plugin Manager ([TPM][]) instead of
+copying the snippet.
+When using TPM, add the following lines to your ~/.tmux.conf:
+
+``` tmux
+set -g @plugin 'christoomey/vim-tmux-navigator'
+run '~/.tmux/plugins/tpm/tpm'
+```
+
+Thanks to Christopher Sexton who provided the updated tmux configuration in
+[this blog post][].
+
+Configuration
+-------------
+
+### Custom Key Bindings
+
+If you don't want the plugin to create any mappings, you can use the five
+provided functions to define your own custom maps. You will need to define
+custom mappings in your `~/.vimrc` as well as update the bindings in tmux to
+match.
+
+#### Vim
+
+Add the following to your `~/.vimrc` to define your custom maps:
+
+``` vim
+let g:tmux_navigator_no_mappings = 1
+
+nnoremap {Left-Mapping} :TmuxNavigateLeft
+nnoremap {Down-Mapping} :TmuxNavigateDown
+nnoremap {Up-Mapping} :TmuxNavigateUp
+nnoremap {Right-Mapping} :TmuxNavigateRight
+nnoremap {Previous-Mapping} :TmuxNavigatePrevious
+```
+
+*Note* Each instance of `{Left-Mapping}` or `{Down-Mapping}` must be replaced
+in the above code with the desired mapping. Ie, the mapping for `` =>
+Left would be created with `nnoremap :TmuxNavigateLeft`.
+
+##### Autosave on leave
+
+You can configure the plugin to write the current buffer, or all buffers, when
+navigating from Vim to tmux. This functionality is exposed via the
+`g:tmux_navigator_save_on_switch` variable, which can have either of the
+following values:
+
+Value | Behavior
+------ | ------
+1 | `:update` (write the current buffer, but only if changed)
+2 | `:wall` (write all buffers)
+
+To enable this, add the following (with the desired value) to your ~/.vimrc:
+
+```vim
+" Write all buffers before navigating from Vim to tmux pane
+let g:tmux_navigator_save_on_switch = 2
+```
+
+##### Disable While Zoomed
+
+By default, if you zoom the tmux pane running Vim and then attempt to navigate
+"past" the edge of the Vim session, tmux will unzoom the pane. This is the
+default tmux behavior, but may be confusing if you've become accustomed to
+navigation "wrapping" around the sides due to this plugin.
+
+We provide an option, `g:tmux_navigator_disable_when_zoomed`, which can be used
+to disable this unzooming behavior, keeping all navigation within Vim until the
+tmux pane is explicitly unzoomed.
+
+To disable navigation when zoomed, add the following to your ~/.vimrc:
+
+```vim
+" Disable tmux navigator when zooming the Vim pane
+let g:tmux_navigator_disable_when_zoomed = 1
+```
+
+##### Preserve Zoom
+
+As noted above, navigating from a Vim pane to another tmux pane normally causes
+the window to be unzoomed. Some users may prefer the behavior of tmux's `-Z`
+option to `select-pane`, which keeps the window zoomed if it was zoomed. To
+enable this behavior, set the `g:tmux_navigator_preserve_zoom` option to `1`:
+
+```vim
+" If the tmux window is zoomed, keep it zoomed when moving from Vim to another pane
+let g:tmux_navigator_preserve_zoom = 1
+```
+
+Naturally, if `g:tmux_navigator_disable_when_zoomed` is enabled, this option
+will have no effect.
+
+#### Tmux
+
+Alter each of the five lines of the tmux configuration listed above to use your
+custom mappings. **Note** each line contains two references to the desired
+mapping.
+
+### Additional Customization
+
+#### Restoring Clear Screen (C-l)
+
+The default key bindings include `` which is the readline key binding
+for clearing the screen. The following binding can be added to your `~/.tmux.conf` file to provide an alternate mapping to `clear-screen`.
+
+``` tmux
+bind C-l send-keys 'C-l'
+```
+
+With this enabled you can use ` C-l` to clear the screen.
+
+Thanks to [Brian Hogan][] for the tip on how to re-map the clear screen binding.
+
+#### Nesting
+If you like to nest your tmux sessions, this plugin is not going to work
+properly. It probably never will, as it would require detecting when Tmux would
+wrap from one outermost pane to another and propagating that to the outer
+session.
+
+By default this plugin works on the outermost tmux session and the vim
+sessions it contains, but you can customize the behaviour by adding more
+commands to the expression used by the grep command.
+
+When nesting tmux sessions via ssh or mosh, you could extend it to look like
+`'(^|\/)g?(view|vim|ssh|mosh?)(diff)?$'`, which makes this plugin work within
+the innermost tmux session and the vim sessions within that one. This works
+better than the default behaviour if you use the outer Tmux sessions as relays
+to different hosts and have all instances of vim on remote hosts.
+
+Similarly, if you like to nest tmux locally, add `|tmux` to the expression.
+
+This behaviour means that you can't leave the innermost session with Ctrl-hjkl
+directly. These following fallback mappings can be targeted to the right Tmux
+session by escaping the prefix (Tmux' `send-prefix` command).
+
+``` tmux
+bind -r C-h run "tmux select-pane -L"
+bind -r C-j run "tmux select-pane -D"
+bind -r C-k run "tmux select-pane -U"
+bind -r C-l run "tmux select-pane -R"
+bind -r C-\ run "tmux select-pane -l"
+```
+
+Troubleshooting
+---------------
+
+### Vim -> Tmux doesn't work!
+
+This is likely due to conflicting key mappings in your `~/.vimrc`. You can use
+the following search pattern to find conflicting mappings
+`\vn(nore)?map\s+\`. Any matching lines should be deleted or
+altered to avoid conflicting with the mappings from the plugin.
+
+Another option is that the pattern matching included in the `.tmux.conf` is
+not recognizing that Vim is active. To check that tmux is properly recognizing
+Vim, use the provided Vim command `:TmuxNavigatorProcessList`. The output of
+that command should be a list like:
+
+```
+Ss -zsh
+S+ vim
+S+ tmux
+```
+
+If you encounter a different output please [open an issue][] with as much info
+about your OS, Vim version, and tmux version as possible.
+
+[open an issue]: https://github.com/christoomey/vim-tmux-navigator/issues/new
+
+### Tmux Can't Tell if Vim Is Active
+
+This functionality requires tmux version 1.8 or higher. You can check your
+version to confirm with this shell command:
+
+``` bash
+tmux -V # should return 'tmux 1.8'
+```
+
+### Switching out of Vim Is Slow
+
+If you find that navigation within Vim (from split to split) is fine, but Vim
+to a non-Vim tmux pane is delayed, it might be due to a slow shell startup.
+Consider moving code from your shell's non-interactive rc file (e.g.,
+`~/.zshenv`) into the interactive startup file (e.g., `~/.zshrc`) as Vim only
+sources the non-interactive config.
+
+### It doesn't work in Vim's `terminal` mode
+
+Terminal mode is currently unsupported as adding this plugin's mappings there
+causes conflict with movement mappings for FZF (it also uses terminal mode).
+There's a conversation about this in https://github.com/christoomey/vim-tmux-navigator/pull/172
+
+### It Doesn't Work in tmate
+
+[tmate][] is a tmux fork that aids in setting up remote pair programming
+sessions. It is designed to run alongside tmux without issue, but occasionally
+there are hiccups. Specifically, if the versions of tmux and tmate don't match,
+you can have issues. See [this
+issue](https://github.com/christoomey/vim-tmux-navigator/issues/27) for more
+detail.
+
+[tmate]: http://tmate.io/
+
+### It Still Doesn't Work!!!
+
+The tmux configuration uses an inlined grep pattern match to help determine if
+the current pane is running Vim. If you run into any issues with the navigation
+not happening as expected, you can try using [Mislav's original external
+script][] which has a more robust check.
+
+[Brian Hogan]: https://twitter.com/bphogan
+[Mislav's original external script]: https://github.com/mislav/dotfiles/blob/master/bin/tmux-vim-select-pane
+[Vundle]: https://github.com/gmarik/vundle
+[TPM]: https://github.com/tmux-plugins/tpm
+[configuration section below]: #custom-key-bindings
+[this blog post]: http://www.codeography.com/2013/06/19/navigating-vim-and-tmux-splits
+[this gist]: https://gist.github.com/mislav/5189704
diff --git a/dot_tmux/plugins/vim-tmux-navigator/doc/tmux-navigator.txt b/dot_tmux/plugins/vim-tmux-navigator/doc/tmux-navigator.txt
new file mode 100644
index 0000000..752abb4
--- /dev/null
+++ b/dot_tmux/plugins/vim-tmux-navigator/doc/tmux-navigator.txt
@@ -0,0 +1,39 @@
+*tmux-navigator.txt* Plugin to allow seamless navigation between tmux and vim
+
+==============================================================================
+CONTENTS *tmux-navigator-contents*
+
+
+==============================================================================
+INTRODUCTION *tmux-navigator*
+
+Vim-tmux-navigator is a little plugin which enables seamless navigation
+between tmux panes and vim splits. This plugin is a repackaging of Mislav
+Marohinc's tmux=navigator configuration. When combined with a set of tmux key
+bindings, the plugin will allow you to navigate seamlessly between vim and
+tmux splits using a consistent set of hotkeys.
+
+NOTE: This requires tmux v1.8 or higher.
+
+==============================================================================
+CONFIGURATION *tmux-navigator-configuration*
+
+* Activate autoupdate on exit
+ let g:tmux_navigator_save_on_switch = 1
+
+* Disable vim->tmux navigation when the Vim pane is zoomed in tmux
+ let g:tmux_navigator_disable_when_zoomed = 1
+
+* If the Vim pane is zoomed, stay zoomed when moving to another tmux pane
+ let g:tmux_navigator_preserve_zoom = 1
+
+* Custom Key Bindings
+ let g:tmux_navigator_no_mappings = 1
+
+ nnoremap {Left-mapping} :TmuxNavigateLeft
+ nnoremap {Down-Mapping} :TmuxNavigateDown
+ nnoremap {Up-Mapping} :TmuxNavigateUp
+ nnoremap {Right-Mapping} :TmuxNavigateRight
+ nnoremap {Previous-Mapping} :TmuxNavigatePrevious
+
+ vim:tw=78:ts=8:ft=help:norl:
diff --git a/dot_tmux/plugins/vim-tmux-navigator/dot_git/HEAD b/dot_tmux/plugins/vim-tmux-navigator/dot_git/HEAD
new file mode 100644
index 0000000..cb089cd
--- /dev/null
+++ b/dot_tmux/plugins/vim-tmux-navigator/dot_git/HEAD
@@ -0,0 +1 @@
+ref: refs/heads/master
diff --git a/dot_tmux/plugins/vim-tmux-navigator/dot_git/config b/dot_tmux/plugins/vim-tmux-navigator/dot_git/config
new file mode 100644
index 0000000..9be2845
--- /dev/null
+++ b/dot_tmux/plugins/vim-tmux-navigator/dot_git/config
@@ -0,0 +1,15 @@
+[core]
+ repositoryformatversion = 0
+ filemode = true
+ bare = false
+ logallrefupdates = true
+ ignorecase = true
+ precomposeunicode = true
+[submodule]
+ active = .
+[remote "origin"]
+ url = https://git::@github.com/christoomey/vim-tmux-navigator
+ fetch = +refs/heads/master:refs/remotes/origin/master
+[branch "master"]
+ remote = origin
+ merge = refs/heads/master
diff --git a/dot_tmux/plugins/vim-tmux-navigator/dot_git/description b/dot_tmux/plugins/vim-tmux-navigator/dot_git/description
new file mode 100644
index 0000000..498b267
--- /dev/null
+++ b/dot_tmux/plugins/vim-tmux-navigator/dot_git/description
@@ -0,0 +1 @@
+Unnamed repository; edit this file 'description' to name the repository.
diff --git a/dot_tmux/plugins/vim-tmux-navigator/dot_git/hooks/executable_applypatch-msg.sample b/dot_tmux/plugins/vim-tmux-navigator/dot_git/hooks/executable_applypatch-msg.sample
new file mode 100644
index 0000000..a5d7b84
--- /dev/null
+++ b/dot_tmux/plugins/vim-tmux-navigator/dot_git/hooks/executable_applypatch-msg.sample
@@ -0,0 +1,15 @@
+#!/bin/sh
+#
+# An example hook script to check the commit log message taken by
+# applypatch from an e-mail message.
+#
+# The hook should exit with non-zero status after issuing an
+# appropriate message if it wants to stop the commit. The hook is
+# allowed to edit the commit message file.
+#
+# To enable this hook, rename this file to "applypatch-msg".
+
+. git-sh-setup
+commitmsg="$(git rev-parse --git-path hooks/commit-msg)"
+test -x "$commitmsg" && exec "$commitmsg" ${1+"$@"}
+:
diff --git a/dot_tmux/plugins/vim-tmux-navigator/dot_git/hooks/executable_commit-msg.sample b/dot_tmux/plugins/vim-tmux-navigator/dot_git/hooks/executable_commit-msg.sample
new file mode 100644
index 0000000..b58d118
--- /dev/null
+++ b/dot_tmux/plugins/vim-tmux-navigator/dot_git/hooks/executable_commit-msg.sample
@@ -0,0 +1,24 @@
+#!/bin/sh
+#
+# An example hook script to check the commit log message.
+# Called by "git commit" with one argument, the name of the file
+# that has the commit message. The hook should exit with non-zero
+# status after issuing an appropriate message if it wants to stop the
+# commit. The hook is allowed to edit the commit message file.
+#
+# To enable this hook, rename this file to "commit-msg".
+
+# Uncomment the below to add a Signed-off-by line to the message.
+# Doing this in a hook is a bad idea in general, but the prepare-commit-msg
+# hook is more suited to it.
+#
+# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p')
+# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1"
+
+# This example catches duplicate Signed-off-by lines.
+
+test "" = "$(grep '^Signed-off-by: ' "$1" |
+ sort | uniq -c | sed -e '/^[ ]*1[ ]/d')" || {
+ echo >&2 Duplicate Signed-off-by lines.
+ exit 1
+}
diff --git a/dot_tmux/plugins/vim-tmux-navigator/dot_git/hooks/executable_fsmonitor-watchman.sample b/dot_tmux/plugins/vim-tmux-navigator/dot_git/hooks/executable_fsmonitor-watchman.sample
new file mode 100644
index 0000000..14ed0aa
--- /dev/null
+++ b/dot_tmux/plugins/vim-tmux-navigator/dot_git/hooks/executable_fsmonitor-watchman.sample
@@ -0,0 +1,173 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+use IPC::Open2;
+
+# An example hook script to integrate Watchman
+# (https://facebook.github.io/watchman/) with git to speed up detecting
+# new and modified files.
+#
+# The hook is passed a version (currently 2) and last update token
+# formatted as a string and outputs to stdout a new update token and
+# all files that have been modified since the update token. Paths must
+# be relative to the root of the working tree and separated by a single NUL.
+#
+# To enable this hook, rename this file to "query-watchman" and set
+# 'git config core.fsmonitor .git/hooks/query-watchman'
+#
+my ($version, $last_update_token) = @ARGV;
+
+# Uncomment for debugging
+# print STDERR "$0 $version $last_update_token\n";
+
+# Check the hook interface version
+if ($version ne 2) {
+ die "Unsupported query-fsmonitor hook version '$version'.\n" .
+ "Falling back to scanning...\n";
+}
+
+my $git_work_tree = get_working_dir();
+
+my $retry = 1;
+
+my $json_pkg;
+eval {
+ require JSON::XS;
+ $json_pkg = "JSON::XS";
+ 1;
+} or do {
+ require JSON::PP;
+ $json_pkg = "JSON::PP";
+};
+
+launch_watchman();
+
+sub launch_watchman {
+ my $o = watchman_query();
+ if (is_work_tree_watched($o)) {
+ output_result($o->{clock}, @{$o->{files}});
+ }
+}
+
+sub output_result {
+ my ($clockid, @files) = @_;
+
+ # Uncomment for debugging watchman output
+ # open (my $fh, ">", ".git/watchman-output.out");
+ # binmode $fh, ":utf8";
+ # print $fh "$clockid\n@files\n";
+ # close $fh;
+
+ binmode STDOUT, ":utf8";
+ print $clockid;
+ print "\0";
+ local $, = "\0";
+ print @files;
+}
+
+sub watchman_clock {
+ my $response = qx/watchman clock "$git_work_tree"/;
+ die "Failed to get clock id on '$git_work_tree'.\n" .
+ "Falling back to scanning...\n" if $? != 0;
+
+ return $json_pkg->new->utf8->decode($response);
+}
+
+sub watchman_query {
+ my $pid = open2(\*CHLD_OUT, \*CHLD_IN, 'watchman -j --no-pretty')
+ or die "open2() failed: $!\n" .
+ "Falling back to scanning...\n";
+
+ # In the query expression below we're asking for names of files that
+ # changed since $last_update_token but not from the .git folder.
+ #
+ # To accomplish this, we're using the "since" generator to use the
+ # recency index to select candidate nodes and "fields" to limit the
+ # output to file names only. Then we're using the "expression" term to
+ # further constrain the results.
+ if (substr($last_update_token, 0, 1) eq "c") {
+ $last_update_token = "\"$last_update_token\"";
+ }
+ my $query = <<" END";
+ ["query", "$git_work_tree", {
+ "since": $last_update_token,
+ "fields": ["name"],
+ "expression": ["not", ["dirname", ".git"]]
+ }]
+ END
+
+ # Uncomment for debugging the watchman query
+ # open (my $fh, ">", ".git/watchman-query.json");
+ # print $fh $query;
+ # close $fh;
+
+ print CHLD_IN $query;
+ close CHLD_IN;
+ my $response = do {local $/; };
+
+ # Uncomment for debugging the watch response
+ # open ($fh, ">", ".git/watchman-response.json");
+ # print $fh $response;
+ # close $fh;
+
+ die "Watchman: command returned no output.\n" .
+ "Falling back to scanning...\n" if $response eq "";
+ die "Watchman: command returned invalid output: $response\n" .
+ "Falling back to scanning...\n" unless $response =~ /^\{/;
+
+ return $json_pkg->new->utf8->decode($response);
+}
+
+sub is_work_tree_watched {
+ my ($output) = @_;
+ my $error = $output->{error};
+ if ($retry > 0 and $error and $error =~ m/unable to resolve root .* directory (.*) is not watched/) {
+ $retry--;
+ my $response = qx/watchman watch "$git_work_tree"/;
+ die "Failed to make watchman watch '$git_work_tree'.\n" .
+ "Falling back to scanning...\n" if $? != 0;
+ $output = $json_pkg->new->utf8->decode($response);
+ $error = $output->{error};
+ die "Watchman: $error.\n" .
+ "Falling back to scanning...\n" if $error;
+
+ # Uncomment for debugging watchman output
+ # open (my $fh, ">", ".git/watchman-output.out");
+ # close $fh;
+
+ # Watchman will always return all files on the first query so
+ # return the fast "everything is dirty" flag to git and do the
+ # Watchman query just to get it over with now so we won't pay
+ # the cost in git to look up each individual file.
+ my $o = watchman_clock();
+ $error = $output->{error};
+
+ die "Watchman: $error.\n" .
+ "Falling back to scanning...\n" if $error;
+
+ output_result($o->{clock}, ("/"));
+ $last_update_token = $o->{clock};
+
+ eval { launch_watchman() };
+ return 0;
+ }
+
+ die "Watchman: $error.\n" .
+ "Falling back to scanning...\n" if $error;
+
+ return 1;
+}
+
+sub get_working_dir {
+ my $working_dir;
+ if ($^O =~ 'msys' || $^O =~ 'cygwin') {
+ $working_dir = Win32::GetCwd();
+ $working_dir =~ tr/\\/\//;
+ } else {
+ require Cwd;
+ $working_dir = Cwd::cwd();
+ }
+
+ return $working_dir;
+}
diff --git a/dot_tmux/plugins/vim-tmux-navigator/dot_git/hooks/executable_post-update.sample b/dot_tmux/plugins/vim-tmux-navigator/dot_git/hooks/executable_post-update.sample
new file mode 100644
index 0000000..ec17ec1
--- /dev/null
+++ b/dot_tmux/plugins/vim-tmux-navigator/dot_git/hooks/executable_post-update.sample
@@ -0,0 +1,8 @@
+#!/bin/sh
+#
+# An example hook script to prepare a packed repository for use over
+# dumb transports.
+#
+# To enable this hook, rename this file to "post-update".
+
+exec git update-server-info
diff --git a/dot_tmux/plugins/vim-tmux-navigator/dot_git/hooks/executable_pre-applypatch.sample b/dot_tmux/plugins/vim-tmux-navigator/dot_git/hooks/executable_pre-applypatch.sample
new file mode 100644
index 0000000..4142082
--- /dev/null
+++ b/dot_tmux/plugins/vim-tmux-navigator/dot_git/hooks/executable_pre-applypatch.sample
@@ -0,0 +1,14 @@
+#!/bin/sh
+#
+# An example hook script to verify what is about to be committed
+# by applypatch from an e-mail message.
+#
+# The hook should exit with non-zero status after issuing an
+# appropriate message if it wants to stop the commit.
+#
+# To enable this hook, rename this file to "pre-applypatch".
+
+. git-sh-setup
+precommit="$(git rev-parse --git-path hooks/pre-commit)"
+test -x "$precommit" && exec "$precommit" ${1+"$@"}
+:
diff --git a/dot_tmux/plugins/vim-tmux-navigator/dot_git/hooks/executable_pre-commit.sample b/dot_tmux/plugins/vim-tmux-navigator/dot_git/hooks/executable_pre-commit.sample
new file mode 100644
index 0000000..e144712
--- /dev/null
+++ b/dot_tmux/plugins/vim-tmux-navigator/dot_git/hooks/executable_pre-commit.sample
@@ -0,0 +1,49 @@
+#!/bin/sh
+#
+# An example hook script to verify what is about to be committed.
+# Called by "git commit" with no arguments. The hook should
+# exit with non-zero status after issuing an appropriate message if
+# it wants to stop the commit.
+#
+# To enable this hook, rename this file to "pre-commit".
+
+if git rev-parse --verify HEAD >/dev/null 2>&1
+then
+ against=HEAD
+else
+ # Initial commit: diff against an empty tree object
+ against=$(git hash-object -t tree /dev/null)
+fi
+
+# If you want to allow non-ASCII filenames set this variable to true.
+allownonascii=$(git config --type=bool hooks.allownonascii)
+
+# Redirect output to stderr.
+exec 1>&2
+
+# Cross platform projects tend to avoid non-ASCII filenames; prevent
+# them from being added to the repository. We exploit the fact that the
+# printable range starts at the space character and ends with tilde.
+if [ "$allownonascii" != "true" ] &&
+ # Note that the use of brackets around a tr range is ok here, (it's
+ # even required, for portability to Solaris 10's /usr/bin/tr), since
+ # the square bracket bytes happen to fall in the designated range.
+ test $(git diff --cached --name-only --diff-filter=A -z $against |
+ LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0
+then
+ cat <<\EOF
+Error: Attempt to add a non-ASCII file name.
+
+This can cause problems if you want to work with people on other platforms.
+
+To be portable it is advisable to rename the file.
+
+If you know what you are doing you can disable this check using:
+
+ git config hooks.allownonascii true
+EOF
+ exit 1
+fi
+
+# If there are whitespace errors, print the offending file names and fail.
+exec git diff-index --check --cached $against --
diff --git a/dot_tmux/plugins/vim-tmux-navigator/dot_git/hooks/executable_pre-merge-commit.sample b/dot_tmux/plugins/vim-tmux-navigator/dot_git/hooks/executable_pre-merge-commit.sample
new file mode 100644
index 0000000..399eab1
--- /dev/null
+++ b/dot_tmux/plugins/vim-tmux-navigator/dot_git/hooks/executable_pre-merge-commit.sample
@@ -0,0 +1,13 @@
+#!/bin/sh
+#
+# An example hook script to verify what is about to be committed.
+# Called by "git merge" with no arguments. The hook should
+# exit with non-zero status after issuing an appropriate message to
+# stderr if it wants to stop the merge commit.
+#
+# To enable this hook, rename this file to "pre-merge-commit".
+
+. git-sh-setup
+test -x "$GIT_DIR/hooks/pre-commit" &&
+ exec "$GIT_DIR/hooks/pre-commit"
+:
diff --git a/dot_tmux/plugins/vim-tmux-navigator/dot_git/hooks/executable_pre-push.sample b/dot_tmux/plugins/vim-tmux-navigator/dot_git/hooks/executable_pre-push.sample
new file mode 100644
index 0000000..4ce688d
--- /dev/null
+++ b/dot_tmux/plugins/vim-tmux-navigator/dot_git/hooks/executable_pre-push.sample
@@ -0,0 +1,53 @@
+#!/bin/sh
+
+# An example hook script to verify what is about to be pushed. Called by "git
+# push" after it has checked the remote status, but before anything has been
+# pushed. If this script exits with a non-zero status nothing will be pushed.
+#
+# This hook is called with the following parameters:
+#
+# $1 -- Name of the remote to which the push is being done
+# $2 -- URL to which the push is being done
+#
+# If pushing without using a named remote those arguments will be equal.
+#
+# Information about the commits which are being pushed is supplied as lines to
+# the standard input in the form:
+#
+#
+#
+# This sample shows how to prevent push of commits where the log message starts
+# with "WIP" (work in progress).
+
+remote="$1"
+url="$2"
+
+zero=$(git hash-object --stdin &2 "Found WIP commit in $local_ref, not pushing"
+ exit 1
+ fi
+ fi
+done
+
+exit 0
diff --git a/dot_tmux/plugins/vim-tmux-navigator/dot_git/hooks/executable_pre-rebase.sample b/dot_tmux/plugins/vim-tmux-navigator/dot_git/hooks/executable_pre-rebase.sample
new file mode 100644
index 0000000..6cbef5c
--- /dev/null
+++ b/dot_tmux/plugins/vim-tmux-navigator/dot_git/hooks/executable_pre-rebase.sample
@@ -0,0 +1,169 @@
+#!/bin/sh
+#
+# Copyright (c) 2006, 2008 Junio C Hamano
+#
+# The "pre-rebase" hook is run just before "git rebase" starts doing
+# its job, and can prevent the command from running by exiting with
+# non-zero status.
+#
+# The hook is called with the following parameters:
+#
+# $1 -- the upstream the series was forked from.
+# $2 -- the branch being rebased (or empty when rebasing the current branch).
+#
+# This sample shows how to prevent topic branches that are already
+# merged to 'next' branch from getting rebased, because allowing it
+# would result in rebasing already published history.
+
+publish=next
+basebranch="$1"
+if test "$#" = 2
+then
+ topic="refs/heads/$2"
+else
+ topic=`git symbolic-ref HEAD` ||
+ exit 0 ;# we do not interrupt rebasing detached HEAD
+fi
+
+case "$topic" in
+refs/heads/??/*)
+ ;;
+*)
+ exit 0 ;# we do not interrupt others.
+ ;;
+esac
+
+# Now we are dealing with a topic branch being rebased
+# on top of master. Is it OK to rebase it?
+
+# Does the topic really exist?
+git show-ref -q "$topic" || {
+ echo >&2 "No such branch $topic"
+ exit 1
+}
+
+# Is topic fully merged to master?
+not_in_master=`git rev-list --pretty=oneline ^master "$topic"`
+if test -z "$not_in_master"
+then
+ echo >&2 "$topic is fully merged to master; better remove it."
+ exit 1 ;# we could allow it, but there is no point.
+fi
+
+# Is topic ever merged to next? If so you should not be rebasing it.
+only_next_1=`git rev-list ^master "^$topic" ${publish} | sort`
+only_next_2=`git rev-list ^master ${publish} | sort`
+if test "$only_next_1" = "$only_next_2"
+then
+ not_in_topic=`git rev-list "^$topic" master`
+ if test -z "$not_in_topic"
+ then
+ echo >&2 "$topic is already up to date with master"
+ exit 1 ;# we could allow it, but there is no point.
+ else
+ exit 0
+ fi
+else
+ not_in_next=`git rev-list --pretty=oneline ^${publish} "$topic"`
+ /usr/bin/perl -e '
+ my $topic = $ARGV[0];
+ my $msg = "* $topic has commits already merged to public branch:\n";
+ my (%not_in_next) = map {
+ /^([0-9a-f]+) /;
+ ($1 => 1);
+ } split(/\n/, $ARGV[1]);
+ for my $elem (map {
+ /^([0-9a-f]+) (.*)$/;
+ [$1 => $2];
+ } split(/\n/, $ARGV[2])) {
+ if (!exists $not_in_next{$elem->[0]}) {
+ if ($msg) {
+ print STDERR $msg;
+ undef $msg;
+ }
+ print STDERR " $elem->[1]\n";
+ }
+ }
+ ' "$topic" "$not_in_next" "$not_in_master"
+ exit 1
+fi
+
+<<\DOC_END
+
+This sample hook safeguards topic branches that have been
+published from being rewound.
+
+The workflow assumed here is:
+
+ * Once a topic branch forks from "master", "master" is never
+ merged into it again (either directly or indirectly).
+
+ * Once a topic branch is fully cooked and merged into "master",
+ it is deleted. If you need to build on top of it to correct
+ earlier mistakes, a new topic branch is created by forking at
+ the tip of the "master". This is not strictly necessary, but
+ it makes it easier to keep your history simple.
+
+ * Whenever you need to test or publish your changes to topic
+ branches, merge them into "next" branch.
+
+The script, being an example, hardcodes the publish branch name
+to be "next", but it is trivial to make it configurable via
+$GIT_DIR/config mechanism.
+
+With this workflow, you would want to know:
+
+(1) ... if a topic branch has ever been merged to "next". Young
+ topic branches can have stupid mistakes you would rather
+ clean up before publishing, and things that have not been
+ merged into other branches can be easily rebased without
+ affecting other people. But once it is published, you would
+ not want to rewind it.
+
+(2) ... if a topic branch has been fully merged to "master".
+ Then you can delete it. More importantly, you should not
+ build on top of it -- other people may already want to
+ change things related to the topic as patches against your
+ "master", so if you need further changes, it is better to
+ fork the topic (perhaps with the same name) afresh from the
+ tip of "master".
+
+Let's look at this example:
+
+ o---o---o---o---o---o---o---o---o---o "next"
+ / / / /
+ / a---a---b A / /
+ / / / /
+ / / c---c---c---c B /
+ / / / \ /
+ / / / b---b C \ /
+ / / / / \ /
+ ---o---o---o---o---o---o---o---o---o---o---o "master"
+
+
+A, B and C are topic branches.
+
+ * A has one fix since it was merged up to "next".
+
+ * B has finished. It has been fully merged up to "master" and "next",
+ and is ready to be deleted.
+
+ * C has not merged to "next" at all.
+
+We would want to allow C to be rebased, refuse A, and encourage
+B to be deleted.
+
+To compute (1):
+
+ git rev-list ^master ^topic next
+ git rev-list ^master next
+
+ if these match, topic has not merged in next at all.
+
+To compute (2):
+
+ git rev-list master..topic
+
+ if this is empty, it is fully merged to "master".
+
+DOC_END
diff --git a/dot_tmux/plugins/vim-tmux-navigator/dot_git/hooks/executable_pre-receive.sample b/dot_tmux/plugins/vim-tmux-navigator/dot_git/hooks/executable_pre-receive.sample
new file mode 100644
index 0000000..a1fd29e
--- /dev/null
+++ b/dot_tmux/plugins/vim-tmux-navigator/dot_git/hooks/executable_pre-receive.sample
@@ -0,0 +1,24 @@
+#!/bin/sh
+#
+# An example hook script to make use of push options.
+# The example simply echoes all push options that start with 'echoback='
+# and rejects all pushes when the "reject" push option is used.
+#
+# To enable this hook, rename this file to "pre-receive".
+
+if test -n "$GIT_PUSH_OPTION_COUNT"
+then
+ i=0
+ while test "$i" -lt "$GIT_PUSH_OPTION_COUNT"
+ do
+ eval "value=\$GIT_PUSH_OPTION_$i"
+ case "$value" in
+ echoback=*)
+ echo "echo from the pre-receive-hook: ${value#*=}" >&2
+ ;;
+ reject)
+ exit 1
+ esac
+ i=$((i + 1))
+ done
+fi
diff --git a/dot_tmux/plugins/vim-tmux-navigator/dot_git/hooks/executable_prepare-commit-msg.sample b/dot_tmux/plugins/vim-tmux-navigator/dot_git/hooks/executable_prepare-commit-msg.sample
new file mode 100644
index 0000000..10fa14c
--- /dev/null
+++ b/dot_tmux/plugins/vim-tmux-navigator/dot_git/hooks/executable_prepare-commit-msg.sample
@@ -0,0 +1,42 @@
+#!/bin/sh
+#
+# An example hook script to prepare the commit log message.
+# Called by "git commit" with the name of the file that has the
+# commit message, followed by the description of the commit
+# message's source. The hook's purpose is to edit the commit
+# message file. If the hook fails with a non-zero status,
+# the commit is aborted.
+#
+# To enable this hook, rename this file to "prepare-commit-msg".
+
+# This hook includes three examples. The first one removes the
+# "# Please enter the commit message..." help message.
+#
+# The second includes the output of "git diff --name-status -r"
+# into the message, just before the "git status" output. It is
+# commented because it doesn't cope with --amend or with squashed
+# commits.
+#
+# The third example adds a Signed-off-by line to the message, that can
+# still be edited. This is rarely a good idea.
+
+COMMIT_MSG_FILE=$1
+COMMIT_SOURCE=$2
+SHA1=$3
+
+/usr/bin/perl -i.bak -ne 'print unless(m/^. Please enter the commit message/..m/^#$/)' "$COMMIT_MSG_FILE"
+
+# case "$COMMIT_SOURCE,$SHA1" in
+# ,|template,)
+# /usr/bin/perl -i.bak -pe '
+# print "\n" . `git diff --cached --name-status -r`
+# if /^#/ && $first++ == 0' "$COMMIT_MSG_FILE" ;;
+# *) ;;
+# esac
+
+# SOB=$(git var GIT_COMMITTER_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p')
+# git interpret-trailers --in-place --trailer "$SOB" "$COMMIT_MSG_FILE"
+# if test -z "$COMMIT_SOURCE"
+# then
+# /usr/bin/perl -i.bak -pe 'print "\n" if !$first_line++' "$COMMIT_MSG_FILE"
+# fi
diff --git a/dot_tmux/plugins/vim-tmux-navigator/dot_git/hooks/executable_push-to-checkout.sample b/dot_tmux/plugins/vim-tmux-navigator/dot_git/hooks/executable_push-to-checkout.sample
new file mode 100644
index 0000000..af5a0c0
--- /dev/null
+++ b/dot_tmux/plugins/vim-tmux-navigator/dot_git/hooks/executable_push-to-checkout.sample
@@ -0,0 +1,78 @@
+#!/bin/sh
+
+# An example hook script to update a checked-out tree on a git push.
+#
+# This hook is invoked by git-receive-pack(1) when it reacts to git
+# push and updates reference(s) in its repository, and when the push
+# tries to update the branch that is currently checked out and the
+# receive.denyCurrentBranch configuration variable is set to
+# updateInstead.
+#
+# By default, such a push is refused if the working tree and the index
+# of the remote repository has any difference from the currently
+# checked out commit; when both the working tree and the index match
+# the current commit, they are updated to match the newly pushed tip
+# of the branch. This hook is to be used to override the default
+# behaviour; however the code below reimplements the default behaviour
+# as a starting point for convenient modification.
+#
+# The hook receives the commit with which the tip of the current
+# branch is going to be updated:
+commit=$1
+
+# It can exit with a non-zero status to refuse the push (when it does
+# so, it must not modify the index or the working tree).
+die () {
+ echo >&2 "$*"
+ exit 1
+}
+
+# Or it can make any necessary changes to the working tree and to the
+# index to bring them to the desired state when the tip of the current
+# branch is updated to the new commit, and exit with a zero status.
+#
+# For example, the hook can simply run git read-tree -u -m HEAD "$1"
+# in order to emulate git fetch that is run in the reverse direction
+# with git push, as the two-tree form of git read-tree -u -m is
+# essentially the same as git switch or git checkout that switches
+# branches while keeping the local changes in the working tree that do
+# not interfere with the difference between the branches.
+
+# The below is a more-or-less exact translation to shell of the C code
+# for the default behaviour for git's push-to-checkout hook defined in
+# the push_to_deploy() function in builtin/receive-pack.c.
+#
+# Note that the hook will be executed from the repository directory,
+# not from the working tree, so if you want to perform operations on
+# the working tree, you will have to adapt your code accordingly, e.g.
+# by adding "cd .." or using relative paths.
+
+if ! git update-index -q --ignore-submodules --refresh
+then
+ die "Up-to-date check failed"
+fi
+
+if ! git diff-files --quiet --ignore-submodules --
+then
+ die "Working directory has unstaged changes"
+fi
+
+# This is a rough translation of:
+#
+# head_has_history() ? "HEAD" : EMPTY_TREE_SHA1_HEX
+if git cat-file -e HEAD 2>/dev/null
+then
+ head=HEAD
+else
+ head=$(git hash-object -t tree --stdin &2
+ echo " (if you want, you could supply GIT_DIR then run" >&2
+ echo " $0 ][ )" >&2
+ exit 1
+fi
+
+if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then
+ echo "usage: $0 ][ " >&2
+ exit 1
+fi
+
+# --- Config
+allowunannotated=$(git config --type=bool hooks.allowunannotated)
+allowdeletebranch=$(git config --type=bool hooks.allowdeletebranch)
+denycreatebranch=$(git config --type=bool hooks.denycreatebranch)
+allowdeletetag=$(git config --type=bool hooks.allowdeletetag)
+allowmodifytag=$(git config --type=bool hooks.allowmodifytag)
+
+# check for no description
+projectdesc=$(sed -e '1q' "$GIT_DIR/description")
+case "$projectdesc" in
+"Unnamed repository"* | "")
+ echo "*** Project description file hasn't been set" >&2
+ exit 1
+ ;;
+esac
+
+# --- Check types
+# if $newrev is 0000...0000, it's a commit to delete a ref.
+zero=$(git hash-object --stdin &2
+ echo "*** Use 'git tag [ -a | -s ]' for tags you want to propagate." >&2
+ exit 1
+ fi
+ ;;
+ refs/tags/*,delete)
+ # delete tag
+ if [ "$allowdeletetag" != "true" ]; then
+ echo "*** Deleting a tag is not allowed in this repository" >&2
+ exit 1
+ fi
+ ;;
+ refs/tags/*,tag)
+ # annotated tag
+ if [ "$allowmodifytag" != "true" ] && git rev-parse $refname > /dev/null 2>&1
+ then
+ echo "*** Tag '$refname' already exists." >&2
+ echo "*** Modifying a tag is not allowed in this repository." >&2
+ exit 1
+ fi
+ ;;
+ refs/heads/*,commit)
+ # branch
+ if [ "$oldrev" = "$zero" -a "$denycreatebranch" = "true" ]; then
+ echo "*** Creating a branch is not allowed in this repository" >&2
+ exit 1
+ fi
+ ;;
+ refs/heads/*,delete)
+ # delete branch
+ if [ "$allowdeletebranch" != "true" ]; then
+ echo "*** Deleting a branch is not allowed in this repository" >&2
+ exit 1
+ fi
+ ;;
+ refs/remotes/*,commit)
+ # tracking branch
+ ;;
+ refs/remotes/*,delete)
+ # delete tracking branch
+ if [ "$allowdeletebranch" != "true" ]; then
+ echo "*** Deleting a tracking branch is not allowed in this repository" >&2
+ exit 1
+ fi
+ ;;
+ *)
+ # Anything else (is there anything else?)
+ echo "*** Update hook: unknown type of update to ref $refname of type $newrev_type" >&2
+ exit 1
+ ;;
+esac
+
+# --- Finished
+exit 0
diff --git a/dot_tmux/plugins/vim-tmux-navigator/dot_git/index b/dot_tmux/plugins/vim-tmux-navigator/dot_git/index
new file mode 100644
index 0000000..2c5a8f7
Binary files /dev/null and b/dot_tmux/plugins/vim-tmux-navigator/dot_git/index differ
diff --git a/dot_tmux/plugins/vim-tmux-navigator/dot_git/info/exclude b/dot_tmux/plugins/vim-tmux-navigator/dot_git/info/exclude
new file mode 100644
index 0000000..a5196d1
--- /dev/null
+++ b/dot_tmux/plugins/vim-tmux-navigator/dot_git/info/exclude
@@ -0,0 +1,6 @@
+# git ls-files --others --exclude-from=.git/info/exclude
+# Lines that start with '#' are comments.
+# For a project mostly in C, the following would be a good set of
+# exclude patterns (uncomment them if you want to use them):
+# *.[oa]
+# *~
diff --git a/dot_tmux/plugins/vim-tmux-navigator/dot_git/logs/HEAD b/dot_tmux/plugins/vim-tmux-navigator/dot_git/logs/HEAD
new file mode 100644
index 0000000..f316032
--- /dev/null
+++ b/dot_tmux/plugins/vim-tmux-navigator/dot_git/logs/HEAD
@@ -0,0 +1 @@
+0000000000000000000000000000000000000000 9ca5bfe5bd274051b5dd796cc150348afc993b80 Kasper J. Hermansen 1657609203 +0200 clone: from https://github.com/christoomey/vim-tmux-navigator
diff --git a/dot_tmux/plugins/vim-tmux-navigator/dot_git/logs/refs/heads/master b/dot_tmux/plugins/vim-tmux-navigator/dot_git/logs/refs/heads/master
new file mode 100644
index 0000000..f316032
--- /dev/null
+++ b/dot_tmux/plugins/vim-tmux-navigator/dot_git/logs/refs/heads/master
@@ -0,0 +1 @@
+0000000000000000000000000000000000000000 9ca5bfe5bd274051b5dd796cc150348afc993b80 Kasper J. Hermansen 1657609203 +0200 clone: from https://github.com/christoomey/vim-tmux-navigator
diff --git a/dot_tmux/plugins/vim-tmux-navigator/dot_git/logs/refs/remotes/origin/HEAD b/dot_tmux/plugins/vim-tmux-navigator/dot_git/logs/refs/remotes/origin/HEAD
new file mode 100644
index 0000000..f316032
--- /dev/null
+++ b/dot_tmux/plugins/vim-tmux-navigator/dot_git/logs/refs/remotes/origin/HEAD
@@ -0,0 +1 @@
+0000000000000000000000000000000000000000 9ca5bfe5bd274051b5dd796cc150348afc993b80 Kasper J. Hermansen 1657609203 +0200 clone: from https://github.com/christoomey/vim-tmux-navigator
diff --git a/dot_tmux/plugins/vim-tmux-navigator/dot_git/objects/info/.keep b/dot_tmux/plugins/vim-tmux-navigator/dot_git/objects/info/.keep
new file mode 100644
index 0000000..e69de29
diff --git a/dot_tmux/plugins/vim-tmux-navigator/dot_git/objects/pack/readonly_pack-d18103c902c90ca8df5435292ec0cf5b50bd3683.idx b/dot_tmux/plugins/vim-tmux-navigator/dot_git/objects/pack/readonly_pack-d18103c902c90ca8df5435292ec0cf5b50bd3683.idx
new file mode 100644
index 0000000..fcd3a2d
Binary files /dev/null and b/dot_tmux/plugins/vim-tmux-navigator/dot_git/objects/pack/readonly_pack-d18103c902c90ca8df5435292ec0cf5b50bd3683.idx differ
diff --git a/dot_tmux/plugins/vim-tmux-navigator/dot_git/objects/pack/readonly_pack-d18103c902c90ca8df5435292ec0cf5b50bd3683.pack b/dot_tmux/plugins/vim-tmux-navigator/dot_git/objects/pack/readonly_pack-d18103c902c90ca8df5435292ec0cf5b50bd3683.pack
new file mode 100644
index 0000000..daa68b8
Binary files /dev/null and b/dot_tmux/plugins/vim-tmux-navigator/dot_git/objects/pack/readonly_pack-d18103c902c90ca8df5435292ec0cf5b50bd3683.pack differ
diff --git a/dot_tmux/plugins/vim-tmux-navigator/dot_git/packed-refs b/dot_tmux/plugins/vim-tmux-navigator/dot_git/packed-refs
new file mode 100644
index 0000000..4658c3a
--- /dev/null
+++ b/dot_tmux/plugins/vim-tmux-navigator/dot_git/packed-refs
@@ -0,0 +1,2 @@
+# pack-refs with: peeled fully-peeled sorted
+9ca5bfe5bd274051b5dd796cc150348afc993b80 refs/remotes/origin/master
diff --git a/dot_tmux/plugins/vim-tmux-navigator/dot_git/refs/heads/master b/dot_tmux/plugins/vim-tmux-navigator/dot_git/refs/heads/master
new file mode 100644
index 0000000..3edb9f0
--- /dev/null
+++ b/dot_tmux/plugins/vim-tmux-navigator/dot_git/refs/heads/master
@@ -0,0 +1 @@
+9ca5bfe5bd274051b5dd796cc150348afc993b80
diff --git a/dot_tmux/plugins/vim-tmux-navigator/dot_git/refs/remotes/origin/HEAD b/dot_tmux/plugins/vim-tmux-navigator/dot_git/refs/remotes/origin/HEAD
new file mode 100644
index 0000000..6efe28f
--- /dev/null
+++ b/dot_tmux/plugins/vim-tmux-navigator/dot_git/refs/remotes/origin/HEAD
@@ -0,0 +1 @@
+ref: refs/remotes/origin/master
diff --git a/dot_tmux/plugins/vim-tmux-navigator/dot_git/refs/tags/v1.0 b/dot_tmux/plugins/vim-tmux-navigator/dot_git/refs/tags/v1.0
new file mode 100644
index 0000000..75bd634
--- /dev/null
+++ b/dot_tmux/plugins/vim-tmux-navigator/dot_git/refs/tags/v1.0
@@ -0,0 +1 @@
+22734100c02990ff090f3544319620ef3f516dea
diff --git a/dot_tmux/plugins/vim-tmux-navigator/dot_gitignore b/dot_tmux/plugins/vim-tmux-navigator/dot_gitignore
new file mode 100644
index 0000000..926ccaa
--- /dev/null
+++ b/dot_tmux/plugins/vim-tmux-navigator/dot_gitignore
@@ -0,0 +1 @@
+doc/tags
diff --git a/dot_tmux/plugins/vim-tmux-navigator/executable_vim-tmux-navigator.tmux b/dot_tmux/plugins/vim-tmux-navigator/executable_vim-tmux-navigator.tmux
new file mode 100644
index 0000000..0aeac55
--- /dev/null
+++ b/dot_tmux/plugins/vim-tmux-navigator/executable_vim-tmux-navigator.tmux
@@ -0,0 +1,25 @@
+#!/usr/bin/env bash
+
+version_pat='s/^tmux[^0-9]*([.0-9]+).*/\1/p'
+
+is_vim="ps -o state= -o comm= -t '#{pane_tty}' \
+ | grep -iqE '^[^TXZ ]+ +(\\S+\\/)?g?(view|n?vim?x?)(diff)?$'"
+tmux bind-key -n C-h if-shell "$is_vim" "send-keys C-h" "select-pane -L"
+tmux bind-key -n C-j if-shell "$is_vim" "send-keys C-j" "select-pane -D"
+tmux bind-key -n C-k if-shell "$is_vim" "send-keys C-k" "select-pane -U"
+tmux bind-key -n C-l if-shell "$is_vim" "send-keys C-l" "select-pane -R"
+tmux_version="$(tmux -V | sed -En "$version_pat")"
+tmux setenv -g tmux_version "$tmux_version"
+
+#echo "{'version' : '${tmux_version}', 'sed_pat' : '${version_pat}' }" > ~/.tmux_version.json
+
+tmux if-shell -b '[ "$(echo "$tmux_version < 3.0" | bc)" = 1 ]' \
+ "bind-key -n 'C-\\' if-shell \"$is_vim\" 'send-keys C-\\' 'select-pane -l'"
+tmux if-shell -b '[ "$(echo "$tmux_version >= 3.0" | bc)" = 1 ]' \
+ "bind-key -n 'C-\\' if-shell \"$is_vim\" 'send-keys C-\\\\' 'select-pane -l'"
+
+tmux bind-key -T copy-mode-vi C-h select-pane -L
+tmux bind-key -T copy-mode-vi C-j select-pane -D
+tmux bind-key -T copy-mode-vi C-k select-pane -U
+tmux bind-key -T copy-mode-vi C-l select-pane -R
+tmux bind-key -T copy-mode-vi C-\\ select-pane -l
diff --git a/dot_tmux/plugins/vim-tmux-navigator/pattern-check b/dot_tmux/plugins/vim-tmux-navigator/pattern-check
new file mode 100644
index 0000000..c5ecbb6
--- /dev/null
+++ b/dot_tmux/plugins/vim-tmux-navigator/pattern-check
@@ -0,0 +1,42 @@
+#!/usr/bin/env bash
+#
+# Collection of various test strings that could be the output of the tmux
+# 'pane_current_comamnd' message. Included as regression test for updates to
+# the inline grep pattern used in the `.tmux.conf` configuration
+
+set -e
+
+RED=$(tput setaf 1)
+GREEN=$(tput setaf 2)
+YELLOW=$(tput setaf 3)
+NORMAL=$(tput sgr0)
+
+vim_pattern='(^|\/)g?(view|n?vim?x?)(diff)?$'
+match_tests=(vim Vim VIM vimdiff /usr/local/bin/vim vi gvim view gview nvim vimx)
+no_match_tests=( /Users/christoomey/.vim/thing /usr/local/bin/start-vim )
+
+display_matches() {
+ for process_name in "$@"; do
+ printf "%s %s\n" "$(matches_vim_pattern $process_name)" "$process_name"
+ done
+}
+
+matches_vim_pattern() {
+ if echo "$1" | grep -iqE "$vim_pattern"; then
+ echo "${GREEN}match${NORMAL}"
+ else
+ echo "${RED}fail${NORMAL}"
+ fi
+}
+
+main() {
+ echo "Testing against pattern: ${YELLOW}$vim_pattern${NORMAL}\n"
+
+ echo "These should all ${GREEN}match${NORMAL}\n----------------------"
+ display_matches "${match_tests[@]}"
+
+ echo "\nThese should all ${RED}fail${NORMAL}\n---------------------"
+ display_matches "${no_match_tests[@]}"
+}
+
+main
diff --git a/dot_tmux/plugins/vim-tmux-navigator/plugin/tmux_navigator.vim b/dot_tmux/plugins/vim-tmux-navigator/plugin/tmux_navigator.vim
new file mode 100644
index 0000000..45a8f7f
--- /dev/null
+++ b/dot_tmux/plugins/vim-tmux-navigator/plugin/tmux_navigator.vim
@@ -0,0 +1,131 @@
+" Maps to switch vim splits in the given direction. If there are
+" no more windows in that direction, forwards the operation to tmux.
+" Additionally, toggles between last active vim splits/tmux panes.
+
+if exists("g:loaded_tmux_navigator") || &cp || v:version < 700
+ finish
+endif
+let g:loaded_tmux_navigator = 1
+
+function! s:VimNavigate(direction)
+ try
+ execute 'wincmd ' . a:direction
+ catch
+ echohl ErrorMsg | echo 'E11: Invalid in command-line window; executes, CTRL-C quits: wincmd k' | echohl None
+ endtry
+endfunction
+
+if !get(g:, 'tmux_navigator_no_mappings', 0)
+ nnoremap :TmuxNavigateLeft
+ nnoremap :TmuxNavigateDown
+ nnoremap :TmuxNavigateUp
+ nnoremap :TmuxNavigateRight
+ nnoremap :TmuxNavigatePrevious
+endif
+
+if empty($TMUX)
+ command! TmuxNavigateLeft call s:VimNavigate('h')
+ command! TmuxNavigateDown call s:VimNavigate('j')
+ command! TmuxNavigateUp call s:VimNavigate('k')
+ command! TmuxNavigateRight call s:VimNavigate('l')
+ command! TmuxNavigatePrevious call s:VimNavigate('p')
+ finish
+endif
+
+command! TmuxNavigateLeft call s:TmuxAwareNavigate('h')
+command! TmuxNavigateDown call s:TmuxAwareNavigate('j')
+command! TmuxNavigateUp call s:TmuxAwareNavigate('k')
+command! TmuxNavigateRight call s:TmuxAwareNavigate('l')
+command! TmuxNavigatePrevious call s:TmuxAwareNavigate('p')
+
+if !exists("g:tmux_navigator_save_on_switch")
+ let g:tmux_navigator_save_on_switch = 0
+endif
+
+if !exists("g:tmux_navigator_disable_when_zoomed")
+ let g:tmux_navigator_disable_when_zoomed = 0
+endif
+
+if !exists("g:tmux_navigator_preserve_zoom")
+ let g:tmux_navigator_preserve_zoom = 0
+endif
+
+function! s:TmuxOrTmateExecutable()
+ return (match($TMUX, 'tmate') != -1 ? 'tmate' : 'tmux')
+endfunction
+
+function! s:TmuxVimPaneIsZoomed()
+ return s:TmuxCommand("display-message -p '#{window_zoomed_flag}'") == 1
+endfunction
+
+function! s:TmuxSocket()
+ " The socket path is the first value in the comma-separated list of $TMUX.
+ return split($TMUX, ',')[0]
+endfunction
+
+function! s:TmuxCommand(args)
+ let cmd = s:TmuxOrTmateExecutable() . ' -S ' . s:TmuxSocket() . ' ' . a:args
+ let l:x=&shellcmdflag
+ let &shellcmdflag='-c'
+ let retval=system(cmd)
+ let &shellcmdflag=l:x
+ return retval
+endfunction
+
+function! s:TmuxNavigatorProcessList()
+ echo s:TmuxCommand("run-shell 'ps -o state= -o comm= -t ''''#{pane_tty}'''''")
+endfunction
+command! TmuxNavigatorProcessList call s:TmuxNavigatorProcessList()
+
+let s:tmux_is_last_pane = 0
+augroup tmux_navigator
+ au!
+ autocmd WinEnter * let s:tmux_is_last_pane = 0
+augroup END
+
+function! s:NeedsVitalityRedraw()
+ return exists('g:loaded_vitality') && v:version < 704 && !has("patch481")
+endfunction
+
+function! s:ShouldForwardNavigationBackToTmux(tmux_last_pane, at_tab_page_edge)
+ if g:tmux_navigator_disable_when_zoomed && s:TmuxVimPaneIsZoomed()
+ return 0
+ endif
+ return a:tmux_last_pane || a:at_tab_page_edge
+endfunction
+
+function! s:TmuxAwareNavigate(direction)
+ let nr = winnr()
+ let tmux_last_pane = (a:direction == 'p' && s:tmux_is_last_pane)
+ if !tmux_last_pane
+ call s:VimNavigate(a:direction)
+ endif
+ let at_tab_page_edge = (nr == winnr())
+ " Forward the switch panes command to tmux if:
+ " a) we're toggling between the last tmux pane;
+ " b) we tried switching windows in vim but it didn't have effect.
+ if s:ShouldForwardNavigationBackToTmux(tmux_last_pane, at_tab_page_edge)
+ if g:tmux_navigator_save_on_switch == 1
+ try
+ update " save the active buffer. See :help update
+ catch /^Vim\%((\a\+)\)\=:E32/ " catches the no file name error
+ endtry
+ elseif g:tmux_navigator_save_on_switch == 2
+ try
+ wall " save all the buffers. See :help wall
+ catch /^Vim\%((\a\+)\)\=:E141/ " catches the no file name error
+ endtry
+ endif
+ let args = 'select-pane -t ' . shellescape($TMUX_PANE) . ' -' . tr(a:direction, 'phjkl', 'lLDUR')
+ if g:tmux_navigator_preserve_zoom == 1
+ let l:args .= ' -Z'
+ endif
+ silent call s:TmuxCommand(args)
+ if s:NeedsVitalityRedraw()
+ redraw!
+ endif
+ let s:tmux_is_last_pane = 1
+ else
+ let s:tmux_is_last_pane = 0
+ endif
+endfunction
diff --git a/revive.toml b/revive.toml
new file mode 100644
index 0000000..da3e14a
--- /dev/null
+++ b/revive.toml
@@ -0,0 +1,4 @@
+[rule.package-comments]
+Disabled = true
+[rule.exported]
+Disabled = true
]