From 3b5aebcd939170b971a1d8f44ada597c693658ea Mon Sep 17 00:00:00 2001 From: Hydroxycarbamide Date: Mon, 23 Sep 2024 13:14:08 +0200 Subject: [PATCH] tmux: move plugins to config --- .../tmux/plugins/tmux-navigate/README.md | 81 +++++ .../tmux/plugins/tmux-navigate/VERSION.md | 43 +++ .../tmux/plugins/tmux-navigate/dot_git/HEAD | 1 + .../tmux-navigate/dot_git/branches/.keep | 0 .../tmux/plugins/tmux-navigate/dot_git/config | 13 + .../plugins/tmux-navigate/dot_git/description | 1 + .../hooks/executable_applypatch-msg.sample | 15 + .../hooks/executable_commit-msg.sample | 24 ++ .../executable_fsmonitor-watchman.sample | 174 ++++++++++ .../hooks/executable_post-update.sample | 8 + .../hooks/executable_pre-applypatch.sample | 14 + .../hooks/executable_pre-commit.sample | 49 +++ .../hooks/executable_pre-merge-commit.sample | 13 + .../dot_git/hooks/executable_pre-push.sample | 53 +++ .../hooks/executable_pre-rebase.sample | 169 +++++++++ .../hooks/executable_pre-receive.sample | 24 ++ .../executable_prepare-commit-msg.sample | 42 +++ .../hooks/executable_push-to-checkout.sample | 78 +++++ .../executable_sendemail-validate.sample | 77 +++++ .../dot_git/hooks/executable_update.sample | 128 +++++++ .../tmux/plugins/tmux-navigate/dot_git/index | Bin 0 -> 424 bytes .../tmux-navigate/dot_git/info/exclude | 6 + .../plugins/tmux-navigate/dot_git/logs/HEAD | 1 + .../dot_git/logs/refs/heads/master | 1 + .../dot_git/logs/refs/remotes/origin/HEAD | 1 + .../tmux-navigate/dot_git/objects/info/.keep | 0 ...a3fbb7296989b1dca05181b524bc410681c9bc.idx | Bin 0 -> 3144 bytes ...3fbb7296989b1dca05181b524bc410681c9bc.pack | Bin 0 -> 14353 bytes ...a3fbb7296989b1dca05181b524bc410681c9bc.rev | Bin 0 -> 348 bytes .../plugins/tmux-navigate/dot_git/packed-refs | 2 + .../tmux-navigate/dot_git/refs/heads/master | 1 + .../dot_git/refs/remotes/origin/HEAD | 1 + .../tmux-navigate/dot_git/refs/tags/0.1.0 | 1 + .../tmux-navigate/dot_git/refs/tags/0.1.1 | 1 + .../tmux-navigate/dot_git/refs/tags/0.2.0 | 1 + .../executable_tmux-navigate.tmux | 112 ++++++ .../tmux-navigate/plugin/tmux-navigate.vim | 30 ++ .../plugins/tmux-session-wizard/Dockerfile | 34 ++ .../plugins/tmux-session-wizard/LICENCE.md | 21 ++ .../plugins/tmux-session-wizard/README.md | 156 +++++++++ .../tmux-session-wizard/bin/executable_t | 89 +++++ .../plugins/tmux-session-wizard/dot_git/HEAD | 1 + .../dot_git/branches/.keep | 0 .../tmux-session-wizard/dot_git/config | 13 + .../tmux-session-wizard/dot_git/description | 1 + .../hooks/executable_applypatch-msg.sample | 15 + .../hooks/executable_commit-msg.sample | 24 ++ .../executable_fsmonitor-watchman.sample | 174 ++++++++++ .../hooks/executable_post-update.sample | 8 + .../hooks/executable_pre-applypatch.sample | 14 + .../hooks/executable_pre-commit.sample | 49 +++ .../hooks/executable_pre-merge-commit.sample | 13 + .../dot_git/hooks/executable_pre-push.sample | 53 +++ .../hooks/executable_pre-rebase.sample | 169 +++++++++ .../hooks/executable_pre-receive.sample | 24 ++ .../executable_prepare-commit-msg.sample | 42 +++ .../hooks/executable_push-to-checkout.sample | 78 +++++ .../executable_sendemail-validate.sample | 77 +++++ .../dot_git/hooks/executable_update.sample | 128 +++++++ .../plugins/tmux-session-wizard/dot_git/index | Bin 0 -> 1064 bytes .../tmux-session-wizard/dot_git/info/exclude | 6 + .../tmux-session-wizard/dot_git/logs/HEAD | 1 + .../dot_git/logs/refs/heads/main | 1 + .../dot_git/logs/refs/remotes/origin/HEAD | 1 + .../dot_git/objects/info/.keep | 0 ...4505d27f37d8283943b7c667d2f9397d849dd5.idx | Bin 0 -> 7568 bytes ...505d27f37d8283943b7c667d2f9397d849dd5.pack | Bin 0 -> 54836 bytes ...4505d27f37d8283943b7c667d2f9397d849dd5.rev | Bin 0 -> 980 bytes .../tmux-session-wizard/dot_git/packed-refs | 2 + .../dot_git/refs/heads/main | 1 + .../dot_git/refs/remotes/origin/HEAD | 1 + .../dot_git/refs/tags/V1.0.0 | 1 + .../dot_git/refs/tags/V1.1.0 | 1 + .../dot_git/refs/tags/V1.2.0 | 1 + .../dot_git/refs/tags/V1.3.0 | 1 + .../dot_git/refs/tags/V1.3.1 | 1 + .../dot_git/refs/tags/V1.4.0 | 1 + .../dot_git/refs/tags/v1.0.0 | 1 + .../plugins/tmux-session-wizard/dot_gitignore | 7 + .../executable_session-wizard.tmux | 30 ++ .../plugins/tmux-session-wizard/flake.lock | 61 ++++ .../plugins/tmux-session-wizard/flake.nix | 48 +++ .../scripts/executable_run-tests.sh | 55 +++ .../tmux-session-wizard/src/helpers.sh | 46 +++ .../tmux-session-wizard/tests/helpers.bats | 51 +++ dot_config/tmux/plugins/tmux-tilish/LICENSE | 21 ++ dot_config/tmux/plugins/tmux-tilish/README.md | 327 ++++++++++++++++++ .../tmux/plugins/tmux-tilish/dot_git/HEAD | 1 + .../tmux-tilish/dot_git/branches/.keep | 0 .../tmux/plugins/tmux-tilish/dot_git/config | 13 + .../plugins/tmux-tilish/dot_git/description | 1 + .../hooks/executable_applypatch-msg.sample | 15 + .../hooks/executable_commit-msg.sample | 24 ++ .../executable_fsmonitor-watchman.sample | 174 ++++++++++ .../hooks/executable_post-update.sample | 8 + .../hooks/executable_pre-applypatch.sample | 14 + .../hooks/executable_pre-commit.sample | 49 +++ .../hooks/executable_pre-merge-commit.sample | 13 + .../dot_git/hooks/executable_pre-push.sample | 53 +++ .../hooks/executable_pre-rebase.sample | 169 +++++++++ .../hooks/executable_pre-receive.sample | 24 ++ .../executable_prepare-commit-msg.sample | 42 +++ .../hooks/executable_push-to-checkout.sample | 78 +++++ .../executable_sendemail-validate.sample | 77 +++++ .../dot_git/hooks/executable_update.sample | 128 +++++++ .../tmux/plugins/tmux-tilish/dot_git/index | Bin 0 -> 289 bytes .../plugins/tmux-tilish/dot_git/info/exclude | 6 + .../plugins/tmux-tilish/dot_git/logs/HEAD | 1 + .../dot_git/logs/refs/heads/master | 1 + .../dot_git/logs/refs/remotes/origin/HEAD | 1 + .../tmux-tilish/dot_git/objects/info/.keep | 0 ...5e83563d291f0d2f14eb0476297fbe3cdcf7e4.idx | Bin 0 -> 10004 bytes ...e83563d291f0d2f14eb0476297fbe3cdcf7e4.pack | Bin 0 -> 81932 bytes ...5e83563d291f0d2f14eb0476297fbe3cdcf7e4.rev | Bin 0 -> 1328 bytes .../plugins/tmux-tilish/dot_git/packed-refs | 2 + .../tmux-tilish/dot_git/refs/heads/master | 1 + .../dot_git/refs/remotes/origin/HEAD | 1 + .../tmux-tilish/dot_git/refs/tags/.keep | 0 .../tmux-tilish/executable_tilish.tmux | 294 ++++++++++++++++ .../tmux/plugins/tpm/dot_git/FETCH_HEAD | 1 + dot_config/tmux/plugins/tpm/dot_git/ORIG_HEAD | 1 + dot_config/tmux/tmux.conf | 6 +- 122 files changed, 4210 insertions(+), 2 deletions(-) create mode 100644 dot_config/tmux/plugins/tmux-navigate/README.md create mode 100644 dot_config/tmux/plugins/tmux-navigate/VERSION.md create mode 100644 dot_config/tmux/plugins/tmux-navigate/dot_git/HEAD create mode 100644 dot_config/tmux/plugins/tmux-navigate/dot_git/branches/.keep create mode 100644 dot_config/tmux/plugins/tmux-navigate/dot_git/config create mode 100644 dot_config/tmux/plugins/tmux-navigate/dot_git/description create mode 100644 dot_config/tmux/plugins/tmux-navigate/dot_git/hooks/executable_applypatch-msg.sample create mode 100644 dot_config/tmux/plugins/tmux-navigate/dot_git/hooks/executable_commit-msg.sample create mode 100644 dot_config/tmux/plugins/tmux-navigate/dot_git/hooks/executable_fsmonitor-watchman.sample create mode 100644 dot_config/tmux/plugins/tmux-navigate/dot_git/hooks/executable_post-update.sample create mode 100644 dot_config/tmux/plugins/tmux-navigate/dot_git/hooks/executable_pre-applypatch.sample create mode 100644 dot_config/tmux/plugins/tmux-navigate/dot_git/hooks/executable_pre-commit.sample create mode 100644 dot_config/tmux/plugins/tmux-navigate/dot_git/hooks/executable_pre-merge-commit.sample create mode 100644 dot_config/tmux/plugins/tmux-navigate/dot_git/hooks/executable_pre-push.sample create mode 100644 dot_config/tmux/plugins/tmux-navigate/dot_git/hooks/executable_pre-rebase.sample create mode 100644 dot_config/tmux/plugins/tmux-navigate/dot_git/hooks/executable_pre-receive.sample create mode 100644 dot_config/tmux/plugins/tmux-navigate/dot_git/hooks/executable_prepare-commit-msg.sample create mode 100644 dot_config/tmux/plugins/tmux-navigate/dot_git/hooks/executable_push-to-checkout.sample create mode 100644 dot_config/tmux/plugins/tmux-navigate/dot_git/hooks/executable_sendemail-validate.sample create mode 100644 dot_config/tmux/plugins/tmux-navigate/dot_git/hooks/executable_update.sample create mode 100644 dot_config/tmux/plugins/tmux-navigate/dot_git/index create mode 100644 dot_config/tmux/plugins/tmux-navigate/dot_git/info/exclude create mode 100644 dot_config/tmux/plugins/tmux-navigate/dot_git/logs/HEAD create mode 100644 dot_config/tmux/plugins/tmux-navigate/dot_git/logs/refs/heads/master create mode 100644 dot_config/tmux/plugins/tmux-navigate/dot_git/logs/refs/remotes/origin/HEAD create mode 100644 dot_config/tmux/plugins/tmux-navigate/dot_git/objects/info/.keep create mode 100644 dot_config/tmux/plugins/tmux-navigate/dot_git/objects/pack/readonly_pack-a5a3fbb7296989b1dca05181b524bc410681c9bc.idx create mode 100644 dot_config/tmux/plugins/tmux-navigate/dot_git/objects/pack/readonly_pack-a5a3fbb7296989b1dca05181b524bc410681c9bc.pack create mode 100644 dot_config/tmux/plugins/tmux-navigate/dot_git/objects/pack/readonly_pack-a5a3fbb7296989b1dca05181b524bc410681c9bc.rev create mode 100644 dot_config/tmux/plugins/tmux-navigate/dot_git/packed-refs create mode 100644 dot_config/tmux/plugins/tmux-navigate/dot_git/refs/heads/master create mode 100644 dot_config/tmux/plugins/tmux-navigate/dot_git/refs/remotes/origin/HEAD create mode 100644 dot_config/tmux/plugins/tmux-navigate/dot_git/refs/tags/0.1.0 create mode 100644 dot_config/tmux/plugins/tmux-navigate/dot_git/refs/tags/0.1.1 create mode 100644 dot_config/tmux/plugins/tmux-navigate/dot_git/refs/tags/0.2.0 create mode 100644 dot_config/tmux/plugins/tmux-navigate/executable_tmux-navigate.tmux create mode 100644 dot_config/tmux/plugins/tmux-navigate/plugin/tmux-navigate.vim create mode 100644 dot_config/tmux/plugins/tmux-session-wizard/Dockerfile create mode 100644 dot_config/tmux/plugins/tmux-session-wizard/LICENCE.md create mode 100644 dot_config/tmux/plugins/tmux-session-wizard/README.md create mode 100644 dot_config/tmux/plugins/tmux-session-wizard/bin/executable_t create mode 100644 dot_config/tmux/plugins/tmux-session-wizard/dot_git/HEAD create mode 100644 dot_config/tmux/plugins/tmux-session-wizard/dot_git/branches/.keep create mode 100644 dot_config/tmux/plugins/tmux-session-wizard/dot_git/config create mode 100644 dot_config/tmux/plugins/tmux-session-wizard/dot_git/description create mode 100644 dot_config/tmux/plugins/tmux-session-wizard/dot_git/hooks/executable_applypatch-msg.sample create mode 100644 dot_config/tmux/plugins/tmux-session-wizard/dot_git/hooks/executable_commit-msg.sample create mode 100644 dot_config/tmux/plugins/tmux-session-wizard/dot_git/hooks/executable_fsmonitor-watchman.sample create mode 100644 dot_config/tmux/plugins/tmux-session-wizard/dot_git/hooks/executable_post-update.sample create mode 100644 dot_config/tmux/plugins/tmux-session-wizard/dot_git/hooks/executable_pre-applypatch.sample create mode 100644 dot_config/tmux/plugins/tmux-session-wizard/dot_git/hooks/executable_pre-commit.sample create mode 100644 dot_config/tmux/plugins/tmux-session-wizard/dot_git/hooks/executable_pre-merge-commit.sample create mode 100644 dot_config/tmux/plugins/tmux-session-wizard/dot_git/hooks/executable_pre-push.sample create mode 100644 dot_config/tmux/plugins/tmux-session-wizard/dot_git/hooks/executable_pre-rebase.sample create mode 100644 dot_config/tmux/plugins/tmux-session-wizard/dot_git/hooks/executable_pre-receive.sample create mode 100644 dot_config/tmux/plugins/tmux-session-wizard/dot_git/hooks/executable_prepare-commit-msg.sample create mode 100644 dot_config/tmux/plugins/tmux-session-wizard/dot_git/hooks/executable_push-to-checkout.sample create mode 100644 dot_config/tmux/plugins/tmux-session-wizard/dot_git/hooks/executable_sendemail-validate.sample create mode 100644 dot_config/tmux/plugins/tmux-session-wizard/dot_git/hooks/executable_update.sample create mode 100644 dot_config/tmux/plugins/tmux-session-wizard/dot_git/index create mode 100644 dot_config/tmux/plugins/tmux-session-wizard/dot_git/info/exclude create mode 100644 dot_config/tmux/plugins/tmux-session-wizard/dot_git/logs/HEAD create mode 100644 dot_config/tmux/plugins/tmux-session-wizard/dot_git/logs/refs/heads/main create mode 100644 dot_config/tmux/plugins/tmux-session-wizard/dot_git/logs/refs/remotes/origin/HEAD create mode 100644 dot_config/tmux/plugins/tmux-session-wizard/dot_git/objects/info/.keep create mode 100644 dot_config/tmux/plugins/tmux-session-wizard/dot_git/objects/pack/readonly_pack-3a4505d27f37d8283943b7c667d2f9397d849dd5.idx create mode 100644 dot_config/tmux/plugins/tmux-session-wizard/dot_git/objects/pack/readonly_pack-3a4505d27f37d8283943b7c667d2f9397d849dd5.pack create mode 100644 dot_config/tmux/plugins/tmux-session-wizard/dot_git/objects/pack/readonly_pack-3a4505d27f37d8283943b7c667d2f9397d849dd5.rev create mode 100644 dot_config/tmux/plugins/tmux-session-wizard/dot_git/packed-refs create mode 100644 dot_config/tmux/plugins/tmux-session-wizard/dot_git/refs/heads/main create mode 100644 dot_config/tmux/plugins/tmux-session-wizard/dot_git/refs/remotes/origin/HEAD create mode 100644 dot_config/tmux/plugins/tmux-session-wizard/dot_git/refs/tags/V1.0.0 create mode 100644 dot_config/tmux/plugins/tmux-session-wizard/dot_git/refs/tags/V1.1.0 create mode 100644 dot_config/tmux/plugins/tmux-session-wizard/dot_git/refs/tags/V1.2.0 create mode 100644 dot_config/tmux/plugins/tmux-session-wizard/dot_git/refs/tags/V1.3.0 create mode 100644 dot_config/tmux/plugins/tmux-session-wizard/dot_git/refs/tags/V1.3.1 create mode 100644 dot_config/tmux/plugins/tmux-session-wizard/dot_git/refs/tags/V1.4.0 create mode 100644 dot_config/tmux/plugins/tmux-session-wizard/dot_git/refs/tags/v1.0.0 create mode 100644 dot_config/tmux/plugins/tmux-session-wizard/dot_gitignore create mode 100644 dot_config/tmux/plugins/tmux-session-wizard/executable_session-wizard.tmux create mode 100644 dot_config/tmux/plugins/tmux-session-wizard/flake.lock create mode 100644 dot_config/tmux/plugins/tmux-session-wizard/flake.nix create mode 100644 dot_config/tmux/plugins/tmux-session-wizard/scripts/executable_run-tests.sh create mode 100644 dot_config/tmux/plugins/tmux-session-wizard/src/helpers.sh create mode 100644 dot_config/tmux/plugins/tmux-session-wizard/tests/helpers.bats create mode 100644 dot_config/tmux/plugins/tmux-tilish/LICENSE create mode 100644 dot_config/tmux/plugins/tmux-tilish/README.md create mode 100644 dot_config/tmux/plugins/tmux-tilish/dot_git/HEAD create mode 100644 dot_config/tmux/plugins/tmux-tilish/dot_git/branches/.keep create mode 100644 dot_config/tmux/plugins/tmux-tilish/dot_git/config create mode 100644 dot_config/tmux/plugins/tmux-tilish/dot_git/description create mode 100644 dot_config/tmux/plugins/tmux-tilish/dot_git/hooks/executable_applypatch-msg.sample create mode 100644 dot_config/tmux/plugins/tmux-tilish/dot_git/hooks/executable_commit-msg.sample create mode 100644 dot_config/tmux/plugins/tmux-tilish/dot_git/hooks/executable_fsmonitor-watchman.sample create mode 100644 dot_config/tmux/plugins/tmux-tilish/dot_git/hooks/executable_post-update.sample create mode 100644 dot_config/tmux/plugins/tmux-tilish/dot_git/hooks/executable_pre-applypatch.sample create mode 100644 dot_config/tmux/plugins/tmux-tilish/dot_git/hooks/executable_pre-commit.sample create mode 100644 dot_config/tmux/plugins/tmux-tilish/dot_git/hooks/executable_pre-merge-commit.sample create mode 100644 dot_config/tmux/plugins/tmux-tilish/dot_git/hooks/executable_pre-push.sample create mode 100644 dot_config/tmux/plugins/tmux-tilish/dot_git/hooks/executable_pre-rebase.sample create mode 100644 dot_config/tmux/plugins/tmux-tilish/dot_git/hooks/executable_pre-receive.sample create mode 100644 dot_config/tmux/plugins/tmux-tilish/dot_git/hooks/executable_prepare-commit-msg.sample create mode 100644 dot_config/tmux/plugins/tmux-tilish/dot_git/hooks/executable_push-to-checkout.sample create mode 100644 dot_config/tmux/plugins/tmux-tilish/dot_git/hooks/executable_sendemail-validate.sample create mode 100644 dot_config/tmux/plugins/tmux-tilish/dot_git/hooks/executable_update.sample create mode 100644 dot_config/tmux/plugins/tmux-tilish/dot_git/index create mode 100644 dot_config/tmux/plugins/tmux-tilish/dot_git/info/exclude create mode 100644 dot_config/tmux/plugins/tmux-tilish/dot_git/logs/HEAD create mode 100644 dot_config/tmux/plugins/tmux-tilish/dot_git/logs/refs/heads/master create mode 100644 dot_config/tmux/plugins/tmux-tilish/dot_git/logs/refs/remotes/origin/HEAD create mode 100644 dot_config/tmux/plugins/tmux-tilish/dot_git/objects/info/.keep create mode 100644 dot_config/tmux/plugins/tmux-tilish/dot_git/objects/pack/readonly_pack-065e83563d291f0d2f14eb0476297fbe3cdcf7e4.idx create mode 100644 dot_config/tmux/plugins/tmux-tilish/dot_git/objects/pack/readonly_pack-065e83563d291f0d2f14eb0476297fbe3cdcf7e4.pack create mode 100644 dot_config/tmux/plugins/tmux-tilish/dot_git/objects/pack/readonly_pack-065e83563d291f0d2f14eb0476297fbe3cdcf7e4.rev create mode 100644 dot_config/tmux/plugins/tmux-tilish/dot_git/packed-refs create mode 100644 dot_config/tmux/plugins/tmux-tilish/dot_git/refs/heads/master create mode 100644 dot_config/tmux/plugins/tmux-tilish/dot_git/refs/remotes/origin/HEAD create mode 100644 dot_config/tmux/plugins/tmux-tilish/dot_git/refs/tags/.keep create mode 100644 dot_config/tmux/plugins/tmux-tilish/executable_tilish.tmux create mode 100644 dot_config/tmux/plugins/tpm/dot_git/FETCH_HEAD create mode 100644 dot_config/tmux/plugins/tpm/dot_git/ORIG_HEAD diff --git a/dot_config/tmux/plugins/tmux-navigate/README.md b/dot_config/tmux/plugins/tmux-navigate/README.md new file mode 100644 index 0000000..cd02ca0 --- /dev/null +++ b/dot_config/tmux/plugins/tmux-navigate/README.md @@ -0,0 +1,81 @@ +# tmux-navigate + +Intelligently navigate tmux panes and Vim splits using the same keys. +This also supports SSH tunnels where Vim is running on a remote host. + + | inside Vim? | is Zoomed? | Action taken by key binding | + | ----------- | ---------- | --------------------------- | + | No | No | Focus directional tmux pane | + | No | Yes | Nothing: ignore key binding | + | Yes | No | Seamlessly focus Vim / tmux | + | Yes | Yes | Focus directional Vim split | + +See https://sunaku.github.io/tmux-select-pane.html for documentation. + +## Installation + +1. Install the [TPM] framework for tmux. + +[TPM]: https://github.com/tmux-plugins/tpm + +2. Add this line to your `~/.tmux.conf`: +```sh +set -g @plugin 'sunaku/tmux-navigate' +``` + +3. Configure your navigation shortcuts: +```sh +# if you're using QWERTY layout +set -g @navigate-left '-n M-h' +set -g @navigate-down '-n M-j' +set -g @navigate-up '-n M-k' +set -g @navigate-right '-n M-l' +set -g @navigate-back '-n M-\' + +# if you're using DVORAK layout +set -g @navigate-back '-n M-d' +set -g @navigate-left '-n M-h' +set -g @navigate-up '-n M-t' +set -g @navigate-down '-n M-n' +set -g @navigate-right '-n M-s' +``` + +4. Reload your tmux configuration file. + +5. Type prefix+I. + (This makes TPM install the plugin.) + +### Vim integration + +> Option 1: use your favorite Vim plugin manager +```vim +Plug 'sunaku/tmux-navigate' +``` + +> Option 2: symlink from your tmux plugins clone +```sh +mkdir -p ~/.vim/plugin/ +ln -s ~/.tmux/plugins/tmux-navigate/plugin/tmux-navigate.vim ~/.vim/plugin/ +``` + +## License + +[Spare A Life]: https://sunaku.github.io/vegan-for-life.html +> Like my work? 👍 Please [spare a life] today as thanks! 🐄🐖🐑🐔🐣🐟✨🙊✌ +> Why? For 💕 ethics, the 🌎 environment, and 💪 health; see link above. 🙇 + +(the ISC license) + +Copyright 2018 Suraj N. Kurapati + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/dot_config/tmux/plugins/tmux-navigate/VERSION.md b/dot_config/tmux/plugins/tmux-navigate/VERSION.md new file mode 100644 index 0000000..b6d4479 --- /dev/null +++ b/dot_config/tmux/plugins/tmux-navigate/VERSION.md @@ -0,0 +1,43 @@ +## Version 0.2.0 (2020-07-10) + +Minor: + + * Removed `@navigate-timeout` configuration setting. + + I have implemented proper edge detection (no more timeouts!) in the Vim + portion of this plugin by reporting navigable directions in Vim's title. + +Other: + + * Moved tmux navigation logic out of string literal. + + * Added documentation comments; improved formatting. + +## Version 0.1.1 (2020-05-06) + +Patch: + + * README: Vim integration required for local control. + + Since we rely on pane title changes to check whether Vim navigation was + successful, the included Vim plugin is also necessary for local control + (it's not only for remote control, where we connect to Vim through SSH). + + * GH-1: don't send BSpace upon Vim misidentification. + + For example, Vim 7.2 sets the pane title to "Thanks for flying Vim" and + doesn't bother to clean up after itself upon termination. As a result, + the old navigation logic would still see "Thanks for flying Vim" as the + title and think that Vim was still running: therefore misidentification. + +## Version 0.1.0 (2020-04-25) + +Minor: + + * Release [blog snippet] as a proper [TPM] plugin: `tmux-navigate`. + + Thanks to @bradleyharden for contributing a working example of TPM + plugin conversion and giving me the opportunity to host this repo. + +[TPM]: https://github.com/tmux-plugins/tpm +[blog snippet]: https://sunaku.github.io/tmux-select-pane.html diff --git a/dot_config/tmux/plugins/tmux-navigate/dot_git/HEAD b/dot_config/tmux/plugins/tmux-navigate/dot_git/HEAD new file mode 100644 index 0000000..cb089cd --- /dev/null +++ b/dot_config/tmux/plugins/tmux-navigate/dot_git/HEAD @@ -0,0 +1 @@ +ref: refs/heads/master diff --git a/dot_config/tmux/plugins/tmux-navigate/dot_git/branches/.keep b/dot_config/tmux/plugins/tmux-navigate/dot_git/branches/.keep new file mode 100644 index 0000000..e69de29 diff --git a/dot_config/tmux/plugins/tmux-navigate/dot_git/config b/dot_config/tmux/plugins/tmux-navigate/dot_git/config new file mode 100644 index 0000000..a44b0fe --- /dev/null +++ b/dot_config/tmux/plugins/tmux-navigate/dot_git/config @@ -0,0 +1,13 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true +[submodule] + active = . +[remote "origin"] + url = https://git::@github.com/sunaku/tmux-navigate + fetch = +refs/heads/master:refs/remotes/origin/master +[branch "master"] + remote = origin + merge = refs/heads/master diff --git a/dot_config/tmux/plugins/tmux-navigate/dot_git/description b/dot_config/tmux/plugins/tmux-navigate/dot_git/description new file mode 100644 index 0000000..498b267 --- /dev/null +++ b/dot_config/tmux/plugins/tmux-navigate/dot_git/description @@ -0,0 +1 @@ +Unnamed repository; edit this file 'description' to name the repository. diff --git a/dot_config/tmux/plugins/tmux-navigate/dot_git/hooks/executable_applypatch-msg.sample b/dot_config/tmux/plugins/tmux-navigate/dot_git/hooks/executable_applypatch-msg.sample new file mode 100644 index 0000000..a5d7b84 --- /dev/null +++ b/dot_config/tmux/plugins/tmux-navigate/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_config/tmux/plugins/tmux-navigate/dot_git/hooks/executable_commit-msg.sample b/dot_config/tmux/plugins/tmux-navigate/dot_git/hooks/executable_commit-msg.sample new file mode 100644 index 0000000..b58d118 --- /dev/null +++ b/dot_config/tmux/plugins/tmux-navigate/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_config/tmux/plugins/tmux-navigate/dot_git/hooks/executable_fsmonitor-watchman.sample b/dot_config/tmux/plugins/tmux-navigate/dot_git/hooks/executable_fsmonitor-watchman.sample new file mode 100644 index 0000000..23e856f --- /dev/null +++ b/dot_config/tmux/plugins/tmux-navigate/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_config/tmux/plugins/tmux-navigate/dot_git/hooks/executable_post-update.sample b/dot_config/tmux/plugins/tmux-navigate/dot_git/hooks/executable_post-update.sample new file mode 100644 index 0000000..ec17ec1 --- /dev/null +++ b/dot_config/tmux/plugins/tmux-navigate/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_config/tmux/plugins/tmux-navigate/dot_git/hooks/executable_pre-applypatch.sample b/dot_config/tmux/plugins/tmux-navigate/dot_git/hooks/executable_pre-applypatch.sample new file mode 100644 index 0000000..4142082 --- /dev/null +++ b/dot_config/tmux/plugins/tmux-navigate/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_config/tmux/plugins/tmux-navigate/dot_git/hooks/executable_pre-commit.sample b/dot_config/tmux/plugins/tmux-navigate/dot_git/hooks/executable_pre-commit.sample new file mode 100644 index 0000000..29ed5ee --- /dev/null +++ b/dot_config/tmux/plugins/tmux-navigate/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-index --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_config/tmux/plugins/tmux-navigate/dot_git/hooks/executable_pre-merge-commit.sample b/dot_config/tmux/plugins/tmux-navigate/dot_git/hooks/executable_pre-merge-commit.sample new file mode 100644 index 0000000..399eab1 --- /dev/null +++ b/dot_config/tmux/plugins/tmux-navigate/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_config/tmux/plugins/tmux-navigate/dot_git/hooks/executable_pre-push.sample b/dot_config/tmux/plugins/tmux-navigate/dot_git/hooks/executable_pre-push.sample new file mode 100644 index 0000000..4ce688d --- /dev/null +++ b/dot_config/tmux/plugins/tmux-navigate/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_config/tmux/plugins/tmux-navigate/dot_git/hooks/executable_pre-rebase.sample b/dot_config/tmux/plugins/tmux-navigate/dot_git/hooks/executable_pre-rebase.sample new file mode 100644 index 0000000..6cbef5c --- /dev/null +++ b/dot_config/tmux/plugins/tmux-navigate/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_config/tmux/plugins/tmux-navigate/dot_git/hooks/executable_pre-receive.sample b/dot_config/tmux/plugins/tmux-navigate/dot_git/hooks/executable_pre-receive.sample new file mode 100644 index 0000000..a1fd29e --- /dev/null +++ b/dot_config/tmux/plugins/tmux-navigate/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_config/tmux/plugins/tmux-navigate/dot_git/hooks/executable_prepare-commit-msg.sample b/dot_config/tmux/plugins/tmux-navigate/dot_git/hooks/executable_prepare-commit-msg.sample new file mode 100644 index 0000000..10fa14c --- /dev/null +++ b/dot_config/tmux/plugins/tmux-navigate/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_config/tmux/plugins/tmux-navigate/dot_git/hooks/executable_push-to-checkout.sample b/dot_config/tmux/plugins/tmux-navigate/dot_git/hooks/executable_push-to-checkout.sample new file mode 100644 index 0000000..af5a0c0 --- /dev/null +++ b/dot_config/tmux/plugins/tmux-navigate/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_config/tmux/plugins/tmux-navigate/dot_git/hooks/executable_update.sample b/dot_config/tmux/plugins/tmux-navigate/dot_git/hooks/executable_update.sample new file mode 100644 index 0000000..c4d426b --- /dev/null +++ b/dot_config/tmux/plugins/tmux-navigate/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_config/tmux/plugins/tmux-navigate/dot_git/index b/dot_config/tmux/plugins/tmux-navigate/dot_git/index new file mode 100644 index 0000000000000000000000000000000000000000..1acea05794f600bd04c1f72583740111e585b8e9 GIT binary patch literal 424 zcmZ?q402{*U|<4bmb8z)p^7utzlYHbjLd8dEt>8O42??|7?@uG@k<5GQQ2ID=drU3^{ja#I*!`e8KGoJdr2SUa~}ai7|mc|7@gvW10v z`8!L~vucVATw$(3!JhtpAcLR)W)6&ons*4*Jm#I;2}_nP{9FH|oMCU7#E(ez?9CkS z7$gdEO4Bp*^hw%b0#;Kw`o&K~)ha{9m$tqnh`ytx 1727090005 +0200 clone: from https://github.com/sunaku/tmux-navigate diff --git a/dot_config/tmux/plugins/tmux-navigate/dot_git/logs/refs/heads/master b/dot_config/tmux/plugins/tmux-navigate/dot_git/logs/refs/heads/master new file mode 100644 index 0000000..4bf2828 --- /dev/null +++ b/dot_config/tmux/plugins/tmux-navigate/dot_git/logs/refs/heads/master @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 27c83cd229bceff55e6318cce7945995623a6106 Hydroxycarbamide 1727090005 +0200 clone: from https://github.com/sunaku/tmux-navigate diff --git a/dot_config/tmux/plugins/tmux-navigate/dot_git/logs/refs/remotes/origin/HEAD b/dot_config/tmux/plugins/tmux-navigate/dot_git/logs/refs/remotes/origin/HEAD new file mode 100644 index 0000000..4bf2828 --- /dev/null +++ b/dot_config/tmux/plugins/tmux-navigate/dot_git/logs/refs/remotes/origin/HEAD @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 27c83cd229bceff55e6318cce7945995623a6106 Hydroxycarbamide 1727090005 +0200 clone: from https://github.com/sunaku/tmux-navigate diff --git a/dot_config/tmux/plugins/tmux-navigate/dot_git/objects/info/.keep b/dot_config/tmux/plugins/tmux-navigate/dot_git/objects/info/.keep new file mode 100644 index 0000000..e69de29 diff --git a/dot_config/tmux/plugins/tmux-navigate/dot_git/objects/pack/readonly_pack-a5a3fbb7296989b1dca05181b524bc410681c9bc.idx b/dot_config/tmux/plugins/tmux-navigate/dot_git/objects/pack/readonly_pack-a5a3fbb7296989b1dca05181b524bc410681c9bc.idx new file mode 100644 index 0000000000000000000000000000000000000000..dcf2b67a05f2bb2c41cca687c6d2972d789ee30e GIT binary patch literal 3144 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 literal 0 HcmV?d00001 diff --git a/dot_config/tmux/plugins/tmux-navigate/dot_git/objects/pack/readonly_pack-a5a3fbb7296989b1dca05181b524bc410681c9bc.rev b/dot_config/tmux/plugins/tmux-navigate/dot_git/objects/pack/readonly_pack-a5a3fbb7296989b1dca05181b524bc410681c9bc.rev new file mode 100644 index 0000000000000000000000000000000000000000..57a2daf427df9656b3980b413694cc5ae347e3d5 GIT binary patch literal 348 zcmYkuw@O0+06@`ai(O;yJ(g$hy(A`+ z91>%LZCWU0m_4$rQbR9`4A4gf6AZG&DCJDE$rOz=(Zw#c)G 2 " +1 for the tabline + let can_go_down = y + h < &lines - &laststatus + let can_go_left = x > 1 + let can_go_right = x + w < &columns + + return + \ (can_go_up ? 'U' : '') . + \ (can_go_down ? 'D' : '') . + \ (can_go_left ? 'L' : '') . + \ (can_go_right ? 'R' : '') +endfunction + +let progname = substitute($VIM, '.*[/\\]', '', '') +set title titlestring=%{progname}\ %f\ #%{TmuxNavigateDirections()} + +" enable support for setting the window title in regular Vim under tmux +if &term =~ '^screen' && !has('nvim') + execute "set t_ts=\e]2; t_fs=\7" +endif diff --git a/dot_config/tmux/plugins/tmux-session-wizard/Dockerfile b/dot_config/tmux/plugins/tmux-session-wizard/Dockerfile new file mode 100644 index 0000000..fa61e3b --- /dev/null +++ b/dot_config/tmux/plugins/tmux-session-wizard/Dockerfile @@ -0,0 +1,34 @@ +# syntax = docker/dockerfile:1.4 +FROM nixos/nix:2.22.0 AS builder + +WORKDIR /tmp/build +RUN mkdir /tmp/nix-store-closure +COPY . . + +RUN \ + --mount=type=cache,target=/nix,from=nixos/nix:2.22.0,source=/nix \ + --mount=type=cache,target=/root/.cache \ + --mount=type=bind,target=/tmp/build \ + < + +One prefix key to rule them all (with [fzf](https://github.com/junegunn/fzf) & [zoxide](https://github.com/ajeetdsouza/zoxide)): + +- Creating a new session from a list of recently accessed directories +- Naming a session after a directory/project +- Switching sessions +- Viewing current or creating new sessions in one popup + +### Elevator Pitch + +Tmux is powerful, yes, but why is creating/switching sessions (arguably its main feature) is so damn hard to do? To create a new session for a project you have to run `tmux new-session -s -c `. What if you're inside tmux? Oh, wait you have to use `-d` followed by `tmux switch-client -t `. Oh, wait again! What if you're outside tmux and you want to attach to an existing session? now you have to run `tmux attach -t ` instead. What if you can't remember whether you have a session for that project or not. Guess what? Now you have to run `tmux has-session -t `. What if your project folder contains characters not accepted by tmux as a session name? What if you want to show a list of existing sessions? You run `tmux list-sessions`. What if you want to create a session for a project you've recently navigated to? What if, what if, what if.... HOW IS THAT BETTER THAN HAVING 20 TERMINAL WINDOWS OPEN? + +What if you could use 1 prefix key to do all of this? Read on! + +### Features + +`prefix + T` (customisable) - displays a pop-up with [fzf](https://github.com/junegunn/fzf) which displays the existing sessions followed by recently accessed directories (using [zoxide](https://github.com/ajeetdsouza/zoxide)). Choose the session or the directory and voila! You're in that session. If the session doesn't exist, it will be created. + +### Required + +You must have [fzf](https://github.com/junegunn/fzf), [zoxide](https://github.com/ajeetdsouza/zoxide) installed and available in your path. + +### Installation with [Tmux Plugin Manager](https://github.com/tmux-plugins/tpm) (recommended) + +Add plugin to the list of TPM plugins in `.tmux.conf`: + +```tmux +set -g @plugin '27medkamal/tmux-session-wizard' +``` + +Hit `prefix + I` to fetch the plugin and source it. That's it! + +### Manual Installation + +Clone the repo: + + git clone https://github.com/27medkamal/tmux-session-wizard ~/clone/path + +Add this line to the bottom of `.tmux.conf`: + +```tmux +run-shell ~/clone/path/tmux-session-wizard.tmux +``` + +Reload TMUX environment with `$ tmux source-file ~/.tmux.conf`, and that's it. + +### Customisation + +You can customise the prefix key by adding this line to your `.tmux.conf`: + +```tmux +set -g @session-wizard 'T' +set -g @session-wizard 'T K' # for multiple key bindings +``` + +You can also customise the height and width of the tmux popup by adding the follwing lines to your `.tmux.conf`: + +```tmux +set -g @session-wizard-height 40 +set -g @session-wizard-width 80 +``` + +To customise the way session names are created, use `@session-wizard-mode` option. Allowed values are: + +- `directory` (default) +- `full-path` +- `short-path` + +```tmux +set -g @session-wizard-mode "full-path" +``` + +By default, `tmux-session-wizard` gives you a list of open sessions (hence the name). An alternative is that it gives you a list of _windows_ to choose from. This can be turned on using the setting `@session-wizard-windows`. Add this line to your `.tmux.conf` to enable this behaviour: + +```tmux +set -g @session-wizard-windows on # default is off +``` + +### (Optional) Using the script outside of tmux + +**Note:** you'll need to check the path of your tpm plugins. It may be `~/.tmux/plugins` or `~/.config/tmux/plugins` depending on where your `tmux.conf` is located. + +
+bash + +Add the following line to `~/.bashrc` + +```sh +# ~/.tmux/plugins +export PATH=$HOME/.tmux/plugins/tmux-session-wizard/bin:$PATH +# ~/.config/tmux/plugins +export PATH=$HOME/.config/tmux/plugins/tmux-session-wizard/bin:$PATH +``` + +
+ +
+zsh + +Add the following line to `~/.zprofile` + +```sh +# ~/.tmux/plugins +export PATH=$HOME/.tmux/plugins/tmux-session-wizard/bin:$PATH +# ~/.config/tmux/plugins +export PATH=$HOME/.config/tmux/plugins/tmux-session-wizard/bin:$PATH +``` + +
+ +
+fish + +Add the following line to `~/.config/fish/config.fish` + +```fish +# ~/.tmux/plugins +fish_add_path $HOME/.tmux/plugins/tmux-session-wizard/bin +# ~/.config/tmux/plugins +fish_add_path $HOME/.config/tmux/plugins/tmux-session-wizard/bin +``` + +
+ +You can then run `t` from anywhere to use the script. + +You can also run `t` with a relative or absolute path to a directory (similar to [zoxide](https://github.com/ajeetdsouza/zoxide)) to create a session for that directory. For example, `t ~/projects/my-project` will create a session named `my-project` and cd into that directory. + +Also, depending on the terminal emulator you use, you can make it always start what that script. + +### Development + +The development environment is built with Nix and Nix's Flakes, if you have it on your system then just run `nix develop` and you are ready to go. Other method is to build the Docker image based on provided Dockerfile: + +```bash +docker build --tag tmux-session-wizard:dev --file ./Dockerfile . +``` + +To run the tests, just run `bats ./tests` for local development environment or `docker run --rm -it -u $(id -u):$(id -g) -v $PWD:$PWD -w $PWD tmux-session-wizard:dev bats ./tests` if you are using Docker. + +There is also the helper script for it _./scripts/run-tests.sh_, run `./scripts/run-tests.sh -h` to get more information about usage. + +### Inspiration + +- ThePrimeagen's [tmux-sessionizer](https://github.com/ThePrimeagen/.dotfiles/blob/master/bin/.local/scripts/tmux-sessionizer) +- Josh Medeski's [t-smart-tmux-session-manager](https://github.com/joshmedeski/t-smart-tmux-session-manager) + +### License + +[MIT](LICENCE.md) diff --git a/dot_config/tmux/plugins/tmux-session-wizard/bin/executable_t b/dot_config/tmux/plugins/tmux-session-wizard/bin/executable_t new file mode 100644 index 0000000..683c464 --- /dev/null +++ b/dot_config/tmux/plugins/tmux-session-wizard/bin/executable_t @@ -0,0 +1,89 @@ +#!/bin/bash + +CURRENT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +source "$CURRENT_DIR/../src/helpers.sh" + +# Usage: t +# If no argument is given, a combination of existing sessions and a zoxide query will be displayed in a FZF + +# Parse optional argument +if [ "$*" ]; then + # Argument is given + eval "$(zoxide init bash)" + RESULT=$(z "$*" && pwd) +else + # No argument is given. Use FZF + SELECT_WINDOW=$(get_tmux_option "@session-wizard-windows" "off") + if [ "$SELECT_WINDOW" == "on" ]; then + RESULT=$(tmux list-windows -a -F "#{session_last_attached} #{session_name}: #{window_name}(#{window_index})\ +#{?session_grouped, (group ,}#{session_group}#{?session_grouped,),}#{?session_attached,#{?window_active, (attached),},}") + else + RESULT=$(tmux list-sessions -F "#{session_last_attached} #{session_name}: #{session_windows} window(s)\ +#{?session_grouped, (group ,}#{session_group}#{?session_grouped,),}#{?session_attached, (attached),}") + fi + RESULT=$( ( + echo "$RESULT" | + sort -r | (if [ -n "$TMUX" ]; then grep -v " $(tmux display-message -p '#S'):"; else cat; fi) | cut -d' ' -f2- + zoxide query -l | sed -e "$HOME_REPLACER" + ) | $(__fzfcmd) --reverse --print-query --tiebreak=index | tail -n 1) + if [ -z "$RESULT" ]; then + exit 0 + fi +fi + +# Makes sure tmux is running in order to get all the correct tmux options below. Gets cleaned at the bottom +if ! tmux info &>/dev/null; then + TMP_SESSION_DIR=$(mktemp -d) + TMP_SESSION_NAME=$(session_name --full-path "$TMP_SESSION_DIR") + tmux new-session -d -s "$TMP_SESSION_NAME" -c "$TMP_SESSION_DIR" +fi + +# Get or create session +if [[ $RESULT == *":"* ]]; then + # RESULT comes from list-sessions or list-windows + SESSION=$(echo "$RESULT" | awk '{print $1}') + SESSION=${SESSION//:/} + if [ "$SELECT_WINDOW" == "on" ]; then + WINDOW=$(echo "$RESULT" | awk -F"[()]" '{print $(NF-1)}') + fi +else + # RESULT is a path + + DIR_FULL=$(echo "$RESULT" | sed -e "$TILDE_REPLACER") + DIR_WITH_TILDE=$(echo "$RESULT" | sed -e "$HOME_REPLACER") # in case it came from a direct usage of `t ` + + # Quit if directory does not exists + if [ ! -d "$DIR_FULL" ]; then + exit 0 + fi + + # Promote rank in zoxide. + zoxide add "$DIR_FULL" + + MODE=$(get_tmux_option "@session-wizard-mode" "directory") + SESSION=$(session_name --"$MODE" "$DIR_WITH_TILDE") + + if ! tmux has-session -t="$SESSION" 2>/dev/null; then + tmux new-session -d -s "$SESSION" -c "$DIR_FULL" + fi +fi + +# Clean up tmp session +if [[ -n "$TMP_SESSION_NAME" ]]; then + tmux kill-session -t "$TMP_SESSION_NAME" 2>/dev/null + rm -rf "$TMP_SESSION_DIR" +fi + +# Attach to session +# Escape tilde which if it appears by itself, tmux will interpret as a marked target +# https://github.com/tmux/tmux/blob/master/cmd-find.c#L1024C51-L1024C57 +SESSION=$(echo "$SESSION" | sed 's/^~$/\\~/') +if [ -z "$TMUX" ]; then + tmux attach -t "$SESSION" +else + tmux switch-client -t "$SESSION" +fi + +if [ -n "$WINDOW" ]; then + tmux select-window -t "$SESSION:$WINDOW" +fi diff --git a/dot_config/tmux/plugins/tmux-session-wizard/dot_git/HEAD b/dot_config/tmux/plugins/tmux-session-wizard/dot_git/HEAD new file mode 100644 index 0000000..b870d82 --- /dev/null +++ b/dot_config/tmux/plugins/tmux-session-wizard/dot_git/HEAD @@ -0,0 +1 @@ +ref: refs/heads/main diff --git a/dot_config/tmux/plugins/tmux-session-wizard/dot_git/branches/.keep b/dot_config/tmux/plugins/tmux-session-wizard/dot_git/branches/.keep new file mode 100644 index 0000000..e69de29 diff --git a/dot_config/tmux/plugins/tmux-session-wizard/dot_git/config b/dot_config/tmux/plugins/tmux-session-wizard/dot_git/config new file mode 100644 index 0000000..3adb933 --- /dev/null +++ b/dot_config/tmux/plugins/tmux-session-wizard/dot_git/config @@ -0,0 +1,13 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true +[submodule] + active = . +[remote "origin"] + url = https://git::@github.com/27medkamal/tmux-session-wizard + fetch = +refs/heads/main:refs/remotes/origin/main +[branch "main"] + remote = origin + merge = refs/heads/main diff --git a/dot_config/tmux/plugins/tmux-session-wizard/dot_git/description b/dot_config/tmux/plugins/tmux-session-wizard/dot_git/description new file mode 100644 index 0000000..498b267 --- /dev/null +++ b/dot_config/tmux/plugins/tmux-session-wizard/dot_git/description @@ -0,0 +1 @@ +Unnamed repository; edit this file 'description' to name the repository. diff --git a/dot_config/tmux/plugins/tmux-session-wizard/dot_git/hooks/executable_applypatch-msg.sample b/dot_config/tmux/plugins/tmux-session-wizard/dot_git/hooks/executable_applypatch-msg.sample new file mode 100644 index 0000000..a5d7b84 --- /dev/null +++ b/dot_config/tmux/plugins/tmux-session-wizard/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_config/tmux/plugins/tmux-session-wizard/dot_git/hooks/executable_commit-msg.sample b/dot_config/tmux/plugins/tmux-session-wizard/dot_git/hooks/executable_commit-msg.sample new file mode 100644 index 0000000..b58d118 --- /dev/null +++ b/dot_config/tmux/plugins/tmux-session-wizard/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_config/tmux/plugins/tmux-session-wizard/dot_git/hooks/executable_fsmonitor-watchman.sample b/dot_config/tmux/plugins/tmux-session-wizard/dot_git/hooks/executable_fsmonitor-watchman.sample new file mode 100644 index 0000000..23e856f --- /dev/null +++ b/dot_config/tmux/plugins/tmux-session-wizard/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_config/tmux/plugins/tmux-session-wizard/dot_git/hooks/executable_post-update.sample b/dot_config/tmux/plugins/tmux-session-wizard/dot_git/hooks/executable_post-update.sample new file mode 100644 index 0000000..ec17ec1 --- /dev/null +++ b/dot_config/tmux/plugins/tmux-session-wizard/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_config/tmux/plugins/tmux-session-wizard/dot_git/hooks/executable_pre-applypatch.sample b/dot_config/tmux/plugins/tmux-session-wizard/dot_git/hooks/executable_pre-applypatch.sample new file mode 100644 index 0000000..4142082 --- /dev/null +++ b/dot_config/tmux/plugins/tmux-session-wizard/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_config/tmux/plugins/tmux-session-wizard/dot_git/hooks/executable_pre-commit.sample b/dot_config/tmux/plugins/tmux-session-wizard/dot_git/hooks/executable_pre-commit.sample new file mode 100644 index 0000000..29ed5ee --- /dev/null +++ b/dot_config/tmux/plugins/tmux-session-wizard/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-index --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_config/tmux/plugins/tmux-session-wizard/dot_git/hooks/executable_pre-merge-commit.sample b/dot_config/tmux/plugins/tmux-session-wizard/dot_git/hooks/executable_pre-merge-commit.sample new file mode 100644 index 0000000..399eab1 --- /dev/null +++ b/dot_config/tmux/plugins/tmux-session-wizard/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_config/tmux/plugins/tmux-session-wizard/dot_git/hooks/executable_pre-push.sample b/dot_config/tmux/plugins/tmux-session-wizard/dot_git/hooks/executable_pre-push.sample new file mode 100644 index 0000000..4ce688d --- /dev/null +++ b/dot_config/tmux/plugins/tmux-session-wizard/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_config/tmux/plugins/tmux-session-wizard/dot_git/hooks/executable_pre-rebase.sample b/dot_config/tmux/plugins/tmux-session-wizard/dot_git/hooks/executable_pre-rebase.sample new file mode 100644 index 0000000..6cbef5c --- /dev/null +++ b/dot_config/tmux/plugins/tmux-session-wizard/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_config/tmux/plugins/tmux-session-wizard/dot_git/hooks/executable_pre-receive.sample b/dot_config/tmux/plugins/tmux-session-wizard/dot_git/hooks/executable_pre-receive.sample new file mode 100644 index 0000000..a1fd29e --- /dev/null +++ b/dot_config/tmux/plugins/tmux-session-wizard/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_config/tmux/plugins/tmux-session-wizard/dot_git/hooks/executable_prepare-commit-msg.sample b/dot_config/tmux/plugins/tmux-session-wizard/dot_git/hooks/executable_prepare-commit-msg.sample new file mode 100644 index 0000000..10fa14c --- /dev/null +++ b/dot_config/tmux/plugins/tmux-session-wizard/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_config/tmux/plugins/tmux-session-wizard/dot_git/hooks/executable_push-to-checkout.sample b/dot_config/tmux/plugins/tmux-session-wizard/dot_git/hooks/executable_push-to-checkout.sample new file mode 100644 index 0000000..af5a0c0 --- /dev/null +++ b/dot_config/tmux/plugins/tmux-session-wizard/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_config/tmux/plugins/tmux-session-wizard/dot_git/hooks/executable_update.sample b/dot_config/tmux/plugins/tmux-session-wizard/dot_git/hooks/executable_update.sample new file mode 100644 index 0000000..c4d426b --- /dev/null +++ b/dot_config/tmux/plugins/tmux-session-wizard/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_config/tmux/plugins/tmux-session-wizard/dot_git/index b/dot_config/tmux/plugins/tmux-session-wizard/dot_git/index new file mode 100644 index 0000000000000000000000000000000000000000..5ede7aa672df7678f1f9899bac7d6e75a2f7d219 GIT binary patch literal 1064 zcmZ?q402{*U|<4b?zE4-VVoDsHp6HJMrJmK76%gshQ=if49qWp_$5%CrX4G*n@#&~ zk^g)4ok`inz~s8;*HQ*9z4XkI%=EncqEw(7Fo2l@qoL+4LN$+h`me;tySP%SP5s`i zSzc;w?q}^D*3ZD@lAoNNT9lTVL&&_PsOGWge7`*H%WUIE%3@2V30ZFyDYu@k!_UCw zxCFNgIpb5e8I-S{0F0< z{@e~U=Pe@KxbJ1yxcQp-wQSudk|ut7XX1$ft)S}+tVx-9`X%_nYZt0}SZ@oi-Bn^I zCEihVzb*UMigS0KmZ_vLaHZuWW~b`q07H#{|8}F9*K4&trtJIbK9>ULuz&fRw0E1& zXm4WRgqW9?S-}AF7mSAb?+B{@*m&QV+Mh7G|7KUBi0+G$-YK{H3|Cxa5GhVB$}A`; z)-Ni}(=ACYE-BV4&VaZOW*&@&ntKA(T;|Ik)t(x;{rUYtNzWiw&#d$Mt*!No8H9^d zi;FY!^K{EIs}hS+^h$C|E1({SnFphx=3YnhcVOJH)z^Qsmc4fUI{8Qw!@K+XhHf7j z_=<~?^)pg)3Q~(;E`^x`qoL;AMKzD*_eBTgNcCIw-Ja|PCNrkHiWx09wvj;y>}R-% zNr@%Ju=oiHa&-l=ComWqDwuEuWVH8v`G5Pfu0%C!RFvTPFwr@hz_h_&s9?aw&dJaD z>?^0tdb4Ane;F9AnxoMi2y`b{?vKCVsjJoh^cECwIaTkpUSqv3@d4OQu&k|Sroi{3 zbB&Xigl@iTx#if4Xvyc$7y-*0FTOdeE9U~onz*ti_e(E6zppNDT43_@SLpQ{SEGaY O(wk?lsyN;|g9!izqjzus literal 0 HcmV?d00001 diff --git a/dot_config/tmux/plugins/tmux-session-wizard/dot_git/info/exclude b/dot_config/tmux/plugins/tmux-session-wizard/dot_git/info/exclude new file mode 100644 index 0000000..a5196d1 --- /dev/null +++ b/dot_config/tmux/plugins/tmux-session-wizard/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_config/tmux/plugins/tmux-session-wizard/dot_git/logs/HEAD b/dot_config/tmux/plugins/tmux-session-wizard/dot_git/logs/HEAD new file mode 100644 index 0000000..e7197e1 --- /dev/null +++ b/dot_config/tmux/plugins/tmux-session-wizard/dot_git/logs/HEAD @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 9c6b5dc612e635352a89f86c836b4532d6696e95 Hydroxycarbamide 1727090006 +0200 clone: from https://github.com/27medkamal/tmux-session-wizard diff --git a/dot_config/tmux/plugins/tmux-session-wizard/dot_git/logs/refs/heads/main b/dot_config/tmux/plugins/tmux-session-wizard/dot_git/logs/refs/heads/main new file mode 100644 index 0000000..e7197e1 --- /dev/null +++ b/dot_config/tmux/plugins/tmux-session-wizard/dot_git/logs/refs/heads/main @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 9c6b5dc612e635352a89f86c836b4532d6696e95 Hydroxycarbamide 1727090006 +0200 clone: from https://github.com/27medkamal/tmux-session-wizard diff --git a/dot_config/tmux/plugins/tmux-session-wizard/dot_git/logs/refs/remotes/origin/HEAD b/dot_config/tmux/plugins/tmux-session-wizard/dot_git/logs/refs/remotes/origin/HEAD new file mode 100644 index 0000000..e7197e1 --- /dev/null +++ b/dot_config/tmux/plugins/tmux-session-wizard/dot_git/logs/refs/remotes/origin/HEAD @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 9c6b5dc612e635352a89f86c836b4532d6696e95 Hydroxycarbamide 1727090006 +0200 clone: from https://github.com/27medkamal/tmux-session-wizard diff --git a/dot_config/tmux/plugins/tmux-session-wizard/dot_git/objects/info/.keep b/dot_config/tmux/plugins/tmux-session-wizard/dot_git/objects/info/.keep new file mode 100644 index 0000000..e69de29 diff --git a/dot_config/tmux/plugins/tmux-session-wizard/dot_git/objects/pack/readonly_pack-3a4505d27f37d8283943b7c667d2f9397d849dd5.idx b/dot_config/tmux/plugins/tmux-session-wizard/dot_git/objects/pack/readonly_pack-3a4505d27f37d8283943b7c667d2f9397d849dd5.idx new file mode 100644 index 0000000000000000000000000000000000000000..01dbf2650001e8fd0a7279cff960255018d3f317 GIT binary patch literal 7568 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 EAK`useEEyz_MH2ibxvDt|N9~?qlHF1qrZJb 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%0Duk6lI=xixTntoG7i#Uc** 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
    d{YhBy$CxwW-HYSUKI( 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 literal 0 HcmV?d00001 diff --git a/dot_config/tmux/plugins/tmux-session-wizard/dot_git/objects/pack/readonly_pack-3a4505d27f37d8283943b7c667d2f9397d849dd5.rev b/dot_config/tmux/plugins/tmux-session-wizard/dot_git/objects/pack/readonly_pack-3a4505d27f37d8283943b7c667d2f9397d849dd5.rev new file mode 100644 index 0000000000000000000000000000000000000000..ffc5ed71c05cee0bf342ade2a96f347aa1ba7354 GIT binary patch literal 980 zcmXxg^K%dY00rP>o6Bz5ShicWY#Ym73v1cNvX;HD)3l^NoB981jQyGHbYcWu=*2)^@)1x%zTk@TZ7nYcnxnv;=0s?&%t!kNum7O|MMtYbZQIKden z^P2Zu;vP@wNLR{ml41t}23Q~nfyrBnKS-}!2 zP>2u?Q;wzNXAnm?M?S98i@RLr6_ZHL5Q?*mhfH8P6{*B&2 + exit 1 + ;; + esac +done + +# Basic command to run tests +CMD=(bats "$PROJECT_ROOT/tests") + +# Run tests in watch mode +if [ "$WATCH" = true ]; then + CMD=(watchexec "${CMD[@]}") +fi + +# Run tests inside a container +if [ "$CONTAINER" = true ] || [ "$REBUILD" = true ]; then + CMD=(docker run --rm -it --user "$(id -u):$(id -g)" -v "$PROJECT_ROOT:$PROJECT_ROOT" -w "$PROJECT_ROOT" "$IMAGE" "${CMD[@]}") + IS_IMAGE_EXISTS=$(docker images -q ${IMAGE}) +fi + +if [ -z "$IS_IMAGE_EXISTS" ] && [ "$CONTAINER" = true ] || [ "$REBUILD" = true ] ; then + docker build -t ${IMAGE} -f "$PROJECT_ROOT/Dockerfile" "$PROJECT_ROOT" +fi + +echo "----------------------------------------------------------------------------" +echo "Running tests with command: ${CMD[*]}" +echo "----------------------------------------------------------------------------" +"${CMD[@]}" + + diff --git a/dot_config/tmux/plugins/tmux-session-wizard/src/helpers.sh b/dot_config/tmux/plugins/tmux-session-wizard/src/helpers.sh new file mode 100644 index 0000000..5ec6abd --- /dev/null +++ b/dot_config/tmux/plugins/tmux-session-wizard/src/helpers.sh @@ -0,0 +1,46 @@ +_normalize() { + cat | tr ' .:' '-' | tr '[:upper:]' '[:lower:]' +} + +# helper functions +get_tmux_option() { + local option="$1" + local default_value="$2" + local option_value + option_value=$(tmux show-option -gqv "$option") + if [ -z "$option_value" ]; then + echo "$default_value" + else + echo "$option_value" + fi +} + +session_name() { + if [ "$1" = "--directory" ]; then + shift + basename "$@" | _normalize + elif [ "$1" = "--full-path" ]; then + shift + echo "$@" | _normalize | sed 's/\/$//' + elif [ "$1" = "--short-path" ]; then + shift + echo "$(echo "${@%/*}" | sed -r 's;/([^/]{1,2})[^/]*;/\1;g' | _normalize)/$(basename "$@" | _normalize)" + else + echo "Wrong argument, you can use --directory, --full-path or --short-path, got $1" + return 1 + fi +} + +HOME_REPLACER="" # default to a noop +TILDE_REPLACER="" # default to a noop +echo "$HOME" | grep -E "^[a-zA-Z0-9\-_/.@]+$" &>/dev/null # chars safe to use in sed +HOME_SED_SAFE=$? +if [ $HOME_SED_SAFE -eq 0 ]; then # $HOME should be safe to use in sed + HOME_REPLACER="s|^$HOME|~|" + TILDE_REPLACER="s|^~|$HOME|" +fi + +__fzfcmd() { + [ -n "$TMUX_PANE" ] && { [ "${FZF_TMUX:-0}" != 0 ] || [ -n "$FZF_TMUX_OPTS" ]; } && + echo "fzf-tmux ${FZF_TMUX_OPTS:--d${FZF_TMUX_HEIGHT:-40%}} -- " || echo "fzf" +} diff --git a/dot_config/tmux/plugins/tmux-session-wizard/tests/helpers.bats b/dot_config/tmux/plugins/tmux-session-wizard/tests/helpers.bats new file mode 100644 index 0000000..d140235 --- /dev/null +++ b/dot_config/tmux/plugins/tmux-session-wizard/tests/helpers.bats @@ -0,0 +1,51 @@ +setup() { + bats_load_library 'bats-support' + bats_load_library 'bats-assert' + DIR="$(cd "$(dirname "$BATS_TEST_FILENAME")" >/dev/null 2>&1 && pwd)" + SRC_DIR="$DIR/../src" + source "$SRC_DIR/helpers.sh" + TEST_PATH="/MOO/.foo BAR/.moo FOO-bar.baz" +} + +unset() { + unset TEST_PATH +} + +# TODO: use better stubbing for tmux (tmux show-option) +@test "get tmux option with default value" { + # stub tmux + function tmux() { + assert_equal "$1" "show-option" + assert_equal "$3" "moo-foo-bar" + } + run get_tmux_option "moo-foo-bar" "bar" + assert_output "bar" +} + +@test "get tmux option with value" { + # stub tmux + function tmux() { + assert_equal "$1" "show-option" + assert_equal "$3" "moo-foo-bar" + # option value is set to "foo" + echo "foo" + } + run get_tmux_option "moo-foo-bar" "bar" + assert_output "foo" +} + +@test "create session name with last directory in path" { + run session_name --directory "$TEST_PATH" + assert_output "-moo-foo-bar-baz" +} + +@test "create session name with full path" { + run session_name --full-path "$TEST_PATH" + assert_output "/moo/-foo-bar/-moo-foo-bar-baz" +} + +@test "create session name with shortened path and last directory in path" { + run session_name --short-path "$TEST_PATH" + assert_output "/mo/-f/-moo-foo-bar-baz" +} + diff --git a/dot_config/tmux/plugins/tmux-tilish/LICENSE b/dot_config/tmux/plugins/tmux-tilish/LICENSE new file mode 100644 index 0000000..d808dbf --- /dev/null +++ b/dot_config/tmux/plugins/tmux-tilish/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 Jabir Ali Ouassou + +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_config/tmux/plugins/tmux-tilish/README.md b/dot_config/tmux/plugins/tmux-tilish/README.md new file mode 100644 index 0000000..5349505 --- /dev/null +++ b/dot_config/tmux/plugins/tmux-tilish/README.md @@ -0,0 +1,327 @@ +# Tmux Tilish + +This is a plugin that makes [`tmux`][6] behave more like a typical +[dynamic window manager][7]. It is heavily inspired by [`i3wm`][8], and +most keybindings are taken [directly from there][1]. However, I have made +some adjustments to make these keybindings more consistent with `vim`: +using hjkl instead of +jkl; for directions, and +using `vim`'s definitions of "split" and "vsplit". There is also an +"easy mode" available for non-`vim` users, which uses arrow keys +instead of hjkl. + +The plugin has been verified to work on `tmux` v1.9, v2.6, v2.7, v2.9, and v3.0. +Some features are only available on newer versions of `tmux` (currently v2.7+), +but I hope to provide at least basic support for most `tmux` versions in active use. +If you encounter any problems, please file an issue and I'll try to look into it. + +[1]: https://i3wm.org/docs/refcard.html +[6]: https://github.com/tmux/tmux/wiki/Getting-Started +[7]: https://en.wikipedia.org/wiki/Dynamic_window_manager +[8]: https://i3wm.org/docs/ + +## Why? + +Okay, so who is this plugin for anyway? You may be interested in this if: + +- You're using or interested in using `tmux`, but find the default keybindings + a bit clunky. This lets you try out an alternative keybinding paradigm, + which uses a modifier key (Alt) instead of a prefix key + (Ctrl + b). The plugin also makes it easier to do + automatic tiling via `tmux` layouts, as opposed to splitting panes manually. +- You use `i3wm`, but also do remote work over `ssh` + `tmux`. This lets + you use similar keybindings in both contexts. +- You also use other platforms like Gnome, Mac, or WSL. You want to take + your `i3wm` muscle memory with you via `tmux`. +- You're not really using `i3wm` anymore, but you did like how it handled + terminals and workspaces. You'd like to keep working that way in terminals, + without using `i3wm` or `sway` for your whole desktop. +- You use a window manager that is similar to `i3wm`, e.g. [`dwm`][9], + and want to have that workflow in `tmux` too. + +[9]: https://dwm.suckless.org/tutorial/ + +## Quickstart + +The easiest way to install this plugin is via the [Tmux Plugin Manager][2]. +Just add the following to `~/.tmux.conf`, then press Ctrl + b +followed by Shift + i to install it (assuming default prefix key): + + set -g @plugin 'jabirali/tmux-tilish' + +For `tmux` v2.7+, you can customize which layout is used as default for new workspaces. +To do so, add this to `~/.tmux.conf`: + + set -g @tilish-default 'main-vertical' + +Just replace `main-vertical` with one of the layouts from the `tmux` `man` page: + +| Description | Name | +| ----------------- | ----------------- | +| split then vsplit | `main-horizontal` | +| only split | `even-vertical` | +| vsplit then split | `main-vertical` | +| only vsplit | `even-horizontal` | +| fully tiled | `tiled` | + +The words "split" and "vsplit" refer to the layouts you get in `vim` when +running `:split` and `:vsplit`, respectively. (Unfortunately, what is called +a "vertical" and "horizontal" split varies between programs.) +If you do not set this option, `tilish` will not autoselect any layout; you +can still choose layouts manually using the keybindings listed below. + +After performing the steps above, you should read the [list of keybindings](#keybindings). +For further configuration options: + +- If you use `nvim` or `vim`, consider [integrating it with `tilish`](#integration-with-vim). +- If you do not use `vim` or `kak`, consider activating [easy mode](#easy-mode). +- If you use `kak` or `emacs`, consider activating [prefix mode](#prefix-mode). +- If you use `tmux` within `i3wm` or `sway`, see [this section](#usage-inside-i3wm). +- If you like `dmenu`, check out the [application launcher](#application-launcher). +- If it doesn't work, check your [terminal settings](#terminal-compatibility). + +It is also recommended that you add the following to the top of your `.tmux.conf`: + + set -s escape-time 0 + set -g base-index 1 + +The first line prevents e.g. Esc + h from triggering the +Alt + h keybinding, preventing common misbehavior when +using `vim` in `tmux`. This option is automatically set by [tmux-sensible][4], if +you use that. The second line makes workspace numbers go from 1-10 instead of 0-9, +which makes more sense on a keyboard where the number row starts at 1. However, +`tilish` explicitly checks this setting when mapping keys, and works fine without it. + +[2]: https://github.com/tmux-plugins/tpm +[4]: https://github.com/tmux-plugins/tmux-sensible + +## Keybindings + +Finally, here is a list of the actual keybindings. Most are [taken from `i3wm`][1]. +Below, a "workspace" is what `tmux` would call a "window" and `vim` would call a "tab", +while a "pane" is what `i3wm` would call a "window" and `vim` would call a "split". + +| Keybinding | Description | +| ---------- | ----------- | +| Alt + 0-9 | Switch to workspace number 0-9 | +| Alt + Shift + 0-9 | Move pane to workspace 0-9 | +| Alt + hjkl | Move focus left/down/up/right | +| Alt + Shift + hjkl | Move pane left/down/up/right | +| Alt + o | Move focus to next pane | +| Alt + Enter | Create a new pane at "the end" of the current layout | +| Alt + s | Switch to layout: split then vsplit | +| Alt + Shift + s | Switch to layout: only split | +| Alt + v | Switch to layout: vsplit then split | +| Alt + Shift + v | Switch to layout: only vsplit | +| Alt + t | Switch to layout: fully tiled | +| Alt + z | Switch to layout: zoom (fullscreen) | +| Alt + r | Refresh current layout | +| Alt + n | Name current workspace | +| Alt + Shift + q | Quit (close) pane | +| Alt + Shift + e | Exit (detach) `tmux` | +| Alt + Shift + c | Reload config | + +The Alt + 0 and Alt + Shift + 0 +bindings are "smart": depending on `base-index`, they either act on workspace 0 or 10. + +The keybindings that move panes between workspaces assume a US keyboard layout. +However, you can configure `tilish` for international keyboards by providing a string +`@tilish-shiftnum` prepared by pressing Shift + +1234567890. +For instance, for a UK keyboard, you would configure it as follows: + + set -g @tilish-shiftnum '!"£$%^&*()' + +Your terminal must support sending keycodes like `M-£` for the above to work. +For instance, a UK keyboard layout works fine on `urxvt`, but does not work +by default on `kitty` or `alacritty`, which may require additional configuration. + +## Easy mode + +To make the plugin more accessible for people who do not use `vim` as well, +there is also an "easy mode" available, which uses arrow keys instead of +the `vim`-style hjkl keys. +This mode can be activated by putting this in your `.tmux.conf`: + + set -g @tilish-easymode 'on' + +The revised keybindings for the pane focus and movement then become: + +| Keybinding | Description | +| ---------- | ----------- | +| Alt + | Move focus left/down/up/right | +| Alt + Shift + | Move pane left/down/up/right | + +## Prefix mode +Note that this feature is currently only available in `tmux` v2.4+. +The "prefix mode" uses a prefix key instead of Alt, and +may be particularly interesting for users of editors like `kak` and +`emacs` that use Alt key a lot. To activate this mode, you +define a prefix keybinding in your `tmux.conf`. For instance, to use +Alt + Space as your `tilish` prefix, add: + + set -g @tilish-prefix 'M-space' + +Actions that would usually be done by Alt + key +are now accomplished by pressing the prefix and then key. +For example, opening a split is usually Alt + Enter, +but with the above prefix this becomes Alt + Space +then Enter. Note that the `tilish` prefix is different from +the `tmux` prefix, and should generally be bound to a different key. +For the prefix key, you can choose basically any keybinding that `tmux` +supports, e.g. `F12` or `C-s` or anything else you may prefer. + +All these keybindings are `repeat`'able, so you do not have to press the +prefix key again if you type multiple commands fast enough. Thus, pressing +Alt + Space followed by hj would +move to the left and then down, without requiring another prefix activation. +The `tmux` option `repeat-time` can be used to customize this timeout. +Personally, I find the default 500ms timeout somewhat short, and would +recommend that you increase this to at least a second if you use `tilish`: + + set -g repeat-time 1000 + +## Application launcher + +In `i3wm`, the keybinding Alt+d is by default mapped to +the application launcher `dmenu`, which can be practical to quickly open apps. +If you have [`fzf`][5] available on your system, `tilish` can offer a similar +application launcher using the same keyboard shortcut. To enable this +functionality, add the following to your `~/.tmux.conf`: + + set -g @tilish-dmenu 'on' + +Basically, pressing Alt+d will then pop up a split +that lets you fuzzy-search through all executables in your system `$PATH`. +Selecting an executable runs the command in that split. When you want +to start an interactive process, this can be more convenient than +using Alt+Enter and typing the command name. +This is currently only available in `tmux` v2.7+. + +[5]: https://github.com/junegunn/fzf + +## Terminal compatibility + +Not all terminals support all keybindings. The plugin has been verified +to work well with: `iTerm2` and `Terminal.app` on macOS; `alacritty`, `kitty`, +`terminator`, `gnome-terminal`, and `urxvt` on Linux; `wsltty` and `alacritty` +on Windows. Some of these terminals bind Alt+Enter to +fullscreen, so you have to disable that for the `tilish` "new pane" binding to +work. Moreover, `gnome-terminal` steals the "switch workspace" keybindings +Alt+0-9 *if* you open multiple tabs. If you +use macOS, you likely want to configure the `Option` key to send either `Esc+` +(`iTerm2`) or `Meta` (`Terminal.app`) under the keyboard settings of the app. + +It is also worth noting that `iTerm2` allows you to swap the `Cmd` and `Option` +keys in the terminal app. I recommend giving this a try if you're on macOS, +since the `Cmd` is more ergonomic than the `Option` key for extended use. + +If you use `xterm`, almost none of the Alt keys work by default. +That can be fixed by adding this to `~/.Xresources`: + + XTerm*eightBitControl: false + XTerm*eightBitInput: false + XTerm.omitTranslation: fullscreen + XTerm*fullscreen: never + +The same issue affects Alacritty on macOS; see +[this issue](https://github.com/alacritty/alacritty/issues/93#issuecomment-353489475) +for a proposed solution. + +## Usage inside i3wm + +If you use `tilish` inside `i3wm` or `sway`, keybindings like +Alt+Enter may spawn a new terminal in your window manager +instead of a new terminal pane inside `tmux`. The window manager always takes +priority — so if both `i3wm` and `tilish` define the same keybinding, +`i3wm` will intercept the keybinding before `tmux` sees it. + +The best way to solve this is perhaps to change your window manager modifier key +to Super, also known as the "Windows key". As described +[in the `i3wm` user guide](https://i3wm.org/docs/userguide.html#_using_i3), this can +be done by changing `$mod` to `Mod4` in your `i3wm` config. That way, pressing e.g. +Alt+Enter opens a new terminal pane inside `tmux`, while +Super+Enter opens a new terminal in `i3wm`. + +Alternatively, `tilish` also supports a [Prefix mode](#prefix-mode). This is in my opinion +less ergonomic than the default `tilish` keybindings. However, it does not require the use +of Alt, and is therefore compatible with the default `i3wm` keybindings. + +## Integration with vim + +There are two great plugins [tmux-navigate][10] and [vim-tmux-navigator][3], +which both allow seamless navigation between `vim` splits and `tmux` splits. +The former has an advantage that it also works over `ssh` connections, and that +it plays better with zooming (Alt+z). If you use either +plugin, you can tell `tilish` to make it setup the keybindings for you. (If you +don't, `tilish` will use fallback keybindings that don't integrate with `vim`.) + +### Navigate + +It is perhaps easiest to setup `tmux-navigate`. Just load `navigate` *after* `tilish` +in your `tmux.conf`, and set the option `@tilish-navigate` to `on` to integrate them. +Thus a full working minimal example of a `tpm`-based `tmux.conf` would be: + + # List of plugins. + set -g @plugin 'tmux-plugins/tpm' + set -g @plugin 'tmux-plugins/tmux-sensible' + set -g @plugin 'jabirali/tmux-tilish' + set -g @plugin 'sunaku/tmux-navigate' + + # Plugin options. + set -g @tilish-navigate 'on' + + # Install `tpm` if needed. + if "test ! -d ~/.tmux/plugins/tpm" \ + "run 'git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm && ~/.tmux/plugins/tpm/bin/install_plugins'" + + # Activate the plugins. + run -b "~/.tmux/plugins/tpm/tpm" + + +No further setup is required; `tilish` sets up the keybindings, and `navigate` +handles seamless navigation of `vim`/`nvim` splits. However, if you also want +this seamless navigation over `ssh` connections, you should install +the accompanying `vim` plugin; see [their website for more information][10]. + +### Navigator + +To install `vim-tmux-navigator`, you should first install the plugin for `vim` +or `nvim`, as described on [their website][3]. Then place this in your +`~/.config/nvim/init.vim` (`nvim`) or `~/.vimrc` (`vim`): + + noremap :TmuxNavigateLeft + noremap :TmuxNavigateDown + noremap :TmuxNavigateUp + noremap :TmuxNavigateRight + +You then just have to tell `tilish` that you want the integration: + + set -g @tilish-navigator 'on' + +A minimal working example of a `~/.tmux.conf` with `tpm` would then be: + + # List of plugins. + set -g @plugin 'tmux-plugins/tpm' + set -g @plugin 'tmux-plugins/tmux-sensible' + set -g @plugin 'jabirali/tmux-tilish' + + # Plugin options. + set -g @tilish-navigator 'on' + + # Install `tpm` if needed. + if "test ! -d ~/.tmux/plugins/tpm" \ + "run 'git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm && ~/.tmux/plugins/tpm/bin/install_plugins'" + + # Activate the plugins. + run -b "~/.tmux/plugins/tpm/tpm" + +[3]: https://github.com/christoomey/vim-tmux-navigator +[10]: https://github.com/sunaku/tmux-navigate + +# Related projects + +- [3mux](https://github.com/aaronjanse/3mux) +- [tmux-navigate](https://github.com/sunaku/tmux-navigate) +- [vim-tmux-navigator](https://github.com/christoomey/vim-tmux-navigator) +- [vim-i3wm-tmux-navigator](https://github.com/fogine/vim-i3wm-tmux-navigator) diff --git a/dot_config/tmux/plugins/tmux-tilish/dot_git/HEAD b/dot_config/tmux/plugins/tmux-tilish/dot_git/HEAD new file mode 100644 index 0000000..cb089cd --- /dev/null +++ b/dot_config/tmux/plugins/tmux-tilish/dot_git/HEAD @@ -0,0 +1 @@ +ref: refs/heads/master diff --git a/dot_config/tmux/plugins/tmux-tilish/dot_git/branches/.keep b/dot_config/tmux/plugins/tmux-tilish/dot_git/branches/.keep new file mode 100644 index 0000000..e69de29 diff --git a/dot_config/tmux/plugins/tmux-tilish/dot_git/config b/dot_config/tmux/plugins/tmux-tilish/dot_git/config new file mode 100644 index 0000000..5b9f532 --- /dev/null +++ b/dot_config/tmux/plugins/tmux-tilish/dot_git/config @@ -0,0 +1,13 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true +[submodule] + active = . +[remote "origin"] + url = https://git::@github.com/jabirali/tmux-tilish + fetch = +refs/heads/master:refs/remotes/origin/master +[branch "master"] + remote = origin + merge = refs/heads/master diff --git a/dot_config/tmux/plugins/tmux-tilish/dot_git/description b/dot_config/tmux/plugins/tmux-tilish/dot_git/description new file mode 100644 index 0000000..498b267 --- /dev/null +++ b/dot_config/tmux/plugins/tmux-tilish/dot_git/description @@ -0,0 +1 @@ +Unnamed repository; edit this file 'description' to name the repository. diff --git a/dot_config/tmux/plugins/tmux-tilish/dot_git/hooks/executable_applypatch-msg.sample b/dot_config/tmux/plugins/tmux-tilish/dot_git/hooks/executable_applypatch-msg.sample new file mode 100644 index 0000000..a5d7b84 --- /dev/null +++ b/dot_config/tmux/plugins/tmux-tilish/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_config/tmux/plugins/tmux-tilish/dot_git/hooks/executable_commit-msg.sample b/dot_config/tmux/plugins/tmux-tilish/dot_git/hooks/executable_commit-msg.sample new file mode 100644 index 0000000..b58d118 --- /dev/null +++ b/dot_config/tmux/plugins/tmux-tilish/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_config/tmux/plugins/tmux-tilish/dot_git/hooks/executable_fsmonitor-watchman.sample b/dot_config/tmux/plugins/tmux-tilish/dot_git/hooks/executable_fsmonitor-watchman.sample new file mode 100644 index 0000000..23e856f --- /dev/null +++ b/dot_config/tmux/plugins/tmux-tilish/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_config/tmux/plugins/tmux-tilish/dot_git/hooks/executable_post-update.sample b/dot_config/tmux/plugins/tmux-tilish/dot_git/hooks/executable_post-update.sample new file mode 100644 index 0000000..ec17ec1 --- /dev/null +++ b/dot_config/tmux/plugins/tmux-tilish/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_config/tmux/plugins/tmux-tilish/dot_git/hooks/executable_pre-applypatch.sample b/dot_config/tmux/plugins/tmux-tilish/dot_git/hooks/executable_pre-applypatch.sample new file mode 100644 index 0000000..4142082 --- /dev/null +++ b/dot_config/tmux/plugins/tmux-tilish/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_config/tmux/plugins/tmux-tilish/dot_git/hooks/executable_pre-commit.sample b/dot_config/tmux/plugins/tmux-tilish/dot_git/hooks/executable_pre-commit.sample new file mode 100644 index 0000000..29ed5ee --- /dev/null +++ b/dot_config/tmux/plugins/tmux-tilish/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-index --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_config/tmux/plugins/tmux-tilish/dot_git/hooks/executable_pre-merge-commit.sample b/dot_config/tmux/plugins/tmux-tilish/dot_git/hooks/executable_pre-merge-commit.sample new file mode 100644 index 0000000..399eab1 --- /dev/null +++ b/dot_config/tmux/plugins/tmux-tilish/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_config/tmux/plugins/tmux-tilish/dot_git/hooks/executable_pre-push.sample b/dot_config/tmux/plugins/tmux-tilish/dot_git/hooks/executable_pre-push.sample new file mode 100644 index 0000000..4ce688d --- /dev/null +++ b/dot_config/tmux/plugins/tmux-tilish/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_config/tmux/plugins/tmux-tilish/dot_git/hooks/executable_pre-rebase.sample b/dot_config/tmux/plugins/tmux-tilish/dot_git/hooks/executable_pre-rebase.sample new file mode 100644 index 0000000..6cbef5c --- /dev/null +++ b/dot_config/tmux/plugins/tmux-tilish/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_config/tmux/plugins/tmux-tilish/dot_git/hooks/executable_pre-receive.sample b/dot_config/tmux/plugins/tmux-tilish/dot_git/hooks/executable_pre-receive.sample new file mode 100644 index 0000000..a1fd29e --- /dev/null +++ b/dot_config/tmux/plugins/tmux-tilish/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_config/tmux/plugins/tmux-tilish/dot_git/hooks/executable_prepare-commit-msg.sample b/dot_config/tmux/plugins/tmux-tilish/dot_git/hooks/executable_prepare-commit-msg.sample new file mode 100644 index 0000000..10fa14c --- /dev/null +++ b/dot_config/tmux/plugins/tmux-tilish/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_config/tmux/plugins/tmux-tilish/dot_git/hooks/executable_push-to-checkout.sample b/dot_config/tmux/plugins/tmux-tilish/dot_git/hooks/executable_push-to-checkout.sample new file mode 100644 index 0000000..af5a0c0 --- /dev/null +++ b/dot_config/tmux/plugins/tmux-tilish/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_config/tmux/plugins/tmux-tilish/dot_git/hooks/executable_update.sample b/dot_config/tmux/plugins/tmux-tilish/dot_git/hooks/executable_update.sample new file mode 100644 index 0000000..c4d426b --- /dev/null +++ b/dot_config/tmux/plugins/tmux-tilish/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_config/tmux/plugins/tmux-tilish/dot_git/index b/dot_config/tmux/plugins/tmux-tilish/dot_git/index new file mode 100644 index 0000000000000000000000000000000000000000..d374738fc3deb5304b81a0e151cb9cb3e690bacf GIT binary patch literal 289 zcmZ?q402{*U|<4b=CqH#Ay)SjPr_&hMrJmK7ELh*hQ=j8=@&r!l7WH6=my8_FL#R4 zWY)4UxvC#~KV54}>Nf^S4S6LSH0X6T;`|&&3TJ(k5c6k* 1727090004 +0200 clone: from https://github.com/jabirali/tmux-tilish diff --git a/dot_config/tmux/plugins/tmux-tilish/dot_git/logs/refs/heads/master b/dot_config/tmux/plugins/tmux-tilish/dot_git/logs/refs/heads/master new file mode 100644 index 0000000..e8fd9df --- /dev/null +++ b/dot_config/tmux/plugins/tmux-tilish/dot_git/logs/refs/heads/master @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 6abf7be089804a1d19a5737c8f9f7cb5bb519fc3 Hydroxycarbamide 1727090004 +0200 clone: from https://github.com/jabirali/tmux-tilish diff --git a/dot_config/tmux/plugins/tmux-tilish/dot_git/logs/refs/remotes/origin/HEAD b/dot_config/tmux/plugins/tmux-tilish/dot_git/logs/refs/remotes/origin/HEAD new file mode 100644 index 0000000..e8fd9df --- /dev/null +++ b/dot_config/tmux/plugins/tmux-tilish/dot_git/logs/refs/remotes/origin/HEAD @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 6abf7be089804a1d19a5737c8f9f7cb5bb519fc3 Hydroxycarbamide 1727090004 +0200 clone: from https://github.com/jabirali/tmux-tilish diff --git a/dot_config/tmux/plugins/tmux-tilish/dot_git/objects/info/.keep b/dot_config/tmux/plugins/tmux-tilish/dot_git/objects/info/.keep new file mode 100644 index 0000000..e69de29 diff --git a/dot_config/tmux/plugins/tmux-tilish/dot_git/objects/pack/readonly_pack-065e83563d291f0d2f14eb0476297fbe3cdcf7e4.idx b/dot_config/tmux/plugins/tmux-tilish/dot_git/objects/pack/readonly_pack-065e83563d291f0d2f14eb0476297fbe3cdcf7e4.idx new file mode 100644 index 0000000000000000000000000000000000000000..d1de4642f82c454fc799a0d07feaecb46efbf0d6 GIT binary patch literal 10004 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%0DR4Nl+3fO59yOtm< zInBB|$*yW`Sk9Zs+L!w{)a6<$Fvq~K_chin+DEJ^>wS?zDQ@#(US zU%-rV=$kXJjDJmhpMMuG83|;m8OW9j+PRyGDO97Fq0X0So1G%}P` z*e)Zz?12Fmbcs>UL2TT!FI_BLH{!-92Ie5y8?ItG|iofduUhcPF)Gm% zPF5F|(9DRaA1vHG93DwAHAJ0HW~%6_Cy`1;p;yjuW{6tYBic2Zr%2DZB#ykZ=*|{) z(9qK5YR67TMOM*SJEs(5CmEk`QdnD)Vpr#8YuD9(kfnu@P8uRtKQuB*b!F)15N939 zuU8K$FghU~wOE9Zn2Pic64)5f(Zx0ltFaq?b<$R)%v3Ha zcW6i2rMg-ncPui`O%_+*k=rWJNV}(04=N!qlfW6~(vaPoMVT4>t_UIBXf%@emL6M_cQpn8j zUiO$U7S?FknM9QbO9(W`>o7{`Bg)Ua=u*q%VzO{Kxo~@Wn%CmR@}~asCj1_m01OVH?s#Wbf4S!VRKg1%DpbZ>urE_IUUJ9PWYBef9LB27fhd;ov)?29fmOYYOf?~}VTFlBYKvSyvS zs2t56|3EeBI@xFw1u*897E@dKhR;OxFteyM94IVu>kU@lQB>edrvFrED6e#K znp7YW+IpP$%90u~8YA4>MCy zR%V6U@4S9s#lA0SiAfS~O;GDqEc?~S`7t|t0_^Vaar)F3u)ocHw`h15Lh$a3W(@-~ z_2}sj+0PLs0OxNOgE;5h{2KUzHPjNpPKUaM^9t1(c`K(QZd$^}cqrge@9c!o-Su7c zh{fM1DDXYtqGwwt+$OJFq8W#T@wZ7-HqBh!a1^2&oKS=YDS)bo#*yNeQHXprPB8Bn zp>B$eB$qvB*k)kVXqVhgMqo=-ssETmXt*L!Ljpb%R-T%|?nj*ZrwFrS;9nRK|vhG&FOJOd! z)jz}dhVi5=X3>dRv2U?28lW9Q^*Po-aYb2I?PS582RY@4mPpb$A8R=ZGs~Ljk_yWOq<5Wwk~qZYeOx#!Cl*==Pn+vn4`dZH>Dei5qX9LkOutGPvDmOb+P5;{ ztbvrv92;%|oInAE6MX}0LQcz$Kd?~2>G=_2pQ|=$uj}diaOa5fg$V;FEC6VbTE<=# zj_LM2<}SPppljN67k_E|G~KBD+O9f~z^6q}!s1uGMm{~~Tew+N@aG1IU%2whPo>DyX^R#U(5eZfh zEP%j5lrxkIbhKVB&}eHP>`LHMOdM}gNoR-^dVW8l?z9m9vW}5eyBW3CY_y5YtMT)` zwo^Jp_rcY^Hh0JN&$*``I5{Y&N>K8?!6eUZQ0phycnV3OA(jxo^P`y?0tid5YlObD zBwGRoDxZP63((`dWR{(yPV(Gj7B{!N6%b-^+)C@*uKSf!>-`Q=T~skph5HbMf?cgnY*zky~o0`~)%2s+b0ahNdm zm52uSOpp}f7}Kz>LsOs$nC=W5hg*||`%f;YsE~rI!>Vh=nfls~gqkTuz;omJQ^O9N zDfIE$)u#xdB(cKCAf`!ul#0c;tFN#Q3=;JS3gxRw=y_u>Jy05G+o5oan;uSndS>Oo zi3EZ)boK#2i_WPt)g>66(ec6w-NW$$6XvJ&sMGQaysAW>K z+v^=3S&*Q7*@i#a2j<&Xa)wQkOyf+NuWksIHQd?(rmaQ;Ti!j!uS&Y|tA{}`PK3H5 zOHXvHILJ?+)Mfns>d7S}os~h}1}omFMuiiCDJ|+h!c47@+?j>bgD}9pi@wGWiVtFB zn9mH+T%mZt8M4S65^558WmWPnme1a~1b}k&;eF_RvJkwnx0$qpgW~spkdXB1xoZkE zm1as(pZc+Zyy_WML0)xj>UZpixTn}t5U;;OnMEJyA$42W_Y@?YfqCWcOynAn$+O<+ zVF5Taw}wjs>=lu^5`-1z8+sYVvZT%>0*S&1Mn2W!*9O=?55T_GqthXV~Wq@XyX{>OEESC*7hnNumY>Y38NdK2bh z7QE{aHSoI7bg<^O%A675o8g`fm{dIn71eduP9&llxcymc zX%bkwWGbRHV~+I%(XcTm)AJ9fA{owPn_P}qFN>KxBc+IbK#X#C!~o}BgDyN-uTfN5 zxNoA5?d`+O$zGY}E8653S`*GOM#oRJAi)VI_Sz*wzllQ69?1_nw$lA=+wB^4C^P39 zk~2Vu>#$-P6cjB_eiQIC`0lw*%hW=Wn|7r&nr%we@=bFb#L(&oO{v(>t!C#?wngE$ zm2S_GHBa!ztc&ODOKnLP%-7A(J4)Rps;<3`sqZV4-L69q8wb?hr#ARI?Az4454?h(9t~JX?uRW4s8H{G(GOkd4by@;yLNf& zD)UbEJC1#?nv?fotw&&bTxm@ShGU8g*}fAF`^4&!--z7H&$PhO%n=ACaJb2tI58epFi2G}A_x|Bde_)O4) zbI&^l6M_&J5Q{Fx-|->Nfp;C&pVV81%A#)7o9G>USKhoA-oDH4U+s_YN3&;SIdgf= zyj||3ms~joU3W3sDAW{Lgx`lP1kH9?Tb81yK+Z&@7-W&;nm~qzE6LWb!ul`1Y;S9P zd|%&w-p+o%044E#4G0$=oKgwnQaX8n!LrAYB611c?NDZKj&F5-mIiV1bP|Pe@tKbj z3evN^F1B%ihRBo4=DsctPAUTr>V#&l1RivG0&2!f${}yZj1`p0CRWal`H#wp;`m`|qj^&(wCD@zAP@rK$C9FyNU+Ie-smy>s$Zt; zpgp;a?dj?E#0adL+d>jy;H4w8>hWWLt$##(#%^EJz__zauMo~QDLXZ1K{+;ZP`WAA zyyZfT0wTykWR6po#uK}KEy4!~jdM6e>xu@5<6`()0gH=BQdGP9pjHmK zy3<>~h)yz7F&L_^)0e!_PTG(n@4n7BB%YBHJ3s`IP84_>DB+fqh0wKZ#yo_eJ)W`U z0p1yH@%K!cj)bz8X*P#`7$iDmcDuba^2`Fe0bm53{tcLnBy%k?m=Ic>K1)6hj(oj_ z?i_kG^-4Ci{qSG4x5=7Z6}fCDT7M2)<0*N-k{M@>I}zys4<^E@s!wuQ1k!MI8Pdzz zV|&13g@PFsIc=Gl2#LR;1#ua7?h0O8eMnj+Hi#+93U^TbBD9l*b5UC~KVxEI=P+Gm z3;miJ6kGj+k&^cc+g#?B`RzE~xrefh#acM?^RNaUzE~i;Wg}c=7>5OB6S&?AHCC8U zZ|CRY<8zO>m2{O2z1!4~{A+@3J0AgG7+l#wLM|9sQjUaF4pp+4nB8(!Q>7FlR@d>| ze`;H3%h6Hl%C!*Kp9~qU0g4&aLAXa#?ndP41~;-WP22GFY~i=~^+PDw&b9P`2B!p_ z)0d78T6(i^o^qw7YMHAOX}CJem+3?ll*ls;Mobyoi9aAr+mlKO%FUshqjYRr98Z+{ zwo8nCcF9XV0)u!hWp*Q6?R~XC7s-*()r)9#>pT<)nVj)Y4^PERpR?GolS7IES(-!y z%tnYMEU#iluH9==K`Jq1-VUnH&itUn1~Q)VmUB4iFql_C=($noLnm7u0}(}S^93~< zo6msB)u8(BG-G}bW0d`58)c?~1URw~(BN)j3%v`I874c09Aw<(9h?jO1A#fQ=w}`D*9`kuDntP#HHV#r>TghZ2yG+T2i|Z$fTQ&f!!gdOg_myUcz0$~ zwb5L{J-c$zy`eYM*w6MS=kpNz5=dA$jx_g3G<EAnLhJd&ql9qEEV2K_b zHhIbX-#rke*$=XP;ulr)Q-(UcTPh&ccx6WEK=mGqd#V0zG^iyXsBrhEn01rSfrDO5qt{Iu%e zU?5=P6Q)@k%(h&4&!B;UOu6+_9h`(p7ONC9dV~+mnDQEGZhpUrwANN# z--=>zRLn+^Qz=zo9&C*^eqCPM$tsM8dYBthIrPs669!8M6wmoA6dY-tPk?PE{pu{Yh95$kS1>!Ac)Kj@6XCR_w7!$D zlY>qi@=S*OQq$ko13(SSq*@Oh8yu8W$Q8+N_4CR18}*o_&&!y7W=pDnOn2SLjpdF! z-69J)@3cb`Dze0RyAnyrtr4DTmELR?H+tRHNM zXkZBx$~{t#ySzk%*2EGkA&%aWx8km)fvN+8u1)9^RE|r`VO(MdD|*TiR>E%09Dogq z5hL$CUp1fw%~WTAUPJSchHxA5L>2+&%z{^KQmM-){zKH zg2xAiJ;PN%sjZM^?{Z!{158}>E&@#?+t^xfqSF>5LTO$xHN+LzWz*OLEvV_Kd)zvn zp+CwgEd{g}jHnPGH*Q}XrDg+b>=r5{<`ST!VIsgRT> zVfA7O3-3@+5k%Bs8(Gj>EfE#^00gpXW4EF&gJ1%y7`^6%kV@k-xno_Ey11hbF%8XU z6r@f|XP_urjW^rR-Pk!hlg-07rf`>r<(yy;%Ga1)v>oXCjOflWxCpw7TZ(f?RR52eXY69In7`Y@k^$B341pg zX$^$?C?42Bo(2_|nuwYxu2xN$auEOSi3+!I;J8{O)-Q!)mR0}rHNa!9wT&{@m^qvu)7MYi~8|NCXV)O5dZ2YeHg^Ve0wvl zfGp*45`wLYRzM$Yx@ve1b$j@jU)bqq7TVxo)N(ZI1Ae*}1W(_^!M|ws(r@$@S$NTs58RLBbW7_}U^`vX(70gp_Rai%6?M%FzWsWI3U0^PwqD-Lw3p%t= zDco`rKoY!y0SQYE`wq7Q?eOF4(Jq0l6@2hD`dsLaH8ea#X~0G4#ihPIs@!p3)6J2|3Lt)PGE1T&Mo%`%J}-GER9R`gvRa^Z8?8EiD8>0+wu-ST@zn1Uj72(pMW z$KEf8x(|H!Q{tN+O!{4y(o)#fl1KnQB(E`>5&IGx%Dx?N+y|A3j{?lqkUkVxF|ldv zXC@@;Z~4t3i0ry4?G803<--+=q6gP06S%j!VGMk9kKOY%P2FxU|Lx~(uTv8e=5s8! zXIj?Do0b{X;-$w4{@Wk4W5hD+T0Qq{E!7p>4uhCkQ@fq5F97ms(B5i1(Bj6L6n&3(ljh{+?(#eS+bO^Q5F1s#dGc#7MCRh?!Zy-2hUch^3 z3^oS5=f7%qhXG7%g8@OZYuhSo7zs5ijS1(7;JA)-1owV&A z`HU&HaiAg1x?dJN!$st*bLNt$LNZ{@CGJRrjlDD+O+hT^sh2ADEi4{(;YK7*)laxf zLAX_=2gVNz2);B&Yog56X0gwRu-K&sxAUPh(R(-peav4!IoM|7-ntka8on%ovVEyj zBuo!~mb8v|Tg3;H@!Wjn>=z4c9)B09##*m_$q+B8%zhr1FsBgEmEafKnn;>t_>_0m zjeNtoC7!n(ZvK!?T~=QJ2eP|oZ=HUvTMWT6#9U2hTwVxkj0%c}d4cD{-nByZ`9OLl1XM0^WZy5*?DTOx%n&k>gh*k<}T1Z$Z zRK^P0`Xa_BWu#SR=_W%IE22b7K|?)6Nun%1M4>!5DJn*xOe#i2GCe*lUMMkP*R+imQiBZ z*cw5b4Wjr=IE0H7V2mq>OH#|O%uGv3)XXa@)~m=1-l4Mo+1ClHaC^WOxR_A_?Z#w~ z@gaIc2>YNTbc{~I9&WCmlwCzZU;mP?hKh=~K*Gi(L7rrEa*=YBqH=yjnqpi+mU@Un zLaD5(>LC3T@1jU6qdW$7K{Y8Y4h-62C=(XYA|RsT5+i^-kDKm(I-CG6&S7<$!ZB48 zY~v?T1;of+fa>&slBA^QsPHJs;u}Y00tDa!O9egC4EQ&FHpz4UVg_YQ38nw20FZF*7m;;?bcxeXL4MweRx;{F@ZlYW;Q;YmLn9NBJk zI7opGCprQLLFT^U#@tytev!h!+TmZ@Ut9%4OBvfL zZj^jk+GcOBx;^*mUfQTH-4x14^iW&m0!6Ap1{_Mk^<#{@?0EQKqwv$N1WAxF@#MIg z`~V{)XakH8>!PHn5U&O}V?ghuEEgS7T^z*U)67JCeoFX#r4;oZ>d8+1c55HdIjtHr z%-HHbFrLOPw?4JD%^3S}F&Ho0Oh)T;>D1i%?_uoI;0#cWoPAZbQJUN#Y@y}f`mvgTlr;T}W(vh)-(|_-lma2^8?EQ) zzn=iStHRU}o0fSE%W4dRR)G*|xHpu4Md@+Y9Md&By!lTru9t?}@ejHgCDxT2Gj%QT zhSGJB-mvMO~BPkv&RO-`hMiNj(lF$M}Mu|VHtmKl^-LgThLweAIxfYOi%TATS{I;;2S zJ$-t`hvsk)nNObHm1$d2Ead_Hq`|prZl5}*EFpS%5So9KuiA1(XsQW9INsd1sd{w& z)=}q>)dS{l-$LyMxMf#v$wfM<=n;x-NxmTs$n)$?27bHfc!XcFY0k9kM*ioP=xX7- zQLhs%q2lsr%K&c+KywO8bBY}0^N*((%OEwx4-hheKcb%ym|hTQhnS^F1xXudjwpb` zNzqQq;&v?VsCG+R?0|}>V~6$|n7B~j*WY(=?so@Oxc{~Lx%(>5H>;b+6PEez*(Nl_ zt+tkk5W8E05Mn2)+xGtSH@4%RO%2h45PH;z#+ccDCW_Be$X=TvH(U}{=kerE+r3yr zPSB48bV_`N%;ij@^qY{it)J=c_2i}2|CGn zh4k&Bi~g~cyfTE`jI=~O-RiP@`uEaO9y;_v@q9uR8Zx-rhp$5G{HIfH8sFB5f4)>n zZP;%Q_94c_l*K3LC#7f<(rEO~31^ek3gqJw)zqruk~DytCGxrd94`SJO-*$>14oZT zLJ1pHSU)x-C|oo7m$;WuC?BOzC8Ly36$7A@qS{IIn4Q&>=l#X)OODSf($2|=lZ{V} z(aeYeWTqwnD|W4|oI{ZT0(!JquerDA{-c#(+%pl(RyUL_6>{(}mG}pAlr_|qv^6x1 z)pZ;l9n=;j1wNX9$0#A)GfK{-o=omnZ|sP!NYBubAfaHQ6R~*UT1~Nk!D%HDx2~9Y zzIyFglyq{8Oo~!edL$)tI3Fk}b0i+z=;Po%u$G(MpMlZ_$NabAP?7)6w4_L>NR(vd zNG8T5$p=ZN6ciX#7?uEHba4-FTVD-I`BqLgz7kat;50NM(4mP3Zlve-A7&Cz7hyvAJnjHJ*JGFfbNA{z1o^P0K8SX?U3_xrGd(2b zz$QP!2Gn2#YqtVpcCVgz+U#$H2%3MIdNVF)?4ga7!4dlxGh)|Ph`?`kV`xHysM)}# zni19h4Z2~Re`*o3%Sa+5rZEptN+dOBgdgA;ZgwfsL%G z<5tE25*U%AoPuhK>@J2|)4!g@T@@8kV_&0=^EW5~jYnf~I)lK81n~5{TkLrg-r> zx#|`1*?C&=>WLZ2NtOTISqS@ot}qMavkS&XGBUFh>hcZC<%{CAH4F2zs{4x#n>}#P z5Jd&jnf||ZB6D++f;0-J#E{|bry+=?u&u5r*5~#hY=c1KK+eyGgyT@k&!&LmV9L+N z6o-rAnkKtF8#sl7&c}ns`DXxG_27#h6hSpWl8gcaOR9CJaS*?`J;tVh0YIo7D|P~z z0{7or)r`du^ytT3^m1bKGGWMra!B{`GD=9IcgW(Qa!B^_)9|rm$iHy98ZP`=>`pcW zjVW9nT%0D%&n#YU{wh=sN!(t90wv;clHsA14foU{L4~a^w@nv}5%g5B3<#{P3glE5 zAEFnn8zmQ|+vH!PR#nmwn33fpX^9r%t79e;6Ogfa^dxol09cG-&^%@v#d6O!N#rv} z5kMJ*BtOg->?and&JA&oaI@m>VhS%rfQt!K0D<1=*lOE2Fg2UaXmi^L*S6zoscDJV z9G)DVU0t0NtZ%u$-aYxVVfoUNVb^=hc6)Sl`>+&N(!uPlp`9xSUE{MyfMtHAnN=6u zB{k*Mmx^{u=K`4=*5HyH&`>oT3vf2d6K|5A`23C z9c=$sGy@qsOAyg+)#Q34NV1?Alz3J9=p+7HQfYAXkv9J7eJjl8u63fanmY+d^`Ttp zE?DuivyJzh#O)@;?i%{w?C;ToojSjo8@x zBL_6x9?B#EiYXeubdiN-9|OeM8X6gxDI%eJ>OD1%rLf5?e4_f(bTtvk-I##xZPEEM zsy|wH&0k#iNM-h=;BC@gU~llO^Q6X7%V&j{J6}@VZsbBP5oLFnyt>~FuXRtqztjEe z41Jn!4oy7Z2hLuPIM{;XHB$=_ca`7zO@`ddjn$-y>2T4gCWV6ThQkCR6SfG}oH+&Q z$*R0j1ZhHgGxl$rz3v<)Fw;bVM5zE8DI-IBFQY08=Xg2Pf;I5Pf7#A}eQ!@{Zq0sy zv&h(bt%LRdCEZi!JqsbAe-y&fUq=86Y|xe~AawU^Kx%-c-#x)~!FnU0Bx9h;BzR!& zrf6V9z@}V~0F)+tOkLn4M0Av~ zHw;&|M~6=qn`9&M4r!Cnj*?Zt>euP}hzrN}ZW2 zoTRafZ)8VMgQR3G9xci4J2e!Mfy(*@p{}6707)nl#9((L1gbFT0Q}8e7T?%OKg?sv zxf~4=2rimnYtb|wGFO@fsL0{bTY*o0QDP#x4U&zTloQ@-#A}a`7m1giWB=oP-BB-R zap!YXPC|}{M76BBqrKAuF+JN}x!TK@t)`{0(?36E9hg_Bq4@u9H}U_Sg|Go;Pkm}? zVNgu#=tL01WC)2ekgJx)jTsY1w)QsUSGmK0H-J`X-ry93fzhz~JDTB1bbBL8ny`#_ z-@R$G_tCl1&Q<%6J{xn60%=ZGCZ(NiO zv2EM7)3I$E9h)7a;&g0vY+D`Mwr#7UsqgPUYi6yPclF|~Tes?-v(G-y`8<1Xeq#da z_uPo^-5mvZA>@X%P0;`Cl{ao!f{T*RAeV(SjiK1vSOtphrW3!^nqJ&M_iLTl!Fn(A z@m7c4jQ?u8xC)JP5Ym4p3IJ&t^{3wz3j(%QcUPOT!4N^AI$Rc2BqO4iL=JiHN1zfL{XIQtC`dsGaTw33q_e~J^fp$mKY3=kuqx4au5cg$H<9S*LB1}!H zue_)k`LR0w%)6T2pPGK*cO5pwvOC11)A0Hc^A6mH{7E zxVIOA3X{|CL^pALE@UP(&{qat#dO#fIQR+{s#@Z)tDFp%6Jk-$ftOhu{$3jaYCfE5 zr6ZypjIvNZYj`+VPQo{@hWzsnm&bmu{2Z8P%`OXU6Vt6n#tf_h#Sp7kzaymQwj9ZWJ(aMJf#Gb>3>I+B+7Pnyl#!@AT4 zoHzv?SV3C@2bsw?7trZ4LDgsYWGox`>_^seWjtN%@{L)^(KZypVao*+u(25sl9E&1eG33Qfi;I8IS4J0!Vk9Z z%fSEp)A|0=+%M<_{)XOj{pO^JmNb7c`7>6_leqgE@$oW(<^(dI{eP;*y2$`>$yC*3 z|9&E@MMitaf1SoUydy0#&LSz_Bw*o|mX`FB{ED`cC)6EB=r3^!o!%M24J#c@eo2& zL{S6>Ayu?dP@hTCg%`zo2hh@UbJx#Ie|Cgl=jLpMT#DR+USgv@m+ae8NHIq_<}VfY z4a%vxt$e?HYxuDeAC6Q{J^gxkPr2*ENG%B(CM|NUP-VeV-O}hEqJ~dT;`SgWAfrIH z(7lC{_F<^H#X<5>>bG{R!?vfZ57o3H<_~@3IDtyXj%>$m6ftSdBMELZ}kkSCyhqw@c1qcgw3(NDNs=e1SxfA0ggO%xC5U+~H-;ga3F=Nxk94p? zEhCi&IHY2f$L4nZ%``bdZv4{<7*b``iqn@_eUf*K0Q30UHx8fHzaQh-}kH_dO(lsANO~`f-QmB zak2m@P<&(DQwKDCWM_Ze|1Tl-1po!Nf+^2t^)-;KTZHu^FklUwtoSAx6R{ksxSyG# z7XIa;*3K1RD~Ga-&>n#J7+_jmGxgpKwg&PkhG2P)%K{ugaU!zdtQcV;o^u^&1`)R* z!CBUKaFFmFDB=RbhWw71EbQKtV{X|RY1f-x;7TNqctqpon-QHa)XY2IM`}HSeuRo1 z3#%TrYEpWgB{YWEr?CdO2=k;kXPIa%<7dO{9mZRDzijmo?`D5f&H&&hBf?OJlmAG~z+*rlE^8-%n2qG=aAjO@R6=S%G!lD20aAa*h~9rh2-`t2;kyZqmO;UHu9 z=>HoNGW9`*8Bpg>!NLsx_ugr}#S-#Gb^U)?8dmu0Sk^d{ID6MP$T(O791Kl$EPt8G z_$N?dgNXMcQ~V4E?(?&fHwax;1cHXfl}9=`y?dEl6&#HI^(E z(FgVc%kpPN4&nIDcWzPZ>x@{Tw%qzS8b0kjF)_H>)Inkj!#QYQw`qD11Pu|9 z!|U@}T88oBh2(cs(*}p<=fGZvvHI{B^*Cjr+yfj)O5tSnQP3wOVTwx0cOSRc5@ENf zSa31pSfwyIr4^aTgvGy53pc;ix44%)sO5D1kh|($Nr{sg~1+n zptcFCphV479Acj8SOu=Zh|C`)uW2>lw%|^e?~Bfox`9z1{&iT(&R{7hc~C@VN}#Yc z;_6{ixx2VPvtnSUY0+(R3%aGq0g!!_g9aBCHc0pO{D``Y>$5qOgdzox+NIZWg^xw! zIS+_WcqZ8Y9;vL#eH;;vn)YeoM$7X@x8w87l zp}D4QdX5$AK*`5gt4N!>01{zqA^72UUUo1|>+lxec*LD-ob)*tlaCmiPl;J^2*`7Y|)IwTLKLXs^qBduqI_`x+sFobDPFa>m;bFlBnvIbhrZd z1W}mDtu=oBm7I3Zu9s;CE{K<@0OMRpzo%kTpdUHv=EwW4(H^g-W#SfvX&)f;&G{tT zwdcWar+sJZ{b6io2K%|Ao&~H3GFKZ>zt6qz3PN=YdnG8YP2P(c6~!7{wo;QN(Hf*3 zbC}D7V1lItA3g@ZaD)W|9bQ$3+Kbpt{ln?#dF}=t8eUBvTqhB^C^%iOR~?mm7G1PY z8V6Tq4!RUr8x*A}xVQMtAEa>Os#5{SzG>&_`!2KcM-10S>$)AZX%6ha(PN#G*n!OI zLMu%h3sxUONLNMg(?e#jiY27S%qfte2ncfUo%mgdJL3uAqgRJ_k4IjdYoC&+1eg+Oie(rl|(F;;ArrnLP z%_YpFgApbUIf_R?Whe?ff1MXGs#=jFw2Z_Bl=Ro2Sf6>;V#51dbhN~XMP^|XiA7@W z*sI81J-QXj*Yh=1W=$>=bKsz>L48ln$?P{P%(zsUG~k_G*$!nw>PNJZa1tnSh=bc( zL1T)eQAtEz`Rr_TDgmRXi$Y~w5j*7|Y(G%a-%);Gab@FW@LnP&_lUj5l!6`mhqpDk z|ARjHF_6L~S5#OeU2y-eu7Z16lE~_)%v85rgDuFq{g}s(MAFp5*5cos{Nmf6Qmub~ z3fKO)PcEDl3iK7{k=?FN9~6IarEds!oz|`z1_v|SV+k?2V@1+xV?+KNGLqviA$OpN zYM|as#|RrF!pU8K=C>=Q_<<&AEd{|0Tj*z&`IqVtsu{OjLC)*C2{RJr4vkZ_#V0G6 zrJ%;Wi6w@UiSM`{@A=0`)6u3Z=WUbl&r_MD5k2_yev@j!gj46c<9#J5W}{$usTu4A zKwyB zc5LTPe$(moX?HH;+zX6ui!BOND|dV~-OykPaoQqm&p0}Xhduv^Q?_=cv<`;Xf4`T{ zee^uJTW+e6eLj(|=Y+n^FD8?w*p;sBu$5{)c3^r8ynV*&wqDrPRYtq{DFn1gpCjuD z2_Rftv!SNcFu;fp{rAV?ZNFNKwv|0mkJqGhy-OneiRZ>bIxaL;*u?zA z3=(qulO~)ZLWdIyY2aGg6ICajYaj#_D@f}+LrzKHo;_NhEr(C;#4|{O=5ccXz7^@e z$xH%6QfOZM1Z{&THnhVL}y;WJ;Vi4Zs_lQgcPPxVIn+|Z+(45 z7LeSlVA%LM$fn8GV5Ua9&sIj%zi6F9cZW}2I`bgxpNl!Kf1UkNY zKW^w~c%>aJM8Djff|9)0{UVl}3|F;^n%2$P{cY|72`6W2S}+;&eF9%gN4f8~33j|u z`_AsIdH-%4AHFJ{zIy4Ou?C?u%$r$Jh8vG`!T#EK&O~DiU2`KwuS?b zx*Bbp*M5t^@s?q=6jG$o>u9}#d-op2+Z2=r;hd+E4}I)&K0*bhxj@mjAbC)&h}+O? zq?;-i&5avCFnAs0M!e_6&3CrT%T-_S>wW0%f)MaS=({0SN??Uke{E2%^B@kAizC95 z@bgdxdd7P-l-&F3J^C9YMe3FO1}@6hE1PnX6|P?xMbd;pfz;GY80~9X5<-q2UMXI( z&IL`XAwCDOGbsZ57OXuYUd;>I(S%vDN@&~1V&?Kru|ugLqtAfpQUqo=GfJSq0f_z@ z=XaS}S%VdP1U7^KD*jTk~seEo>TzOfke2)Tc2*Je!{7zB*H$XwQ`HaIvNMEjtZbEjC)>g12Bs z?wW?!&m61YFKUCl9XQ#YDHnJ9v1(ebn9mBSTCU@TcdsV@#<|0QV0B=29+;-)8cR{{ zvUD^USFBgFKsLmBw#JMv6nzcf*vq@_C76ciQYgo1&4_thQKFBVtRBkW%IC&po4)U2 zSHwsVlg83$Sp!#0P15Hr7c}}K+B3XHwRnXQ^eN>rABK>5o#0>!Dd!*yx%6Ovj{V2S zEjZF1QpD{w$&c_?2eg3n!I#8Wf3$$)LFB~OgXlJ&N16Kp{}?Hf+|bmVG`BzbrWW=lu$@`{ipHCiY1#P!zC!YU0oh&>e`8SSdoLHdOoZ@M>%`7han)y5bW-*OjRoLVoIe znW5JyP<(+u~=L(*{X~horQ#v{u4e8Y6h$x5ek**-Q8DReK}0cpmc1Ln5Rml_5G7pvUfv z7IieBzu;5W!Xd=svG;zuDItkUMGcCl0JXHsAB(8Y=c;cX#zoG6zgjbYhYMmlt2VEVHNUX=yK^r^ci{d}&1{6@|Nc5;v zgZ;S_R*JTIH#+3s=loK z555}HG9Oxm$}VEAIk*GH5Adv?t+K z>W@3GMJ);w@AIsTqU!tyH*L!A+(%PI22yJnr018HnJ@qMVf=5r%26E&Wx|D zNhcAm>#t$Cto)j$I$$ZkV8U&isWqQ>AquMzfp4U}4?0S6D3SC|@_9L=z#*_^eDRhb zT{+>rPC+Emg6_eTX(nk=J`LRNd73K{r9RCkPL@rZs4|n^Hr&rYoq2h~L>q}k0z}4rvWARGar>w}i>NZ+UGvJ_8 ztdM$xYtjIKIc_SVQ8tYHhgy+_4$RQcFJDIWrG0pqEJ&iy@J!JbtW7|U1b=u2g$I3j z28{>!36%$XxRwD`8xH;u=CJ>jE$E2FKi8PgWvtP)zg2C{c5$NpGV82p;ctp!=6$T& zeA3@o#a|mQPWkAie(*WKa!SI~Ii#;__ofqsj81RxqD487hTB!>)`Xq$2D|9rwnY62 zwxhp&(VZh@oCGo-C0Ae!qZGXh@%lEd<`9F4rIK8)%cM!v4tH{NSZI#&LK@S3dfI7Y zb{nm{XL;L+*kPE6bD|(|c8_nJKMqfa_zi*fy61a|fnXs1>x(d(G&jC96g#QAmZ{_ZN{C7Gl{5pE zW&ouoT)E@PH#+@rC)o#hsc+U({*0)%+pF~peY@=K+wCxD3yRT|<;BP6NUTGP?5)O! zOs#hRjpXvxac#oPRY?X9QMZihHSsQ0U!Ek|tDmX(EpDF?8h4n?_&0vr%hMNN&P!?5 zradTbxWviRjt!^%r<99G$HI7kJByLMgyzV|@6Q>7xPTaHXGekSrk#!}*HVK)A@sl# z>QtniU^l#$+W}aV*PAx7wN`)o?+MuaQlB{U;5h1lAH75bKHo+&w5>fy;PGNWoh+q} z(SLv+R0 z1AWPTxb)vQwNamotV>@&$;8kl{4kG>LW~W|T z0bCy>DQO$YZxWw_vEitL$V=z6>}OD(dl*d5qQ4?}P?2fImra$=iRM5}>HB5o#xdY2 zFCfk%w@higlL$M|dTfgf&IEN&rFzR4Q&0#;Z2qQ8VII~9o~o+s646SqbyF2T-0Inp;KJ(1w+ z*UPQb%lSu@(FXU#!@Vyrws8LA;AeWuFC#_@u6)!Q)6w3QIG?_KC?+2t=w8-z3ey|w zEJOMy64C(|aL1o@7U!EaNAb`+{`Zgn?oZcVPD+^-f2aJDkC~ksyF@*NKiGx)iboe4 zKaf`0#-Z!>vK}=JP82*V~KBrpY;o zgI`W;CD2J^4YE{N3mjTDpP}U0;y;!Nk)IvTqFQ!=G_n$Qmy0)MQDgPMP+=g0&>_XK z-I@w^6sv;o`RD!mx-0bMxDmK-Py;+8w^vt)!w06*+*XwB5R|^+1x>0=zE#lB{gBlt zu(Cx2!t|6z?UJuT%!noLGQPRg#3{xm_Wv|^Z$I*3LOKcW4uHTwpT5}dlSTALgQX)=( zWlDbWGsKeHhbZIxGxSA>;5irMKF*FGl!6o#q1n@NE$h;8QlJe7ds)92eJv|Mm4a_+ zU`qalq2|VP-kw-v_Htia`BF=mW00&N1j}YtX?7iox9oh|<#UoW)9TqnvzV01+$xf@ z4H6WHtH7y!bp_=o{!CEdEN8EqH=`EnW48`-+BRPc438(V5r zf~t^=ewt}gY&UdL6%bCwudXAgA%(lvR#yN@Nbg1XuM(AnfzJ<;=G4hY(*MNT*P3KwFM)1s`sw^rNnWsUhD--*vAtk1SOS zoA@SR2kM}ac-A+%lf#`~2mZvo3p7b`{sf*~g(bS=fXx>C+myG(9jrPGrI@|vfyN9D zOf!Gl31g7*NbwZa1mG%XoyDpB$MN{#T7l!Efh9o{9nOn$`p*X=04^rlO>d- zTkuHSumO*&XB$1|=KgRr zjo4X!eZPOdwSD_~8MI5ai-04r#pY`Z$3P}K+!P&wCJ|)292pW&kx8ZxGUVD3F?S9i z!B?fTMjMlxkZ2GH(x_i2$8D7w412HfUA>HO6cy#;TAI|{hl)A4q*6e>!syFD^w9Kd zTv6i2O`GKz@ye4+b3$W5&`qJ4kR5VppyH7qCJ)y2RXd%k^_S^>F5m>a7IN$cCxAGY zBUm(#^~V2!1an|HA97axYC;}QJLnENdF9QA!(aL_snsad%2ys23JCkd9})xE<^l0D z+L@8@9O_V0MdHX{#=r$NtV~50rdhVqJAIYINS^EdVpu`Fl|v%3<7`aJJ4FrkTQjsD z=_2|2{7>sY7!(#*k)q^$3rlff*_oSe!Woo*T^*2XR-GPIGyA7>no;g~k9p$Tf2R+> zm}wmcc(2GdCI4G${(~_v0M1~to)mv3Vb)HI=R*->lt@s5g;2R0ov20htwI;ww$7MT z4VFB%&WoJqly;Fh4mpD-Wq0}&ZebrmH`|(iO^P>kEFR_FWQ%=nzW=*@7-7yc+_4%? zHJ^qJVhe?nqmL!(n~>K{ccMqHQAd;s8>@%p1(1(#(Q2!wD_42h6Nm`>0J9!2My#TT zQ$vGWE%T7{$r>2Rk;GrmJb*t^EhptX)yYJlu~W_U`a1@%=t7oKgy%x;w78dh(QbD> zn$mXkQXC*1>#XY{G}w<^QUXy3ks1w!ukYeK2b)mg?Tt*?-U(V~f zFC$y8Ti>&>mQLT#q|r=bL=DeA0ki)2j{}v2w#-nq*A1t1x4|E$+t>3`t#yBq9M?T7 zQU2|Wwqv1aH8w6`clVsoboC!Y1_L{2ZdkW3xQG%L_7DG{bdUs$;kQ-dVshC&;5a*% z6&00GrXDBDPh%{Ex^m5+W=%{MW$~;T%8E1zkhAlOkyg_w^o{<<7|Q>L82)svNk&Eo z>8Qr<-bX9~?z=F5vnm3oqJ+e%^eCY;joU{s7=(*R0!O>Bu1iqNl(u$*XVsPtb&U%^ zdV-WD!38Qx{VXZhjO6nC3|r}&aQkoSPEXn$a+1~L)DVYZR_B$fjbvX@Up+K$*lGoM zv$|%o#z5#1Cx6qWFYU4zTvZcN7ADcdE`i<^;F&W=P^g<^EZ8&%*&2t=D!b{3KLi6a zNz43jg5U>7ERO`?$?@I~1uRHDSmP|Yy7jz-E2viFGQZ7?v#$|?kwUkYZ+XR5aK>q^ z@74oZoPGE}U~J)>6hsmc!3f)XjohyhrZjRxyX->?mGo4?$xhE;Z$F7q)(IsnQzuio zc$D=~$)D}Ham~#hUTN_6<;=Y*R);AFn-|?qS?!S3DcHWAlDgud;|t$LS!fo!_Z~t$ z)IhO1z_4>Fx}-}tCWRDUqlmvF7|uO_(<>3Wv}RswLROWQEpWJd=kVrwZ;sr@M#NzE z?jgnkpQISrVXF3g0oT(Ig*yZb1Oicd7;SV;0~nIa^ZWm$w@J8+JZ&y&=nqj(7+iTj zKSsOWP%gkJLBN%fDD7B*mt($;JBqQsA5RhN9D&mOf!sep#`4N${9O;E@GvBFhWh)| zxlG*ws{qLQMiqWWc?)c?ceib-gX_uOt~CSIH+a~0YRM0TJAQ@*oipiqeWsKCJ^wiF zgQF)~dpao6%=I>0zJsP4SxrXTAQxmN`oUgP3&KBY9B)L9*e2%omMU|Sx z^ONIIo=ADTzoF;QBLmw&lkgS%K~4;sfn{rW>X;1D(`rCYc5Ogo>u0y*@(ncc&wwx) zEv#egKy%=aj8~8Y6TunLDaIZaBWhkiHwd1j1VeWeK_QCj|1;2V+V)VE)X6?EZMKp7 z4?>hJ?XT2{=&7sQCA{0^V*1v1ZO={R(bL188p|K^XC9akO&9^PUD;k3)-ds(F!kAF zPB7y6US#AXxN@A9?dqZ@@lHb{>3}}#)ljA&4i=Fwk^`_Jw(?2k-nu|z5~ce=ji!NN zBmV-#K8)ym^{oCQ+!p00#7yI`Xx>XFXCe0FKV;xVYx`H(LGy#*&U3~s`#EcJwHmH2 z5njh10#JJ$WQn>NVSaZVdaacV#?OsV9-U1;b#gS)H^fIFPZO$tjc_qO3Dgl612Kvp zG?0uwYFph8S{xtxip2pz;trcCabA)%={{>guqrluf8#3J(TZs(9MA2#TC!_dpH_VT zefw(9woJHuK2-|rd_!U}hm`E01W5zKer&xW7;vzV9}SK(x2;*(#W146>xoL3h}k{Y zKRD%GPNHm^Im`7UOTVI`{Qwb~8dKHT-gLcr%egKU8hGbjS!5H{WyjNDgITUFDj4>A zWm1iY3%|db1{8%+db&m$?w9U6{leu}AXWNUkz{n@08m1Vb89x<3;oqnr>!Wnz|gA) z_KwXb*yCw`%k|cAwMdMlR(^ECpBkXQFT3rEr}2vu)r!@gGn4Q^objsVr56{8E!oUB zo=3WV<-^$$HGNK$(rtTiaPocy_xh(dbq0Qp0ff6O{U?0IK$CtaMoIohV+8+?xpuaR z3jS5^FJG4`8Y9^hRAXTmV;Pg1o9Z8v|F@%L{uoo9!+eUd_S5(A~SwPI!~eoSa$O7 z&38u6jL=`cjGe1EFOrMoIhrRdg#$4+$fmu>9phf_rd_&UtHQtK?oa7$i0??M6PY<7 z3plVi>0%F30o5YXr>i&@&Q$~Du)(Gx#q(~>=JUD_QD2Mk6L7n~+hWCPgQWI<6HD|_ zSiY$92UCostSjUQErn_^*xl>Iys9A-sv3NSUN~nfcEln)TMzY|vDdzHr}2C$et`lQ z6zlg;1A+W6q z9-^*mMEmU%LGK6dLoCWY=kVqGFm>bp)bQ_B{x>K03lYABhC*)DK+OdO!)>-ejae;X z;Xatcf!P@nMd(eDG>Lu@wGvBwTEfT1zOGKS13g~dytesb%-eT)X#XFGKO@81alFXj zRJ^j&VJFR&{qj1tM6<1k?F_%%B3IhXCtXx)sue_Vx211A2dxnvlBWA}c@RqXt&r5) zPoq2N4VZHr>HFunhW)YL_Y5XMWf`$oUp_6Vx2a6{GVEIxm|r0ud^G5e!T(ZtWp|>x z@mdZ1TpRl~M+9KpFU$j-jA)oq?5^ytXwevLRQ#hl_q0XFlvGDWbjjxCSoBWz4oRKE zkRU41=oi;eKry0|z>VE%0M5G{=nN15f?ldjB$_lzlk_SyV_Gy!G7NMXU0R0v8dCWb z-ysS#3v>K$`Jv17myh61MoXqT)MI7X;ag|M8F2PlU=Dd*32_LHQIMOl>z&t%l z)X>!7+|m{jRuSY#f|}%zAQWguu#fMv*#Kt9*3u-ZGEA_mv9uqfP$MW$t4)WqX*7?@ zgiWcE^QPXKOEnCwI3F;)4Bdx_F7&Uk|6rzgXH+{b9^=InJ14)t*>@&qE;cTV0;WBY zPv(L?1$i1rLVBJZBDUPT{@L&kpF}A~+JS2PQBRbsDiW@UeDD(4;oRo~nA=MqZZBBh zurd|nkz+>V6)<*E){Ef8m?Xn(U-`T4Pj5 z=zh?s9;!>1Y)(C13CO0H*2;cQU|=_Ni5iVniPm-;eeexMUKuC=h~o-#}TO90qa8bk)MlT{6lo z)X+NDEw7$ezP-6-{l^gbQg=2FxH2WU|1@)`b|1oZlwyZXuSu2@&Lm zIB6l8`U3s=CoO&t9B97DzTgfp?hui+aru+{dMHmDJC;-wO3j=UmCB$vB{w&vSPe8p zP0`CR?#oUbs%n;1S090a)DEK*okO((0}rSTNXqw^YOPS+3}~YfSSx5F0fa47;|>xD zcoGj%Y2!DlJ!sMl0x_hig`J~k(iH*+f}52EiJ7Cly@`XlYZ3_}KRleZD~Xwjot=d_ zNzzY53Pe{63wu`*H%Af=6BqBK1VoHRJM=54#w?N=82%xugi8`{peaP9UU7g0BfEYP z)T3ylqe#Rw6qJH0{SBmZOwM%aF50ftnr~KU4_nxD_odE&PNjak)AQzfdt~5c;pAx_ z<)1TkeK(`0akyeDVLKR~un)pzw;{f$v3eo$=7pfix!Y1-S;oj9T45>PIJsMBCLU*I zAeD_yCQJRstBA&-To;>7*a=ug4LLs%jBlWCCv8$>gXzX7KPi&{WR zZIglh7^DGhBgQ_ZZg63rxZh}F`CyS4bPI$-Lt~*)+^};VXhst8d_fA1y4*_vUJg0_ zq`o-Zdz%2n)UsH605+WT`aEwuE+K#SPkc0r-`PFN6*|LK>Jw-);ZSp0bi*#fvboW` z+X_shmL3db7HpE)UgOg}`KI|T(`+dX5jUf6TpYDPH;ldDvbmS6(Im34ya1iqv1&x^ z#L)W^@_R(*#u6F!Dp#sxrK0Epy%Dou3VMD zR4?DhWh3>1DMG07qu7P5OA1CqUVgiNc-hEXVQwWBI-uIz#?LW=sSowZAVpY4bC{*z zono~9y5MCy*Yv|As_JO4AIYHjt(vpYXi2Ye31L|?8my3ze|erdh{j9D+M4V&EoH5_ z1a%|fK256gT=X>e*Xz`6U{_P?*{^y!vEN$Y^`J@_$sYRK+^^$Zqvx8S_5+g58UbDv zPFpV?umpuk1?HmfH3@vMW#7~OAI{YQ1oANKZ?-5v;lNY^!;*vJSW&? zfRggrPzH)8yQ3?Es2^Gv_m0`B&9VrW4bnjCE_QZQJk$YJ5E0Pn5ickUA%YRgih7Al zo*`ccM(&P^0UoOb4vx-xQ*z}_^ytR?S=uSTkBjHH3yR@*Kxyu{J9%9fJg2GIRS~z} zZOA-K9Gx?Pf6*(3Zp1Ucb_Z+8B?sN<3g_&!c$k}wt1bT?t{VVkLE%nN={$p?( zd3an-YC(9}xERZ`KqX{MYDnUFXj{;Wd^E=9!pcDbC9}|iv1*R}wY((IJ*Tp0l7<#r z`k9v@$vOqDnN5r|0868FzqIT;{~_;3WXAyX{MI?ApEd8-BAZ=>uP&KT^2u9u7u|cf z8@Lb8#Lm&42iouCZ#oaPC-`F>8#{+UV1u0Z)B7z8F?{yIw`0j;WET+jb|~sS3S1!c z75|^36=Q^!DX~ukj*KY|ZaH6LT~}Ez$IS(;5w82tFpGT5VAKGOEO@7v(n$RBrxS)y zV3tw;P@g9)WIj^xg!9Yw_RUMci}#)L)8lfRJGeY*C=`}8q`WA61{0|!fnKi*71^-_ zj9N;tdISHMgg}tISp~l`L_hMSNXWpvIwp!~xrnrVytDGcdB<8-57%EH(4VF};*2@S zAkG3Rie|x1dKS#avLjVJG@trM)=Ccou8pj>ypJ_(u3fYSAbuSc37? zz97ZHW zyir_(phXvwGCo(PYx|Yvw6mGlV+T~O!0q7%1ok>02Hv3;4BiHAbicH=ST@iJTheMsnB$^6fWKaT=EZ`bX zpZ?#s2Met$r5oNWyn1*IeIe{?X^4`=OoCSL=PgTSf1peNekOhvpJb- zcCXdXLdNJAg6i5?moT~u?%JS`l+=@`1hY#m5_z~sE%g@Q#dpdiZga_l1HaSuY+H`T zpHTQ7T__b6EfD=iXVW=@ndEIaaE$sySF&_>7^WS2t76?toL~?}8c|jAU^ZB-8m7mg z%*vIqITu*s?Is@XcqX#N+ajb(wz5#=t4KIWRWq!?Rz&iNcgsxBZ48sqhjq?JI*pVR ziQvMwl%DKn;R|=AWV=~q#5?>aqgac9b~4)>bUdPtS&{2d?gh%{6%?K#j#br@sgi(% zS#gi#Oq}}$&@j-h0hcTpFRHqLH?V(iBX3VWf+~4)q)9*NvH^CN*d&&DP{`x6E&E)= zI8Lx;wmRpz6A;gPH2#vP;fqKkRVQ=R6rHINVq=MYYnVUVTB^f({j6x*#7>Byn*khx<@&wJCye2+K)_EC2>qWTquQTmz8ks zSZntPWYIM9>ZkyazYIl2CSa_G}0Zp!9NxUFS)d4167GE*}0}_(u{~0R* z4T}Z)lOFMM}GeCr)Nh?jsnqwRHpou`XGg z41Ysw#os_5=6`zv2g3^BzTijLdb%lNH%{zF7mkA9Cyv-Bn7aaH&HpK!QFr#&X+ceO z0ZqC22j_vMBQ_&243&GNFDuf zA+mIJ;+X@q1*2DZ2n7(SGfH=f3ZqvL4f>EPvu9{XhZCCm4IlE0IwYAvwsSYa!Llh~ zVK#r6ex5bz*PBfcIO<8X%Z zMXi5R85BXP2rvz4%c?r3oE9i=bZ9%HhTAY7uiN5fN>3@DGx2zJyb`y;5*kD$Repyd z1&1`I$ssv+>>T*q_z=Gsys!EGoiXPxoO2?m8$lS~Q$#@wGno9%_Ajq(dQ)BuTZ{q- zj`|Xiz@tFt3NM6|W!nkgVmM_%V-U8C^_C8jw!tUmLt?CO(RhfO!Hcdo#$G#J!d`C- z7c)n!4@c;?ZGt6t*f&ir?$nj)7X?`gpaf~kvjtiQ9vqvov4pS`yc*R{Ty-^$5F4(X zAm0>ND;cQc#F~4vuWjy&g@gPVFu07@aoCd>D*$i2BzsOZLR}TRBp>==>dh$7Vy=COODe7^CQ|aHqm_|MsyZ-bKczzvk`;&Yq*aL|%h0glh#;rZS;-{DBqNwBYw zm4NKt3y4r)g7;q3Bk3rHvv5d3RX7zh*%6%7EpCpm6s_i}nk47uibnq+Cx@Xrq59y) zejm+NdH*1b=30fRTAb#+VUKGZ$;??O57jswNGE#c?ss=`n5D`#Dqv{h*Vx z<P8+hZsvLhcENgz zo-$1X*T%q8aw?EPNUEAWIN&IIuke<%1%9*h|2?S_CqKGO|MwK8Boms}_pXxF@{~1Q zgAJ39gNYwxKu2}#|3blj%!i9X*)PZ~H^~2YwyU}W@BsUZ7?4|C>X1*Seh6>>{~2C9 z6)fNS%DYF$1rIN13I<|&%wu|mnJN$D`{KI)%c%j-Uq$lLm^NI~gK_F)G-^Y$_2b}m zEA|fOWi^iGJ4I82li8)lVCDQXz2r+s7tK94*$;x>ncoc4KU}Pq&;$zAkszDR+e*L+ zV4JPEQUEN^mo3K8#g~}_XjdFrB5Pn*a$FPfX{T*6gYIPzo6;ZSeY>-X514v!(D$6x z^cM2r&z$@MiovW+MfAaX3cxqAK&3Ps6As+($DjHMu|51++$|wvm z#R}s?sua&6_|;&kv<$9PS%;%Xn%B>Z9P4l3%lphQUwUn0>!bPJs?3wLrTO(1?_0f5N!*3RH zO3bLDXl^<2+ei`eGkZP_M>P-9_0SM^jIvz@KQzeQ3Y#}^7iMWl-kc0wtH&XF~_S#FqTv~M*@9h*wG zia5qsB8tFP(&zd0lBbL=h_k=;3VpiaP^qWo==fvj#P46%)x)#X8)Mgx)4+p}Atc|W z_OrFbB@P(6uWR4ApO;uKe~?H7h~UMd1_~EY9eEJ;7-OS&KaOBcH_Pj~Bw1cO)fi2UPZIT!P5`gcbbvx;krIkbIz1Yx7d@Krn_ zn~9WN{D?;{REGIori_yTk7KxPL;*zP&6dCJGW?}jpfU(rxm_e5W_r}M#+W)zO)rPQ zK0;(g_KI_ZHQ0i?6>l(XDRBDd1ZVv?ZrH;ZcrEcM1izJfF`*XY>r3;`HLL7|fMHbm zI40(RrVP&eEIdB{(I@2ZpIyx+pGZp=^|xB3B5@t|qTAFgWYbg^kv4aD(n?#><|()E!J zDsCiF5xSI)NhsDm>JW4k zIB4qlWb1SiJs}tLl!p?tF=M-0U{hoPN$j_E&m)n#aSq-1a$!}Y9gmLaon)){9XPaV z#(-rGUWK47%(fC7C(xptY*RqmQq^ypQ$BwL!G~sbgr2xC7Jj}qKCh! zvf3So+9-Y>PCarKD?9=dagUu%u4}nG(Oxr|G41LOArqte5EV;wFW3+*YjHQAp}}G zt`q|HHbUjDMCaZmMf73G5U1!~o7=t`L4Z?3Qy0CBjl!i)uQUI*KAc8=E2FNGm-;Va z%zQVJ{NUIR1l6U6v%Rt=-6T}j^zg#Ssc6MBhSO(W_AWKfxEfQ|JSLaP$-Jh+-1(3` zxeYEbF0Rft0=qUPDlsm_8|_6%8SQnHsxZMS7n*xN7os#R$bCq(@1?z0jpbG}?#7p!r|aq?7zyqwu!b|Gt;G3(4XJS0*1IN#@?RNu)qTu2LD zAJ^e7K`l8cx~yd{uapcJPK&#C!C~+A)c@7lIkwjo^;>_(HX1ZWV_S`OY&JF<+t{() z#4hk0ZoihN z<*LI7zzx)TV#(E*mgRQ8YH@=E%p_Hh2>JyJ(5_QQ)eLtwXAH-F|CI#rGKt}Q#Y%cK zFNj&2gDz+1&=_l>1Qe3fvnFhDMUC=-s5P4YyiiA`WkOTJBEBKzLiC-nXJfdn>VDSMUFphiU;p6U z`Jug4_z`5)nJ7bQ$rOklGNeWYlvx-#J|CdCnYnld`N?nDE$g@HeRA*|tthhrIU_?X zR(NMMwTTT9bmP;Y;{fW-C1^wE)w|IPmdD)AQZRhzq%iZu%lc=GT;tH%C7x_VN;#7Y zr}W)cKVBA?o%hSf&;?Y|P@xO9OLG+>tY3WX;5V-|yACxny=I1-xn;Smu;+9e-ah6) zpEYVz5E9&?=MH63Ao>BUz(fjOuK&|uDJh{!@qi&o{@n_P9V5hw7n^9w3g|DP`rtu^aWj@yUWqM3gBT5?PV!QC=$Xy#%RRKsd z&r<~#qhd(KNGd$7@K;G?cvSFgV;S)gy8)HOWA7v@agO67h6#99Qm>#0e;r;^ASI~r zF&kF7avqVphB&u5cG9Mzu9n0oSIRkA#If7W4)seO2gpQ8(8?%k`bg#GD=}AaqURPq z8aVjL^}wPJy$!?cPY1&gkQOdD+>XM#%rJ6*JH9@#XA%NHD*U7Ozx4ie!(h z*o71MTD1pC^L;`hHkp^l625det}%os&DKC)Dp5@77$WPX5yY9ceBh74G7KQ~+xbZ{ z?!#*JrrZIec3yP&{SbxnfdehIH3k%e zuOCI83W?puUc*Ji<79YeXw_i}MS3L~_7fw9ZRgwaBvB(g{eA7_eqC|QMEl%2nkREn z3BP4i`KdYzA=omdGCmhi5G|U__=M7j=jmp8%>3j#@fnT1WR( z+C(F`40^SG%00j)F)2xdkJ&|a8wdwp{7axn+HRQWU>f?X-Ai#r!aKZj>msxNC`VM~|dcY?5+2>J_|Jz0YQHiA#HrI-Ba zvzD$r?y$ba_+pl{Ac8VX-Gp{3Q#vIz*IyU|TFjZ)~4gwXfsVlAN|IA)`G=Su_fHjOwQ5a5a$>k?IMm|w)agPW@gpbcC|iX{ ziJ2l*mFQ94Kgk(Wwq~Pr$Ijlpgnq|_Hih|teDuQA;Tc%$UM<( zy)9u6acJVUvdYV|O<$$uRl%L^`;(=G9y(vP8LEX*ZyKCNdf=CKd{tZdXp0PMDpxtT z3e&n8XMYMs@w7!t$$52Qfi~rs#)cv)g=a*keoNX?WHH>SnXj9Vf zCHJVK=F&)=m^cjTrpchzn8eX`M1DO{ESdLa@x?v8(7{4Gp%PSA*L<*floLyn)j;|l z?G~IkbBZbUT(32b(7N;&Kp*+shJzco9DIO@sJ*6^v=}yHF(FU!BEmlz5Y|A-FK5=y zc0TA^i)p$~Ag<b;?t&|@1iwYp@%(Tj_ht?Ls5g_>Os%?B;R03D z&LFRmPL`<7|6GNgDN_XamPc<9Ps5qtmEp2xBat|1m*)C`lV4N(VlsW}&?mMxz17v< zN2TXLsGt$GT#+f0d$>ZftYW|48tL!q$)`rLxw4h2(zL=}_e;t$qd>pE7au}dhtg5c zu4arf$<`{1t?6>sMLBHAOjIVJ3J>||LqT01?U8|w+`t&M5(X}RRqTvP0#o}Kwqr*J zw9qH$)^P*UoKqZ7FzlBpc3RYr(-t=DA$RA=s?HJ^ShRLj+156#{Z|A#?Kn|#7HKc> zzFX|!B%Ac9TrA{N9=|t^S(b=d?;qFEozy6elh@mkn`Y1@$Y8$tG<>UCa-{XJCk&$|pKQhi;@LpF9{YyufbU zRw~Cc_Q+0kpf87qA7!RPSwi6i)pnr#w@3b(DSY<%xtG7csrMl3Pyo#LhDGtAw8Hs3 zE@nN$yK4EG-sYQUdqGuzUb3oF^$*GuvNEn92a3hDOpSy}HJZ5khJat3NEs%RV^bgR z=Yo7(y)9T=kRp>vkK+UBW{L^j!NOsY(_pAAnZ3AuH8DMjdlNc13=06dQ!@_#*-;z2 zusG6TCM!HEv;Dk+Oa-K@{96>$ukzFsJMv3dtbM*5Sgv0EbV_*ch7(23?OHu#;Rn2i5uHRGHVD z2CT_;iz+`I2pf~VcqnD z+xnb_2t4>mM?SZ5lBxIR5u@eIN`D>$#Xla=&O^2CJzyi&??ZB%o%EUx77N?I#q#Ok zsL%t21O06R9!ZUgXQfd>MpbFHb=UVKLG) z>v{pXs^Ri*_51LELk7f#J2Kdt`gu}Mj}VkiHkV3iY|Ht#o{N{nl?SX32ZoNdTMxen zM8DBAR=x-9?Vn8OHT&O372K0HS}xKSSogETqe?DK(U1=oP1R`#MF_K0v%o+XUvl`M9vRNy6+tY9-0=LTq0fe0ihG15 zj_ks>?e0@yue)>2wXWG+syh-tfMP4&IsMescW}TF*e&2;zWir^*8;MN^$;RlMzG>w zkBMjM!dca2QXqK>a=4@_Zm5K)YD0k-y&I~eiVW=+Y7#U$RP}^tLN&CvN*g6q%*Z<` zX&lWH>qe$Ik>&EY+KZL~1PT5lT*Q*#xU&zu#>Ft$!PzN@*g{$O6DCfd%IpR;&j0Xd zu(9#OFnugqiJwc0x9dw>KM#2;AF^OG<-E`?K}D`0aQfH~wn@+&YFGxKh${nL@BS?c zZ`gG(@a}$4`%0!kQ5=K$WA?tSC1AOOJDN3!7eH_Wpbqu@#yFBXwR z<9f}z-2i=Xy7bM)eoc%(ujTd`1)Hvh>I5bjLL~AvejV}}QbOm4iyPkGU)cO7Eu=0r z4=-e6hk**0nx~M%&X?q-rv>@3bqL%)OrB|)|>dvnGZSO zuSlRYV=%9EM_3?mhVpl$O5iZ? z?!*+*n-34+y0Z$Rhn^0v>9#kgS5cZ6zwbCTCWz9C6uE-YXy5T=M$3vNow%1qkj0gl zyfmY2_EQX5EkUz;Mk8+NlI{I2@%+~D&6(L$KVbmUm1%Yd)IpG`x1jZcb*l+4N}aBu znsaaqPw2W|5M*(cbBDU*^J3ht z-PoySY+`>*9D~UWHicjCm?g+j-t@@EP-7qMI3;H z3jK0-ZJV8La9m6&MnW}BGmGg087;*@H`6QoD<=)`sJIkxwGh1qLZ!Vk4I9S(kK!}o zOQQ$q2^cIs!VZGa^1pIrSvNw~-2`eKJi=iTOc#rt==qpw96a=qKh_wEn8m+d6mC_I zw!UA&aAIPsTfkJbRnbE&+Q3Q5Qa372BoZk}1V*bhMwv7sd3x%#2eSzW4vjVsZ+y@~ zqj1+;U(H3lYM{20_HY;^AD7Zj%TiIXPuu?SQD-v~>9XCf!Un+Oqak~N7laBi;i(Az zb6ex7g(hOrV+$gh&r#!%Gh#)?_amK%OQ*DWf_NV;!{4Z{vFPSoHL?Lwj82Fre8^oC zTT?Hw+gYn;c~uGCWg$cZGUWHsTttV^VZNuu2`VX4x+w$E84DPgs-0-R(|Z!K9bVQfW5y$e-9& z;mb0!oQXeL4wk;M?DuvhDC=?3bfjFH5V1oo(i|*O2t7%LWYl~$pp#?=Jd*DC%sTpE z4}?ZROW>|5Nxj8QI(6k*W>Mnt^y1#nb0zAt%!|34uS^X5+O&m{VlUp4!1}a&gp4r# zR47Fbg8ndGVhqIRc}z3U>*{%1Aya~Lv$>QErh_<6)F&b05w0dy%nv$M`tl3VnC4O; zEVp~e5?p~P%vO*n2wIR@`TWdF*LQR(7J}N*xJEN<+CvfbgWc%|B^ZYdN1sW9LPTpm zP;F(n&ItD=I6em02R7|IKV#rK}X4rHdCMKDrax?B}#Ck*tgWo4NaLn`&{&~bMrcE0IhmxI+FhIJ5((h{L91jxUcoqhhtSvJ_mRcyeTgKQ(7YN zySR%9g*90_MiF!cFeCUlZR^wfhw7O=SoxIq6-GM;Qp6BjCGX-yA7Bnvx~7I@eoCKF zkGuEi+9G%7Q>I1Lk@Xke_#>bwHvzY6Q6Rc%v=g-A=(C{@I*mQGp7FXPOEQzeVY(|{ z052U)U$({% zs#d>Qd4k6tR+7^K?Kk8T-|ZX&GHU(%?uf0-?3hlVLc}23Xvr5T>v)rR7ON z^zO*wReKHKe}fcy1rI^Ny%a81cMT{RH>Ly?Y5aT9bK(LZFMSTE6@(Va67KX#5IIuG zkUAelgO&r_5ftynhTmc#V;cu|-*3xUa2GIOlQk52_yy2XL#h263Nn@Xx?;byHOIsz z8|m1X5j1t^4hmxSw@OcF57#;I8*CeFZXI=I-kYP6Fm zk;+FOz8xLP{g{%Un38ABt){OoPfJYwl3j^{D_bKo2XUIp)M&^|!>R$1qb6vO!QRNf zz`&m)a8VN#Sysq>#?S!4VbZlDB*;&lU>&D{XGk@hy6L>7=APl`#FTzxN)=esyGflf z<$w51#3#1@SXIWxuc8r^^tBNbw00<>x-}s!$t{|kjm&mN z8xySq1#sG8WjMjla`ws=PW%^EzzoN7i87RAgn=J6LM)^<35@pRoz z?%AsE8vB(i3fBen-4U&?zoz$t5i}Ba(yS*=zsdt!I)p#w9D5g$ks%RZf#l7iN>m65 zEHgPo#!_w1RoqA@L|S#vJK9D)1kLo#25UZTNt=D;hh=efARi}cBQkE%DhV$Y*8$NO zI8DH&BWMhUmT&P90QE~NIojzyl|J~Qn9Ci+PP&kSy|pVPM~cHV>+R$&Sx(&jE)MGX z2?rI}&Zxqi>!3Q~j^?&_$ndEg#a%Ev#m?N`5dMzAm%FfZC-C}v+xauY_E~k6m0Tk4 z~O>AoAF^Zom9nOXT>G!HB`zYfy|VYe?eRA zSqh&##I2GkCfsxfc%43MqC5jYvkNs>yFb#5Ej8x0IyPN9js+j@6P_o_g%(Ml1{^+d zT-@ugb=?e7LTTwV?MOBVvN1dxnxf_UGt{lg5^}pq)MBw0i5bh|E&17q-xagjnKy6M zH6PU}Wwn2!=U_mM4K0BA)|JONX+BObgi}T}+pGCSb|a)B?jqbb#~D&VO1`Xrw|70w z^gxa$lr!HDLHucqLvvi5kR4V5BUZsq;GPY|Hc^(_I@vXY+xWQhlRU7Tx^Q%Bq!Wq( zI$g*cyTqTxFk*RjVf!83Woj;D7MS?y&zKDEqBoHm0fzfk-Mp|*w!^9{uld~6H9{hY z!lRn#!M_t2Kg%*cyG9`>4RjVkIZc!YW|t;?i!5<@6gtAv^wutz3fKb@y(ri?t-8;Y z;jEjjZzs#E#kTK(ej@#RhQ`Xx3HXg4)Cqtj%Kr!OJkNFAPoQ8TnmRB_C%YSqO>vqU z6qcjK)74>j3IFJE@OR>us2^Yhj%-j)XkZmWc$UQUgW@e+aCu_ixyk~M=Z&OPR<|hF zS}}{25vWsX7BC#k14}v$J&f*kDSqoMFE`*NiP6(Zr+j#fTfN!qt08ZfNjD85q8pA@ zg)xt&4@PQZM~2{Rr?$efh;=}!&;h9#@YB{mGFC9#zt=Ac5=*dL)E<9{ql8cKngPwB z`t7qrqaJ*W6pI(25RF(M5Pf6&fvAcw78Iwh4Ia2+r1gl82!>MibhWJJcHDe|sa z?P;(kuvYk#-D0v!+9gO*5rjy4jKCHA+j!Wm*lApf+`n(9?`D1nqkZ=Blp_V`<)`Md zQv7F|dO6Gl#|FD)j9iFHKY z4)XcAQ9pO;rdW33wm^LfX<%VudV=OZ83;)rzclcJuG`=EVq-wq6G~a}KKl=aEByo> z8X4I}mfDcG!iwf@f%}3Gmcg*Mm;zHx_oWSm6sxhM5e62;9C}3wHn#4j>{?o+E6Glm zeUMy1hD01*w=6sl!_unpiKWl~%n`-AWea-p!}Zqy;ebB3ZVHT?%dZ@}X&3HrA?|3^ zRPiOt`B-{uNRkJiBioO9wJ;qX9^zmtyGP2?Y*#DNAefUR49XR;ZsipxQw-fm7fF4 z71TppKQkRA_B5ahK`^*^rvJg<9tnMSDLj}e&1?L7T~*ydyer#iK->008ds)vFmQ7{ zAhe+^OIuTc%~M5uhx4obH&` zQZhcvFIhp>llgw?Qb&0=Qo1J_&R!hsHqS(n*Pebm@)|LQ)akx*uQi)w+&eFq%jjZVNHrTuAj*^=$<<+e~jF};g8J9c^HAM8-uXnf3)N&rwq zwV_x|HVDzQREpXA0l)|yW*rPiY3&9DM3bv1l#xkMg9RpG+d!$eKMj3N1_43bI>0aU zk#v93KXFiivZJw;Ff}9L3z#^qPaHK-Jm@C$@;~tNp_ZRjLizOt%953jf3DnFnBAy) z^3r;Tf)q9I- zGWU>6(&g58W&5d`_Gx#RsuEcoc=PNc9*v97w}QTLWEnIO17;K@_ASG0%G)d-e9Io= zo-=I6wgam_Q8#LSlEre2Kv{GnaH{x`(q7SA58=0D2$~H>V>fdPDFc}otv7AH7;H`PnHbZ08%5ms8547*00)$R)aCfy!X&12ce z++Ao}!0*Z(s2ZD{Q}jFv@SD?g^nke!K8Q{+BJR6s@^^fEjEqMB?NL#zzDzU6*-p?7 zy6`OUxm>ZD9L{XCd}0?3i;2e`TQ|zN(A`hEA!03~=nyt6e&xD*9%;HP&dYk>TLj&G zL-`qx^F!O5D3{es7{)EFHfEWHt8G3wTaKr`5KT6;|F?2Nj5>PaM&9`dQy%YKXMhri z;=-GvXuzu%I?m<>s*}Hlu0uA#Lzutd*W z%`UD;U$fxnTR`I4@GE<|rvH)tN;1|pICRUPt?_=Q%lyYmbG97vs_vo|y(e2-Lr0^a zKLNjk;LMdgzS)MS*9u$QY|}D)YgHMKkpfDZOGg_v#tp4s{jXgxSn_SRcTz}%TwYI} zzU7-qf6#Ks7#c?2?9GhcEKkhvH;euRiGrT=os2J6+JVZj2gy8C`J~a%&BcT=t094* zaQXI{Aph+Y4rL_m!b=j_a4~{+6vW?_Dq88?8yn|!Wb@j_CpT8`&o1e`!t;!?D#`&+ z$#Y&RsgQ=Kw0L%hAvRQ?XAa0WNwkr29zME|r0Wj7S*8SXgZuGRgiWfdEHQhF;*~`NyAQ=OoyT;6fI~;E+if96@KZTqlD0GEAX35iE2G z{LdzXQE2wh9d1u_3@y~b$5m5lT4{gRNp~8edV?e)J`s=Y?oQ}@Rn)a*_Ca{3F!LKf ziX#kNAzljmCDOID<6vN{CodSXa`7@}&1$8_eq^vG$2eDla*b9z?}rucr@SLC{95uo zfa^0asp()279<8RC9E{ehAFzYU6xLY757dOI=8Uk6h^Xvvp*80ZHN%HF%(TTC+t5$ zoI@C^E-<3N0!L$I!~YXE``$JwvI!;TIz7i|I8ERRhKZk<#3tlt6|T-qUt)6uT}V;n zs88HD^$Ee(vp-S|ZeBHT+Zdf&>rk`b1r;?Wm;RnK2Q1q-vXb{Si@;I|3+0RBR@mzi zhP=OErQYKB-FPzjvb-SJl{~IoachN7p^&)u^T!#IQ8hO`L4`VfQA+>M>gAQ-C@@9m z`K!u1WFwR%g4w0Yl=LN3=e*M$y!H;B{YPo|+EX~&n~qTnUUw2?;>I|ueG4;iQpc_rRDP%X zUo+L9=Vy`|X((O8I7@5$rb5#2_Q~=og=~P(tJmnwwiTN0pP4^10q7t^hUnV1MA(5n z3QX9y`?GWXG7SHx%9o{S!O@^lLYhv~%wcl{O-4dliNtVMJsG3O?K?u3LB!8TB-2iEDk?@<3(*Q%3JnQgD z(-pshwpXp0-$xihnH6%%Hk3~ka)oq>rIpAtItZH})^ObJCB?DYUvC%sfBa;uX8U!)iLY$Tu;|_{Y2Uh z$vE0{cTH<{pwJwecWstbk$Y5wsoY`fFV^`wb1j66x#}?=!_N!vttCUEA74l>qO%%g z@KqT!uYK7qGcNu#iVKgr;KF*72MKJv8C-i&7BM|P?c&bZ`>%ydRG4MctM3PdW|WY8 zdz3IEv!Lo=KKk=CuWaESXR>DtEwe9LksUuc@DuGpwR^t|Xs?MYYj)y2!Ej@}vA!*h zZ#!t?rUv`zUE5DvE2ia<7b^&%DF3Sg|L2UT3apH5xd2^0dwACCiq*H1A^UI(SQEF* zL3dZKR5w8-Qt`(2;_D+#K%Mtl%iyZz?Ho9OJ(#EX9W9)3BwKZkU4apP^!NjSh5ahb0IkyTAr-Y|+aPIBWcd#a5M|M$G-ZVRXA3jH6*8s-kRl`6>@DLUB& z+R1vl1LOgmrWucr%;|=*^{$*n9MGc9;>A`pKF_q z_$gXkcBmA^HiR(@psHig>`t(QGvOgzl!X7n7{aVUKnX0>IX?zumBex^@xnq;`dxtG zc@$@~=h(Wz1_7n&{G8fcu@cFI)vl0!Fgq6Z{rl}s*8Qz*hd1#B_1nvdMO)r^;3diA zFYrEl-ypW<0;Xm1GL-7>34I|)yhtrZ!gJmA;}bUsMu8Bv=7}#NWxQ52J1a7kY^l2G(}HCM>vbLKn-P#dz;+dLn_2Dd>%wlBYL7A=M}ZIoyr);lAEG}Mv_&k{W2ZYE4+m&R;VK?Q0(o5osH zeGzFJ*Ya3sV!-Ai_5kFbX8*76>0Uq4CHb|{nEwx>9;AR~jo6;Otsd)qN>_FDu>U4U zdj9zU!|7ujG^v$8T;oN~sMWY6PIcrGTO$LmWEfEFK#&%@EcM%bpCQ!wX>CbiE&yX4 z+}0&ja4y982I)d{%E0_o{XIRU;=57i7yWFb--)Wddj{)4AJ{9j`FQyM03uwgqW}N^ literal 0 HcmV?d00001 diff --git a/dot_config/tmux/plugins/tmux-tilish/dot_git/objects/pack/readonly_pack-065e83563d291f0d2f14eb0476297fbe3cdcf7e4.rev b/dot_config/tmux/plugins/tmux-tilish/dot_git/objects/pack/readonly_pack-065e83563d291f0d2f14eb0476297fbe3cdcf7e4.rev new file mode 100644 index 0000000000000000000000000000000000000000..dcdd31ed10c8070b26bbd028aa777d9088fd5d29 GIT binary patch literal 1328 zcmXBT2e^+_90&0Ct?Meek%&rGNjKw$j6@NMqU>&xw2UHAsF1R8SlC8d(Qc{Xxtz-Ns{!Ww2<;jbs1h`;mM(7qIx)2^Nzj} zoT~1@0Ip&jZ_PX`54wpF5+g^F_Kp1#kZWspIo3_R4!!=<#>`K z94E$Vm}6eDo}=n4*X`d&* zVkXy8n#uZO|BLeh&3J>SF+VNL%KpS&H6-q2ta%Ofnai!T@TAA?_sZ>siF#w@f9I!8GA6@>?VBi%iO5Z<4qVSv24eRvNb-$-~6mxt{sV zp)S3Q$64)?_B^em9?i4rxVNKZoXZ4;@f3aeU4QJw0;bald!EGaX{WIYc>grcWjrHz zm1%s)CH%x&45Tyva61RMg-@wRywl6P&R#ljh#5Rjc|K+dUH#8gR_9%H88XyEY0e7X z*Ow!^$hb3)@&u3b887I!pQ(3DD{DW{>a-@$!tHUO`YtL pSviIGX7tV;u%!0ZBfHv-&E34e=!T99cZ{lWsB^x4lV`Nt^FRI^n}h%W literal 0 HcmV?d00001 diff --git a/dot_config/tmux/plugins/tmux-tilish/dot_git/packed-refs b/dot_config/tmux/plugins/tmux-tilish/dot_git/packed-refs new file mode 100644 index 0000000..64fcf55 --- /dev/null +++ b/dot_config/tmux/plugins/tmux-tilish/dot_git/packed-refs @@ -0,0 +1,2 @@ +# pack-refs with: peeled fully-peeled sorted +6abf7be089804a1d19a5737c8f9f7cb5bb519fc3 refs/remotes/origin/master diff --git a/dot_config/tmux/plugins/tmux-tilish/dot_git/refs/heads/master b/dot_config/tmux/plugins/tmux-tilish/dot_git/refs/heads/master new file mode 100644 index 0000000..e8bbe39 --- /dev/null +++ b/dot_config/tmux/plugins/tmux-tilish/dot_git/refs/heads/master @@ -0,0 +1 @@ +6abf7be089804a1d19a5737c8f9f7cb5bb519fc3 diff --git a/dot_config/tmux/plugins/tmux-tilish/dot_git/refs/remotes/origin/HEAD b/dot_config/tmux/plugins/tmux-tilish/dot_git/refs/remotes/origin/HEAD new file mode 100644 index 0000000..6efe28f --- /dev/null +++ b/dot_config/tmux/plugins/tmux-tilish/dot_git/refs/remotes/origin/HEAD @@ -0,0 +1 @@ +ref: refs/remotes/origin/master diff --git a/dot_config/tmux/plugins/tmux-tilish/dot_git/refs/tags/.keep b/dot_config/tmux/plugins/tmux-tilish/dot_git/refs/tags/.keep new file mode 100644 index 0000000..e69de29 diff --git a/dot_config/tmux/plugins/tmux-tilish/executable_tilish.tmux b/dot_config/tmux/plugins/tmux-tilish/executable_tilish.tmux new file mode 100644 index 0000000..c41dbab --- /dev/null +++ b/dot_config/tmux/plugins/tmux-tilish/executable_tilish.tmux @@ -0,0 +1,294 @@ +#!/bin/sh +# vim: foldmethod=marker + +# Project: tmux-tilish +# Author: Jabir Ali Ouassou +# Licence: MIT licence +# +# This file contains the `tmux` plugin `tilish`, which implements keybindings +# that turns `tmux` into a more typical tiling window manger for your terminal. +# The keybindings are taken nearly directly from `i3wm` and `sway`, but with +# minor adaptation to fit better with `vim` and `tmux`. See also the README. + +# shellcheck disable=SC2016 +# shellcheck disable=SC2086 +# shellcheck disable=SC2250 + +# Check input parameters {{{ + # Whether we need to use legacy workarounds (required before Tmux 2.7). + legacy="$(tmux -V | grep -E 'tmux (1\.|2\.[0-6])')" + + # Read user options. + for opt in default dmenu easymode navigate navigator prefix shiftnum + do + export "$opt"="$(tmux show-option -gv @tilish-"$opt" 2>/dev/null)" + done + + # Default to US keyboard layout, unless something is configured. + if [ -z "$shiftnum" ] + then + shiftnum='!@#$%^&*()' + fi + + # Determine "arrow types". + if [ "${easymode:-}" = "on" ] + then + # Simplified arrows. + h='left'; j='down'; k='up'; l='right'; + H='S-left'; J='S-down'; K='S-up'; L='S-right'; + else + # Vim-style arrows. + h='h'; j='j'; k='k'; l='l'; + H='H'; J='J'; K='K'; L='L'; + fi + + # Determine modifier vs. prefix key. + if [ -z "${prefix:-}" ] + then + bind='bind -n' + mod='M-' + else + bind='bind -rT tilish' + mod='' + fi +# }}} + +# Define core functionality {{{ +bind_switch () { + # Bind keys to switch between workspaces. + tmux $bind "$1" \ + if-shell "tmux select-window -t :$2" "" "new-window -t :$2" +} + +bind_move () { + # Bind keys to move panes between workspaces. + if [ -z "$legacy" ] + then + tmux $bind "$1" \ + if-shell "tmux join-pane -t :$2" \ + "" \ + "new-window -dt :$2; join-pane -t :$2; select-pane -t top-left; kill-pane" \\\;\ + select-layout \\\;\ + select-layout -E + else + tmux $bind "$1" \ + if-shell "tmux new-window -dt :$2" \ + "join-pane -t :$2; select-pane -t top-left; kill-pane" \ + "send escape; join-pane -t :$2" \\\;\ + select-layout + fi +} + +bind_layout () { + # Bind keys to switch or refresh layouts. + if [ "$2" = "zoom" ] + then + # Invoke the zoom feature. + tmux $bind "$1" \ + resize-pane -Z + else + # Actually switch layout. + if [ -z "$legacy" ] + then + tmux $bind "$1" \ + select-layout "$2" \\\;\ + select-layout -E + else + tmux $bind "$1" \ + run-shell "tmux select-layout \"$2\"" \\\;\ + send escape + fi + fi +} + +char_at () { + # Finding the character at a given position in + # a string in a way compatible with POSIX sh. + echo $1 | cut -c $2 +} +# }}} + +# Define keybindings {{{ +# Define a prefix key. +if [ -n "$prefix" ] +then + tmux bind -n "$prefix" switch-client -T tilish +fi + +# Switch to workspace via Alt + #. +bind_switch "${mod}1" 1 +bind_switch "${mod}2" 2 +bind_switch "${mod}3" 3 +bind_switch "${mod}4" 4 +bind_switch "${mod}5" 5 +bind_switch "${mod}6" 6 +bind_switch "${mod}7" 7 +bind_switch "${mod}8" 8 +bind_switch "${mod}9" 9 + +# Move pane to workspace via Alt + Shift + #. +bind_move "${mod}$(char_at $shiftnum 1)" 1 +bind_move "${mod}$(char_at $shiftnum 2)" 2 +bind_move "${mod}$(char_at $shiftnum 3)" 3 +bind_move "${mod}$(char_at $shiftnum 4)" 4 +bind_move "${mod}$(char_at $shiftnum 5)" 5 +bind_move "${mod}$(char_at $shiftnum 6)" 6 +bind_move "${mod}$(char_at $shiftnum 7)" 7 +bind_move "${mod}$(char_at $shiftnum 8)" 8 +bind_move "${mod}$(char_at $shiftnum 9)" 9 + +# The mapping of Alt + 0 and Alt + Shift + 0 depends on `base-index`. +# It can either refer to workspace number 0 or workspace number 10. +if [ "$(tmux show-option -gv base-index)" = "1" ] +then + bind_switch "${mod}0" 10 + bind_move "${mod}$(char_at "$shiftnum" 10)" 10 +else + bind_switch "${mod}0" 0 + bind_move "${mod}$(char_at "$shiftnum" 10)" 0 +fi + +# Switch layout with Alt + . The mnemonics are `s` and `S` for +# layouts Vim would generate with `:split`, and `v` and `V` for `:vsplit`. +# The remaining mappings based on `z` and `t` should be quite obvious. +bind_layout "${mod}s" 'main-horizontal' +bind_layout "${mod}S" 'even-vertical' +bind_layout "${mod}v" 'main-vertical' +bind_layout "${mod}V" 'even-horizontal' +bind_layout "${mod}t" 'tiled' +bind_layout "${mod}z" 'zoom' + +# Refresh the current layout (e.g. after deleting a pane). +if [ -z "$legacy" ] +then + tmux $bind "${mod}r" select-layout -E +else + tmux $bind "${mod}r" run-shell 'tmux select-layout'\\\; send escape +fi + +# Switch pane via Alt + o. (Mirrors Tmux `Ctrl-b o` and Emacs `Ctrl-x o`.) +tmux $bind "${mod}o" select-pane -t :.+1 + +# Switch to pane via Alt + hjkl. +tmux $bind "${mod}${h}" select-pane -L +tmux $bind "${mod}${j}" select-pane -D +tmux $bind "${mod}${k}" select-pane -U +tmux $bind "${mod}${l}" select-pane -R + +# Move a pane via Alt + Shift + hjkl. +if [ -z "$legacy" ] +then + tmux $bind "${mod}${H}" swap-pane -s '{left-of}' + tmux $bind "${mod}${J}" swap-pane -s '{down-of}' + tmux $bind "${mod}${K}" swap-pane -s '{up-of}' + tmux $bind "${mod}${L}" swap-pane -s '{right-of}' +else + tmux $bind "${mod}${H}" run-shell 'old=`tmux display -p "#{pane_index}"`; tmux select-pane -L; tmux swap-pane -t $old' + tmux $bind "${mod}${J}" run-shell 'old=`tmux display -p "#{pane_index}"`; tmux select-pane -D; tmux swap-pane -t $old' + tmux $bind "${mod}${K}" run-shell 'old=`tmux display -p "#{pane_index}"`; tmux select-pane -U; tmux swap-pane -t $old' + tmux $bind "${mod}${L}" run-shell 'old=`tmux display -p "#{pane_index}"`; tmux select-pane -R; tmux swap-pane -t $old' +fi + +# Open a terminal with Alt + Enter. +if [ -z "$legacy" ] +then + tmux $bind "${mod}enter" \ + run-shell 'cwd="`tmux display -p \"#{pane_current_path}\"`"; tmux select-pane -t "bottom-right"; tmux split-pane -c "$cwd"' +else + tmux $bind "${mod}enter" \ + select-pane -t 'bottom-right' \\\;\ + split-window \\\;\ + run-shell 'tmux select-layout' \\\;\ + send escape +fi + +# Name a window with Alt + n. +tmux $bind "${mod}n" \ + command-prompt -p 'Workspace name:' 'rename-window "%%"' + +# Close a window with Alt + Shift + q. +if [ -z "$legacy" ] +then + tmux $bind "${mod}Q" \ + if-shell \ + '[ "$(tmux display-message -p "#{window_panes}")" -gt 1 ]' \ + 'kill-pane; select-layout; select-layout -E' \ + 'kill-pane' +else + tmux $bind "${mod}Q" \ + kill-pane +fi + +# Close a connection with Alt + Shift + e. +tmux $bind "${mod}E" \ + confirm-before -p "Detach from #H:#S? (y/n)" detach-client + +# Reload configuration with Alt + Shift + c. +tmux $bind "${mod}C" \ + source-file ~/.tmux.conf \\\;\ + display "Reloaded config" +# }}} + +# Define hooks {{{ +if [ -z "$legacy" ] +then + # Autorefresh layout after deleting a pane. + tmux set-hook -g after-split-window "select-layout; select-layout -E" + tmux set-hook -g pane-exited "select-layout; select-layout -E" + + # Autoselect layout after creating new window. + if [ -n "${default:-}" ] + then + tmux set-hook -g window-linked "select-layout \"$default\"; select-layout -E" + tmux select-layout "$default" + tmux select-layout -E + fi +fi +# }}} + +# Integrate with Vim for transparent navigation {{{ +if [ "${navigate:-}" = "on" ] +then + # If `@tilish-navigate` is nonzero, integrate Alt + hjkl with `tmux-navigate`. + tmux set -g '@navigate-left' "-n M-$h" + tmux set -g '@navigate-down' "-n M-$j" + tmux set -g '@navigate-up' "-n M-$k" + tmux set -g '@navigate-right' "-n M-$l" +elif [ "${navigator:-}" = "on" ] +then + # If `@tilish-navigator` is nonzero, integrate Alt + hjkl with `vim-tmux-navigator`. + # This assumes that your Vim/Neovim is setup to use Alt + hjkl bindings as well. + is_vim="ps -o state= -o comm= -t '#{pane_tty}' | grep -iqE '^[^TXZ ]+ +(\\S+\\/)?g?(view|n?vim?x?)(diff)?$'" + + tmux $bind "${mod}${h}" if-shell "$is_vim" 'send M-h' 'select-pane -L' + tmux $bind "${mod}${j}" if-shell "$is_vim" 'send M-j' 'select-pane -D' + tmux $bind "${mod}${k}" if-shell "$is_vim" 'send M-k' 'select-pane -U' + tmux $bind "${mod}${l}" if-shell "$is_vim" 'send M-l' 'select-pane -R' + + if [ -z "$prefix" ] + then + tmux bind -T copy-mode-vi "M-$h" select-pane -L + tmux bind -T copy-mode-vi "M-$j" select-pane -D + tmux bind -T copy-mode-vi "M-$k" select-pane -U + tmux bind -T copy-mode-vi "M-$l" select-pane -R + fi +fi +# }}} + +# Integrate with `fzf` to approximate `dmenu` {{{ +if [ -z "$legacy" ] && [ "${dmenu:-}" = "on" ] +then + if [ -n "$(command -v fzf)" ] + then + # The environment variables of your `default-shell` are used when running `fzf`. + # This solution is about an order of magnitude faster than invoking `compgen`. + # Based on: https://medium.com/njiuko/using-fzf-instead-of-dmenu-2780d184753f + tmux $bind "${mod}d" \ + select-pane -t '{bottom-right}' \\\;\ + split-pane 'sh -c "exec \$(echo \"\$PATH\" | tr \":\" \"\n\" | xargs -I{} -- find {} -maxdepth 1 -mindepth 1 -executable 2>/dev/null | sort -u | fzf)"' + else + tmux $bind "${mod}d" \ + display 'To enable this function, install `fzf` and restart `tmux`.' + fi +fi +# }}} diff --git a/dot_config/tmux/plugins/tpm/dot_git/FETCH_HEAD b/dot_config/tmux/plugins/tpm/dot_git/FETCH_HEAD new file mode 100644 index 0000000..c463c9b --- /dev/null +++ b/dot_config/tmux/plugins/tpm/dot_git/FETCH_HEAD @@ -0,0 +1 @@ +99469c4a9b1ccf77fade25842dc7bafbc8ce9946 branch 'master' of https://github.com/tmux-plugins/tpm diff --git a/dot_config/tmux/plugins/tpm/dot_git/ORIG_HEAD b/dot_config/tmux/plugins/tpm/dot_git/ORIG_HEAD new file mode 100644 index 0000000..e69d6dc --- /dev/null +++ b/dot_config/tmux/plugins/tpm/dot_git/ORIG_HEAD @@ -0,0 +1 @@ +99469c4a9b1ccf77fade25842dc7bafbc8ce9946 diff --git a/dot_config/tmux/tmux.conf b/dot_config/tmux/tmux.conf index bed90fd..2f4bb97 100644 --- a/dot_config/tmux/tmux.conf +++ b/dot_config/tmux/tmux.conf @@ -1,5 +1,7 @@ -set-environment -g TMUX_PLUGIN_MANAGER_PATH '~/.local/share/tmux/plugins' +set-environment -g TMUX_PLUGIN_MANAGER_PATH '~/.config/tmux/plugins' +# personal +set -g mouse on set -g base-index 1 setw -g pane-base-index 1 set -g default-terminal "xterm-256color" @@ -20,4 +22,4 @@ set -g @tilish-default 'main-vertical' set -g @tilish-navigate 'on' set -g @catppuccin_flavor 'macchiato' -run '~/.local/share/tmux/plugins/tpm/tpm' +run '~/.config/tmux/plugins/tpm/tpm'