mirror of
https://github.com/tumillanino/miasma-os.git
synced 2026-04-11 07:15:31 +00:00
moved etc into usr folder
This commit is contained in:
19
files/system/usr/etc/skel/.tmux/plugins/.travis.yml
Normal file
19
files/system/usr/etc/skel/.tmux/plugins/.travis.yml
Normal file
@@ -0,0 +1,19 @@
|
||||
# generic packages and tmux
|
||||
before_install:
|
||||
- sudo apt-get update
|
||||
- sudo apt-get install -y git-core expect
|
||||
- sudo apt-get install -y python-software-properties software-properties-common
|
||||
- sudo apt-get install -y libevent-dev libncurses-dev
|
||||
- git clone https://github.com/tmux/tmux.git
|
||||
- cd tmux
|
||||
- git checkout 2.0
|
||||
- sh autogen.sh
|
||||
- ./configure && make && sudo make install
|
||||
|
||||
install:
|
||||
- git fetch --unshallow --recurse-submodules || git fetch --recurse-submodules
|
||||
# manual `git clone` required for testing `tmux-test` plugin itself
|
||||
- git clone https://github.com/tmux-plugins/tmux-test lib/tmux-test; true
|
||||
- lib/tmux-test/setup
|
||||
|
||||
script: ./tests/run_tests_in_isolation
|
||||
86
files/system/usr/etc/skel/.tmux/plugins/CHANGELOG.md
Normal file
86
files/system/usr/etc/skel/.tmux/plugins/CHANGELOG.md
Normal file
@@ -0,0 +1,86 @@
|
||||
# Changelog
|
||||
|
||||
### master
|
||||
|
||||
### v3.1.0, 2023-01-03
|
||||
- upgrade to new version of `tmux-test`
|
||||
- bug: when using `emacs` copy mode, Enter does not quit screen after tpm
|
||||
installation/update. Fix by making `Escape` the key for emacs mode.
|
||||
- add a doc with troubleshooting instructions
|
||||
- add `.gitattributes` file that forces linefeed characters (classic `\n`) as
|
||||
line endings - helps with misconfigured git on windows/cygwin
|
||||
- readme update: announce Cygwin support
|
||||
- un-deprecate old plugin definition syntax: `set -g @tpm_plugins`
|
||||
- More stuff, check `git log`.
|
||||
|
||||
### v3.0.0, 2015-08-03
|
||||
- refactor `shared_set_tpm_path_constant` function
|
||||
- move all instructions to `docs/` dir
|
||||
- add `bin/install_plugins` cli executable script
|
||||
- improved test runner function
|
||||
- switch to using [tmux-test](https://github.com/tmux-plugins/tmux-test)
|
||||
framework
|
||||
- add `bin/update_plugins` cli executable script
|
||||
- refactor test `expect` scripts, make them simpler and ensure they properly
|
||||
assert expectations
|
||||
- refactor code that sets 'TMUX_PLUGIN_MANAGER_PATH' global env var
|
||||
- stop using global variable for 'tpm path'
|
||||
- support defining plugins via `set -g @plugin` in sourced files as well
|
||||
|
||||
### v2.0.0, 2015-07-07
|
||||
- enable overriding default key bindings
|
||||
- start using `C-c` to clear screen
|
||||
- add uninstall/clean procedure and keybinding (prefix+alt+u) (@chilicuil)
|
||||
- add new `set @plugin 'repo'` plugin definition syntax (@chilicuil)
|
||||
- revert back to using `-g` flag in new plugin definition syntax
|
||||
- permit leading whitespace with new plugin definition syntax (thanks @chilicuil)
|
||||
- make sure `TMUX_PLUGIN_MANAGER_PATH` always has trailng slash
|
||||
- ensure old/deprecated plugin syntax `set -g @tpm_plugins` works alongside new
|
||||
`set -g @plugin` syntax
|
||||
|
||||
### v1.2.2, 2015-02-08
|
||||
- set GIT_TERMINAL_PROMPT=0 when doing `git clone`, `pull` or `submodule update`
|
||||
to ensure git does not prompt for username/password in any case
|
||||
|
||||
### v1.2.1, 2014-11-21
|
||||
- change the way plugin name is expanded. It now uses the http username
|
||||
and password by default, like this: `https://git::@github.com/`. This prevents
|
||||
username and password prompt (and subsequently tmux install hanging) with old
|
||||
git versions. Fixes #7.
|
||||
|
||||
### v1.2.0, 2014-11-20
|
||||
- refactor tests so they can be used on travis
|
||||
- add travis.yml, add travis badge to the readme
|
||||
|
||||
### v1.1.0, 2014-11-19
|
||||
- if the plugin is not downloaded do not source it
|
||||
- remove `PLUGINS.md`, an obsolete list of plugins
|
||||
- update readme with instructions about uninstalling plugins
|
||||
- tilde char and `$HOME` in `TMUX_SHARED_MANAGER_PATH` couldn't be used because
|
||||
they are just plain strings. Fixing the problem by manually expanding them.
|
||||
- bugfix: fragile `*.tmux` file globbing (@majutsushi)
|
||||
|
||||
### v1.0.0, 2014-08-05
|
||||
- update readme because of github organization change to
|
||||
[tmux-plugins](https://github.com/tmux-plugins)
|
||||
- update tests to pass
|
||||
- update README to suggest different first plugin
|
||||
- update list of plugins in the README
|
||||
- remove README 'about' section
|
||||
- move key binding to the main file. Delete `key_binding.sh`.
|
||||
- rename `display_message` -> `echo_message`
|
||||
- installing plugins installs just new plugins. Already installed plugins aren't
|
||||
updated.
|
||||
- add 'update plugin' binding and functionality
|
||||
- add test for updating a plugin
|
||||
|
||||
### v0.0.2, 2014-07-17
|
||||
- run all *.tmux plugin files as executables
|
||||
- fix all redirects to /dev/null
|
||||
- fix bug: TPM shared path is created before sync (cloning plugins from github
|
||||
is done)
|
||||
- add test suite running in Vagrant
|
||||
- add Tmux version check. `TPM` won't run if Tmux version is less than 1.9.
|
||||
|
||||
### v0.0.1, 2014-05-21
|
||||
- get TPM up and running
|
||||
2
files/system/usr/etc/skel/.tmux/plugins/HOW_TO_PLUGIN.md
Normal file
2
files/system/usr/etc/skel/.tmux/plugins/HOW_TO_PLUGIN.md
Normal file
@@ -0,0 +1,2 @@
|
||||
Instructions moved to
|
||||
[docs/how_to_create_plugin.md](docs/how_to_create_plugin.md).
|
||||
20
files/system/usr/etc/skel/.tmux/plugins/LICENSE.md
Normal file
20
files/system/usr/etc/skel/.tmux/plugins/LICENSE.md
Normal file
@@ -0,0 +1,20 @@
|
||||
MIT license
|
||||
Copyright (C) 2014 Bruno Sutic
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the "Software"),
|
||||
to deal in the Software without restriction, including without limitation
|
||||
the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
and/or sell copies of the Software, and to permit persons to whom the
|
||||
Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included
|
||||
in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||||
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
|
||||
OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
101
files/system/usr/etc/skel/.tmux/plugins/README.md
Normal file
101
files/system/usr/etc/skel/.tmux/plugins/README.md
Normal file
@@ -0,0 +1,101 @@
|
||||
# Tmux Plugin Manager
|
||||
|
||||
[](https://travis-ci.org/tmux-plugins/tpm)
|
||||
|
||||
Installs and loads `tmux` plugins.
|
||||
|
||||
Tested and working on Linux, OSX, and Cygwin.
|
||||
|
||||
See list of plugins [here](https://github.com/tmux-plugins/list).
|
||||
|
||||
### Installation
|
||||
|
||||
Requirements: `tmux` version 1.9 (or higher), `git`, `bash`.
|
||||
|
||||
Clone TPM:
|
||||
|
||||
```bash
|
||||
git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm
|
||||
```
|
||||
|
||||
Put this at the bottom of `~/.tmux.conf` (`$XDG_CONFIG_HOME/tmux/tmux.conf`
|
||||
works too):
|
||||
|
||||
```bash
|
||||
# List of plugins
|
||||
set -g @plugin 'tmux-plugins/tpm'
|
||||
set -g @plugin 'tmux-plugins/tmux-sensible'
|
||||
|
||||
# Other examples:
|
||||
# set -g @plugin 'github_username/plugin_name'
|
||||
# set -g @plugin 'github_username/plugin_name#branch'
|
||||
# set -g @plugin 'git@github.com:user/plugin'
|
||||
# set -g @plugin 'git@bitbucket.com:user/plugin'
|
||||
|
||||
# Initialize TMUX plugin manager (keep this line at the very bottom of tmux.conf)
|
||||
run '~/.tmux/plugins/tpm/tpm'
|
||||
```
|
||||
|
||||
Reload TMUX environment so TPM is sourced:
|
||||
|
||||
```bash
|
||||
# type this in terminal if tmux is already running
|
||||
tmux source ~/.tmux.conf
|
||||
```
|
||||
|
||||
That's it!
|
||||
|
||||
### Installing plugins
|
||||
|
||||
1. Add new plugin to `~/.tmux.conf` with `set -g @plugin '...'`
|
||||
2. Press `prefix` + <kbd>I</kbd> (capital i, as in **I**nstall) to fetch the plugin.
|
||||
|
||||
You're good to go! The plugin was cloned to `~/.tmux/plugins/` dir and sourced.
|
||||
|
||||
### Uninstalling plugins
|
||||
|
||||
1. Remove (or comment out) plugin from the list.
|
||||
2. Press `prefix` + <kbd>alt</kbd> + <kbd>u</kbd> (lowercase u as in **u**ninstall) to remove the plugin.
|
||||
|
||||
All the plugins are installed to `~/.tmux/plugins/` so alternatively you can
|
||||
find plugin directory there and remove it.
|
||||
|
||||
### Key bindings
|
||||
|
||||
`prefix` + <kbd>I</kbd>
|
||||
- Installs new plugins from GitHub or any other git repository
|
||||
- Refreshes TMUX environment
|
||||
|
||||
`prefix` + <kbd>U</kbd>
|
||||
- updates plugin(s)
|
||||
|
||||
`prefix` + <kbd>alt</kbd> + <kbd>u</kbd>
|
||||
- remove/uninstall plugins not on the plugin list
|
||||
|
||||
### Docs
|
||||
|
||||
- [Help, tpm not working](docs/tpm_not_working.md) - problem solutions
|
||||
|
||||
More advanced features and instructions, regular users probably do not need
|
||||
this:
|
||||
|
||||
- [How to create a plugin](docs/how_to_create_plugin.md). It's easy.
|
||||
- [Managing plugins via the command line](docs/managing_plugins_via_cmd_line.md)
|
||||
- [Changing plugins install dir](docs/changing_plugins_install_dir.md)
|
||||
- [Automatic TPM installation on a new machine](docs/automatic_tpm_installation.md)
|
||||
|
||||
### Tests
|
||||
|
||||
Tests for this project run on [Travis CI](https://travis-ci.org/tmux-plugins/tpm).
|
||||
|
||||
When run locally, [vagrant](https://www.vagrantup.com/) is required.
|
||||
Run tests with:
|
||||
|
||||
```bash
|
||||
# within project directory
|
||||
./run_tests
|
||||
```
|
||||
|
||||
### License
|
||||
|
||||
[MIT](LICENSE.md)
|
||||
14
files/system/usr/etc/skel/.tmux/plugins/bin/clean_plugins
Executable file
14
files/system/usr/etc/skel/.tmux/plugins/bin/clean_plugins
Executable file
@@ -0,0 +1,14 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Script intended for use via the command line.
|
||||
#
|
||||
# `.tmux.conf` needs to be set for TPM. Tmux has to be installed on the system,
|
||||
# but does not need to be started in order to run this script.
|
||||
|
||||
CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||
SCRIPTS_DIR="$CURRENT_DIR/../scripts"
|
||||
|
||||
main() {
|
||||
"$SCRIPTS_DIR/clean_plugins.sh" # has correct exit code
|
||||
}
|
||||
main
|
||||
14
files/system/usr/etc/skel/.tmux/plugins/bin/install_plugins
Executable file
14
files/system/usr/etc/skel/.tmux/plugins/bin/install_plugins
Executable file
@@ -0,0 +1,14 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Script intended for use via the command line.
|
||||
#
|
||||
# `.tmux.conf` needs to be set for TPM. Tmux has to be installed on the system,
|
||||
# but does not need to be started in order to run this script.
|
||||
|
||||
CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||
SCRIPTS_DIR="$CURRENT_DIR/../scripts"
|
||||
|
||||
main() {
|
||||
"$SCRIPTS_DIR/install_plugins.sh" # has correct exit code
|
||||
}
|
||||
main
|
||||
24
files/system/usr/etc/skel/.tmux/plugins/bin/update_plugins
Executable file
24
files/system/usr/etc/skel/.tmux/plugins/bin/update_plugins
Executable file
@@ -0,0 +1,24 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Script intended for use via the command line.
|
||||
#
|
||||
# `.tmux.conf` needs to be set for TPM. Tmux has to be installed on the system,
|
||||
# but does not need to be started in order to run this script.
|
||||
|
||||
CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||
SCRIPTS_DIR="$CURRENT_DIR/../scripts"
|
||||
PROGRAM_NAME="$0"
|
||||
|
||||
if [ $# -eq 0 ]; then
|
||||
echo "usage:"
|
||||
echo " $PROGRAM_NAME all update all plugins"
|
||||
echo " $PROGRAM_NAME tmux-foo update plugin 'tmux-foo'"
|
||||
echo " $PROGRAM_NAME tmux-bar tmux-baz update multiple plugins"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
main() {
|
||||
"$SCRIPTS_DIR/update_plugin.sh" --shell-echo "$*" # has correct exit code
|
||||
}
|
||||
main "$*"
|
||||
|
||||
19
files/system/usr/etc/skel/.tmux/plugins/bindings/clean_plugins
Executable file
19
files/system/usr/etc/skel/.tmux/plugins/bindings/clean_plugins
Executable file
@@ -0,0 +1,19 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Tmux key-binding script.
|
||||
# Scripts intended to be used via the command line are in `bin/` directory.
|
||||
|
||||
CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||
SCRIPTS_DIR="$CURRENT_DIR/../scripts"
|
||||
HELPERS_DIR="$SCRIPTS_DIR/helpers"
|
||||
|
||||
source "$HELPERS_DIR/tmux_echo_functions.sh"
|
||||
source "$HELPERS_DIR/tmux_utils.sh"
|
||||
|
||||
main() {
|
||||
reload_tmux_environment
|
||||
"$SCRIPTS_DIR/clean_plugins.sh" --tmux-echo >/dev/null 2>&1
|
||||
reload_tmux_environment
|
||||
end_message
|
||||
}
|
||||
main
|
||||
19
files/system/usr/etc/skel/.tmux/plugins/bindings/install_plugins
Executable file
19
files/system/usr/etc/skel/.tmux/plugins/bindings/install_plugins
Executable file
@@ -0,0 +1,19 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Tmux key-binding script.
|
||||
# Scripts intended to be used via the command line are in `bin/` directory.
|
||||
|
||||
CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||
SCRIPTS_DIR="$CURRENT_DIR/../scripts"
|
||||
HELPERS_DIR="$SCRIPTS_DIR/helpers"
|
||||
|
||||
source "$HELPERS_DIR/tmux_echo_functions.sh"
|
||||
source "$HELPERS_DIR/tmux_utils.sh"
|
||||
|
||||
main() {
|
||||
reload_tmux_environment
|
||||
"$SCRIPTS_DIR/install_plugins.sh" --tmux-echo >/dev/null 2>&1
|
||||
reload_tmux_environment
|
||||
end_message
|
||||
}
|
||||
main
|
||||
49
files/system/usr/etc/skel/.tmux/plugins/bindings/update_plugins
Executable file
49
files/system/usr/etc/skel/.tmux/plugins/bindings/update_plugins
Executable file
@@ -0,0 +1,49 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Tmux key-binding script.
|
||||
# Scripts intended to be used via the command line are in `bin/` directory.
|
||||
|
||||
# This script:
|
||||
# - shows a list of installed plugins
|
||||
# - starts a prompt to enter the name of the plugin that will be updated
|
||||
|
||||
CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||
SCRIPTS_DIR="$CURRENT_DIR/../scripts"
|
||||
HELPERS_DIR="$SCRIPTS_DIR/helpers"
|
||||
|
||||
source "$HELPERS_DIR/plugin_functions.sh"
|
||||
source "$HELPERS_DIR/tmux_echo_functions.sh"
|
||||
source "$HELPERS_DIR/tmux_utils.sh"
|
||||
|
||||
display_plugin_update_list() {
|
||||
local plugins="$(tpm_plugins_list_helper)"
|
||||
tmux_echo "Installed plugins:"
|
||||
tmux_echo ""
|
||||
|
||||
for plugin in $plugins; do
|
||||
# displaying only installed plugins
|
||||
if plugin_already_installed "$plugin"; then
|
||||
local plugin_name="$(plugin_name_helper "$plugin")"
|
||||
tmux_echo " $plugin_name"
|
||||
fi
|
||||
done
|
||||
|
||||
tmux_echo ""
|
||||
tmux_echo "Type plugin name to update it."
|
||||
tmux_echo ""
|
||||
tmux_echo "- \"all\" - updates all plugins"
|
||||
tmux_echo "- ENTER - cancels"
|
||||
}
|
||||
|
||||
update_plugin_prompt() {
|
||||
tmux command-prompt -p 'plugin update:' " \
|
||||
send-keys C-c; \
|
||||
run-shell '$SCRIPTS_DIR/update_plugin_prompt_handler.sh %1'"
|
||||
}
|
||||
|
||||
main() {
|
||||
reload_tmux_environment
|
||||
display_plugin_update_list
|
||||
update_plugin_prompt
|
||||
}
|
||||
main
|
||||
BIN
files/system/usr/etc/skel/.tmux/plugins/cole-tmux/.github/assets/demo.png
vendored
Normal file
BIN
files/system/usr/etc/skel/.tmux/plugins/cole-tmux/.github/assets/demo.png
vendored
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 558 KiB |
2
files/system/usr/etc/skel/.tmux/plugins/cole-tmux/.gitignore
vendored
Normal file
2
files/system/usr/etc/skel/.tmux/plugins/cole-tmux/.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
# MacOS
|
||||
.DS_Store
|
||||
21
files/system/usr/etc/skel/.tmux/plugins/cole-tmux/LICENSE
Normal file
21
files/system/usr/etc/skel/.tmux/plugins/cole-tmux/LICENSE
Normal file
@@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2026 Kyle Huang
|
||||
|
||||
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.
|
||||
17
files/system/usr/etc/skel/.tmux/plugins/cole-tmux/README.md
Normal file
17
files/system/usr/etc/skel/.tmux/plugins/cole-tmux/README.md
Normal file
@@ -0,0 +1,17 @@
|
||||
# Cole for [tmux](https://github.com/tmux/tmux/wiki)
|
||||
|
||||
A tmux theme based on the [Cole](https://github.com/thekylehuang/cole) colorscheme. Uses only default colors (no configuration).
|
||||
|
||||

|
||||
|
||||
## Installation
|
||||
|
||||
### Using TPM (Tmux Plugin Manager)
|
||||
|
||||
Add these lines to the top of `~/.config/tmux/tmux.conf`:
|
||||
|
||||
```tmux
|
||||
set -g @plugin 'thekylehuang/cole-tmux'
|
||||
```
|
||||
|
||||
Then press `prefix + I` to fetch and install. It should appear in `~/.config/tmux/plugins/`.
|
||||
54
files/system/usr/etc/skel/.tmux/plugins/cole-tmux/cole.tmux
Executable file
54
files/system/usr/etc/skel/.tmux/plugins/cole-tmux/cole.tmux
Executable file
@@ -0,0 +1,54 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Cole colorscheme for Tmux
|
||||
# A stationery-inspired theme with vintage earth tones
|
||||
|
||||
# Color palette
|
||||
background="#101010"
|
||||
foreground="#f2e6cf"
|
||||
accent="#b38d59"
|
||||
accent_bright="#cc9b52"
|
||||
green="#2e9969"
|
||||
green_bright="#66cc69"
|
||||
red="#cc5d4b"
|
||||
black="#121212"
|
||||
border="#3d3d3d"
|
||||
|
||||
# Set vi style key bindings in copy mode
|
||||
tmux set-option -g mode-keys vi
|
||||
|
||||
# Set colors to status bar
|
||||
tmux set-option -g status-style "bg=$background,fg=$foreground"
|
||||
tmux set-option -g status-position bottom
|
||||
tmux set-option -g status-justify left
|
||||
|
||||
# Set window list styles
|
||||
tmux set-window-option -g window-status-style "bg=$background,fg=$foreground"
|
||||
tmux set-window-option -g window-status-current-style "bg=$accent,fg=$black,bold"
|
||||
tmux set-window-option -g window-status-separator " "
|
||||
|
||||
# Format window names in list
|
||||
tmux set-window-option -g window-status-format " #I: #W "
|
||||
tmux set-window-option -g window-status-current-format " #I: #W "
|
||||
|
||||
# Panes styling
|
||||
tmux set-option -g pane-border-style "fg=$border"
|
||||
tmux set-option -g pane-active-border-style "fg=$accent_bright"
|
||||
|
||||
# Messages
|
||||
tmux set-option -g message-style "bg=$black,fg=$foreground"
|
||||
tmux set-option -g message-command-style "bg=$black,fg=$foreground"
|
||||
tmux set-option -g prompt-cursor-colour "$foreground"
|
||||
|
||||
# Copy mode
|
||||
tmux set-window-option -g copy-mode-match-style "bg=$green,fg=$black"
|
||||
tmux set-window-option -g copy-mode-current-match-style "bg=$green_bright,fg=$black"
|
||||
|
||||
# Command styling
|
||||
tmux set-option -g command-style "bg=$black,fg=$foreground"
|
||||
|
||||
# Status bar left (session info)
|
||||
tmux set-option -g status-left "#[bg=$red,fg=$black,bold] #S #[bg=$background,fg=$foreground]"
|
||||
|
||||
# Status bar right (time and date)
|
||||
tmux set-option -g status-right "#[bg=$background,fg=$foreground] %H:%M #[bg=$red,fg=$black,bold] %Y-%m-%d "
|
||||
@@ -0,0 +1,12 @@
|
||||
# Automatic tpm installation
|
||||
|
||||
One of the first things we do on a new machine is cloning our dotfiles. Not everything comes with them though, so for example `tpm` most likely won't be installed.
|
||||
|
||||
If you want to install `tpm` and plugins automatically when tmux is started, put the following snippet in `.tmux.conf` before the final `run '~/.tmux/plugins/tpm/tpm'`:
|
||||
|
||||
```
|
||||
if "test ! -d ~/.tmux/plugins/tpm" \
|
||||
"run 'git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm && ~/.tmux/plugins/tpm/bin/install_plugins'"
|
||||
```
|
||||
|
||||
This useful tip was submitted by @acr4 and narfman0.
|
||||
@@ -0,0 +1,16 @@
|
||||
# Changing plugins install dir
|
||||
|
||||
By default, TPM installs plugins in a subfolder named `plugins/` inside
|
||||
`$XDG_CONFIG_HOME/tmux/` if a `tmux.conf` file was found at that location, or
|
||||
inside `~/.tmux/` otherwise.
|
||||
|
||||
You can change the install path by putting this in `.tmux.conf`:
|
||||
|
||||
set-environment -g TMUX_PLUGIN_MANAGER_PATH '/some/other/path/'
|
||||
|
||||
Tmux plugin manager initialization in `.tmux.conf` should also be updated:
|
||||
|
||||
# initializes TMUX plugin manager in a new path
|
||||
run /some/other/path/tpm/tpm
|
||||
|
||||
Please make sure that the `run` line is at the very bottom of `.tmux.conf`.
|
||||
@@ -0,0 +1,108 @@
|
||||
# How to create Tmux plugins
|
||||
|
||||
Creating a new plugin is easy.
|
||||
|
||||
For demonstration purposes we'll create a simple plugin that lists all
|
||||
installed TPM plugins. Yes, a plugin that lists plugins :) We'll bind that to
|
||||
`prefix + T`.
|
||||
|
||||
The source code for this example plugin can be found
|
||||
[here](https://github.com/tmux-plugins/tmux-example-plugin).
|
||||
|
||||
### 1. create a new git project
|
||||
|
||||
TPM depends on git for downloading and updating plugins.
|
||||
|
||||
To create a new git project:
|
||||
|
||||
$ mkdir tmux_my_plugin
|
||||
$ cd tmux_my_plugin
|
||||
$ git init
|
||||
|
||||
### 2. create a `*.tmux` plugin run file
|
||||
|
||||
When it sources a plugin, TPM executes all `*.tmux` files in your plugins'
|
||||
directory. That's how plugins are run.
|
||||
|
||||
Create a plugin run file in plugin directory:
|
||||
|
||||
$ touch my_plugin.tmux
|
||||
$ chmod u+x my_plugin.tmux
|
||||
|
||||
You can have more than one `*.tmux` file, and all will get executed. However, usually
|
||||
you'll need just one.
|
||||
|
||||
### 3. create a plugin key binding
|
||||
|
||||
We want the behavior of the plugin to trigger when a user hits `prefix + T`.
|
||||
|
||||
Key `T` is chosen because:
|
||||
- it's "kind of" a mnemonic for `TPM`
|
||||
- the key is not used by Tmux natively. Tmux man page, KEY BINDINGS section
|
||||
contains a list of all the bindings Tmux uses. There's plenty of unused keys
|
||||
and we don't want to override any of Tmux default key bindings.
|
||||
|
||||
Open the plugin run file in your favorite text editor:
|
||||
|
||||
$ vim my_plugin.tmux
|
||||
# or
|
||||
$ subl my_plugin.tmux
|
||||
|
||||
Put the following content in the file:
|
||||
|
||||
#!/usr/bin/env bash
|
||||
|
||||
CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||
tmux bind-key T run-shell "$CURRENT_DIR/scripts/tmux_list_plugins.sh"
|
||||
|
||||
As you can see, plugin run file is a simple bash script that sets up the binding.
|
||||
|
||||
When pressed, `prefix + T` will execute another shell script:
|
||||
`tmux_list_plugins.sh`. That script should be in `scripts/` directory -
|
||||
relative to the plugin run file.
|
||||
|
||||
|
||||
### 4. listing plugins
|
||||
|
||||
Now that we have the binding, let's create a script that's invoked with
|
||||
`prefix + T`.
|
||||
|
||||
$ mkdir scripts
|
||||
$ touch scripts/tmux_list_plugins.sh
|
||||
$ chmod u+x scripts/tmux_list_plugins.sh
|
||||
|
||||
And here's the script content:
|
||||
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# fetching the directory where plugins are installed
|
||||
plugin_path="$(tmux show-env -g TMUX_PLUGIN_MANAGER_PATH | cut -f2 -d=)"
|
||||
|
||||
# listing installed plugins
|
||||
ls -1 "$plugin_path"
|
||||
|
||||
### 5. try it out
|
||||
|
||||
To see if this works, execute the plugin run file:
|
||||
|
||||
$ ./my_plugin.tmux
|
||||
|
||||
That should set up the key binding. Now hit `prefix + T` and see if it works.
|
||||
|
||||
### 6. publish the plugin
|
||||
|
||||
When everything is ready, push the plugin to an online git repository,
|
||||
preferably GitHub.
|
||||
|
||||
Other users can install your plugin by just adding plugin git URL to the
|
||||
`@plugin` list in their `.tmux.conf`.
|
||||
|
||||
If the plugin is on GitHub, your users will be able to use the shorthand of
|
||||
`github_username/repository`.
|
||||
|
||||
### Conclusion
|
||||
|
||||
Hopefully, that was easy. As you can see, it's mostly shell scripting.
|
||||
|
||||
You can use other scripting languages (ruby, python etc) but plain old shell
|
||||
is preferred because of portability.
|
||||
@@ -0,0 +1,36 @@
|
||||
# Managing plugins via the command line
|
||||
|
||||
Aside from tmux key bindings, TPM provides shell interface for managing plugins
|
||||
via scripts located in [bin/](../bin/) directory.
|
||||
|
||||
Tmux does not need to be started in order to run scripts (but it's okay if it
|
||||
is). If you [changed tpm install dir](../docs/changing_plugins_install_dir.md)
|
||||
in `.tmux.conf` that should work fine too.
|
||||
|
||||
Prerequisites:
|
||||
|
||||
- tmux installed on the system (doh)
|
||||
- `.tmux.conf` set up for TPM
|
||||
|
||||
### Installing plugins
|
||||
|
||||
As usual, plugins need to be specified in `.tmux.conf`. Run the following
|
||||
command to install plugins:
|
||||
|
||||
~/.tmux/plugins/tpm/bin/install_plugins
|
||||
|
||||
### Updating plugins
|
||||
|
||||
To update all installed plugins:
|
||||
|
||||
~/.tmux/plugins/tpm/bin/update_plugins all
|
||||
|
||||
or update a single plugin:
|
||||
|
||||
~/.tmux/plugins/tpm/bin/update_plugins tmux-sensible
|
||||
|
||||
### Removing plugins
|
||||
|
||||
To remove plugins not on the plugin list:
|
||||
|
||||
~/.tmux/plugins/tpm/bin/clean_plugins
|
||||
102
files/system/usr/etc/skel/.tmux/plugins/docs/tpm_not_working.md
Normal file
102
files/system/usr/etc/skel/.tmux/plugins/docs/tpm_not_working.md
Normal file
@@ -0,0 +1,102 @@
|
||||
# Help, tpm not working!
|
||||
|
||||
Here's the list of issues users had with `tpm`:
|
||||
|
||||
<hr />
|
||||
|
||||
> Nothing works. `tpm` key bindings `prefix + I`, `prefix + U` not even
|
||||
defined.
|
||||
|
||||
Related [issue #22](https://github.com/tmux-plugins/tpm/issues/22)
|
||||
|
||||
- Do you have required `tmux` version to run `tpm`?<br/>
|
||||
Check `tmux` version with `$ tmux -V` command and make sure it's higher or
|
||||
equal to the required version for `tpm` as stated in the readme.
|
||||
|
||||
- ZSH tmux plugin might be causing issues.<br/>
|
||||
If you have it installed, try disabling it and see if `tpm` works then.
|
||||
|
||||
<hr />
|
||||
|
||||
> Help, I'm using custom config file with `tmux -f /path/to/my_tmux.conf`
|
||||
to start Tmux and for some reason plugins aren't loaded!?
|
||||
|
||||
Related [issue #57](https://github.com/tmux-plugins/tpm/issues/57)
|
||||
|
||||
`tpm` has a known issue when using custom config file with `-f` option.
|
||||
The solution is to use alternative plugin definition syntax. Here are the steps
|
||||
to make it work:
|
||||
|
||||
1. remove all `set -g @plugin` lines from tmux config file
|
||||
2. in the config file define the plugins in the following way:
|
||||
|
||||
# List of plugins
|
||||
set -g @tpm_plugins ' \
|
||||
tmux-plugins/tpm \
|
||||
tmux-plugins/tmux-sensible \
|
||||
tmux-plugins/tmux-resurrect \
|
||||
'
|
||||
|
||||
# Initialize TMUX plugin manager (keep this line at the very bottom of tmux.conf)
|
||||
run '~/.tmux/plugins/tpm/tpm'
|
||||
|
||||
3. Reload TMUX environment so TPM is sourced: `$ tmux source /path/to/my_tmux.conf`
|
||||
|
||||
The plugins should now be working.
|
||||
|
||||
<hr />
|
||||
|
||||
> Weird sequence of characters show up when installing or updating plugins
|
||||
|
||||
Related: [issue #25](https://github.com/tmux-plugins/tpm/issues/25)
|
||||
|
||||
- This could be caused by [tmuxline.vim](https://github.com/edkolev/tmuxline.vim)
|
||||
plugin. Uninstall it and see if things work.
|
||||
|
||||
<hr />
|
||||
|
||||
> "failed to connect to server" error when sourcing .tmux.conf
|
||||
|
||||
Related: [issue #48](https://github.com/tmux-plugins/tpm/issues/48)
|
||||
|
||||
- Make sure `tmux source ~/.tmux.conf` command is ran from inside `tmux`.
|
||||
|
||||
<hr />
|
||||
|
||||
> tpm not working: '~/.tmux/plugins/tpm/tpm' returned 2 (Windows / Cygwin)
|
||||
|
||||
Related: [issue #81](https://github.com/tmux-plugins/tpm/issues/81)
|
||||
|
||||
This issue is most likely caused by Windows line endings. For example, if you
|
||||
have git's `core.autocrlf` option set to `true`, git will automatically convert
|
||||
all the files to Windows line endings which might cause a problem.
|
||||
|
||||
The solution is to convert all line ending to Unix newline characters. This
|
||||
command handles that for all files under `.tmux/` dir (skips `.git`
|
||||
subdirectories):
|
||||
|
||||
```bash
|
||||
find ~/.tmux -type d -name '.git*' -prune -o -type f -print0 | xargs -0 dos2unix
|
||||
```
|
||||
|
||||
<hr />
|
||||
|
||||
> '~/.tmux/plugins/tpm/tpm' returned 127 (on macOS, w/ tmux installed using brew)
|
||||
|
||||
Related: [issue #67](https://github.com/tmux-plugins/tpm/issues/67)
|
||||
|
||||
This problem is because tmux's `run-shell` command runs a shell which doesn't read from user configs, thus tmux installed in a brew prefix (e.g. `/usr/local/bin`) will not be found.
|
||||
|
||||
The solution is to find your brew prefix
|
||||
|
||||
```sh
|
||||
> echo "$(brew --prefix)/bin"
|
||||
/opt/homebrew/bin
|
||||
```
|
||||
|
||||
And prepend it to the `PATH` environment variable
|
||||
```
|
||||
set-environment -g PATH "/opt/homebrew/bin:/bin:/usr/bin"
|
||||
```
|
||||
|
||||
before any `run-shell`/`run` commands in `~/.tmux.conf`.
|
||||
78
files/system/usr/etc/skel/.tmux/plugins/scripts/check_tmux_version.sh
Executable file
78
files/system/usr/etc/skel/.tmux/plugins/scripts/check_tmux_version.sh
Executable file
@@ -0,0 +1,78 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
VERSION="$1"
|
||||
UNSUPPORTED_MSG="$2"
|
||||
|
||||
get_tmux_option() {
|
||||
local option=$1
|
||||
local default_value=$2
|
||||
local option_value=$(tmux show-option -gqv "$option")
|
||||
if [ -z "$option_value" ]; then
|
||||
echo "$default_value"
|
||||
else
|
||||
echo "$option_value"
|
||||
fi
|
||||
}
|
||||
|
||||
# Ensures a message is displayed for 5 seconds in tmux prompt.
|
||||
# Does not override the 'display-time' tmux option.
|
||||
display_message() {
|
||||
local message="$1"
|
||||
|
||||
# display_duration defaults to 5 seconds, if not passed as an argument
|
||||
if [ "$#" -eq 2 ]; then
|
||||
local display_duration="$2"
|
||||
else
|
||||
local display_duration="5000"
|
||||
fi
|
||||
|
||||
# saves user-set 'display-time' option
|
||||
local saved_display_time=$(get_tmux_option "display-time" "750")
|
||||
|
||||
# sets message display time to 5 seconds
|
||||
tmux set-option -gq display-time "$display_duration"
|
||||
|
||||
# displays message
|
||||
tmux display-message "$message"
|
||||
|
||||
# restores original 'display-time' value
|
||||
tmux set-option -gq display-time "$saved_display_time"
|
||||
}
|
||||
|
||||
# this is used to get "clean" integer version number. Examples:
|
||||
# `tmux 1.9` => `19`
|
||||
# `1.9a` => `19`
|
||||
get_digits_from_string() {
|
||||
local string="$1"
|
||||
local only_digits="$(echo "$string" | tr -dC '[:digit:]')"
|
||||
echo "$only_digits"
|
||||
}
|
||||
|
||||
tmux_version_int() {
|
||||
local tmux_version_string=$(tmux -V)
|
||||
echo "$(get_digits_from_string "$tmux_version_string")"
|
||||
}
|
||||
|
||||
unsupported_version_message() {
|
||||
if [ -n "$UNSUPPORTED_MSG" ]; then
|
||||
echo "$UNSUPPORTED_MSG"
|
||||
else
|
||||
echo "Error, Tmux version unsupported! Please install Tmux version $VERSION or greater!"
|
||||
fi
|
||||
}
|
||||
|
||||
exit_if_unsupported_version() {
|
||||
local current_version="$1"
|
||||
local supported_version="$2"
|
||||
if [ "$current_version" -lt "$supported_version" ]; then
|
||||
display_message "$(unsupported_version_message)"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
main() {
|
||||
local supported_version_int="$(get_digits_from_string "$VERSION")"
|
||||
local current_version_int="$(tmux_version_int)"
|
||||
exit_if_unsupported_version "$current_version_int" "$supported_version_int"
|
||||
}
|
||||
main
|
||||
41
files/system/usr/etc/skel/.tmux/plugins/scripts/clean_plugins.sh
Executable file
41
files/system/usr/etc/skel/.tmux/plugins/scripts/clean_plugins.sh
Executable file
@@ -0,0 +1,41 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||
HELPERS_DIR="$CURRENT_DIR/helpers"
|
||||
|
||||
source "$HELPERS_DIR/plugin_functions.sh"
|
||||
source "$HELPERS_DIR/utility.sh"
|
||||
|
||||
if [ "$1" == "--tmux-echo" ]; then # tmux-specific echo functions
|
||||
source "$HELPERS_DIR/tmux_echo_functions.sh"
|
||||
else # shell output functions
|
||||
source "$HELPERS_DIR/shell_echo_functions.sh"
|
||||
fi
|
||||
|
||||
clean_plugins() {
|
||||
local plugins plugin plugin_directory
|
||||
plugins="$(tpm_plugins_list_helper)"
|
||||
|
||||
for plugin_directory in "$(tpm_path)"/*; do
|
||||
[ -d "${plugin_directory}" ] || continue
|
||||
plugin="$(plugin_name_helper "${plugin_directory}")"
|
||||
case "${plugins}" in
|
||||
*"${plugin}"*) : ;;
|
||||
*)
|
||||
[ "${plugin}" = "tpm" ] && continue
|
||||
echo_ok "Removing \"$plugin\""
|
||||
rm -rf "${plugin_directory}" >/dev/null 2>&1
|
||||
[ -d "${plugin_directory}" ] &&
|
||||
echo_err " \"$plugin\" clean fail" ||
|
||||
echo_ok " \"$plugin\" clean success"
|
||||
;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
|
||||
main() {
|
||||
ensure_tpm_path_exists
|
||||
clean_plugins
|
||||
exit_value_helper
|
||||
}
|
||||
main
|
||||
@@ -0,0 +1,104 @@
|
||||
# using @tpm_plugins is now deprecated in favor of using @plugin syntax
|
||||
tpm_plugins_variable_name="@tpm_plugins"
|
||||
|
||||
# manually expanding tilde char or `$HOME` variable.
|
||||
_manual_expansion() {
|
||||
local path="$1"
|
||||
local expanded_tilde="${path/#\~/$HOME}"
|
||||
echo "${expanded_tilde/#\$HOME/$HOME}"
|
||||
}
|
||||
|
||||
_tpm_path() {
|
||||
local string_path="$(tmux start-server\; show-environment -g TMUX_PLUGIN_MANAGER_PATH | cut -f2 -d=)/"
|
||||
_manual_expansion "$string_path"
|
||||
}
|
||||
|
||||
_CACHED_TPM_PATH="$(_tpm_path)"
|
||||
|
||||
# Get the absolute path to the users configuration file of TMux.
|
||||
# This includes a prioritized search on different locations.
|
||||
#
|
||||
_get_user_tmux_conf() {
|
||||
# Define the different possible locations.
|
||||
xdg_location="${XDG_CONFIG_HOME:-$HOME/.config}/tmux/tmux.conf"
|
||||
default_location="$HOME/.tmux.conf"
|
||||
|
||||
# Search for the correct configuration file by priority.
|
||||
if [ -f "$xdg_location" ]; then
|
||||
echo "$xdg_location"
|
||||
|
||||
else
|
||||
echo "$default_location"
|
||||
fi
|
||||
}
|
||||
|
||||
_tmux_conf_contents() {
|
||||
user_config=$(_get_user_tmux_conf)
|
||||
cat /etc/tmux.conf "$user_config" 2>/dev/null
|
||||
if [ "$1" == "full" ]; then # also output content from sourced files
|
||||
local file
|
||||
for file in $(_sourced_files); do
|
||||
cat $(_manual_expansion "$file") 2>/dev/null
|
||||
done
|
||||
fi
|
||||
}
|
||||
|
||||
# return files sourced from tmux config files
|
||||
_sourced_files() {
|
||||
_tmux_conf_contents |
|
||||
sed -E -n -e "s/^[[:space:]]*source(-file)?[[:space:]]+(-q+[[:space:]]+)?['\"]?([^'\"]+)['\"]?/\3/p"
|
||||
}
|
||||
|
||||
# Want to be able to abort in certain cases
|
||||
trap "exit 1" TERM
|
||||
export TOP_PID=$$
|
||||
|
||||
_fatal_error_abort() {
|
||||
echo >&2 "Aborting."
|
||||
kill -s TERM $TOP_PID
|
||||
}
|
||||
|
||||
# PUBLIC FUNCTIONS BELOW
|
||||
|
||||
tpm_path() {
|
||||
if [ "$_CACHED_TPM_PATH" == "/" ]; then
|
||||
echo >&2 "FATAL: Tmux Plugin Manager not configured in tmux.conf"
|
||||
_fatal_error_abort
|
||||
fi
|
||||
echo "$_CACHED_TPM_PATH"
|
||||
}
|
||||
|
||||
tpm_plugins_list_helper() {
|
||||
# lists plugins from @tpm_plugins option
|
||||
echo "$(tmux start-server\; show-option -gqv "$tpm_plugins_variable_name")"
|
||||
|
||||
# read set -g @plugin "tmux-plugins/tmux-example-plugin" entries
|
||||
_tmux_conf_contents "full" |
|
||||
awk '/^[ \t]*set(-option)? +-g +@plugin/ { gsub(/'\''/,""); gsub(/'\"'/,""); print $4 }'
|
||||
}
|
||||
|
||||
# Allowed plugin name formats:
|
||||
# 1. "git://github.com/user/plugin_name.git"
|
||||
# 2. "user/plugin_name"
|
||||
plugin_name_helper() {
|
||||
local plugin="$1"
|
||||
# get only the part after the last slash, e.g. "plugin_name.git"
|
||||
local plugin_basename="$(basename "$plugin")"
|
||||
# remove ".git" extension (if it exists) to get only "plugin_name"
|
||||
local plugin_name="${plugin_basename%.git}"
|
||||
echo "$plugin_name"
|
||||
}
|
||||
|
||||
plugin_path_helper() {
|
||||
local plugin="$1"
|
||||
local plugin_name="$(plugin_name_helper "$plugin")"
|
||||
echo "$(tpm_path)${plugin_name}/"
|
||||
}
|
||||
|
||||
plugin_already_installed() {
|
||||
local plugin="$1"
|
||||
local plugin_path="$(plugin_path_helper "$plugin")"
|
||||
[ -d "$plugin_path" ] &&
|
||||
cd "$plugin_path" &&
|
||||
git remote >/dev/null 2>&1
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
echo_ok() {
|
||||
echo "$*"
|
||||
}
|
||||
|
||||
echo_err() {
|
||||
fail_helper "$*"
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
_has_emacs_mode_keys() {
|
||||
$(tmux show -gw mode-keys | grep -q emacs)
|
||||
}
|
||||
|
||||
tmux_echo() {
|
||||
local message="$1"
|
||||
tmux run-shell "echo '$message'"
|
||||
}
|
||||
|
||||
echo_ok() {
|
||||
tmux_echo "$*"
|
||||
}
|
||||
|
||||
echo_err() {
|
||||
tmux_echo "$*"
|
||||
}
|
||||
|
||||
end_message() {
|
||||
if _has_emacs_mode_keys; then
|
||||
local continue_key="ESCAPE"
|
||||
else
|
||||
local continue_key="ENTER"
|
||||
fi
|
||||
tmux_echo ""
|
||||
tmux_echo "TMUX environment reloaded."
|
||||
tmux_echo ""
|
||||
tmux_echo "Done, press $continue_key to continue."
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
HELPERS_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||
source "$HELPERS_DIR/plugin_functions.sh"
|
||||
|
||||
reload_tmux_environment() {
|
||||
tmux source-file $(_get_user_tmux_conf) >/dev/null 2>&1
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
ensure_tpm_path_exists() {
|
||||
mkdir -p "$(tpm_path)"
|
||||
}
|
||||
|
||||
fail_helper() {
|
||||
local message="$1"
|
||||
echo "$message" >&2
|
||||
FAIL="true"
|
||||
}
|
||||
|
||||
exit_value_helper() {
|
||||
if [ "$FAIL" == "true" ]; then
|
||||
exit 1
|
||||
else
|
||||
exit 0
|
||||
fi
|
||||
}
|
||||
75
files/system/usr/etc/skel/.tmux/plugins/scripts/install_plugins.sh
Executable file
75
files/system/usr/etc/skel/.tmux/plugins/scripts/install_plugins.sh
Executable file
@@ -0,0 +1,75 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||
HELPERS_DIR="$CURRENT_DIR/helpers"
|
||||
|
||||
source "$HELPERS_DIR/plugin_functions.sh"
|
||||
source "$HELPERS_DIR/utility.sh"
|
||||
|
||||
if [ "$1" == "--tmux-echo" ]; then # tmux-specific echo functions
|
||||
source "$HELPERS_DIR/tmux_echo_functions.sh"
|
||||
else # shell output functions
|
||||
source "$HELPERS_DIR/shell_echo_functions.sh"
|
||||
fi
|
||||
|
||||
clone() {
|
||||
local plugin="$1"
|
||||
local branch="$2"
|
||||
if [ -n "$branch" ]; then
|
||||
cd "$(tpm_path)" &&
|
||||
GIT_TERMINAL_PROMPT=0 git clone -b "$branch" --single-branch --recursive "$plugin" >/dev/null 2>&1
|
||||
else
|
||||
cd "$(tpm_path)" &&
|
||||
GIT_TERMINAL_PROMPT=0 git clone --single-branch --recursive "$plugin" >/dev/null 2>&1
|
||||
fi
|
||||
}
|
||||
|
||||
# tries cloning:
|
||||
# 1. plugin name directly - works if it's a valid git url
|
||||
# 2. expands the plugin name to point to a GitHub repo and tries cloning again
|
||||
clone_plugin() {
|
||||
local plugin="$1"
|
||||
local branch="$2"
|
||||
clone "$plugin" "$branch" ||
|
||||
clone "https://git::@github.com/$plugin" "$branch"
|
||||
}
|
||||
|
||||
# clone plugin and produce output
|
||||
install_plugin() {
|
||||
local plugin="$1"
|
||||
local branch="$2"
|
||||
local plugin_name="$(plugin_name_helper "$plugin")"
|
||||
|
||||
if plugin_already_installed "$plugin"; then
|
||||
echo_ok "Already installed \"$plugin_name\""
|
||||
else
|
||||
echo_ok "Installing \"$plugin_name\""
|
||||
clone_plugin "$plugin" "$branch" &&
|
||||
echo_ok " \"$plugin_name\" download success" ||
|
||||
echo_err " \"$plugin_name\" download fail"
|
||||
fi
|
||||
}
|
||||
|
||||
install_plugins() {
|
||||
local plugins="$(tpm_plugins_list_helper)"
|
||||
for plugin in $plugins; do
|
||||
IFS='#' read -ra plugin <<< "$plugin"
|
||||
install_plugin "${plugin[0]}" "${plugin[1]}"
|
||||
done
|
||||
}
|
||||
|
||||
verify_tpm_path_permissions() {
|
||||
local path="$(tpm_path)"
|
||||
# check the write permission flag for all users to ensure
|
||||
# that we have proper access
|
||||
[ -w "$path" ] ||
|
||||
echo_err "$path is not writable!"
|
||||
}
|
||||
|
||||
main() {
|
||||
ensure_tpm_path_exists
|
||||
verify_tpm_path_permissions
|
||||
install_plugins
|
||||
exit_value_helper
|
||||
}
|
||||
main
|
||||
42
files/system/usr/etc/skel/.tmux/plugins/scripts/source_plugins.sh
Executable file
42
files/system/usr/etc/skel/.tmux/plugins/scripts/source_plugins.sh
Executable file
@@ -0,0 +1,42 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||
HELPERS_DIR="$CURRENT_DIR/helpers"
|
||||
|
||||
source "$HELPERS_DIR/plugin_functions.sh"
|
||||
|
||||
plugin_dir_exists() {
|
||||
[ -d "$1" ]
|
||||
}
|
||||
|
||||
# Runs all *.tmux files from the plugin directory.
|
||||
# Files are ran as executables.
|
||||
# No errors if the plugin dir does not exist.
|
||||
silently_source_all_tmux_files() {
|
||||
local plugin_path="$1"
|
||||
local plugin_tmux_files="$plugin_path*.tmux"
|
||||
if plugin_dir_exists "$plugin_path"; then
|
||||
for tmux_file in $plugin_tmux_files; do
|
||||
# if the glob didn't find any files this will be the
|
||||
# unexpanded glob which obviously doesn't exist
|
||||
[ -f "$tmux_file" ] || continue
|
||||
# runs *.tmux file as an executable
|
||||
$tmux_file >/dev/null 2>&1
|
||||
done
|
||||
fi
|
||||
}
|
||||
|
||||
source_plugins() {
|
||||
local plugin plugin_path
|
||||
local plugins="$(tpm_plugins_list_helper)"
|
||||
for plugin in $plugins; do
|
||||
IFS='#' read -ra plugin <<< "$plugin"
|
||||
plugin_path="$(plugin_path_helper "${plugin[0]}")"
|
||||
silently_source_all_tmux_files "$plugin_path"
|
||||
done
|
||||
}
|
||||
|
||||
main() {
|
||||
source_plugins
|
||||
}
|
||||
main
|
||||
78
files/system/usr/etc/skel/.tmux/plugins/scripts/update_plugin.sh
Executable file
78
files/system/usr/etc/skel/.tmux/plugins/scripts/update_plugin.sh
Executable file
@@ -0,0 +1,78 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# this script handles core logic of updating plugins
|
||||
|
||||
CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||
HELPERS_DIR="$CURRENT_DIR/helpers"
|
||||
|
||||
source "$HELPERS_DIR/plugin_functions.sh"
|
||||
source "$HELPERS_DIR/utility.sh"
|
||||
|
||||
if [ "$1" == "--tmux-echo" ]; then # tmux-specific echo functions
|
||||
source "$HELPERS_DIR/tmux_echo_functions.sh"
|
||||
else # shell output functions
|
||||
source "$HELPERS_DIR/shell_echo_functions.sh"
|
||||
fi
|
||||
|
||||
# from now on ignore first script argument
|
||||
shift
|
||||
|
||||
pull_changes() {
|
||||
local plugin="$1"
|
||||
local plugin_path="$(plugin_path_helper "$plugin")"
|
||||
cd "$plugin_path" &&
|
||||
GIT_TERMINAL_PROMPT=0 git pull &&
|
||||
GIT_TERMINAL_PROMPT=0 git submodule update --init --recursive
|
||||
}
|
||||
|
||||
update() {
|
||||
local plugin="$1" output
|
||||
output=$(pull_changes "$plugin" 2>&1)
|
||||
if (( $? == 0 )); then
|
||||
echo_ok " \"$plugin\" update success"
|
||||
echo_ok "$(echo "$output" | sed -e 's/^/ | /')"
|
||||
else
|
||||
echo_err " \"$plugin\" update fail"
|
||||
echo_err "$(echo "$output" | sed -e 's/^/ | /')"
|
||||
fi
|
||||
}
|
||||
|
||||
update_all() {
|
||||
echo_ok "Updating all plugins!"
|
||||
echo_ok ""
|
||||
local plugins="$(tpm_plugins_list_helper)"
|
||||
for plugin in $plugins; do
|
||||
IFS='#' read -ra plugin <<< "$plugin"
|
||||
local plugin_name="$(plugin_name_helper "${plugin[0]}")"
|
||||
# updating only installed plugins
|
||||
if plugin_already_installed "$plugin_name"; then
|
||||
update "$plugin_name" &
|
||||
fi
|
||||
done
|
||||
wait
|
||||
}
|
||||
|
||||
update_plugins() {
|
||||
local plugins="$*"
|
||||
for plugin in $plugins; do
|
||||
IFS='#' read -ra plugin <<< "$plugin"
|
||||
local plugin_name="$(plugin_name_helper "${plugin[0]}")"
|
||||
if plugin_already_installed "$plugin_name"; then
|
||||
update "$plugin_name" &
|
||||
else
|
||||
echo_err "$plugin_name not installed!" &
|
||||
fi
|
||||
done
|
||||
wait
|
||||
}
|
||||
|
||||
main() {
|
||||
ensure_tpm_path_exists
|
||||
if [ "$1" == "all" ]; then
|
||||
update_all
|
||||
else
|
||||
update_plugins "$*"
|
||||
fi
|
||||
exit_value_helper
|
||||
}
|
||||
main "$*"
|
||||
@@ -0,0 +1,18 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||
HELPERS_DIR="$CURRENT_DIR/helpers"
|
||||
|
||||
if [ $# -eq 0 ]; then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
source "$HELPERS_DIR/tmux_echo_functions.sh"
|
||||
source "$HELPERS_DIR/tmux_utils.sh"
|
||||
|
||||
main() {
|
||||
"$CURRENT_DIR/update_plugin.sh" --tmux-echo "$*"
|
||||
reload_tmux_environment
|
||||
end_message
|
||||
}
|
||||
main "$*"
|
||||
13
files/system/usr/etc/skel/.tmux/plugins/scripts/variables.sh
Normal file
13
files/system/usr/etc/skel/.tmux/plugins/scripts/variables.sh
Normal file
@@ -0,0 +1,13 @@
|
||||
install_key_option="@tpm-install"
|
||||
default_install_key="I"
|
||||
|
||||
update_key_option="@tpm-update"
|
||||
default_update_key="U"
|
||||
|
||||
clean_key_option="@tpm-clean"
|
||||
default_clean_key="M-u"
|
||||
|
||||
SUPPORTED_TMUX_VERSION="1.9"
|
||||
|
||||
DEFAULT_TPM_ENV_VAR_NAME="TMUX_PLUGIN_MANAGER_PATH"
|
||||
DEFAULT_TPM_PATH="$HOME/.tmux/plugins/"
|
||||
36
files/system/usr/etc/skel/.tmux/plugins/tests/expect_failed_plugin_download
Executable file
36
files/system/usr/etc/skel/.tmux/plugins/tests/expect_failed_plugin_download
Executable file
@@ -0,0 +1,36 @@
|
||||
#!/usr/bin/env expect
|
||||
|
||||
# disables script output
|
||||
log_user 0
|
||||
|
||||
spawn tmux
|
||||
|
||||
# Waiting for tmux to attach. If this is not done, next command, `send` will
|
||||
# not work properly.
|
||||
sleep 1
|
||||
|
||||
# this is tmux prefix + I
|
||||
send "I"
|
||||
|
||||
# cloning might take a while
|
||||
set timeout 20
|
||||
|
||||
expect_after {
|
||||
timeout { exit 1 }
|
||||
}
|
||||
|
||||
expect {
|
||||
"Installing \"non-existing-plugin\""
|
||||
}
|
||||
|
||||
expect {
|
||||
"\"non-existing-plugin\" download fail"
|
||||
}
|
||||
|
||||
expect {
|
||||
"Done, press ENTER to continue" {
|
||||
exit 0
|
||||
}
|
||||
}
|
||||
|
||||
exit 1
|
||||
@@ -0,0 +1,35 @@
|
||||
#!/usr/bin/env expect
|
||||
|
||||
# disables script output
|
||||
log_user 0
|
||||
|
||||
spawn tmux
|
||||
|
||||
# Waiting for tmux to attach. If this is not done, next command, `send` will
|
||||
# not work properly.
|
||||
sleep 1
|
||||
|
||||
# this is tmux prefix + alt + u
|
||||
send "u"
|
||||
|
||||
set timeout 5
|
||||
|
||||
expect_after {
|
||||
timeout { exit 1 }
|
||||
}
|
||||
|
||||
expect {
|
||||
"Removing \"tmux-example-plugin\""
|
||||
}
|
||||
|
||||
expect {
|
||||
"\"tmux-example-plugin\" clean success"
|
||||
}
|
||||
|
||||
expect {
|
||||
"Done, press ENTER to continue." {
|
||||
exit 0
|
||||
}
|
||||
}
|
||||
|
||||
exit 1
|
||||
@@ -0,0 +1,44 @@
|
||||
#!/usr/bin/env expect
|
||||
|
||||
# disables script output
|
||||
log_user 0
|
||||
|
||||
spawn tmux
|
||||
|
||||
# Waiting for tmux to attach. If this is not done, next command, `send` will
|
||||
# not work properly.
|
||||
sleep 1
|
||||
|
||||
# this is tmux prefix + I
|
||||
send "I"
|
||||
|
||||
# cloning might take a while
|
||||
set timeout 15
|
||||
|
||||
expect_after {
|
||||
timeout { exit 1 }
|
||||
}
|
||||
|
||||
expect {
|
||||
"Installing \"tmux-example-plugin\""
|
||||
}
|
||||
|
||||
expect {
|
||||
"\"tmux-example-plugin\" download success"
|
||||
}
|
||||
|
||||
expect {
|
||||
"Installing \"tmux-copycat\""
|
||||
}
|
||||
|
||||
expect {
|
||||
"\"tmux-copycat\" download success"
|
||||
}
|
||||
|
||||
expect {
|
||||
"Done, press ENTER to continue." {
|
||||
exit 0
|
||||
}
|
||||
}
|
||||
|
||||
exit 1
|
||||
@@ -0,0 +1,50 @@
|
||||
#!/usr/bin/env expect
|
||||
|
||||
# disables script output
|
||||
log_user 0
|
||||
|
||||
spawn tmux
|
||||
|
||||
# Waiting for tmux to attach. If this is not done, next command, `send` will
|
||||
# not work properly.
|
||||
sleep 1
|
||||
|
||||
# this is tmux prefix + I
|
||||
send "I"
|
||||
|
||||
# cloning might take a while
|
||||
set timeout 15
|
||||
|
||||
expect_after {
|
||||
timeout { exit 1 }
|
||||
}
|
||||
|
||||
expect {
|
||||
"Installing \"tmux-example-plugin\""
|
||||
}
|
||||
|
||||
expect {
|
||||
"\"tmux-example-plugin\" download success"
|
||||
}
|
||||
|
||||
expect {
|
||||
"Done, press ENTER to continue" {
|
||||
send "
|
||||
"
|
||||
}
|
||||
}
|
||||
|
||||
sleep 1
|
||||
# this is tmux prefix + I
|
||||
send "I"
|
||||
|
||||
expect {
|
||||
"Already installed \"tmux-example-plugin\""
|
||||
}
|
||||
|
||||
expect {
|
||||
"Done, press ENTER to continue" {
|
||||
exit 0
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,55 @@
|
||||
#!/usr/bin/env expect
|
||||
|
||||
# disables script output
|
||||
log_user 0
|
||||
|
||||
spawn tmux
|
||||
|
||||
# Waiting for tmux to attach. If this is not done, next command, `send` will
|
||||
# not work properly.
|
||||
sleep 1
|
||||
|
||||
# this is tmux prefix + U
|
||||
send "U"
|
||||
|
||||
set timeout 15
|
||||
|
||||
expect_after {
|
||||
timeout { exit 1 }
|
||||
}
|
||||
|
||||
expect {
|
||||
"Installed plugins"
|
||||
}
|
||||
|
||||
expect {
|
||||
"tmux-example-plugin"
|
||||
}
|
||||
|
||||
expect {
|
||||
"\"all\" - updates all plugins"
|
||||
}
|
||||
|
||||
expect {
|
||||
"ENTER - cancels"
|
||||
}
|
||||
|
||||
# wait for tmux to display prompt before sending characters
|
||||
sleep 1
|
||||
send "tmux-example-plugin\r"
|
||||
|
||||
expect {
|
||||
"Updating \"tmux-example-plugin\""
|
||||
}
|
||||
|
||||
expect {
|
||||
"\"tmux-example-plugin\" update success"
|
||||
}
|
||||
|
||||
expect {
|
||||
"Done, press ENTER to continue." {
|
||||
exit 0
|
||||
}
|
||||
}
|
||||
|
||||
exit 1
|
||||
@@ -0,0 +1,59 @@
|
||||
#!/usr/bin/env expect
|
||||
|
||||
# disables script output
|
||||
log_user 0
|
||||
|
||||
spawn tmux
|
||||
|
||||
# Waiting for tmux to attach. If this is not done, next command, `send` will
|
||||
# not work properly.
|
||||
sleep 1
|
||||
|
||||
# this is tmux prefix + U
|
||||
send "U"
|
||||
|
||||
set timeout 5
|
||||
|
||||
expect_after {
|
||||
timeout { exit 1 }
|
||||
}
|
||||
|
||||
expect {
|
||||
"Installed plugins"
|
||||
}
|
||||
|
||||
expect {
|
||||
"tmux-example-plugin"
|
||||
}
|
||||
|
||||
expect {
|
||||
"\"all\" - updates all plugins"
|
||||
}
|
||||
|
||||
expect {
|
||||
"ENTER - cancels"
|
||||
}
|
||||
|
||||
# wait for tmux to display prompt before sending characters
|
||||
sleep 1
|
||||
send "all\r"
|
||||
|
||||
expect {
|
||||
"Updating all plugins!"
|
||||
}
|
||||
|
||||
expect {
|
||||
"Updating \"tmux-example-plugin\""
|
||||
}
|
||||
|
||||
expect {
|
||||
"\"tmux-example-plugin\" update success"
|
||||
}
|
||||
|
||||
expect {
|
||||
"Done, press ENTER to continue." {
|
||||
exit 0
|
||||
}
|
||||
}
|
||||
|
||||
exit 1
|
||||
13
files/system/usr/etc/skel/.tmux/plugins/tests/helpers/tpm.sh
Normal file
13
files/system/usr/etc/skel/.tmux/plugins/tests/helpers/tpm.sh
Normal file
@@ -0,0 +1,13 @@
|
||||
check_dir_exists_helper() {
|
||||
[ -d "$1" ]
|
||||
}
|
||||
|
||||
# runs the scripts and asserts it has the correct output and exit code
|
||||
script_run_helper() {
|
||||
local script="$1"
|
||||
local expected_output="$2"
|
||||
local expected_exit_code="${3:-0}"
|
||||
$script 2>&1 |
|
||||
grep "$expected_output" >/dev/null 2>&1 && # grep -q flag quits the script early
|
||||
[ "${PIPESTATUS[0]}" -eq "$expected_exit_code" ]
|
||||
}
|
||||
67
files/system/usr/etc/skel/.tmux/plugins/tests/test_plugin_clean.sh
Executable file
67
files/system/usr/etc/skel/.tmux/plugins/tests/test_plugin_clean.sh
Executable file
@@ -0,0 +1,67 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||
TPM_DIR="$PWD"
|
||||
PLUGINS_DIR="$HOME/.tmux/plugins"
|
||||
|
||||
source "$CURRENT_DIR/helpers/helpers.sh"
|
||||
source "$CURRENT_DIR/helpers/tpm.sh"
|
||||
|
||||
manually_install_the_plugin() {
|
||||
rm -rf "$PLUGINS_DIR"
|
||||
mkdir -p "$PLUGINS_DIR"
|
||||
cd "$PLUGINS_DIR"
|
||||
git clone --quiet https://github.com/tmux-plugins/tmux-example-plugin
|
||||
}
|
||||
|
||||
# TMUX KEY-BINDING TESTS
|
||||
|
||||
test_plugin_uninstallation_via_tmux_key_binding() {
|
||||
set_tmux_conf_helper <<- HERE
|
||||
set -g mode-keys vi
|
||||
run-shell "$TPM_DIR/tpm"
|
||||
HERE
|
||||
|
||||
manually_install_the_plugin
|
||||
|
||||
"$CURRENT_DIR/expect_successful_clean_plugins" ||
|
||||
fail_helper "[key-binding] clean fails"
|
||||
|
||||
teardown_helper
|
||||
}
|
||||
|
||||
# SCRIPT TESTS
|
||||
|
||||
test_plugin_uninstallation_via_script() {
|
||||
set_tmux_conf_helper <<- HERE
|
||||
set -g mode-keys vi
|
||||
run-shell "$TPM_DIR/tpm"
|
||||
HERE
|
||||
|
||||
manually_install_the_plugin
|
||||
|
||||
script_run_helper "$TPM_DIR/bin/clean_plugins" '"tmux-example-plugin" clean success' ||
|
||||
fail_helper "[script] plugin cleaning fails"
|
||||
|
||||
teardown_helper
|
||||
}
|
||||
|
||||
test_unsuccessful_plugin_uninstallation_via_script() {
|
||||
set_tmux_conf_helper <<- HERE
|
||||
set -g mode-keys vi
|
||||
run-shell "$TPM_DIR/tpm"
|
||||
HERE
|
||||
|
||||
manually_install_the_plugin
|
||||
chmod 000 "$PLUGINS_DIR/tmux-example-plugin" # disable directory deletion
|
||||
|
||||
local expected_exit_code=1
|
||||
script_run_helper "$TPM_DIR/bin/clean_plugins" '"tmux-example-plugin" clean fail' "$expected_exit_code" ||
|
||||
fail_helper "[script] unsuccessful plugin cleaning doesn't fail"
|
||||
|
||||
chmod 755 "$PLUGINS_DIR/tmux-example-plugin" # enable directory deletion
|
||||
|
||||
teardown_helper
|
||||
}
|
||||
|
||||
run_tests
|
||||
284
files/system/usr/etc/skel/.tmux/plugins/tests/test_plugin_installation.sh
Executable file
284
files/system/usr/etc/skel/.tmux/plugins/tests/test_plugin_installation.sh
Executable file
@@ -0,0 +1,284 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||
PLUGINS_DIR="$HOME/.tmux/plugins"
|
||||
TPM_DIR="$PWD"
|
||||
|
||||
CUSTOM_PLUGINS_DIR="$HOME/foo/plugins"
|
||||
ADDITIONAL_CONFIG_FILE_1="$HOME/.tmux/additional_config_file_1"
|
||||
ADDITIONAL_CONFIG_FILE_2="$HOME/.tmux/additional_config_file_2"
|
||||
|
||||
source "$CURRENT_DIR/helpers/helpers.sh"
|
||||
source "$CURRENT_DIR/helpers/tpm.sh"
|
||||
|
||||
# TMUX KEY-BINDING TESTS
|
||||
|
||||
test_plugin_installation_via_tmux_key_binding() {
|
||||
set_tmux_conf_helper <<- HERE
|
||||
set -g mode-keys vi
|
||||
set -g @plugin "tmux-plugins/tmux-example-plugin"
|
||||
run-shell "$TPM_DIR/tpm"
|
||||
HERE
|
||||
|
||||
"$CURRENT_DIR/expect_successful_plugin_download" ||
|
||||
fail_helper "[key-binding] plugin installation fails"
|
||||
|
||||
check_dir_exists_helper "$PLUGINS_DIR/tmux-example-plugin/" ||
|
||||
fail_helper "[key-binding] plugin download fails"
|
||||
|
||||
teardown_helper
|
||||
}
|
||||
|
||||
test_plugin_installation_via_tmux_key_binding_set_option() {
|
||||
set_tmux_conf_helper <<- HERE
|
||||
set -g mode-keys vi
|
||||
set-option -g @plugin "tmux-plugins/tmux-example-plugin"
|
||||
run-shell "$TPM_DIR/tpm"
|
||||
HERE
|
||||
|
||||
"$CURRENT_DIR/expect_successful_plugin_download" ||
|
||||
fail_helper "[key-binding][set-option] plugin installation fails"
|
||||
|
||||
check_dir_exists_helper "$PLUGINS_DIR/tmux-example-plugin/" ||
|
||||
fail_helper "[key-binding][set-option] plugin download fails"
|
||||
|
||||
teardown_helper
|
||||
}
|
||||
|
||||
test_plugin_installation_custom_dir_via_tmux_key_binding() {
|
||||
set_tmux_conf_helper <<- HERE
|
||||
set -g mode-keys vi
|
||||
set-environment -g TMUX_PLUGIN_MANAGER_PATH '$CUSTOM_PLUGINS_DIR'
|
||||
|
||||
set -g @plugin "tmux-plugins/tmux-example-plugin"
|
||||
run-shell "$TPM_DIR/tpm"
|
||||
HERE
|
||||
|
||||
"$CURRENT_DIR/expect_successful_plugin_download" ||
|
||||
fail_helper "[key-binding][custom dir] plugin installation fails"
|
||||
|
||||
check_dir_exists_helper "$CUSTOM_PLUGINS_DIR/tmux-example-plugin/" ||
|
||||
fail_helper "[key-binding][custom dir] plugin download fails"
|
||||
|
||||
teardown_helper
|
||||
rm -rf "$CUSTOM_PLUGINS_DIR"
|
||||
}
|
||||
|
||||
test_non_existing_plugin_installation_via_tmux_key_binding() {
|
||||
set_tmux_conf_helper <<- HERE
|
||||
set -g mode-keys vi
|
||||
set -g @plugin "tmux-plugins/non-existing-plugin"
|
||||
run-shell "$TPM_DIR/tpm"
|
||||
HERE
|
||||
|
||||
"$CURRENT_DIR/expect_failed_plugin_download" ||
|
||||
fail_helper "[key-binding] non existing plugin installation doesn't fail"
|
||||
|
||||
teardown_helper
|
||||
}
|
||||
|
||||
test_multiple_plugins_installation_via_tmux_key_binding() {
|
||||
set_tmux_conf_helper <<- HERE
|
||||
set -g mode-keys vi
|
||||
set -g @plugin "tmux-plugins/tmux-example-plugin"
|
||||
\ \ set -g @plugin 'tmux-plugins/tmux-copycat'
|
||||
run-shell "$TPM_DIR/tpm"
|
||||
HERE
|
||||
|
||||
"$CURRENT_DIR/expect_successful_multiple_plugins_download" ||
|
||||
fail_helper "[key-binding] multiple plugins installation fails"
|
||||
|
||||
check_dir_exists_helper "$PLUGINS_DIR/tmux-example-plugin/" ||
|
||||
fail_helper "[key-binding] plugin download fails (tmux-example-plugin)"
|
||||
|
||||
check_dir_exists_helper "$PLUGINS_DIR/tmux-copycat/" ||
|
||||
fail_helper "[key-binding] plugin download fails (tmux-copycat)"
|
||||
|
||||
teardown_helper
|
||||
}
|
||||
|
||||
test_plugins_installation_from_sourced_file_via_tmux_key_binding() {
|
||||
set_tmux_conf_helper <<- HERE
|
||||
set -g mode-keys vi
|
||||
source '$ADDITIONAL_CONFIG_FILE_1'
|
||||
set -g @plugin 'tmux-plugins/tmux-example-plugin'
|
||||
run-shell "$TPM_DIR/tpm"
|
||||
HERE
|
||||
|
||||
mkdir ~/.tmux
|
||||
echo "set -g @plugin 'tmux-plugins/tmux-copycat'" > "$ADDITIONAL_CONFIG_FILE_1"
|
||||
|
||||
"$CURRENT_DIR/expect_successful_multiple_plugins_download" ||
|
||||
fail_helper "[key-binding][sourced file] plugins installation fails"
|
||||
|
||||
check_dir_exists_helper "$PLUGINS_DIR/tmux-example-plugin/" ||
|
||||
fail_helper "[key-binding][sourced file] plugin download fails (tmux-example-plugin)"
|
||||
|
||||
check_dir_exists_helper "$PLUGINS_DIR/tmux-copycat/" ||
|
||||
fail_helper "[key-binding][sourced file] plugin download fails (tmux-copycat)"
|
||||
|
||||
teardown_helper
|
||||
}
|
||||
|
||||
test_plugins_installation_from_multiple_sourced_files_via_tmux_key_binding() {
|
||||
set_tmux_conf_helper <<- HERE
|
||||
set -g mode-keys vi
|
||||
\ \ source '$ADDITIONAL_CONFIG_FILE_1'
|
||||
source-file '$ADDITIONAL_CONFIG_FILE_2'
|
||||
run-shell "$TPM_DIR/tpm"
|
||||
HERE
|
||||
|
||||
mkdir ~/.tmux
|
||||
echo "set -g @plugin 'tmux-plugins/tmux-example-plugin'" > "$ADDITIONAL_CONFIG_FILE_1"
|
||||
echo " set -g @plugin 'tmux-plugins/tmux-copycat'" > "$ADDITIONAL_CONFIG_FILE_2"
|
||||
|
||||
"$CURRENT_DIR/expect_successful_multiple_plugins_download" ||
|
||||
fail_helper "[key-binding][multiple sourced files] plugins installation fails"
|
||||
|
||||
check_dir_exists_helper "$PLUGINS_DIR/tmux-example-plugin/" ||
|
||||
fail_helper "[key-binding][multiple sourced files] plugin download fails (tmux-example-plugin)"
|
||||
|
||||
check_dir_exists_helper "$PLUGINS_DIR/tmux-copycat/" ||
|
||||
fail_helper "[key-binding][multiple sourced files] plugin download fails (tmux-copycat)"
|
||||
|
||||
teardown_helper
|
||||
}
|
||||
|
||||
# SCRIPT TESTS
|
||||
|
||||
test_plugin_installation_via_script() {
|
||||
set_tmux_conf_helper <<- HERE
|
||||
set -g mode-keys vi
|
||||
set -g @plugin "tmux-plugins/tmux-example-plugin"
|
||||
run-shell "$TPM_DIR/tpm"
|
||||
HERE
|
||||
|
||||
script_run_helper "$TPM_DIR/bin/install_plugins" '"tmux-example-plugin" download success' ||
|
||||
fail_helper "[script] plugin installation fails"
|
||||
|
||||
check_dir_exists_helper "$PLUGINS_DIR/tmux-example-plugin/" ||
|
||||
fail_helper "[script] plugin download fails"
|
||||
|
||||
script_run_helper "$TPM_DIR/bin/install_plugins" 'Already installed "tmux-example-plugin"' ||
|
||||
fail_helper "[script] plugin already installed message fail"
|
||||
|
||||
teardown_helper
|
||||
}
|
||||
|
||||
test_plugin_installation_custom_dir_via_script() {
|
||||
set_tmux_conf_helper <<- HERE
|
||||
set -g mode-keys vi
|
||||
set-environment -g TMUX_PLUGIN_MANAGER_PATH '$CUSTOM_PLUGINS_DIR'
|
||||
|
||||
set -g @plugin "tmux-plugins/tmux-example-plugin"
|
||||
run-shell "$TPM_DIR/tpm"
|
||||
HERE
|
||||
|
||||
script_run_helper "$TPM_DIR/bin/install_plugins" '"tmux-example-plugin" download success' ||
|
||||
fail_helper "[script][custom dir] plugin installation fails"
|
||||
|
||||
check_dir_exists_helper "$CUSTOM_PLUGINS_DIR/tmux-example-plugin/" ||
|
||||
fail_helper "[script][custom dir] plugin download fails"
|
||||
|
||||
script_run_helper "$TPM_DIR/bin/install_plugins" 'Already installed "tmux-example-plugin"' ||
|
||||
fail_helper "[script][custom dir] plugin already installed message fail"
|
||||
|
||||
teardown_helper
|
||||
rm -rf "$CUSTOM_PLUGINS_DIR"
|
||||
}
|
||||
|
||||
test_non_existing_plugin_installation_via_script() {
|
||||
set_tmux_conf_helper <<- HERE
|
||||
set -g mode-keys vi
|
||||
set -g @plugin "tmux-plugins/non-existing-plugin"
|
||||
run-shell "$TPM_DIR/tpm"
|
||||
HERE
|
||||
|
||||
local expected_exit_code=1
|
||||
script_run_helper "$TPM_DIR/bin/install_plugins" '"non-existing-plugin" download fail' "$expected_exit_code" ||
|
||||
fail_helper "[script] non existing plugin installation doesn't fail"
|
||||
|
||||
teardown_helper
|
||||
}
|
||||
|
||||
test_multiple_plugins_installation_via_script() {
|
||||
set_tmux_conf_helper <<- HERE
|
||||
set -g mode-keys vi
|
||||
set -g @plugin "tmux-plugins/tmux-example-plugin"
|
||||
\ \ set -g @plugin 'tmux-plugins/tmux-copycat'
|
||||
run-shell "$TPM_DIR/tpm"
|
||||
HERE
|
||||
|
||||
script_run_helper "$TPM_DIR/bin/install_plugins" '"tmux-example-plugin" download success' ||
|
||||
fail_helper "[script] multiple plugins installation fails"
|
||||
|
||||
check_dir_exists_helper "$PLUGINS_DIR/tmux-example-plugin/" ||
|
||||
fail_helper "[script] plugin download fails (tmux-example-plugin)"
|
||||
|
||||
check_dir_exists_helper "$PLUGINS_DIR/tmux-copycat/" ||
|
||||
fail_helper "[script] plugin download fails (tmux-copycat)"
|
||||
|
||||
script_run_helper "$TPM_DIR/bin/install_plugins" 'Already installed "tmux-copycat"' ||
|
||||
fail_helper "[script] multiple plugins already installed message fail"
|
||||
|
||||
teardown_helper
|
||||
}
|
||||
|
||||
test_plugins_installation_from_sourced_file_via_script() {
|
||||
set_tmux_conf_helper <<- HERE
|
||||
set -g mode-keys vi
|
||||
source '$ADDITIONAL_CONFIG_FILE_1'
|
||||
set -g @plugin 'tmux-plugins/tmux-example-plugin'
|
||||
run-shell "$TPM_DIR/tpm"
|
||||
HERE
|
||||
|
||||
mkdir ~/.tmux
|
||||
echo "set -g @plugin 'tmux-plugins/tmux-copycat'" > "$ADDITIONAL_CONFIG_FILE_1"
|
||||
|
||||
script_run_helper "$TPM_DIR/bin/install_plugins" '"tmux-copycat" download success' ||
|
||||
fail_helper "[script][sourced file] plugins installation fails"
|
||||
|
||||
check_dir_exists_helper "$PLUGINS_DIR/tmux-example-plugin/" ||
|
||||
fail_helper "[script][sourced file] plugin download fails (tmux-example-plugin)"
|
||||
|
||||
check_dir_exists_helper "$PLUGINS_DIR/tmux-copycat/" ||
|
||||
fail_helper "[script][sourced file] plugin download fails (tmux-copycat)"
|
||||
|
||||
script_run_helper "$TPM_DIR/bin/install_plugins" 'Already installed "tmux-copycat"' ||
|
||||
fail_helper "[script][sourced file] plugins already installed message fail"
|
||||
|
||||
teardown_helper
|
||||
}
|
||||
|
||||
test_plugins_installation_from_multiple_sourced_files_via_script() {
|
||||
set_tmux_conf_helper <<- HERE
|
||||
set -g mode-keys vi
|
||||
\ \ source '$ADDITIONAL_CONFIG_FILE_1'
|
||||
source-file '$ADDITIONAL_CONFIG_FILE_2'
|
||||
set -g @plugin 'tmux-plugins/tmux-example-plugin'
|
||||
run-shell "$TPM_DIR/tpm"
|
||||
HERE
|
||||
|
||||
mkdir ~/.tmux
|
||||
echo " set -g @plugin 'tmux-plugins/tmux-copycat'" > "$ADDITIONAL_CONFIG_FILE_1"
|
||||
echo "set -g @plugin 'tmux-plugins/tmux-sensible'" > "$ADDITIONAL_CONFIG_FILE_2"
|
||||
|
||||
script_run_helper "$TPM_DIR/bin/install_plugins" '"tmux-sensible" download success' ||
|
||||
fail_helper "[script][multiple sourced files] plugins installation fails"
|
||||
|
||||
check_dir_exists_helper "$PLUGINS_DIR/tmux-example-plugin/" ||
|
||||
fail_helper "[script][multiple sourced files] plugin download fails (tmux-example-plugin)"
|
||||
|
||||
check_dir_exists_helper "$PLUGINS_DIR/tmux-copycat/" ||
|
||||
fail_helper "[script][multiple sourced files] plugin download fails (tmux-copycat)"
|
||||
|
||||
check_dir_exists_helper "$PLUGINS_DIR/tmux-sensible/" ||
|
||||
fail_helper "[script][multiple sourced files] plugin download fails (tmux-sensible)"
|
||||
|
||||
script_run_helper "$TPM_DIR/bin/install_plugins" 'Already installed "tmux-sensible"' ||
|
||||
fail_helper "[script][multiple sourced files] plugins already installed message fail"
|
||||
|
||||
teardown_helper
|
||||
}
|
||||
|
||||
run_tests
|
||||
100
files/system/usr/etc/skel/.tmux/plugins/tests/test_plugin_installation_legacy.sh
Executable file
100
files/system/usr/etc/skel/.tmux/plugins/tests/test_plugin_installation_legacy.sh
Executable file
@@ -0,0 +1,100 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||
PLUGINS_DIR="$HOME/.tmux/plugins"
|
||||
TPM_DIR="$PWD"
|
||||
|
||||
source "$CURRENT_DIR/helpers/helpers.sh"
|
||||
source "$CURRENT_DIR/helpers/tpm.sh"
|
||||
|
||||
# TMUX KEY-BINDING TESTS
|
||||
|
||||
test_plugin_installation_via_tmux_key_binding() {
|
||||
set_tmux_conf_helper <<- HERE
|
||||
set -g mode-keys vi
|
||||
set -g @tpm_plugins "tmux-plugins/tmux-example-plugin"
|
||||
run-shell "$TPM_DIR/tpm"
|
||||
HERE
|
||||
|
||||
# opens tmux and test it with `expect`
|
||||
$CURRENT_DIR/expect_successful_plugin_download ||
|
||||
fail_helper "[key-binding] plugin installation fails"
|
||||
|
||||
# check plugin dir exists after download
|
||||
check_dir_exists_helper "$PLUGINS_DIR/tmux-example-plugin/" ||
|
||||
fail_helper "[key-binding] plugin download fails"
|
||||
|
||||
teardown_helper
|
||||
}
|
||||
|
||||
test_legacy_and_new_syntax_for_plugin_installation_work_via_tmux_key_binding() {
|
||||
set_tmux_conf_helper <<- HERE
|
||||
set -g mode-keys vi
|
||||
set -g @tpm_plugins " \
|
||||
tmux-plugins/tmux-example-plugin \
|
||||
"
|
||||
set -g @plugin 'tmux-plugins/tmux-copycat'
|
||||
run-shell "$TPM_DIR/tpm"
|
||||
HERE
|
||||
|
||||
# opens tmux and test it with `expect`
|
||||
"$CURRENT_DIR"/expect_successful_multiple_plugins_download ||
|
||||
fail_helper "[key-binding] multiple plugins installation fails"
|
||||
|
||||
# check plugin dir exists after download
|
||||
check_dir_exists_helper "$PLUGINS_DIR/tmux-example-plugin/" ||
|
||||
fail_helper "[key-binding] plugin download fails (tmux-example-plugin)"
|
||||
|
||||
check_dir_exists_helper "$PLUGINS_DIR/tmux-copycat/" ||
|
||||
fail_helper "[key-binding] plugin download fails (tmux-copycat)"
|
||||
|
||||
teardown_helper
|
||||
}
|
||||
|
||||
# SCRIPT TESTS
|
||||
|
||||
test_plugin_installation_via_script() {
|
||||
set_tmux_conf_helper <<- HERE
|
||||
set -g mode-keys vi
|
||||
set -g @tpm_plugins "tmux-plugins/tmux-example-plugin"
|
||||
run-shell "$TPM_DIR/tpm"
|
||||
HERE
|
||||
|
||||
script_run_helper "$TPM_DIR/bin/install_plugins" '"tmux-example-plugin" download success' ||
|
||||
fail_helper "[script] plugin installation fails"
|
||||
|
||||
check_dir_exists_helper "$PLUGINS_DIR/tmux-example-plugin/" ||
|
||||
fail_helper "[script] plugin download fails"
|
||||
|
||||
script_run_helper "$TPM_DIR/bin/install_plugins" 'Already installed "tmux-example-plugin"' ||
|
||||
fail_helper "[script] plugin already installed message fail"
|
||||
|
||||
teardown_helper
|
||||
}
|
||||
|
||||
test_legacy_and_new_syntax_for_plugin_installation_work_via_script() {
|
||||
set_tmux_conf_helper <<- HERE
|
||||
set -g mode-keys vi
|
||||
set -g @tpm_plugins " \
|
||||
tmux-plugins/tmux-example-plugin \
|
||||
"
|
||||
set -g @plugin 'tmux-plugins/tmux-copycat'
|
||||
run-shell "$TPM_DIR/tpm"
|
||||
HERE
|
||||
|
||||
script_run_helper "$TPM_DIR/bin/install_plugins" '"tmux-example-plugin" download success' ||
|
||||
fail_helper "[script] multiple plugin installation fails"
|
||||
|
||||
check_dir_exists_helper "$PLUGINS_DIR/tmux-example-plugin/" ||
|
||||
fail_helper "[script] plugin download fails (tmux-example-plugin)"
|
||||
|
||||
check_dir_exists_helper "$PLUGINS_DIR/tmux-copycat/" ||
|
||||
fail_helper "[script] plugin download fails (tmux-copycat)"
|
||||
|
||||
script_run_helper "$TPM_DIR/bin/install_plugins" 'Already installed "tmux-copycat"' ||
|
||||
fail_helper "[script] multiple plugins already installed message fail"
|
||||
|
||||
teardown_helper
|
||||
}
|
||||
|
||||
run_tests
|
||||
78
files/system/usr/etc/skel/.tmux/plugins/tests/test_plugin_sourcing.sh
Executable file
78
files/system/usr/etc/skel/.tmux/plugins/tests/test_plugin_sourcing.sh
Executable file
@@ -0,0 +1,78 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||
TPM_DIR="$PWD"
|
||||
PLUGINS_DIR="$HOME/.tmux/plugins"
|
||||
|
||||
CUSTOM_PLUGINS_DIR="$HOME/foo/plugins"
|
||||
|
||||
source "$CURRENT_DIR/helpers/helpers.sh"
|
||||
source "$CURRENT_DIR/helpers/tpm.sh"
|
||||
|
||||
check_binding_defined() {
|
||||
local binding="$1"
|
||||
tmux list-keys | grep -q "$binding"
|
||||
}
|
||||
|
||||
create_test_plugin_helper() {
|
||||
local plugin_path="$PLUGINS_DIR/tmux_test_plugin/"
|
||||
rm -rf "$plugin_path"
|
||||
mkdir -p "$plugin_path"
|
||||
|
||||
while read line; do
|
||||
echo "$line" >> "$plugin_path/test_plugin.tmux"
|
||||
done
|
||||
chmod +x "$plugin_path/test_plugin.tmux"
|
||||
}
|
||||
|
||||
check_tpm_path() {
|
||||
local correct_tpm_path="$1"
|
||||
local tpm_path="$(tmux start-server\; show-environment -g TMUX_PLUGIN_MANAGER_PATH | cut -f2 -d=)"
|
||||
[ "$correct_tpm_path" == "$tpm_path" ]
|
||||
}
|
||||
|
||||
test_plugin_sourcing() {
|
||||
set_tmux_conf_helper <<- HERE
|
||||
set -g mode-keys vi
|
||||
set -g @plugin "doesnt_matter/tmux_test_plugin"
|
||||
run-shell "$TPM_DIR/tpm"
|
||||
HERE
|
||||
|
||||
# manually creates a local tmux plugin
|
||||
create_test_plugin_helper <<- HERE
|
||||
tmux bind-key R run-shell foo_command
|
||||
HERE
|
||||
|
||||
tmux new-session -d # tmux starts detached
|
||||
check_binding_defined "R run-shell foo_command" ||
|
||||
fail_helper "Plugin sourcing fails"
|
||||
|
||||
teardown_helper
|
||||
}
|
||||
|
||||
test_default_tpm_path() {
|
||||
set_tmux_conf_helper <<- HERE
|
||||
set -g mode-keys vi
|
||||
run-shell "$TPM_DIR/tpm"
|
||||
HERE
|
||||
|
||||
check_tpm_path "${PLUGINS_DIR}/" ||
|
||||
fail_helper "Default TPM path not correct"
|
||||
|
||||
teardown_helper
|
||||
}
|
||||
|
||||
test_custom_tpm_path() {
|
||||
set_tmux_conf_helper <<- HERE
|
||||
set -g mode-keys vi
|
||||
set-environment -g TMUX_PLUGIN_MANAGER_PATH '$CUSTOM_PLUGINS_DIR'
|
||||
run-shell "$TPM_DIR/tpm"
|
||||
HERE
|
||||
|
||||
check_tpm_path "$CUSTOM_PLUGINS_DIR" ||
|
||||
fail_helper "Custom TPM path not correct"
|
||||
|
||||
teardown_helper
|
||||
}
|
||||
|
||||
run_tests
|
||||
60
files/system/usr/etc/skel/.tmux/plugins/tests/test_plugin_update.sh
Executable file
60
files/system/usr/etc/skel/.tmux/plugins/tests/test_plugin_update.sh
Executable file
@@ -0,0 +1,60 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||
TPM_DIR="$PWD"
|
||||
PLUGINS_DIR="$HOME/.tmux/plugins"
|
||||
|
||||
source "$CURRENT_DIR/helpers/helpers.sh"
|
||||
source "$CURRENT_DIR/helpers/tpm.sh"
|
||||
|
||||
manually_install_the_plugin() {
|
||||
mkdir -p "$PLUGINS_DIR"
|
||||
cd "$PLUGINS_DIR"
|
||||
git clone --quiet https://github.com/tmux-plugins/tmux-example-plugin
|
||||
}
|
||||
|
||||
# TMUX KEY-BINDING TESTS
|
||||
|
||||
test_plugin_update_via_tmux_key_binding() {
|
||||
set_tmux_conf_helper <<- HERE
|
||||
set -g mode-keys vi
|
||||
set -g @plugin "tmux-plugins/tmux-example-plugin"
|
||||
run-shell "$TPM_DIR/tpm"
|
||||
HERE
|
||||
|
||||
manually_install_the_plugin
|
||||
|
||||
"$CURRENT_DIR/expect_successful_update_of_all_plugins" ||
|
||||
fail_helper "[key-binding] 'update all plugins' fails"
|
||||
|
||||
"$CURRENT_DIR/expect_successful_update_of_a_single_plugin" ||
|
||||
fail_helper "[key-binding] 'update single plugin' fails"
|
||||
|
||||
teardown_helper
|
||||
}
|
||||
|
||||
# SCRIPT TESTS
|
||||
|
||||
test_plugin_update_via_script() {
|
||||
set_tmux_conf_helper <<- HERE
|
||||
set -g mode-keys vi
|
||||
set -g @plugin "tmux-plugins/tmux-example-plugin"
|
||||
run-shell "$TPM_DIR/tpm"
|
||||
HERE
|
||||
|
||||
manually_install_the_plugin
|
||||
|
||||
local expected_exit_code=1
|
||||
script_run_helper "$TPM_DIR/bin/update_plugins" 'usage' "$expected_exit_code" ||
|
||||
fail_helper "[script] running update plugins without args should fail"
|
||||
|
||||
script_run_helper "$TPM_DIR/bin/update_plugins tmux-example-plugin" '"tmux-example-plugin" update success' ||
|
||||
fail_helper "[script] plugin update fails"
|
||||
|
||||
script_run_helper "$TPM_DIR/bin/update_plugins all" '"tmux-example-plugin" update success' ||
|
||||
fail_helper "[script] update all plugins fails"
|
||||
|
||||
teardown_helper
|
||||
}
|
||||
|
||||
run_tests
|
||||
2
files/system/usr/etc/skel/.tmux/plugins/tmux-continuum/.gitattributes
vendored
Normal file
2
files/system/usr/etc/skel/.tmux/plugins/tmux-continuum/.gitattributes
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
# Force text files to have unix eols, so Windows/Cygwin does not break them
|
||||
*.* eol=lf
|
||||
@@ -0,0 +1,45 @@
|
||||
# Changelog
|
||||
|
||||
### master
|
||||
- bugfix: "auto restore" feature stopped working
|
||||
- bugfix: prevent race condition when auto-saving with locks (@v9v)
|
||||
- Multiple users on a system can now each run continuum on their own.
|
||||
|
||||
### v3.1.0, 2015-03-14
|
||||
- properly quote scripts
|
||||
- bugfix: "auto restore" feature does not work on tmux `1.9a`
|
||||
- bugfix: do not count `tmux source-file .tmux.conf` as a tmux process (when
|
||||
checking if other tmux server is running). Previously, this caused
|
||||
interpolation command not to be inserted into `status-right` because `tmux
|
||||
source-file` was falsely detected as another tmux server.
|
||||
- add `#{continuum_status}` status line interpolation
|
||||
|
||||
### v3.0.0, 2015-02-20
|
||||
- rename the plugin from `tmux-resurrect-auto` to `tmux-continuum`
|
||||
|
||||
### v2.2.0, 2015-02-20
|
||||
- document tmux multi-server behavior in the readme
|
||||
- do not auto-restore tmux environment if another tmux server is already running
|
||||
(we don't want to duplicate stuff)
|
||||
- bugfixes for 'tmux auto start' OS X Terminal.app and iTerm scripts
|
||||
- prevent saving for the first 15 minutes only when plugin is sourced the first
|
||||
time (not on subsequent sources or tmux.conf reloads)
|
||||
- do not start auto-saving if there's another tmux server running (we don't want
|
||||
for save files from various tmux environments to override each other)
|
||||
|
||||
### v2.1.0, 2015-02-18
|
||||
- enable "tmux auto start" for OS X
|
||||
- enable customizing "tmux auto start" for OS X
|
||||
- fix errors when creating a launchd plist file for auto-start on OS X
|
||||
|
||||
### v2.0.0, 2015-02-15
|
||||
- enable automatic environment restore when tmux is started
|
||||
|
||||
### v1.0.0, 2015-02-12
|
||||
- first working version
|
||||
- run the save script in the background
|
||||
- do not start saving right after tmux is started
|
||||
- add a check for tmux version to the initializer script
|
||||
- when interval is set to '0' autosave is disabled
|
||||
- bugfix: helper files not loaded
|
||||
- update readme with the instructions how to disable auto saving
|
||||
@@ -0,0 +1,15 @@
|
||||
### Contributing
|
||||
|
||||
Code contributions are welcome!
|
||||
|
||||
If you wanna contribute a bigger feature, please open a github issue so we can
|
||||
discuss it together first.
|
||||
|
||||
### Reporting a bug
|
||||
|
||||
If you find a bug please report it in the issues. When reporting a bug please
|
||||
attach:
|
||||
- a file symlinked to `~/.tmux/resurrect/last`.
|
||||
- your `.tmux.conf`
|
||||
- if you're getting an error paste it to a [gist](https://gist.github.com/) and
|
||||
link it in the issue
|
||||
@@ -0,0 +1,19 @@
|
||||
Copyright (C) Bruno Sutic
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the "Software"),
|
||||
to deal in the Software without restriction, including without limitation
|
||||
the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
and/or sell copies of the Software, and to permit persons to whom the
|
||||
Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included
|
||||
in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||||
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
|
||||
OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
103
files/system/usr/etc/skel/.tmux/plugins/tmux-continuum/README.md
Normal file
103
files/system/usr/etc/skel/.tmux/plugins/tmux-continuum/README.md
Normal file
@@ -0,0 +1,103 @@
|
||||
# tmux-continuum
|
||||
|
||||
Features:
|
||||
|
||||
- continuous saving of tmux environment
|
||||
- automatic tmux start when computer/server is turned on
|
||||
- automatic restore when tmux is started
|
||||
|
||||
Together, these features enable uninterrupted tmux usage. No matter the computer
|
||||
or server restarts, if the machine is on, tmux will be there how you left it off
|
||||
the last time it was used.
|
||||
|
||||
Tested and working on Linux, OSX and Cygwin.
|
||||
|
||||
#### Continuous saving
|
||||
|
||||
Tmux environment will be saved at an interval of 15 minutes. All the saving
|
||||
happens in the background without impact to your workflow.
|
||||
|
||||
This action starts automatically when the plugin is installed. Note it requires
|
||||
the status line to be `on` to run (since it uses a hook in status-right to run).
|
||||
|
||||
#### Automatic tmux start
|
||||
|
||||
Tmux is automatically started after the computer/server is turned on.
|
||||
|
||||
See the [instructions](docs/automatic_start.md) on how to enable this for your
|
||||
system.
|
||||
|
||||
#### Automatic restore
|
||||
|
||||
Last saved environment is automatically restored when tmux is started.
|
||||
|
||||
Put `set -g @continuum-restore 'on'` in `.tmux.conf` to enable this.
|
||||
|
||||
Note: automatic restore happens **exclusively** on tmux server start. No other
|
||||
action (e.g. sourcing `.tmux.conf`) triggers this.
|
||||
|
||||
#### Dependencies
|
||||
|
||||
`tmux 1.9` or higher, `bash`,
|
||||
[tmux-resurrect](https://github.com/tmux-plugins/tmux-resurrect) plugin.
|
||||
|
||||
### Installation with [Tmux Plugin Manager](https://github.com/tmux-plugins/tpm) (recommended)
|
||||
|
||||
Please make sure you have
|
||||
[tmux-resurrect](https://github.com/tmux-plugins/tmux-resurrect) installed.
|
||||
|
||||
Add plugin to the list of TPM plugins in `.tmux.conf`:
|
||||
|
||||
set -g @plugin 'tmux-plugins/tmux-resurrect'
|
||||
set -g @plugin 'tmux-plugins/tmux-continuum'
|
||||
|
||||
Hit `prefix + I` to fetch the plugin and source it. The plugin will
|
||||
automatically start "working" in the background, no action required.
|
||||
|
||||
### Manual Installation
|
||||
|
||||
Please make sure you have
|
||||
[tmux-resurrect](https://github.com/tmux-plugins/tmux-resurrect) installed.
|
||||
|
||||
Clone the repo:
|
||||
|
||||
$ git clone https://github.com/tmux-plugins/tmux-continuum ~/clone/path
|
||||
|
||||
Add this line to the bottom of `.tmux.conf`:
|
||||
|
||||
run-shell ~/clone/path/continuum.tmux
|
||||
|
||||
Reload TMUX environment with: `$ tmux source-file ~/.tmux.conf`
|
||||
|
||||
The plugin will automatically start "working" in the background, no action
|
||||
required.
|
||||
|
||||
### Docs
|
||||
|
||||
- [frequently asked questions](docs/faq.md)
|
||||
- [behavior when running multiple tmux servers](docs/multiple_tmux_servers.md) -
|
||||
this doc is safe to skip, but you might want to read it if you're using tmux
|
||||
with `-L` or `-S` flags
|
||||
- [automatically start tmux after the computer is turned on](docs/automatic_start.md)
|
||||
- [continuum status in tmux status line](docs/continuum_status.md)
|
||||
|
||||
### Other goodies
|
||||
|
||||
- [tmux-copycat](https://github.com/tmux-plugins/tmux-copycat) - a plugin for
|
||||
regex searches in tmux and fast match selection
|
||||
- [tmux-yank](https://github.com/tmux-plugins/tmux-yank) - enables copying
|
||||
highlighted text to system clipboard
|
||||
- [tmux-open](https://github.com/tmux-plugins/tmux-open) - a plugin for quickly
|
||||
opening highlighted file or a url
|
||||
|
||||
### Known Issues
|
||||
|
||||
- In order to be executed periodically, the plugin updates the `status-right` tmux variable. In case some plugin (usually themes) overwrites the `status-right` variable, the autosave feature stops working. To fix this issue, place the plugin last in the TPM plugins list.
|
||||
|
||||
### Reporting bugs and contributing
|
||||
|
||||
Both contributing and bug reports are welcome. Please check out
|
||||
[contributing guidelines](CONTRIBUTING.md).
|
||||
|
||||
### License
|
||||
[MIT](LICENSE.md)
|
||||
89
files/system/usr/etc/skel/.tmux/plugins/tmux-continuum/continuum.tmux
Executable file
89
files/system/usr/etc/skel/.tmux/plugins/tmux-continuum/continuum.tmux
Executable file
@@ -0,0 +1,89 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -x
|
||||
|
||||
CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||
|
||||
source "$CURRENT_DIR/scripts/helpers.sh"
|
||||
source "$CURRENT_DIR/scripts/variables.sh"
|
||||
source "$CURRENT_DIR/scripts/shared.sh"
|
||||
|
||||
save_command_interpolation="#($CURRENT_DIR/scripts/continuum_save.sh)"
|
||||
|
||||
supported_tmux_version_ok() {
|
||||
"$CURRENT_DIR/scripts/check_tmux_version.sh" "$SUPPORTED_VERSION"
|
||||
}
|
||||
|
||||
handle_tmux_automatic_start() {
|
||||
"$CURRENT_DIR/scripts/handle_tmux_automatic_start.sh"
|
||||
}
|
||||
|
||||
another_tmux_server_running() {
|
||||
if just_started_tmux_server; then
|
||||
another_tmux_server_running_on_startup
|
||||
else
|
||||
# script loaded after tmux server start can have multiple clients attached
|
||||
[ "$(number_tmux_processes_except_current_server)" -gt "$(number_current_server_client_processes)" ]
|
||||
fi
|
||||
}
|
||||
|
||||
delay_saving_environment_on_first_plugin_load() {
|
||||
if [ -z "$(get_tmux_option "$last_auto_save_option" "")" ]; then
|
||||
# last save option not set, this is first time plugin load
|
||||
set_last_save_timestamp
|
||||
fi
|
||||
}
|
||||
|
||||
add_resurrect_save_interpolation() {
|
||||
local status_right_value="$(get_tmux_option "status-right" "")"
|
||||
# check interpolation not already added
|
||||
if ! [[ "$status_right_value" == *"$save_command_interpolation"* ]]; then
|
||||
local new_value="${save_command_interpolation}${status_right_value}"
|
||||
set_tmux_option "status-right" "$new_value"
|
||||
fi
|
||||
}
|
||||
|
||||
just_started_tmux_server() {
|
||||
local tmux_start_time
|
||||
tmux_start_time="$(tmux display-message -p -F '#{start_time}')"
|
||||
local restore_max_delay
|
||||
restore_max_delay="$(get_tmux_option "$auto_restore_max_delay_option" "${auto_restore_max_delay_default}")"
|
||||
[ "$tmux_start_time" == "" ] || [ "$tmux_start_time" -gt "$(($(date +%s)-${restore_max_delay}))" ]
|
||||
}
|
||||
|
||||
start_auto_restore_in_background() {
|
||||
"$CURRENT_DIR/scripts/continuum_restore.sh" &
|
||||
}
|
||||
|
||||
update_tmux_option() {
|
||||
local option="$1"
|
||||
local option_value="$(get_tmux_option "$option")"
|
||||
# replace interpolation string with a script to execute
|
||||
local new_option_value="${option_value/$status_interpolation_string/$status_script}"
|
||||
set_tmux_option "$option" "$new_option_value"
|
||||
}
|
||||
|
||||
main() {
|
||||
if supported_tmux_version_ok; then
|
||||
handle_tmux_automatic_start
|
||||
|
||||
# Advanced edge case handling: start auto-saving only if this is the
|
||||
# only tmux server. We don't want saved files from more environments to
|
||||
# overwrite each other.
|
||||
if ! another_tmux_server_running; then
|
||||
# give user a chance to restore previously saved session
|
||||
delay_saving_environment_on_first_plugin_load
|
||||
add_resurrect_save_interpolation
|
||||
fi
|
||||
|
||||
if just_started_tmux_server; then
|
||||
start_auto_restore_in_background
|
||||
fi
|
||||
|
||||
# Put "#{continuum_status}" interpolation in status-right or
|
||||
# status-left tmux option to get current tmux continuum status.
|
||||
update_tmux_option "status-right"
|
||||
update_tmux_option "status-left"
|
||||
fi
|
||||
}
|
||||
main
|
||||
@@ -0,0 +1,47 @@
|
||||
# Automatic Tmux start
|
||||
|
||||
Tmux is automatically started after the computer/server is turned on.
|
||||
|
||||
### OS X
|
||||
|
||||
To enable this feature:
|
||||
- put `set -g @continuum-boot 'on'` in `.tmux.conf`
|
||||
- reload tmux config with this shell command: `$ tmux source-file ~/.tmux.conf`
|
||||
|
||||
Next time the computer is started:
|
||||
- `Terminal.app` window will open and resize to maximum size
|
||||
- `tmux` command will be executed in the terminal window
|
||||
- if "auto restore" feature is enabled, tmux will start restoring previous env
|
||||
|
||||
Config options:
|
||||
- `set -g @continuum-boot-options 'fullscreen'` - terminal window
|
||||
will go fullscreen
|
||||
- `set -g @continuum-boot-options 'iterm'` - start [iTerm](https://www.iterm2.com) instead
|
||||
of `Terminal.app`
|
||||
- `set -g @continuum-boot-options 'iterm,fullscreen'` - start `iTerm`
|
||||
in fullscreen
|
||||
- `set -g @continuum-boot-options 'kitty'` - start [kitty](https://sw.kovidgoyal.net/kitty) instead
|
||||
of `Terminal.app`
|
||||
- `set -g @continuum-boot-options 'kitty,fullscreen'` - start `kitty`
|
||||
in fullscreen
|
||||
- `set -g @continuum-boot-options 'alacritty'` - start [alacritty](https://github.com/alacritty/alacritty) instead of `Terminal.app`
|
||||
- `set -g @continuum-boot-options 'alacritty,fullscreen'` - start `alacritty`
|
||||
in fullscreen
|
||||
|
||||
Note: The first time you reboot your machine and activate this feature you may be prompted about a script requiring
|
||||
access to a system program (i.e. - System Events). If this happens tmux will not start automatically and you will need
|
||||
to go to `System Preferences -> Security & Privacy -> Accessability` and add the script to the list of apps that are
|
||||
allowed to control your computer.
|
||||
|
||||
### Linux
|
||||
|
||||
Help with this would be greatly appreciated. Please get in touch.
|
||||
|
||||
#### Systemd
|
||||
|
||||
##### this will only start the tmux server, it will *not* start any terminal emulator
|
||||
|
||||
To enable automatic start with systemd:
|
||||
- Put `set -g @continuum-boot 'on'` in `.tmux.conf`
|
||||
- reload tmux config with this shell command: `$ tmux source-file ~/.tmux.conf`
|
||||
- see [systemd](/docs/systemd_details.md) for more details about how this is implemented
|
||||
@@ -0,0 +1,17 @@
|
||||
## Continuum status in tmux status line
|
||||
|
||||
There is an option to display current status of tmux continuum in tmux status
|
||||
line. This is done via `#{continuum_status}` interpolation and it works with
|
||||
both `status-right` and `status-left` tmux native options.
|
||||
|
||||
Example usage:
|
||||
|
||||
set -g status-right 'Continuum status: #{continuum_status}'
|
||||
|
||||
When running, `#{continuum_status}` will show continuum save interval:
|
||||
|
||||
Continuum status: 15
|
||||
|
||||
or if continuous saving is disabled:
|
||||
|
||||
Continuum status: off
|
||||
@@ -0,0 +1,45 @@
|
||||
### FAQ
|
||||
|
||||
> Will a previous save be overwritten immediately after I start tmux?
|
||||
|
||||
No, first automatic save starts 15 minutes after tmux is started. If automatic
|
||||
restore is not enabled, that gives you enough time to manually restore from a
|
||||
previous save.
|
||||
|
||||
> I want to make a restore to a previous point in time, but it seems that save
|
||||
is now overwritten?
|
||||
|
||||
Read how to [restore a previously saved environment](https://github.com/tmux-plugins/tmux-resurrect/blob/master/docs/restoring_previously_saved_environment.md)
|
||||
|
||||
> Will this plugin fill my hard disk?
|
||||
|
||||
Most likely no. A regular save file is in the range of 5Kb. And `tmux-resurrect` already has a `remove_old_backups()` routine that will ["remove resurrect files older than 30 days, but keep at least 5 copies of backup."](https://github.com/tmux-plugins/tmux-resurrect/blob/da1a7558024b8552f7262b39ed22e3d679304f99/scripts/save.sh#L271-L277)
|
||||
|
||||
> How do I change the save interval to i.e. 1 hour?
|
||||
|
||||
The interval is always measured in minutes. So setting the interval to `60`
|
||||
(minutes) will do the trick. Put this in `.tmux.conf`:
|
||||
|
||||
set -g @continuum-save-interval '60'
|
||||
|
||||
and then source `tmux.conf` by executing this command in the shell
|
||||
`$ tmux source-file ~/.tmux.conf`.
|
||||
|
||||
> How do I stop automatic saving?
|
||||
|
||||
Just set the save interval to `0`. Put this in `.tmux.conf`
|
||||
|
||||
set -g @continuum-save-interval '0'
|
||||
|
||||
and then source `tmux.conf` by executing this command in the shell
|
||||
`$ tmux source-file ~/.tmux.conf`.
|
||||
|
||||
> I had automatic restore turned on, how do I disable it now?
|
||||
|
||||
Just remove `set -g @continuum-restore 'on'` from `tmux.conf`.
|
||||
|
||||
To be absolutely sure automatic restore doesn't happen, create a
|
||||
`tmux_no_auto_restore` file in your home directory (command:
|
||||
`$ touch ~/tmux_no_auto_restore`). Automatic restore won't happen if this file
|
||||
exists.
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
### Behavior when running multiple tmux servers
|
||||
|
||||
(This is safe to skip if you're always running a single tmux server.)
|
||||
|
||||
If you're an advanced tmux user, you might be running multiple tmux servers at
|
||||
the same time. Maybe you start the first tmux server with `$ tmux` and then
|
||||
later another one with e.g. `$ tmux -S/tmp/foo`.
|
||||
|
||||
You probably don't want to "auto restore" the same environment in the second
|
||||
tmux that uses `/tmp/foo` socket. You also probably don't want two tmux
|
||||
environments both having "auto save" feature on (think about overwrites).
|
||||
|
||||
This plugin handles multi-server scenario by giving precedence to the tmux
|
||||
server that was first started.
|
||||
|
||||
In the above example, the server started with `$ tmux` will do "auto
|
||||
restore" (if enabled) and will start "auto saving".
|
||||
"Auto restore" or "auto saving" **will not** happen for the second server that
|
||||
was started later with the `$ tmux -S/tmp/foo` command. The plugin will
|
||||
detect the presence of another server (`$ tmux`) and give it precedence.
|
||||
@@ -0,0 +1,13 @@
|
||||
# Systemd automatic start for tmux
|
||||
|
||||
The first time tmux starts when `@continuum-boot` is set to 'on' tmux-continuum will generate a user level systemd unit file which it will save to `${HOME}/.config/systemd/user/tmux.service` and enable it. From then on when that user logs in, either through a GUI session or on the console or via ssh, Systemd will start the tmux server.
|
||||
|
||||
The command used to start the tmux server is determined via the `@continuum-systemd-start-cmd` option that can be set in .tmux.conf. (Remember to reload your configuration with `tmux source ~/.tmux.conf` afterwards.
|
||||
|
||||
The default command to use is `new-session -d`. If you want more control over what sessions get started then you should set up your sessions in tmux.conf and set `@continuum-systemd-start-cmd = 'start-server'`. As this will be executed as part of systemd's ExecStart statement there will be no shell parsing. See [Systemd manual](http://www.freedesktop.org/software/systemd/man/systemd.service.html#Command%20lines) for more details.
|
||||
|
||||
To control the tmux service you can use all the standard `systemctl` commands using the `--user` argument. eg to see if the tmux server has started:
|
||||
|
||||
systemctl --user status tmux.service
|
||||
|
||||
|
||||
@@ -0,0 +1,33 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
VERSION="$1"
|
||||
UNSUPPORTED_MSG="$2"
|
||||
|
||||
# this is used to get "clean" integer version number. Examples:
|
||||
# `tmux 1.9` => `19`
|
||||
# `1.9a` => `19`
|
||||
get_digits_from_string() {
|
||||
local string="$1"
|
||||
local only_digits="$(echo "$string" | tr -dC '[:digit:]')"
|
||||
echo "$only_digits"
|
||||
}
|
||||
|
||||
tmux_version_int() {
|
||||
local tmux_version_string=$(tmux -V)
|
||||
echo "$(get_digits_from_string "$tmux_version_string")"
|
||||
}
|
||||
|
||||
exit_if_unsupported_version() {
|
||||
local current_version="$1"
|
||||
local supported_version="$2"
|
||||
if [ "$current_version" -lt "$supported_version" ]; then
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
main() {
|
||||
local supported_version_int="$(get_digits_from_string "$VERSION")"
|
||||
local current_version_int="$(tmux_version_int)"
|
||||
exit_if_unsupported_version "$current_version_int" "$supported_version_int"
|
||||
}
|
||||
main
|
||||
@@ -0,0 +1,29 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||
|
||||
source "$CURRENT_DIR/helpers.sh"
|
||||
source "$CURRENT_DIR/variables.sh"
|
||||
|
||||
auto_restore_enabled() {
|
||||
local auto_restore_value="$(get_tmux_option "$auto_restore_option" "$auto_restore_default")"
|
||||
[ "$auto_restore_value" == "on" ] && [ ! -f "$auto_restore_halt_file" ]
|
||||
}
|
||||
|
||||
fetch_and_run_tmux_resurrect_restore_script() {
|
||||
# give tmux some time to start and source all the plugins
|
||||
sleep 1
|
||||
local resurrect_restore_script_path="$(get_tmux_option "$resurrect_restore_path_option" "")"
|
||||
if [ -n "$resurrect_restore_script_path" ]; then
|
||||
"$resurrect_restore_script_path"
|
||||
fi
|
||||
}
|
||||
|
||||
main() {
|
||||
# Advanced edge case handling: auto restore only if this is the only tmux
|
||||
# server. If another tmux server exists, it is assumed auto-restore is not wanted.
|
||||
if auto_restore_enabled && ! another_tmux_server_running_on_startup; then
|
||||
fetch_and_run_tmux_resurrect_restore_script
|
||||
fi
|
||||
}
|
||||
main
|
||||
@@ -0,0 +1,60 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||
|
||||
source "$CURRENT_DIR/helpers.sh"
|
||||
source "$CURRENT_DIR/variables.sh"
|
||||
source "$CURRENT_DIR/shared.sh"
|
||||
|
||||
supported_tmux_version_ok() {
|
||||
"$CURRENT_DIR/check_tmux_version.sh" "$SUPPORTED_VERSION"
|
||||
}
|
||||
|
||||
get_interval() {
|
||||
get_tmux_option "$auto_save_interval_option" "$auto_save_interval_default"
|
||||
}
|
||||
|
||||
auto_save_not_disabled() {
|
||||
[ "$(get_interval)" -gt 0 ]
|
||||
}
|
||||
|
||||
enough_time_since_last_run_passed() {
|
||||
local last_saved_timestamp="$(get_tmux_option "$last_auto_save_option" "0")"
|
||||
local interval_minutes="$(get_interval)"
|
||||
local interval_seconds="$((interval_minutes * 60))"
|
||||
local next_run="$((last_saved_timestamp + $interval_seconds))"
|
||||
[ "$(current_timestamp)" -ge "$next_run" ]
|
||||
}
|
||||
|
||||
fetch_and_run_tmux_resurrect_save_script() {
|
||||
local resurrect_save_script_path="$(get_tmux_option "$resurrect_save_path_option" "")"
|
||||
if [ -n "$resurrect_save_script_path" ]; then
|
||||
"$resurrect_save_script_path" "quiet" >/dev/null 2>&1 &
|
||||
set_last_save_timestamp
|
||||
fi
|
||||
}
|
||||
|
||||
acquire_lock() {
|
||||
# Sometimes tmux starts multiple saves in parallel. We want only one
|
||||
# save to be running, otherwise we can get corrupted saved state.
|
||||
local lockdir_prefix="/tmp/tmux-continuum-$(current_tmux_server_pid)-lock-"
|
||||
# The following implements a lock that auto-expires after 100...200s.
|
||||
local lock_generation=$((`date +%s` / 100))
|
||||
local lockdir1="${lockdir_prefix}${lock_generation}"
|
||||
local lockdir2="${lockdir_prefix}$(($lock_generation + 1))"
|
||||
if mkdir "$lockdir1"; then
|
||||
trap "rmdir "$lockdir1"" EXIT
|
||||
if mkdir "$lockdir2"; then
|
||||
trap "rmdir "$lockdir1" "$lockdir2"" EXIT
|
||||
return 0
|
||||
fi
|
||||
fi
|
||||
return 1 # Someone else has the lock.
|
||||
}
|
||||
|
||||
main() {
|
||||
if supported_tmux_version_ok && auto_save_not_disabled && enough_time_since_last_run_passed && acquire_lock; then
|
||||
fetch_and_run_tmux_resurrect_save_script
|
||||
fi
|
||||
}
|
||||
main
|
||||
@@ -0,0 +1,25 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||
|
||||
source "$CURRENT_DIR/helpers.sh"
|
||||
source "$CURRENT_DIR/variables.sh"
|
||||
|
||||
print_status() {
|
||||
local save_int="$(get_tmux_option "$auto_save_interval_option")"
|
||||
local status=""
|
||||
local style_wrap
|
||||
if [ $save_int -gt 0 ]; then
|
||||
style_wrap="$(get_tmux_option "$status_on_style_wrap_option" "")"
|
||||
status="$save_int"
|
||||
else
|
||||
style_wrap="$(get_tmux_option "$status_off_style_wrap_option" "")"
|
||||
status="off"
|
||||
fi
|
||||
|
||||
if [ -n "$style_wrap" ]; then
|
||||
status="${style_wrap/$status_wrap_string/$status}"
|
||||
fi
|
||||
echo "$status"
|
||||
}
|
||||
print_status
|
||||
@@ -0,0 +1,36 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||
|
||||
source "$CURRENT_DIR/helpers.sh"
|
||||
source "$CURRENT_DIR/variables.sh"
|
||||
|
||||
is_tmux_automatic_start_enabled() {
|
||||
local auto_start_value="$(get_tmux_option "$auto_start_option" "$auto_start_default")"
|
||||
[ "$auto_start_value" == "on" ]
|
||||
}
|
||||
|
||||
is_osx() {
|
||||
[ $(uname) == "Darwin" ]
|
||||
}
|
||||
|
||||
is_systemd() {
|
||||
[ $(ps -o comm= -p1) == 'systemd' ]
|
||||
}
|
||||
|
||||
main() {
|
||||
if is_tmux_automatic_start_enabled; then
|
||||
if is_osx; then
|
||||
"$CURRENT_DIR/handle_tmux_automatic_start/osx_enable.sh"
|
||||
elif is_systemd; then
|
||||
"$CURRENT_DIR/handle_tmux_automatic_start/systemd_enable.sh"
|
||||
fi
|
||||
else
|
||||
if is_osx; then
|
||||
"$CURRENT_DIR/handle_tmux_automatic_start/osx_disable.sh"
|
||||
elif is_systemd; then
|
||||
"$CURRENT_DIR/handle_tmux_automatic_start/systemd_disable.sh"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
main
|
||||
@@ -0,0 +1 @@
|
||||
../../docs/automatic_start.md
|
||||
@@ -0,0 +1,68 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# for "true full screen" call the script with "fullscreen" as the first argument
|
||||
TRUE_FULL_SCREEN="$1"
|
||||
|
||||
start_terminal_and_run_tmux() {
|
||||
osascript <<-EOF
|
||||
tell application "alacritty"
|
||||
activate
|
||||
delay 0.5
|
||||
tell application "System Events" to tell process "alacritty"
|
||||
set frontmost to true
|
||||
keystroke "tmux"
|
||||
key code 36
|
||||
end tell
|
||||
end tell
|
||||
EOF
|
||||
}
|
||||
|
||||
resize_window_to_full_screen() {
|
||||
osascript <<-EOF
|
||||
tell application "alacritty"
|
||||
activate
|
||||
tell application "System Events"
|
||||
if (every window of process "alacritty") is {} then
|
||||
keystroke "n" using command down
|
||||
end if
|
||||
|
||||
tell application "Finder"
|
||||
set desktopSize to bounds of window of desktop
|
||||
end tell
|
||||
|
||||
set position of front window of process "alacritty" to {0, 0}
|
||||
set size of front window of process "alacritty" to {item 3 of desktopSize, item 4 of desktopSize}
|
||||
end tell
|
||||
end tell
|
||||
EOF
|
||||
}
|
||||
|
||||
resize_to_true_full_screen() {
|
||||
osascript <<-EOF
|
||||
tell application "Alacritty"
|
||||
activate
|
||||
delay 0.5
|
||||
tell application "System Events" to tell process "Alacritty"
|
||||
if front window exists then
|
||||
tell front window
|
||||
if value of attribute "AXFullScreen" then
|
||||
set value of attribute "AXFullScreen" to false
|
||||
else
|
||||
set value of attribute "AXFullScreen" to true
|
||||
end if
|
||||
end tell
|
||||
end if
|
||||
end tell
|
||||
end tell
|
||||
EOF
|
||||
}
|
||||
|
||||
main() {
|
||||
start_terminal_and_run_tmux
|
||||
if [ "$TRUE_FULL_SCREEN" == "fullscreen" ]; then
|
||||
resize_to_true_full_screen
|
||||
else
|
||||
resize_window_to_full_screen
|
||||
fi
|
||||
}
|
||||
main
|
||||
@@ -0,0 +1,10 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||
|
||||
source "$CURRENT_DIR/../variables.sh"
|
||||
|
||||
main() {
|
||||
rm "$osx_auto_start_file_path" > /dev/null 2>&1
|
||||
}
|
||||
main
|
||||
@@ -0,0 +1,72 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||
|
||||
source "$CURRENT_DIR/../helpers.sh"
|
||||
source "$CURRENT_DIR/../variables.sh"
|
||||
|
||||
template() {
|
||||
local tmux_start_script="$1"
|
||||
local is_fullscreen="$2"
|
||||
|
||||
local fullscreen_tag=""
|
||||
if [ "$is_fullscreen" == "true" ]; then
|
||||
# newline and spacing so tag is aligned with other tags in template
|
||||
fullscreen_tag=$'\n <string>fullscreen</string>'
|
||||
fi
|
||||
|
||||
local content
|
||||
read -r -d '' content <<-EOF
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>Label</key>
|
||||
<string>${osx_auto_start_file_name}</string>
|
||||
<key>ProgramArguments</key>
|
||||
<array>
|
||||
<string>${tmux_start_script}</string>$fullscreen_tag
|
||||
</array>
|
||||
<key>RunAtLoad</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</plist>
|
||||
EOF
|
||||
echo "$content"
|
||||
}
|
||||
|
||||
get_strategy() {
|
||||
local options="$1"
|
||||
if [[ "$options" =~ "iterm" ]]; then
|
||||
echo "iterm"
|
||||
elif [[ "$options" =~ "kitty" ]]; then
|
||||
echo "kitty"
|
||||
elif [[ "$options" =~ "alacritty" ]]; then
|
||||
echo "alacritty"
|
||||
else
|
||||
# Terminal.app is the default console app
|
||||
echo "terminal"
|
||||
fi
|
||||
}
|
||||
|
||||
get_fullscreen_option_value() {
|
||||
local options="$1"
|
||||
if [[ "$options" =~ "fullscreen" ]]; then
|
||||
echo "true"
|
||||
else
|
||||
echo "false"
|
||||
fi
|
||||
}
|
||||
|
||||
main() {
|
||||
local options="$(get_tmux_option "$auto_start_config_option" "$auto_start_config_default")"
|
||||
local strategy="$(get_strategy "$options")"
|
||||
local fullscreen_option_value="$(get_fullscreen_option_value "$options")"
|
||||
local tmux_start_script_path="${CURRENT_DIR}/osx_${strategy}_start_tmux.sh"
|
||||
|
||||
local launchd_plist_file_content="$(template "$tmux_start_script_path" "$fullscreen_option_value")"
|
||||
if ! diff "$osx_auto_start_file_path" <(echo "$launchd_plist_file_content") &>/dev/null ; then
|
||||
echo "$launchd_plist_file_content" > "$osx_auto_start_file_path"
|
||||
fi
|
||||
}
|
||||
main
|
||||
@@ -0,0 +1,66 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# for "true full screen" call the script with "fullscreen" as the first argument
|
||||
TRUE_FULL_SCREEN="$1"
|
||||
|
||||
start_iterm_and_run_tmux() {
|
||||
osascript <<-EOF
|
||||
tell application "iTerm"
|
||||
activate
|
||||
|
||||
# open iterm window
|
||||
try
|
||||
set _session to current session of current window
|
||||
on error
|
||||
set _term to (make new terminal)
|
||||
tell _term
|
||||
launch session "Tmux"
|
||||
set _session to current session
|
||||
end tell
|
||||
end try
|
||||
|
||||
# start tmux
|
||||
tell _session
|
||||
write text "tmux"
|
||||
end tell
|
||||
end tell
|
||||
EOF
|
||||
}
|
||||
|
||||
resize_window_to_full_screen() {
|
||||
osascript <<-EOF
|
||||
tell application "iTerm"
|
||||
set winID to id of window 1
|
||||
tell application "Finder"
|
||||
set desktopSize to bounds of window of desktop
|
||||
end tell
|
||||
set bounds of window id winID to desktopSize
|
||||
end tell
|
||||
EOF
|
||||
}
|
||||
|
||||
resize_to_true_full_screen() {
|
||||
osascript <<-EOF
|
||||
tell application "iTerm"
|
||||
# wait for iTerm to start
|
||||
delay 1
|
||||
activate
|
||||
# short wait for iTerm to gain focus
|
||||
delay 0.1
|
||||
# Command + Enter for fullscreen
|
||||
tell application "System Events"
|
||||
key code 36 using {command down}
|
||||
end tell
|
||||
end tell
|
||||
EOF
|
||||
}
|
||||
|
||||
main() {
|
||||
start_iterm_and_run_tmux
|
||||
if [ "$TRUE_FULL_SCREEN" == "fullscreen" ]; then
|
||||
resize_to_true_full_screen
|
||||
else
|
||||
resize_window_to_full_screen
|
||||
fi
|
||||
}
|
||||
main
|
||||
@@ -0,0 +1,60 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# for "true full screen" call the script with "fullscreen" as the first argument
|
||||
TRUE_FULL_SCREEN="$1"
|
||||
|
||||
start_terminal_and_run_tmux() {
|
||||
osascript <<-EOF
|
||||
tell application "kitty"
|
||||
activate
|
||||
delay 5
|
||||
tell application "System Events" to tell process "kitty"
|
||||
set frontmost to true
|
||||
keystroke "tmux"
|
||||
key code 36
|
||||
end tell
|
||||
end tell
|
||||
EOF
|
||||
}
|
||||
|
||||
resize_window_to_full_screen() {
|
||||
osascript <<-EOF
|
||||
tell application "kitty"
|
||||
activate
|
||||
tell application "System Events"
|
||||
if (every window of process "kitty") is {} then
|
||||
keystroke "n" using command down
|
||||
end if
|
||||
|
||||
tell application "Finder"
|
||||
set desktopSize to bounds of window of desktop
|
||||
end tell
|
||||
|
||||
set position of front window of process "kitty" to {0, 0}
|
||||
set size of front window of process "kitty" to {item 3 of desktopSize, item 4 of desktopSize}
|
||||
end tell
|
||||
end tell
|
||||
EOF
|
||||
}
|
||||
|
||||
resize_to_true_full_screen() {
|
||||
osascript <<-EOF
|
||||
tell application "kitty"
|
||||
activate
|
||||
delay 1
|
||||
tell application "System Events" to tell process "kitty"
|
||||
keystroke "f" using {control down, command down}
|
||||
end tell
|
||||
end tell
|
||||
EOF
|
||||
}
|
||||
|
||||
main() {
|
||||
start_terminal_and_run_tmux
|
||||
if [ "$TRUE_FULL_SCREEN" == "fullscreen" ]; then
|
||||
resize_to_true_full_screen
|
||||
else
|
||||
resize_window_to_full_screen
|
||||
fi
|
||||
}
|
||||
main
|
||||
@@ -0,0 +1,52 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# for "true full screen" call the script with "fullscreen" as the first argument
|
||||
TRUE_FULL_SCREEN="$1"
|
||||
|
||||
start_terminal_and_run_tmux() {
|
||||
osascript <<-EOF
|
||||
tell application "Terminal"
|
||||
if not (exists window 1) then reopen
|
||||
activate
|
||||
set winID to id of window 1
|
||||
do script "tmux" in window id winID
|
||||
end tell
|
||||
EOF
|
||||
}
|
||||
|
||||
resize_window_to_full_screen() {
|
||||
osascript <<-EOF
|
||||
tell application "Terminal"
|
||||
set winID to id of window 1
|
||||
tell application "Finder"
|
||||
set desktopSize to bounds of window of desktop
|
||||
end tell
|
||||
set bounds of window id winID to desktopSize
|
||||
end tell
|
||||
EOF
|
||||
}
|
||||
|
||||
resize_to_true_full_screen() {
|
||||
osascript <<-EOF
|
||||
tell application "Terminal"
|
||||
# waiting for Terminal.app to start
|
||||
delay 1
|
||||
activate
|
||||
# short wait for Terminal to gain focus
|
||||
delay 0.1
|
||||
tell application "System Events"
|
||||
keystroke "f" using {control down, command down}
|
||||
end tell
|
||||
end tell
|
||||
EOF
|
||||
}
|
||||
|
||||
main() {
|
||||
start_terminal_and_run_tmux
|
||||
if [ "$TRUE_FULL_SCREEN" == "fullscreen" ]; then
|
||||
resize_to_true_full_screen
|
||||
else
|
||||
resize_window_to_full_screen
|
||||
fi
|
||||
}
|
||||
main
|
||||
@@ -0,0 +1,13 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Maintainer: Sven Vowe @nuclearglow
|
||||
# Contact maintainer for any change to this file.
|
||||
|
||||
CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||
|
||||
source "$CURRENT_DIR/../variables.sh"
|
||||
|
||||
main() {
|
||||
systemctl --user disable ${systemd_service_name}
|
||||
}
|
||||
main
|
||||
@@ -0,0 +1,78 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Maintainer: Sven Vowe @nuclearglow
|
||||
# Contact maintainer for any change to this file.
|
||||
|
||||
CURRENT_DIR="$( dirname ${BASH_SOURCE[0]} )"
|
||||
|
||||
source "$CURRENT_DIR/../helpers.sh"
|
||||
source "$CURRENT_DIR/../variables.sh"
|
||||
|
||||
template() {
|
||||
local tmux_start_script="$1"
|
||||
shift
|
||||
local options="$@"
|
||||
local content=""
|
||||
local resurrect_save_script_path="$(get_tmux_option "$resurrect_save_path_option" "$(realpath ${CURRENT_DIR}/../../../tmux-resurrect/scripts/save.sh)")"
|
||||
local tmux_path="$(command -v tmux)"
|
||||
|
||||
read -r -d '' content <<-EOF
|
||||
[Unit]
|
||||
Description=tmux default session (detached)
|
||||
Documentation=man:tmux(1)
|
||||
|
||||
[Service]
|
||||
Type=forking
|
||||
Environment=DISPLAY=:0
|
||||
ExecStart=${tmux_path} ${systemd_tmux_server_start_cmd}
|
||||
|
||||
ExecStop=${resurrect_save_script_path}
|
||||
ExecStop=${tmux_path} kill-server
|
||||
KillMode=control-group
|
||||
|
||||
RestartSec=2
|
||||
|
||||
[Install]
|
||||
WantedBy=default.target
|
||||
EOF
|
||||
|
||||
echo "$content"
|
||||
}
|
||||
|
||||
systemd_tmux_is_enabled() {
|
||||
systemctl --user is-enabled $(basename "${systemd_unit_file_path}") >/dev/null 2>&1
|
||||
}
|
||||
|
||||
enable_tmux_unit_on_boot() {
|
||||
if ! systemd_tmux_is_enabled; then
|
||||
systemctl --user enable ${systemd_service_name}
|
||||
fi
|
||||
}
|
||||
|
||||
systemd_unit_file() {
|
||||
local options="$(get_tmux_option "$auto_start_config_option" "${auto_start_config_default}")"
|
||||
local systemd_tmux_server_start_cmd="$(get_tmux_option "${systemd_tmux_server_start_cmd_option}" "${systemd_tmux_server_start_cmd_default}" )"
|
||||
local tmux_start_script_path="${CURRENT_DIR}/linux_start_tmux.sh"
|
||||
local systemd_unit_file=$(template "${tmux_start_script_path}" "${options}")
|
||||
echo "$systemd_unit_file"
|
||||
}
|
||||
|
||||
write_unit_file() {
|
||||
systemd_unit_file > "${systemd_unit_file_path}"
|
||||
}
|
||||
|
||||
write_unit_file_unless_exists() {
|
||||
local systemd_unit_file_dir=$(dirname ${systemd_unit_file_path})
|
||||
if ! [ -d $systemd_unit_file_dir ]; then
|
||||
mkdir -p $systemd_unit_file_dir
|
||||
write_unit_file
|
||||
elif ! [ -e "${systemd_unit_file_path}" ]; then
|
||||
write_unit_file
|
||||
fi
|
||||
}
|
||||
|
||||
main() {
|
||||
write_unit_file_unless_exists
|
||||
enable_tmux_unit_on_boot
|
||||
}
|
||||
main
|
||||
@@ -0,0 +1,49 @@
|
||||
get_tmux_option() {
|
||||
local option="$1"
|
||||
local default_value="$2"
|
||||
local option_value=$(tmux show-option -gqv "$option")
|
||||
if [ -z "$option_value" ]; then
|
||||
echo "$default_value"
|
||||
else
|
||||
echo "$option_value"
|
||||
fi
|
||||
}
|
||||
|
||||
set_tmux_option() {
|
||||
local option="$1"
|
||||
local value="$2"
|
||||
tmux set-option -gq "$option" "$value"
|
||||
}
|
||||
|
||||
# multiple tmux server detection helpers
|
||||
|
||||
current_tmux_server_pid() {
|
||||
echo "$TMUX" |
|
||||
cut -f2 -d","
|
||||
}
|
||||
|
||||
all_tmux_processes() {
|
||||
# ignores `tmux source-file .tmux.conf` command used to reload tmux.conf
|
||||
local user_id=$(id -u)
|
||||
ps -u $user_id -o "command pid" |
|
||||
\grep "^tmux" |
|
||||
\grep -v "^tmux source"
|
||||
}
|
||||
|
||||
number_tmux_processes_except_current_server() {
|
||||
all_tmux_processes |
|
||||
\grep -v " $(current_tmux_server_pid)$" |
|
||||
wc -l |
|
||||
sed "s/ //g"
|
||||
}
|
||||
|
||||
number_current_server_client_processes() {
|
||||
tmux list-clients |
|
||||
wc -l |
|
||||
sed "s/ //g"
|
||||
}
|
||||
|
||||
another_tmux_server_running_on_startup() {
|
||||
# there are 2 tmux processes (current tmux server + 1) on tmux startup
|
||||
[ "$(number_tmux_processes_except_current_server)" -gt 1 ]
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
current_timestamp() {
|
||||
echo "$(date +%s)"
|
||||
}
|
||||
|
||||
set_last_save_timestamp() {
|
||||
set_tmux_option "$last_auto_save_option" "$(current_timestamp)"
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
SUPPORTED_VERSION="1.9"
|
||||
|
||||
# these tmux options contain paths to tmux resurrect save and restore scripts
|
||||
resurrect_save_path_option="@resurrect-save-script-path"
|
||||
resurrect_restore_path_option="@resurrect-restore-script-path"
|
||||
|
||||
auto_save_interval_option="@continuum-save-interval"
|
||||
auto_save_interval_default="15"
|
||||
|
||||
# time when the tmux environment was last saved (unix timestamp)
|
||||
last_auto_save_option="@continuum-save-last-timestamp"
|
||||
|
||||
auto_restore_option="@continuum-restore"
|
||||
auto_restore_default="off"
|
||||
|
||||
auto_restore_halt_file="${HOME}/tmux_no_auto_restore"
|
||||
|
||||
auto_restore_max_delay_option="@continuum-restore-max-delay"
|
||||
auto_restore_max_delay_default="10"
|
||||
|
||||
# tmux auto start options
|
||||
auto_start_option="@continuum-boot"
|
||||
auto_start_default="off"
|
||||
|
||||
# comma separated list of additional options for tmux auto start
|
||||
auto_start_config_option="@continuum-boot-options"
|
||||
auto_start_config_default=""
|
||||
|
||||
osx_auto_start_file_name="Tmux.Start.plist"
|
||||
osx_auto_start_file_path="${HOME}/Library/LaunchAgents/${osx_auto_start_file_name}"
|
||||
|
||||
status_interpolation_string="\#{continuum_status}"
|
||||
status_script="#($CURRENT_DIR/scripts/continuum_status.sh)"
|
||||
# below options set style/color for #{continuum_status} interpolation
|
||||
status_on_style_wrap_option="@continuum-status-on-wrap-style" # example value: "#[fg=green]#{value}#[fg=white]"
|
||||
status_off_style_wrap_option="@continuum-status-off-wrap-style" # example value: "#[fg=yellow,bold]#{value}#[fg=white,nobold]"
|
||||
status_wrap_string="\#{value}"
|
||||
|
||||
systemd_service_name="tmux.service"
|
||||
systemd_unit_file_path="$HOME/.config/systemd/user/${systemd_service_name}"
|
||||
|
||||
systemd_tmux_server_start_cmd_option="@continuum-systemd-start-cmd"
|
||||
systemd_tmux_server_start_cmd_default="new-session -d"
|
||||
@@ -0,0 +1,674 @@
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 3, 29 June 2007
|
||||
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The GNU General Public License is a free, copyleft license for
|
||||
software and other kinds of works.
|
||||
|
||||
The licenses for most software and other practical works are designed
|
||||
to take away your freedom to share and change the works. By contrast,
|
||||
the GNU General Public License is intended to guarantee your freedom to
|
||||
share and change all versions of a program--to make sure it remains free
|
||||
software for all its users. We, the Free Software Foundation, use the
|
||||
GNU General Public License for most of our software; it applies also to
|
||||
any other work released this way by its authors. You can apply it to
|
||||
your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
them if you wish), that you receive source code or can get it if you
|
||||
want it, that you can change the software or use pieces of it in new
|
||||
free programs, and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to prevent others from denying you
|
||||
these rights or asking you to surrender the rights. Therefore, you have
|
||||
certain responsibilities if you distribute copies of the software, or if
|
||||
you modify it: responsibilities to respect the freedom of others.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must pass on to the recipients the same
|
||||
freedoms that you received. You must make sure that they, too, receive
|
||||
or can get the source code. And you must show them these terms so they
|
||||
know their rights.
|
||||
|
||||
Developers that use the GNU GPL protect your rights with two steps:
|
||||
(1) assert copyright on the software, and (2) offer you this License
|
||||
giving you legal permission to copy, distribute and/or modify it.
|
||||
|
||||
For the developers' and authors' protection, the GPL clearly explains
|
||||
that there is no warranty for this free software. For both users' and
|
||||
authors' sake, the GPL requires that modified versions be marked as
|
||||
changed, so that their problems will not be attributed erroneously to
|
||||
authors of previous versions.
|
||||
|
||||
Some devices are designed to deny users access to install or run
|
||||
modified versions of the software inside them, although the manufacturer
|
||||
can do so. This is fundamentally incompatible with the aim of
|
||||
protecting users' freedom to change the software. The systematic
|
||||
pattern of such abuse occurs in the area of products for individuals to
|
||||
use, which is precisely where it is most unacceptable. Therefore, we
|
||||
have designed this version of the GPL to prohibit the practice for those
|
||||
products. If such problems arise substantially in other domains, we
|
||||
stand ready to extend this provision to those domains in future versions
|
||||
of the GPL, as needed to protect the freedom of users.
|
||||
|
||||
Finally, every program is threatened constantly by software patents.
|
||||
States should not allow patents to restrict development and use of
|
||||
software on general-purpose computers, but in those that do, we wish to
|
||||
avoid the special danger that patents applied to a free program could
|
||||
make it effectively proprietary. To prevent this, the GPL assures that
|
||||
patents cannot be used to render the program non-free.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
TERMS AND CONDITIONS
|
||||
|
||||
0. Definitions.
|
||||
|
||||
"This License" refers to version 3 of the GNU General Public License.
|
||||
|
||||
"Copyright" also means copyright-like laws that apply to other kinds of
|
||||
works, such as semiconductor masks.
|
||||
|
||||
"The Program" refers to any copyrightable work licensed under this
|
||||
License. Each licensee is addressed as "you". "Licensees" and
|
||||
"recipients" may be individuals or organizations.
|
||||
|
||||
To "modify" a work means to copy from or adapt all or part of the work
|
||||
in a fashion requiring copyright permission, other than the making of an
|
||||
exact copy. The resulting work is called a "modified version" of the
|
||||
earlier work or a work "based on" the earlier work.
|
||||
|
||||
A "covered work" means either the unmodified Program or a work based
|
||||
on the Program.
|
||||
|
||||
To "propagate" a work means to do anything with it that, without
|
||||
permission, would make you directly or secondarily liable for
|
||||
infringement under applicable copyright law, except executing it on a
|
||||
computer or modifying a private copy. Propagation includes copying,
|
||||
distribution (with or without modification), making available to the
|
||||
public, and in some countries other activities as well.
|
||||
|
||||
To "convey" a work means any kind of propagation that enables other
|
||||
parties to make or receive copies. Mere interaction with a user through
|
||||
a computer network, with no transfer of a copy, is not conveying.
|
||||
|
||||
An interactive user interface displays "Appropriate Legal Notices"
|
||||
to the extent that it includes a convenient and prominently visible
|
||||
feature that (1) displays an appropriate copyright notice, and (2)
|
||||
tells the user that there is no warranty for the work (except to the
|
||||
extent that warranties are provided), that licensees may convey the
|
||||
work under this License, and how to view a copy of this License. If
|
||||
the interface presents a list of user commands or options, such as a
|
||||
menu, a prominent item in the list meets this criterion.
|
||||
|
||||
1. Source Code.
|
||||
|
||||
The "source code" for a work means the preferred form of the work
|
||||
for making modifications to it. "Object code" means any non-source
|
||||
form of a work.
|
||||
|
||||
A "Standard Interface" means an interface that either is an official
|
||||
standard defined by a recognized standards body, or, in the case of
|
||||
interfaces specified for a particular programming language, one that
|
||||
is widely used among developers working in that language.
|
||||
|
||||
The "System Libraries" of an executable work include anything, other
|
||||
than the work as a whole, that (a) is included in the normal form of
|
||||
packaging a Major Component, but which is not part of that Major
|
||||
Component, and (b) serves only to enable use of the work with that
|
||||
Major Component, or to implement a Standard Interface for which an
|
||||
implementation is available to the public in source code form. A
|
||||
"Major Component", in this context, means a major essential component
|
||||
(kernel, window system, and so on) of the specific operating system
|
||||
(if any) on which the executable work runs, or a compiler used to
|
||||
produce the work, or an object code interpreter used to run it.
|
||||
|
||||
The "Corresponding Source" for a work in object code form means all
|
||||
the source code needed to generate, install, and (for an executable
|
||||
work) run the object code and to modify the work, including scripts to
|
||||
control those activities. However, it does not include the work's
|
||||
System Libraries, or general-purpose tools or generally available free
|
||||
programs which are used unmodified in performing those activities but
|
||||
which are not part of the work. For example, Corresponding Source
|
||||
includes interface definition files associated with source files for
|
||||
the work, and the source code for shared libraries and dynamically
|
||||
linked subprograms that the work is specifically designed to require,
|
||||
such as by intimate data communication or control flow between those
|
||||
subprograms and other parts of the work.
|
||||
|
||||
The Corresponding Source need not include anything that users
|
||||
can regenerate automatically from other parts of the Corresponding
|
||||
Source.
|
||||
|
||||
The Corresponding Source for a work in source code form is that
|
||||
same work.
|
||||
|
||||
2. Basic Permissions.
|
||||
|
||||
All rights granted under this License are granted for the term of
|
||||
copyright on the Program, and are irrevocable provided the stated
|
||||
conditions are met. This License explicitly affirms your unlimited
|
||||
permission to run the unmodified Program. The output from running a
|
||||
covered work is covered by this License only if the output, given its
|
||||
content, constitutes a covered work. This License acknowledges your
|
||||
rights of fair use or other equivalent, as provided by copyright law.
|
||||
|
||||
You may make, run and propagate covered works that you do not
|
||||
convey, without conditions so long as your license otherwise remains
|
||||
in force. You may convey covered works to others for the sole purpose
|
||||
of having them make modifications exclusively for you, or provide you
|
||||
with facilities for running those works, provided that you comply with
|
||||
the terms of this License in conveying all material for which you do
|
||||
not control copyright. Those thus making or running the covered works
|
||||
for you must do so exclusively on your behalf, under your direction
|
||||
and control, on terms that prohibit them from making any copies of
|
||||
your copyrighted material outside their relationship with you.
|
||||
|
||||
Conveying under any other circumstances is permitted solely under
|
||||
the conditions stated below. Sublicensing is not allowed; section 10
|
||||
makes it unnecessary.
|
||||
|
||||
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
|
||||
|
||||
No covered work shall be deemed part of an effective technological
|
||||
measure under any applicable law fulfilling obligations under article
|
||||
11 of the WIPO copyright treaty adopted on 20 December 1996, or
|
||||
similar laws prohibiting or restricting circumvention of such
|
||||
measures.
|
||||
|
||||
When you convey a covered work, you waive any legal power to forbid
|
||||
circumvention of technological measures to the extent such circumvention
|
||||
is effected by exercising rights under this License with respect to
|
||||
the covered work, and you disclaim any intention to limit operation or
|
||||
modification of the work as a means of enforcing, against the work's
|
||||
users, your or third parties' legal rights to forbid circumvention of
|
||||
technological measures.
|
||||
|
||||
4. Conveying Verbatim Copies.
|
||||
|
||||
You may convey verbatim copies of the Program's source code as you
|
||||
receive it, in any medium, provided that you conspicuously and
|
||||
appropriately publish on each copy an appropriate copyright notice;
|
||||
keep intact all notices stating that this License and any
|
||||
non-permissive terms added in accord with section 7 apply to the code;
|
||||
keep intact all notices of the absence of any warranty; and give all
|
||||
recipients a copy of this License along with the Program.
|
||||
|
||||
You may charge any price or no price for each copy that you convey,
|
||||
and you may offer support or warranty protection for a fee.
|
||||
|
||||
5. Conveying Modified Source Versions.
|
||||
|
||||
You may convey a work based on the Program, or the modifications to
|
||||
produce it from the Program, in the form of source code under the
|
||||
terms of section 4, provided that you also meet all of these conditions:
|
||||
|
||||
a) The work must carry prominent notices stating that you modified
|
||||
it, and giving a relevant date.
|
||||
|
||||
b) The work must carry prominent notices stating that it is
|
||||
released under this License and any conditions added under section
|
||||
7. This requirement modifies the requirement in section 4 to
|
||||
"keep intact all notices".
|
||||
|
||||
c) You must license the entire work, as a whole, under this
|
||||
License to anyone who comes into possession of a copy. This
|
||||
License will therefore apply, along with any applicable section 7
|
||||
additional terms, to the whole of the work, and all its parts,
|
||||
regardless of how they are packaged. This License gives no
|
||||
permission to license the work in any other way, but it does not
|
||||
invalidate such permission if you have separately received it.
|
||||
|
||||
d) If the work has interactive user interfaces, each must display
|
||||
Appropriate Legal Notices; however, if the Program has interactive
|
||||
interfaces that do not display Appropriate Legal Notices, your
|
||||
work need not make them do so.
|
||||
|
||||
A compilation of a covered work with other separate and independent
|
||||
works, which are not by their nature extensions of the covered work,
|
||||
and which are not combined with it such as to form a larger program,
|
||||
in or on a volume of a storage or distribution medium, is called an
|
||||
"aggregate" if the compilation and its resulting copyright are not
|
||||
used to limit the access or legal rights of the compilation's users
|
||||
beyond what the individual works permit. Inclusion of a covered work
|
||||
in an aggregate does not cause this License to apply to the other
|
||||
parts of the aggregate.
|
||||
|
||||
6. Conveying Non-Source Forms.
|
||||
|
||||
You may convey a covered work in object code form under the terms
|
||||
of sections 4 and 5, provided that you also convey the
|
||||
machine-readable Corresponding Source under the terms of this License,
|
||||
in one of these ways:
|
||||
|
||||
a) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by the
|
||||
Corresponding Source fixed on a durable physical medium
|
||||
customarily used for software interchange.
|
||||
|
||||
b) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by a
|
||||
written offer, valid for at least three years and valid for as
|
||||
long as you offer spare parts or customer support for that product
|
||||
model, to give anyone who possesses the object code either (1) a
|
||||
copy of the Corresponding Source for all the software in the
|
||||
product that is covered by this License, on a durable physical
|
||||
medium customarily used for software interchange, for a price no
|
||||
more than your reasonable cost of physically performing this
|
||||
conveying of source, or (2) access to copy the
|
||||
Corresponding Source from a network server at no charge.
|
||||
|
||||
c) Convey individual copies of the object code with a copy of the
|
||||
written offer to provide the Corresponding Source. This
|
||||
alternative is allowed only occasionally and noncommercially, and
|
||||
only if you received the object code with such an offer, in accord
|
||||
with subsection 6b.
|
||||
|
||||
d) Convey the object code by offering access from a designated
|
||||
place (gratis or for a charge), and offer equivalent access to the
|
||||
Corresponding Source in the same way through the same place at no
|
||||
further charge. You need not require recipients to copy the
|
||||
Corresponding Source along with the object code. If the place to
|
||||
copy the object code is a network server, the Corresponding Source
|
||||
may be on a different server (operated by you or a third party)
|
||||
that supports equivalent copying facilities, provided you maintain
|
||||
clear directions next to the object code saying where to find the
|
||||
Corresponding Source. Regardless of what server hosts the
|
||||
Corresponding Source, you remain obligated to ensure that it is
|
||||
available for as long as needed to satisfy these requirements.
|
||||
|
||||
e) Convey the object code using peer-to-peer transmission, provided
|
||||
you inform other peers where the object code and Corresponding
|
||||
Source of the work are being offered to the general public at no
|
||||
charge under subsection 6d.
|
||||
|
||||
A separable portion of the object code, whose source code is excluded
|
||||
from the Corresponding Source as a System Library, need not be
|
||||
included in conveying the object code work.
|
||||
|
||||
A "User Product" is either (1) a "consumer product", which means any
|
||||
tangible personal property which is normally used for personal, family,
|
||||
or household purposes, or (2) anything designed or sold for incorporation
|
||||
into a dwelling. In determining whether a product is a consumer product,
|
||||
doubtful cases shall be resolved in favor of coverage. For a particular
|
||||
product received by a particular user, "normally used" refers to a
|
||||
typical or common use of that class of product, regardless of the status
|
||||
of the particular user or of the way in which the particular user
|
||||
actually uses, or expects or is expected to use, the product. A product
|
||||
is a consumer product regardless of whether the product has substantial
|
||||
commercial, industrial or non-consumer uses, unless such uses represent
|
||||
the only significant mode of use of the product.
|
||||
|
||||
"Installation Information" for a User Product means any methods,
|
||||
procedures, authorization keys, or other information required to install
|
||||
and execute modified versions of a covered work in that User Product from
|
||||
a modified version of its Corresponding Source. The information must
|
||||
suffice to ensure that the continued functioning of the modified object
|
||||
code is in no case prevented or interfered with solely because
|
||||
modification has been made.
|
||||
|
||||
If you convey an object code work under this section in, or with, or
|
||||
specifically for use in, a User Product, and the conveying occurs as
|
||||
part of a transaction in which the right of possession and use of the
|
||||
User Product is transferred to the recipient in perpetuity or for a
|
||||
fixed term (regardless of how the transaction is characterized), the
|
||||
Corresponding Source conveyed under this section must be accompanied
|
||||
by the Installation Information. But this requirement does not apply
|
||||
if neither you nor any third party retains the ability to install
|
||||
modified object code on the User Product (for example, the work has
|
||||
been installed in ROM).
|
||||
|
||||
The requirement to provide Installation Information does not include a
|
||||
requirement to continue to provide support service, warranty, or updates
|
||||
for a work that has been modified or installed by the recipient, or for
|
||||
the User Product in which it has been modified or installed. Access to a
|
||||
network may be denied when the modification itself materially and
|
||||
adversely affects the operation of the network or violates the rules and
|
||||
protocols for communication across the network.
|
||||
|
||||
Corresponding Source conveyed, and Installation Information provided,
|
||||
in accord with this section must be in a format that is publicly
|
||||
documented (and with an implementation available to the public in
|
||||
source code form), and must require no special password or key for
|
||||
unpacking, reading or copying.
|
||||
|
||||
7. Additional Terms.
|
||||
|
||||
"Additional permissions" are terms that supplement the terms of this
|
||||
License by making exceptions from one or more of its conditions.
|
||||
Additional permissions that are applicable to the entire Program shall
|
||||
be treated as though they were included in this License, to the extent
|
||||
that they are valid under applicable law. If additional permissions
|
||||
apply only to part of the Program, that part may be used separately
|
||||
under those permissions, but the entire Program remains governed by
|
||||
this License without regard to the additional permissions.
|
||||
|
||||
When you convey a copy of a covered work, you may at your option
|
||||
remove any additional permissions from that copy, or from any part of
|
||||
it. (Additional permissions may be written to require their own
|
||||
removal in certain cases when you modify the work.) You may place
|
||||
additional permissions on material, added by you to a covered work,
|
||||
for which you have or can give appropriate copyright permission.
|
||||
|
||||
Notwithstanding any other provision of this License, for material you
|
||||
add to a covered work, you may (if authorized by the copyright holders of
|
||||
that material) supplement the terms of this License with terms:
|
||||
|
||||
a) Disclaiming warranty or limiting liability differently from the
|
||||
terms of sections 15 and 16 of this License; or
|
||||
|
||||
b) Requiring preservation of specified reasonable legal notices or
|
||||
author attributions in that material or in the Appropriate Legal
|
||||
Notices displayed by works containing it; or
|
||||
|
||||
c) Prohibiting misrepresentation of the origin of that material, or
|
||||
requiring that modified versions of such material be marked in
|
||||
reasonable ways as different from the original version; or
|
||||
|
||||
d) Limiting the use for publicity purposes of names of licensors or
|
||||
authors of the material; or
|
||||
|
||||
e) Declining to grant rights under trademark law for use of some
|
||||
trade names, trademarks, or service marks; or
|
||||
|
||||
f) Requiring indemnification of licensors and authors of that
|
||||
material by anyone who conveys the material (or modified versions of
|
||||
it) with contractual assumptions of liability to the recipient, for
|
||||
any liability that these contractual assumptions directly impose on
|
||||
those licensors and authors.
|
||||
|
||||
All other non-permissive additional terms are considered "further
|
||||
restrictions" within the meaning of section 10. If the Program as you
|
||||
received it, or any part of it, contains a notice stating that it is
|
||||
governed by this License along with a term that is a further
|
||||
restriction, you may remove that term. If a license document contains
|
||||
a further restriction but permits relicensing or conveying under this
|
||||
License, you may add to a covered work material governed by the terms
|
||||
of that license document, provided that the further restriction does
|
||||
not survive such relicensing or conveying.
|
||||
|
||||
If you add terms to a covered work in accord with this section, you
|
||||
must place, in the relevant source files, a statement of the
|
||||
additional terms that apply to those files, or a notice indicating
|
||||
where to find the applicable terms.
|
||||
|
||||
Additional terms, permissive or non-permissive, may be stated in the
|
||||
form of a separately written license, or stated as exceptions;
|
||||
the above requirements apply either way.
|
||||
|
||||
8. Termination.
|
||||
|
||||
You may not propagate or modify a covered work except as expressly
|
||||
provided under this License. Any attempt otherwise to propagate or
|
||||
modify it is void, and will automatically terminate your rights under
|
||||
this License (including any patent licenses granted under the third
|
||||
paragraph of section 11).
|
||||
|
||||
However, if you cease all violation of this License, then your
|
||||
license from a particular copyright holder is reinstated (a)
|
||||
provisionally, unless and until the copyright holder explicitly and
|
||||
finally terminates your license, and (b) permanently, if the copyright
|
||||
holder fails to notify you of the violation by some reasonable means
|
||||
prior to 60 days after the cessation.
|
||||
|
||||
Moreover, your license from a particular copyright holder is
|
||||
reinstated permanently if the copyright holder notifies you of the
|
||||
violation by some reasonable means, this is the first time you have
|
||||
received notice of violation of this License (for any work) from that
|
||||
copyright holder, and you cure the violation prior to 30 days after
|
||||
your receipt of the notice.
|
||||
|
||||
Termination of your rights under this section does not terminate the
|
||||
licenses of parties who have received copies or rights from you under
|
||||
this License. If your rights have been terminated and not permanently
|
||||
reinstated, you do not qualify to receive new licenses for the same
|
||||
material under section 10.
|
||||
|
||||
9. Acceptance Not Required for Having Copies.
|
||||
|
||||
You are not required to accept this License in order to receive or
|
||||
run a copy of the Program. Ancillary propagation of a covered work
|
||||
occurring solely as a consequence of using peer-to-peer transmission
|
||||
to receive a copy likewise does not require acceptance. However,
|
||||
nothing other than this License grants you permission to propagate or
|
||||
modify any covered work. These actions infringe copyright if you do
|
||||
not accept this License. Therefore, by modifying or propagating a
|
||||
covered work, you indicate your acceptance of this License to do so.
|
||||
|
||||
10. Automatic Licensing of Downstream Recipients.
|
||||
|
||||
Each time you convey a covered work, the recipient automatically
|
||||
receives a license from the original licensors, to run, modify and
|
||||
propagate that work, subject to this License. You are not responsible
|
||||
for enforcing compliance by third parties with this License.
|
||||
|
||||
An "entity transaction" is a transaction transferring control of an
|
||||
organization, or substantially all assets of one, or subdividing an
|
||||
organization, or merging organizations. If propagation of a covered
|
||||
work results from an entity transaction, each party to that
|
||||
transaction who receives a copy of the work also receives whatever
|
||||
licenses to the work the party's predecessor in interest had or could
|
||||
give under the previous paragraph, plus a right to possession of the
|
||||
Corresponding Source of the work from the predecessor in interest, if
|
||||
the predecessor has it or can get it with reasonable efforts.
|
||||
|
||||
You may not impose any further restrictions on the exercise of the
|
||||
rights granted or affirmed under this License. For example, you may
|
||||
not impose a license fee, royalty, or other charge for exercise of
|
||||
rights granted under this License, and you may not initiate litigation
|
||||
(including a cross-claim or counterclaim in a lawsuit) alleging that
|
||||
any patent claim is infringed by making, using, selling, offering for
|
||||
sale, or importing the Program or any portion of it.
|
||||
|
||||
11. Patents.
|
||||
|
||||
A "contributor" is a copyright holder who authorizes use under this
|
||||
License of the Program or a work on which the Program is based. The
|
||||
work thus licensed is called the contributor's "contributor version".
|
||||
|
||||
A contributor's "essential patent claims" are all patent claims
|
||||
owned or controlled by the contributor, whether already acquired or
|
||||
hereafter acquired, that would be infringed by some manner, permitted
|
||||
by this License, of making, using, or selling its contributor version,
|
||||
but do not include claims that would be infringed only as a
|
||||
consequence of further modification of the contributor version. For
|
||||
purposes of this definition, "control" includes the right to grant
|
||||
patent sublicenses in a manner consistent with the requirements of
|
||||
this License.
|
||||
|
||||
Each contributor grants you a non-exclusive, worldwide, royalty-free
|
||||
patent license under the contributor's essential patent claims, to
|
||||
make, use, sell, offer for sale, import and otherwise run, modify and
|
||||
propagate the contents of its contributor version.
|
||||
|
||||
In the following three paragraphs, a "patent license" is any express
|
||||
agreement or commitment, however denominated, not to enforce a patent
|
||||
(such as an express permission to practice a patent or covenant not to
|
||||
sue for patent infringement). To "grant" such a patent license to a
|
||||
party means to make such an agreement or commitment not to enforce a
|
||||
patent against the party.
|
||||
|
||||
If you convey a covered work, knowingly relying on a patent license,
|
||||
and the Corresponding Source of the work is not available for anyone
|
||||
to copy, free of charge and under the terms of this License, through a
|
||||
publicly available network server or other readily accessible means,
|
||||
then you must either (1) cause the Corresponding Source to be so
|
||||
available, or (2) arrange to deprive yourself of the benefit of the
|
||||
patent license for this particular work, or (3) arrange, in a manner
|
||||
consistent with the requirements of this License, to extend the patent
|
||||
license to downstream recipients. "Knowingly relying" means you have
|
||||
actual knowledge that, but for the patent license, your conveying the
|
||||
covered work in a country, or your recipient's use of the covered work
|
||||
in a country, would infringe one or more identifiable patents in that
|
||||
country that you have reason to believe are valid.
|
||||
|
||||
If, pursuant to or in connection with a single transaction or
|
||||
arrangement, you convey, or propagate by procuring conveyance of, a
|
||||
covered work, and grant a patent license to some of the parties
|
||||
receiving the covered work authorizing them to use, propagate, modify
|
||||
or convey a specific copy of the covered work, then the patent license
|
||||
you grant is automatically extended to all recipients of the covered
|
||||
work and works based on it.
|
||||
|
||||
A patent license is "discriminatory" if it does not include within
|
||||
the scope of its coverage, prohibits the exercise of, or is
|
||||
conditioned on the non-exercise of one or more of the rights that are
|
||||
specifically granted under this License. You may not convey a covered
|
||||
work if you are a party to an arrangement with a third party that is
|
||||
in the business of distributing software, under which you make payment
|
||||
to the third party based on the extent of your activity of conveying
|
||||
the work, and under which the third party grants, to any of the
|
||||
parties who would receive the covered work from you, a discriminatory
|
||||
patent license (a) in connection with copies of the covered work
|
||||
conveyed by you (or copies made from those copies), or (b) primarily
|
||||
for and in connection with specific products or compilations that
|
||||
contain the covered work, unless you entered into that arrangement,
|
||||
or that patent license was granted, prior to 28 March 2007.
|
||||
|
||||
Nothing in this License shall be construed as excluding or limiting
|
||||
any implied license or other defenses to infringement that may
|
||||
otherwise be available to you under applicable patent law.
|
||||
|
||||
12. No Surrender of Others' Freedom.
|
||||
|
||||
If conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot convey a
|
||||
covered work so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you may
|
||||
not convey it at all. For example, if you agree to terms that obligate you
|
||||
to collect a royalty for further conveying from those to whom you convey
|
||||
the Program, the only way you could satisfy both those terms and this
|
||||
License would be to refrain entirely from conveying the Program.
|
||||
|
||||
13. Use with the GNU Affero General Public License.
|
||||
|
||||
Notwithstanding any other provision of this License, you have
|
||||
permission to link or combine any covered work with a work licensed
|
||||
under version 3 of the GNU Affero General Public License into a single
|
||||
combined work, and to convey the resulting work. The terms of this
|
||||
License will continue to apply to the part which is the covered work,
|
||||
but the special requirements of the GNU Affero General Public License,
|
||||
section 13, concerning interaction through a network will apply to the
|
||||
combination as such.
|
||||
|
||||
14. Revised Versions of this License.
|
||||
|
||||
The Free Software Foundation may publish revised and/or new versions of
|
||||
the GNU General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the
|
||||
Program specifies that a certain numbered version of the GNU General
|
||||
Public License "or any later version" applies to it, you have the
|
||||
option of following the terms and conditions either of that numbered
|
||||
version or of any later version published by the Free Software
|
||||
Foundation. If the Program does not specify a version number of the
|
||||
GNU General Public License, you may choose any version ever published
|
||||
by the Free Software Foundation.
|
||||
|
||||
If the Program specifies that a proxy can decide which future
|
||||
versions of the GNU General Public License can be used, that proxy's
|
||||
public statement of acceptance of a version permanently authorizes you
|
||||
to choose that version for the Program.
|
||||
|
||||
Later license versions may give you additional or different
|
||||
permissions. However, no additional obligations are imposed on any
|
||||
author or copyright holder as a result of your choosing to follow a
|
||||
later version.
|
||||
|
||||
15. Disclaimer of Warranty.
|
||||
|
||||
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
|
||||
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
|
||||
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
|
||||
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
|
||||
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
|
||||
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
|
||||
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||
|
||||
16. Limitation of Liability.
|
||||
|
||||
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
|
||||
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
|
||||
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
|
||||
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
|
||||
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
|
||||
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
|
||||
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
|
||||
SUCH DAMAGES.
|
||||
|
||||
17. Interpretation of Sections 15 and 16.
|
||||
|
||||
If the disclaimer of warranty and limitation of liability provided
|
||||
above cannot be given local legal effect according to their terms,
|
||||
reviewing courts shall apply local law that most closely approximates
|
||||
an absolute waiver of all civil liability in connection with the
|
||||
Program, unless a warranty or assumption of liability accompanies a
|
||||
copy of the Program in return for a fee.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
free software which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest
|
||||
to attach them to the start of each source file to most effectively
|
||||
state the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If the program does terminal interaction, make it output a short
|
||||
notice like this when it starts in an interactive mode:
|
||||
|
||||
<program> Copyright (C) <year> <name of author>
|
||||
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||
This is free software, and you are welcome to redistribute it
|
||||
under certain conditions; type `show c' for details.
|
||||
|
||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||
parts of the General Public License. Of course, your program's commands
|
||||
might be different; for a GUI interface, you would use an "about box".
|
||||
|
||||
You should also get your employer (if you work as a programmer) or school,
|
||||
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
||||
For more information on this, and how to apply and follow the GNU GPL, see
|
||||
<https://www.gnu.org/licenses/>.
|
||||
|
||||
The GNU General Public License does not permit incorporating your program
|
||||
into proprietary programs. If your program is a subroutine library, you
|
||||
may consider it more useful to permit linking proprietary applications with
|
||||
the library. If this is what you want to do, use the GNU Lesser General
|
||||
Public License instead of this License. But first, please read
|
||||
<https://www.gnu.org/licenses/why-not-lgpl.html>.
|
||||
@@ -0,0 +1,41 @@
|
||||
# Gruvbox colorscheme for tmux
|
||||
|
||||
Retro groove colorscheme for [tmux](https://github.com/tmux/tmux), based on the excellent [gruvbox](https://github.com/morhetz/gruvbox) theme for vim.
|
||||
|
||||
<img src="https://i.imgur.com/6IQCia6.png" style="width: 100%; max-width: 600px; text-align: center;"/>
|
||||
|
||||
This is a heavily modified fork of [tmux-gruvbox](https://github.com/egel/tmux-gruvbox).
|
||||
|
||||
Features/Differences:
|
||||
- Uses gruvbox's hexadecimal colors (most terminal emulators have truecolor support)
|
||||
- Indicates when the prefix key has been pressed
|
||||
- If vi-mode is enabled (if `$EDITOR` contains `vi`), the statusbar will indicate its mode while being edited
|
||||
- Highlights unfocused windows with activity or terminal bells
|
||||
- Does not use custom glyphs
|
||||
|
||||
## Installation
|
||||
### Manual
|
||||
Just clone this repo and add `tmux-colorscheme.conf` to your `.tmux.conf`:
|
||||
```bash
|
||||
cat tmux-colorscheme.conf >> ~/.tmux.conf
|
||||
```
|
||||
Or move `tmux-colorscheme.conf` to your home directory and source it in `.tmux.conf`:
|
||||
```tmux
|
||||
source-file ~/tmux-colorscheme.conf
|
||||
```
|
||||
### Tmux Plugin Manager
|
||||
Add this repo to the list of [TPM](https://github.com/tmux-plugins/tpm) plugins in your `.tmux.conf`:
|
||||
```tmux
|
||||
set -g @plugin 'lawabidingcactus/tmux-gruvbox-truecolor'
|
||||
```
|
||||
Press `<prefix> + I` to reload tmux with the plugin.
|
||||
|
||||
## Troubleshooting
|
||||
### tmux's colors look weird
|
||||
Try adding the following to your `.tmux.conf`:
|
||||
```tmux
|
||||
set-option -as terminal-overrides ",xterm*:RGB"
|
||||
```
|
||||
|
||||
### Pane separator lines look weird
|
||||
Something isn't correctly handling UTF-8 line drawing characters.
|
||||
@@ -0,0 +1,4 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||
tmux source-file "$CURRENT_DIR/tmux-colorscheme.conf"
|
||||
@@ -0,0 +1,62 @@
|
||||
### theme settings ###
|
||||
|
||||
# window separators
|
||||
set-option -wg window-status-separator ""
|
||||
|
||||
# monitor window changes
|
||||
set-option -wg monitor-activity on
|
||||
set-option -wg monitor-bell on
|
||||
|
||||
# set statusbar update interval
|
||||
set-option -g status-interval 1
|
||||
|
||||
### colorscheme ###
|
||||
|
||||
# change window screen colors
|
||||
set-option -wg mode-style bg="#fe8019",fg="#3c3836"
|
||||
|
||||
# default statusbar colors (terminal bg should be #282828)
|
||||
set-option -g status-style bg=terminal,fg="#a89984"
|
||||
|
||||
# default window title colors
|
||||
set-option -wg window-status-style bg="#3c3836",fg="#7c6f64"
|
||||
|
||||
# colors for windows with activity
|
||||
set-option -wg window-status-activity-style bg="#3c3836",fg="#a89984"
|
||||
|
||||
# colors for windows with bells
|
||||
set-option -wg window-status-bell-style bg="#3c3836",fg="#fe8019"
|
||||
|
||||
# active window title colors
|
||||
set-option -wg window-status-current-style bg="#fe8019",fg="#3c3836"
|
||||
|
||||
# pane border
|
||||
set-option -g pane-active-border-style fg="#fe8019"
|
||||
set-option -g pane-border-style fg="#3c3836"
|
||||
|
||||
# message info
|
||||
set-option -g message-style bg="#fe8019",fg="#3c3836"
|
||||
|
||||
# writing commands inactive
|
||||
set-option -g message-command-style bg="#a89984",fg="#3c3836"
|
||||
|
||||
# pane number display
|
||||
set-option -g display-panes-active-colour "#fe8019"
|
||||
set-option -g display-panes-colour "#3c3836"
|
||||
|
||||
# clock
|
||||
set-option -wg clock-mode-colour "#fe8019"
|
||||
|
||||
# copy mode highlighting
|
||||
%if #{>=:#{version},3.2}
|
||||
set-option -wg copy-mode-match-style "bg=#a89984,fg=#3c3836"
|
||||
set-option -wg copy-mode-current-match-style "bg=#fe8019,fg=#3c3836"
|
||||
%endif
|
||||
|
||||
# statusbar formatting
|
||||
# "#fe8019" MUST be in lowercase here (conflicts with statusline alias otherwise)
|
||||
set-option -g status-left "#[bg=#a89984, fg=#3c3836]#{?client_prefix,#[bg=#fe8019],#[bg=#a89984]} #{session_name} "
|
||||
set-option -g status-right "#[bg=#3c3836, fg=#7c6f64] %Y-%m-%d %H:%M:%S #[bg=#a89984, fg=#3c3836]#{?client_prefix,#[bg=#fe8019],#[bg=#a89984]} #{host_short} "
|
||||
|
||||
set-option -wg window-status-current-format "#{?window_zoomed_flag,#[fg=default bold],#[fg=default]} #{window_index} #{window_name} "
|
||||
set-option -wg window-status-format "#{?window_zoomed_flag,#[fg=default bold],#[fg=default]} #{window_index} #{window_name} "
|
||||
5
files/system/usr/etc/skel/.tmux/plugins/tmux-resurrect/.gitattributes
vendored
Normal file
5
files/system/usr/etc/skel/.tmux/plugins/tmux-resurrect/.gitattributes
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
# Force text files to have unix eols, so Windows/Cygwin does not break them
|
||||
*.* eol=lf
|
||||
|
||||
# Except for images because then on checkout the files have been altered.
|
||||
*.png binary
|
||||
3
files/system/usr/etc/skel/.tmux/plugins/tmux-resurrect/.gitignore
vendored
Normal file
3
files/system/usr/etc/skel/.tmux/plugins/tmux-resurrect/.gitignore
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
run_tests
|
||||
tests/run_tests_in_isolation
|
||||
tests/helpers/helpers.sh
|
||||
3
files/system/usr/etc/skel/.tmux/plugins/tmux-resurrect/.gitmodules
vendored
Normal file
3
files/system/usr/etc/skel/.tmux/plugins/tmux-resurrect/.gitmodules
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
[submodule "lib/tmux-test"]
|
||||
path = lib/tmux-test
|
||||
url = https://github.com/tmux-plugins/tmux-test.git
|
||||
@@ -0,0 +1,19 @@
|
||||
# generic packages and tmux
|
||||
before_install:
|
||||
- sudo apt-get update
|
||||
- sudo apt-get install -y git-core expect
|
||||
- sudo apt-get install -y python-software-properties software-properties-common
|
||||
- sudo apt-get install -y libevent-dev libncurses-dev
|
||||
- git clone https://github.com/tmux/tmux.git
|
||||
- cd tmux
|
||||
- git checkout 2.5
|
||||
- sh autogen.sh
|
||||
- ./configure && make && sudo make install
|
||||
|
||||
install:
|
||||
- git fetch --unshallow --recurse-submodules || git fetch --recurse-submodules
|
||||
# manual `git clone` required for testing `tmux-test` plugin itself
|
||||
- git clone https://github.com/tmux-plugins/tmux-test lib/tmux-test; true
|
||||
- lib/tmux-test/setup
|
||||
|
||||
script: ./tests/run_tests_in_isolation
|
||||
@@ -0,0 +1,163 @@
|
||||
# Changelog
|
||||
|
||||
### master
|
||||
- Remove deprecated "restoring shell history" feature.
|
||||
|
||||
### v4.0.0, 2022-04-10
|
||||
- Proper handling of `automatic-rename` window option.
|
||||
- save and restore tmux pane title (breaking change: you have to re-save to be
|
||||
able to properly restore!)
|
||||
|
||||
### v3.0.0, 2021-08-30
|
||||
- save and restore tmux pane contents (@laomaiweng)
|
||||
- update tmux-test to solve issue with recursing git submodules in that project
|
||||
- set options quietly in `resurrect.tmux` script
|
||||
- improve pane contents restoration: `cat <file>` is no longer shown in pane
|
||||
content history
|
||||
- refactoring: drop dependency on `paste` command
|
||||
- bugfix for pane contents restoration
|
||||
- expand tilde char `~` if used with `@resurrect-dir`
|
||||
- do not save empty trailing lines when pane content is saved
|
||||
- do not save pane contents if pane is empty (only for 'save pane contents'
|
||||
feature)
|
||||
- "save pane contents" feature saves files to a separate directory
|
||||
- archive and compress pane contents file
|
||||
- make archive & compress pane contents process more portable
|
||||
- `mutt` added to the list of automatically restored programs
|
||||
- added guide for migrating from tmuxinator
|
||||
- fixed a bug for restoring commands on tmux 2.5 (and probably tmux 2.4)
|
||||
- do not create another resurrect file if there are no changes (credit @vburdo)
|
||||
- allow using '$HOSTNAME' in @resurrect-dir
|
||||
- add zsh history saving and restoring
|
||||
- delete resurrect files older than 30 days, but keep at least 5 files
|
||||
- add save and restore hooks
|
||||
- always use `-ao` flags for `ps` command to detect commands
|
||||
- Deprecate restoring shell history feature.
|
||||
- `view` added to the list of automatically restored programs
|
||||
- Enable vim session strategy to work with custom session files,
|
||||
e.g. `vim -S Session1.vim`.
|
||||
- Enable restoring command arguments for inline strategies with `*` character.
|
||||
- Kill session "0" if it wasn't restored.
|
||||
- Add `@resurrect-delete-backup-after` option to specify how many days of
|
||||
backups to keep - default is 30.
|
||||
|
||||
### v2.4.0, 2015-02-23
|
||||
- add "tmux-test"
|
||||
- add test for "resurrect save" feature
|
||||
- add test for "resurrect restore" feature
|
||||
- make the tests work and pass on travis
|
||||
- add travis badge to the readme
|
||||
|
||||
### v2.3.0, 2015-02-12
|
||||
- Improve fetching proper window_layout for zoomed windows. In order to fetch
|
||||
proper value, window has to get unzoomed. This is now done faster so that
|
||||
"unzoom,fetch value,zoom" cycle is almost unnoticable to the user.
|
||||
|
||||
### v2.2.0, 2015-02-12
|
||||
- bugfix: zoomed windows related regression
|
||||
- export save and restore script paths so that 'tmux-resurrect-save' plugin can
|
||||
use them
|
||||
- enable "quiet" saving (used by 'tmux-resurrect-save' plugin)
|
||||
|
||||
### v2.1.0, 2015-02-12
|
||||
- if restore is started when there's only **1 pane in the whole tmux server**,
|
||||
assume the users wants the "full restore" and overrwrite that pane.
|
||||
|
||||
### v2.0.0, 2015-02-10
|
||||
- add link to the wiki page for "first pane/window issue" to the README as well
|
||||
as other tweaks
|
||||
- save and restore grouped sessions (used with multi-monitor workflow)
|
||||
- save and restore active and alternate windows in grouped sessions
|
||||
- if there are no grouped sessions, do not output empty line to "last" file
|
||||
- restore active and alternate windows only if they are present in the "last" file
|
||||
- refactoring: prefer using variable with tab character
|
||||
- remove deprecated `M-s` and `M-r` key bindings (breaking change)
|
||||
|
||||
### v1.5.0, 2014-11-09
|
||||
- add support for restoring neovim sessions
|
||||
|
||||
### v1.4.0, 2014-10-25
|
||||
- plugin now uses strategies when fetching pane full command. Implemented
|
||||
'default' strategy.
|
||||
- save command strategy: 'pgrep'. It's here only if fallback is needed.
|
||||
- save command strategy: 'gdb'
|
||||
- rename default strategy name to 'ps'
|
||||
- create `expect` script that can fully restore tmux environment
|
||||
- fix default save command strategy `ps` command flags. Flags are different for
|
||||
FreeBSD.
|
||||
- add bash history saving and restoring (@rburny)
|
||||
- preserving layout of zoomed windows across restores (@Azrael3000)
|
||||
|
||||
### v1.3.0, 2014-09-20
|
||||
- remove dependency on `pgrep` command. Use `ps` for fetching process names.
|
||||
|
||||
### v1.2.1, 2014-09-02
|
||||
- tweak 'new_pane' creation strategy to fix #36
|
||||
- when running multiple tmux server and for a large number of panes (120 +) when
|
||||
doing a restore, some panes might not be created. When that is the case also
|
||||
don't restore programs for those panes.
|
||||
|
||||
### v1.2.0, 2014-09-01
|
||||
- new feature: inline strategies when restoring a program
|
||||
|
||||
### v1.1.0, 2014-08-31
|
||||
- bugfix: sourcing `variables.sh` file in save script
|
||||
- add `Ctrl` key mappings, deprecate `Alt` keys mappings.
|
||||
|
||||
### v1.0.0, 2014-08-30
|
||||
- show spinner during the save process
|
||||
- add screencast script
|
||||
- make default program running list even more conservative
|
||||
|
||||
### v0.4.0, 2014-08-29
|
||||
- change plugin name to `tmux-resurrect`. Change all the variable names.
|
||||
|
||||
### v0.3.0, 2014-08-29
|
||||
- bugfix: when top is running the pane `$PWD` can't be saved. This was causing
|
||||
issues during the restore and is now fixed.
|
||||
- restoring sessions multiple times messes up the whole environment - new panes
|
||||
are all around. This is now fixed - pane restorations are now idempotent.
|
||||
- if pane exists from before session restore - do not restore the process within
|
||||
it. This makes the restoration process even more idempotent.
|
||||
- more panes within a window can now be restored
|
||||
- restore window zoom state
|
||||
|
||||
### v0.2.0, 2014-08-29
|
||||
- bugfix: with vim 'session' strategy, if the session file does not exist - make
|
||||
sure vim does not contain `-S` flag
|
||||
- enable restoring programs with arguments (e.g. "rails console") and also
|
||||
processes that contain program name
|
||||
- improve `irb` restore strategy
|
||||
|
||||
### v0.1.0, 2014-08-28
|
||||
- refactor checking if saved tmux session exists
|
||||
- spinner while tmux sessions are restored
|
||||
|
||||
### v0.0.5, 2014-08-28
|
||||
- restore pane processes
|
||||
- user option for disabling pane process restoring
|
||||
- enable whitelisting processes that will be restored
|
||||
- expand readme with configuration options
|
||||
- enable command strategies; enable restoring vim sessions
|
||||
- update readme: explain restoring vim sessions
|
||||
|
||||
### v0.0.4, 2014-08-26
|
||||
- restore pane layout for each window
|
||||
- bugfix: correct pane ordering in a window
|
||||
|
||||
### v0.0.3, 2014-08-26
|
||||
- save and restore current and alternate session
|
||||
- fix a bug with non-existing window names
|
||||
- restore active pane for each window that has multiple panes
|
||||
- restore active and alternate window for each session
|
||||
|
||||
### v0.0.2, 2014-08-26
|
||||
- saving a new session does not remove the previous one
|
||||
- make the directory where sessions are stored configurable
|
||||
- support only Tmux v1.9 or greater
|
||||
- display a nice error message if saved session file does not exist
|
||||
- added README
|
||||
|
||||
### v0.0.1, 2014-08-26
|
||||
- started a project
|
||||
- basic saving and restoring works
|
||||
@@ -0,0 +1,12 @@
|
||||
### Contributing
|
||||
|
||||
Code contributions are welcome!
|
||||
|
||||
### Reporting a bug
|
||||
|
||||
If you find a bug please report it in the issues. When reporting a bug please
|
||||
attach:
|
||||
- a file symlinked to `~/.tmux/resurrect/last`.
|
||||
- your `.tmux.conf`
|
||||
- if you're getting an error paste it to a [gist](https://gist.github.com/) and
|
||||
link it in the issue
|
||||
@@ -0,0 +1,19 @@
|
||||
Copyright (C) 2014 Bruno Sutic
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the "Software"),
|
||||
to deal in the Software without restriction, including without limitation
|
||||
the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
and/or sell copies of the Software, and to permit persons to whom the
|
||||
Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included
|
||||
in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||||
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
|
||||
OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
129
files/system/usr/etc/skel/.tmux/plugins/tmux-resurrect/README.md
Normal file
129
files/system/usr/etc/skel/.tmux/plugins/tmux-resurrect/README.md
Normal file
@@ -0,0 +1,129 @@
|
||||
# Tmux Resurrect
|
||||
|
||||
[](https://travis-ci.org/tmux-plugins/tmux-resurrect)
|
||||
|
||||
Restore `tmux` environment after system restart.
|
||||
|
||||
Tmux is great, except when you have to restart the computer. You lose all the
|
||||
running programs, working directories, pane layouts etc.
|
||||
There are helpful management tools out there, but they require initial
|
||||
configuration and continuous updates as your workflow evolves or you start new
|
||||
projects.
|
||||
|
||||
`tmux-resurrect` saves all the little details from your tmux environment so it
|
||||
can be completely restored after a system restart (or when you feel like it).
|
||||
No configuration is required. You should feel like you never quit tmux.
|
||||
|
||||
It even (optionally)
|
||||
[restores vim and neovim sessions](docs/restoring_vim_and_neovim_sessions.md)!
|
||||
|
||||
Automatic restoring and continuous saving of tmux env is also possible with
|
||||
[tmux-continuum](https://github.com/tmux-plugins/tmux-continuum) plugin.
|
||||
|
||||
### Screencast
|
||||
|
||||
[](https://vimeo.com/104763018)
|
||||
|
||||
### Key bindings
|
||||
|
||||
- `prefix + Ctrl-s` - save
|
||||
- `prefix + Ctrl-r` - restore
|
||||
|
||||
### About
|
||||
|
||||
This plugin goes to great lengths to save and restore all the details from your
|
||||
`tmux` environment. Here's what's been taken care of:
|
||||
|
||||
- all sessions, windows, panes and their order
|
||||
- current working directory for each pane
|
||||
- **exact pane layouts** within windows (even when zoomed)
|
||||
- active and alternative session
|
||||
- active and alternative window for each session
|
||||
- windows with focus
|
||||
- active pane for each window
|
||||
- "grouped sessions" (useful feature when using tmux with multiple monitors)
|
||||
- programs running within a pane! More details in the
|
||||
[restoring programs doc](docs/restoring_programs.md).
|
||||
|
||||
Optional:
|
||||
|
||||
- [restoring vim and neovim sessions](docs/restoring_vim_and_neovim_sessions.md)
|
||||
- [restoring pane contents](docs/restoring_pane_contents.md)
|
||||
- [restoring a previously saved environment](docs/restoring_previously_saved_environment.md)
|
||||
|
||||
Requirements / dependencies: `tmux 1.9` or higher, `bash`.
|
||||
|
||||
Tested and working on Linux, OSX and Cygwin.
|
||||
|
||||
`tmux-resurrect` is idempotent! It will not try to restore panes or windows that
|
||||
already exist.<br/>
|
||||
The single exception to this is when tmux is started with only 1 pane in order
|
||||
to restore previous tmux env. Only in this case will this single pane be
|
||||
overwritten.
|
||||
|
||||
### Installation with [Tmux Plugin Manager](https://github.com/tmux-plugins/tpm) (recommended)
|
||||
|
||||
Add plugin to the list of TPM plugins in `.tmux.conf`:
|
||||
|
||||
set -g @plugin 'tmux-plugins/tmux-resurrect'
|
||||
|
||||
Hit `prefix + I` to fetch the plugin and source it. You should now be able to
|
||||
use the plugin.
|
||||
|
||||
### Manual Installation
|
||||
|
||||
Clone the repo:
|
||||
|
||||
$ git clone https://github.com/tmux-plugins/tmux-resurrect ~/clone/path
|
||||
|
||||
Add this line to the bottom of `.tmux.conf`:
|
||||
|
||||
run-shell ~/clone/path/resurrect.tmux
|
||||
|
||||
Reload TMUX environment with: `$ tmux source-file ~/.tmux.conf`.
|
||||
You should now be able to use the plugin.
|
||||
|
||||
### Docs
|
||||
|
||||
- [Guide for migrating from tmuxinator](docs/migrating_from_tmuxinator.md)
|
||||
|
||||
**Configuration**
|
||||
|
||||
- [Changing the default key bindings](docs/custom_key_bindings.md).
|
||||
- [Setting up hooks on save & restore](docs/hooks.md).
|
||||
- Only a conservative list of programs is restored by default:<br/>
|
||||
`vi vim nvim emacs man less more tail top htop irssi weechat mutt`.<br/>
|
||||
[Restoring programs doc](docs/restoring_programs.md) explains how to restore
|
||||
additional programs.
|
||||
- [Change a directory](docs/save_dir.md) where `tmux-resurrect` saves tmux
|
||||
environment.
|
||||
|
||||
**Optional features**
|
||||
|
||||
- [Restoring vim and neovim sessions](docs/restoring_vim_and_neovim_sessions.md)
|
||||
is nice if you're a vim/neovim user.
|
||||
- [Restoring pane contents](docs/restoring_pane_contents.md) feature.
|
||||
|
||||
### Other goodies
|
||||
|
||||
- [tmux-copycat](https://github.com/tmux-plugins/tmux-copycat) - a plugin for
|
||||
regex searches in tmux and fast match selection
|
||||
- [tmux-yank](https://github.com/tmux-plugins/tmux-yank) - enables copying
|
||||
highlighted text to system clipboard
|
||||
- [tmux-open](https://github.com/tmux-plugins/tmux-open) - a plugin for quickly
|
||||
opening highlighted file or a url
|
||||
- [tmux-continuum](https://github.com/tmux-plugins/tmux-continuum) - automatic
|
||||
restoring and continuous saving of tmux env
|
||||
|
||||
### Reporting bugs and contributing
|
||||
|
||||
Both contributing and bug reports are welcome. Please check out
|
||||
[contributing guidelines](CONTRIBUTING.md).
|
||||
|
||||
### Credits
|
||||
|
||||
[Mislav Marohnić](https://github.com/mislav) - the idea for the plugin came from his
|
||||
[tmux-session script](https://github.com/mislav/dotfiles/blob/2036b5e03fb430bbcbc340689d63328abaa28876/bin/tmux-session).
|
||||
|
||||
### License
|
||||
[MIT](LICENSE.md)
|
||||
@@ -0,0 +1,11 @@
|
||||
# Custom key bindings
|
||||
|
||||
The default key bindings are:
|
||||
|
||||
- `prefix + Ctrl-s` - save
|
||||
- `prefix + Ctrl-r` - restore
|
||||
|
||||
To change these, add to `.tmux.conf`:
|
||||
|
||||
set -g @resurrect-save 'S'
|
||||
set -g @resurrect-restore 'R'
|
||||
@@ -0,0 +1,33 @@
|
||||
# Save & Restore Hooks
|
||||
|
||||
Hooks allow to set custom commands that will be executed during session save
|
||||
and restore. Most hooks are called with zero arguments, unless explicitly
|
||||
stated otherwise.
|
||||
|
||||
Currently the following hooks are supported:
|
||||
|
||||
- `@resurrect-hook-post-save-layout`
|
||||
|
||||
Called after all sessions, panes and windows have been saved.
|
||||
|
||||
Passed single argument of the state file.
|
||||
|
||||
- `@resurrect-hook-post-save-all`
|
||||
|
||||
Called at end of save process right before the spinner is turned off.
|
||||
|
||||
- `@resurrect-hook-pre-restore-all`
|
||||
|
||||
Called before any tmux state is altered.
|
||||
|
||||
- `@resurrect-hook-pre-restore-pane-processes`
|
||||
|
||||
Called before running processes are restored.
|
||||
|
||||
### Examples
|
||||
|
||||
Here is an example how to save and restore window geometry for most terminals in X11.
|
||||
Add this to `.tmux.conf`:
|
||||
|
||||
set -g @resurrect-hook-post-save-all 'eval $(xdotool getwindowgeometry --shell $WINDOWID); echo 0,$X,$Y,$WIDTH,$HEIGHT > $HOME/.tmux/resurrect/geometry'
|
||||
set -g @resurrect-hook-pre-restore-all 'wmctrl -i -r $WINDOWID -e $(cat $HOME/.tmux/resurrect/geometry)'
|
||||
@@ -0,0 +1,72 @@
|
||||
# Migrating from `tmuxinator`
|
||||
|
||||
### Why migrate to `tmux-resurrect`?
|
||||
|
||||
Here are some reasons why you'd want to migrate from `tmuxinator` to
|
||||
`tmux-resurrect`:
|
||||
|
||||
- **Less dependencies**<br/>
|
||||
`tmuxinator` depends on `ruby` which can be a hassle to set up if you're not a
|
||||
rubyist.<br/>
|
||||
`tmux-resurrect` depends just on `bash` which is virtually
|
||||
omnipresent.
|
||||
|
||||
- **Simplicity**<br/>
|
||||
`tmuxinator` has an executable, CLI interface with half dozen commands and
|
||||
command completion.<br/>
|
||||
`tmux-resurrect` defines just 2 tmux key bindings.
|
||||
|
||||
- **No configuration**<br/>
|
||||
`tmuxinator` is all about config files (and their constant updating).<br/>
|
||||
`tmux-resurrect` requires no configuration to work.
|
||||
|
||||
- **Better change handling**<br/>
|
||||
When you make a change to any aspect of tmux layout, you also have to
|
||||
update related `tmuxinator` project file (and test to make sure change is
|
||||
ok).<br/>
|
||||
With `tmux-resurrect` there's nothing to do: your change will be
|
||||
remembered on the next save.
|
||||
|
||||
### How to migrate?
|
||||
|
||||
1. Install `tmux-resurrect`.
|
||||
2. Open \*all* existing `tmuxinator` projects.<br/>
|
||||
Verify all projects are open by pressing `prefix + s` and checking they are
|
||||
all on the list.
|
||||
3. Perform a `tmux-resurrect` save.
|
||||
|
||||
That's it! You can continue using just `tmux-resurrect` should you choose so.
|
||||
|
||||
Note: it probably makes no sense to use both tools at the same time as they do
|
||||
the same thing (creating tmux environment for you to work in).
|
||||
Technically however, there should be no issues.
|
||||
|
||||
### Usage differences
|
||||
|
||||
`tmuxinator` focuses on managing individual tmux sessions (projects).
|
||||
`tmux-resurrect` keeps track of the \*whole* tmux environment: all sessions are
|
||||
saved and restored together.
|
||||
|
||||
A couple tips if you decide to switch to `tmux-resurrect`:
|
||||
|
||||
- Keep all tmux sessions (projects) running all the time.<br/>
|
||||
If you want to work on an existing project, you should be able to just
|
||||
\*switch* to an already open session using `prefix + s`.<br/>
|
||||
This is different from `tmuxinator` where you'd usually run `mux new [project]`
|
||||
in order to start working on something.
|
||||
|
||||
- No need to kill sessions with `tmux kill-session` (unless you really don't
|
||||
want to work on it ever).<br/>
|
||||
It's the recurring theme by now: just keep all the sessions running all the
|
||||
time. This is convenient and also cheap in terms of resources.
|
||||
|
||||
- The only 2 situations when you need `tmux-resurrect`:<br/>
|
||||
1) Save tmux environment just before restarting/shutting down your
|
||||
computer.<br/>
|
||||
2) Restore tmux env after you turn the computer on.
|
||||
|
||||
### Other questions?
|
||||
|
||||
Still have questions? Feel free to open an
|
||||
[issue](ihttps://github.com/tmux-plugins/tmux-resurrect/issues). We'll try to
|
||||
answer it and also update this doc.
|
||||
@@ -0,0 +1,39 @@
|
||||
tmux-ressurect no longer restores shell history for each pane, as of [this PR](https://github.com/tmux-plugins/tmux-resurrect/pull/308).
|
||||
|
||||
As a workaround, you can use the `HISTFILE` environment variable to preserve history for each pane separately, and modify
|
||||
`PROMPT_COMMAND` to make sure history gets saved with each new command.
|
||||
|
||||
Unfortunately, we haven't found a perfect way of getting a unique identifier for each pane, as the `TMUX_PANE` variable
|
||||
seems to occasionally change when resurrecting. As a workaround, the example below sets a unique ID in each pane's `title`.
|
||||
The downside of this implementation is that pane titles must all be unique across sessions/windows, and also must use the `pane_id_prefix`.
|
||||
|
||||
Any improvements/suggestions for getting a unique, persistent ID for each pane are welcome!
|
||||
|
||||
```bash
|
||||
pane_id_prefix="resurrect_"
|
||||
|
||||
# Create history directory if it doesn't exist
|
||||
HISTS_DIR=$HOME/.bash_history.d
|
||||
mkdir -p "${HISTS_DIR}"
|
||||
|
||||
if [ -n "${TMUX_PANE}" ]; then
|
||||
|
||||
# Check if we've already set this pane title
|
||||
pane_id=$(tmux display -pt "${TMUX_PANE:?}" "#{pane_title}")
|
||||
if [[ $pane_id != "$pane_id_prefix"* ]]; then
|
||||
|
||||
# if not, set it to a random ID
|
||||
random_id=$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 16)
|
||||
printf "\033]2;$pane_id_prefix$random_id\033\\"
|
||||
pane_id=$(tmux display -pt "${TMUX_PANE:?}" "#{pane_title}")
|
||||
fi
|
||||
|
||||
# use the pane's random ID for the HISTFILE
|
||||
export HISTFILE="${HISTS_DIR}/bash_history_tmux_${pane_id}"
|
||||
else
|
||||
export HISTFILE="${HISTS_DIR}/bash_history_no_tmux"
|
||||
fi
|
||||
|
||||
# Stash the new history each time a command runs.
|
||||
export PROMPT_COMMAND="$PROMPT_COMMAND;history -a"
|
||||
```
|
||||
@@ -0,0 +1,31 @@
|
||||
# Restoring pane contents
|
||||
|
||||
This plugin enables saving and restoring tmux pane contents.
|
||||
|
||||
This feature can be enabled by adding this line to `.tmux.conf`:
|
||||
|
||||
set -g @resurrect-capture-pane-contents 'on'
|
||||
|
||||
##### Known issue
|
||||
|
||||
When using this feature, please check the value of `default-command`
|
||||
tmux option. That can be done with `$ tmux show -g default-command`.
|
||||
|
||||
The value should NOT contain `&&` or `||` operators. If it does, simplify the
|
||||
option so those operators are removed.
|
||||
|
||||
Example:
|
||||
|
||||
- this will cause issues (notice the `&&` and `||` operators):
|
||||
|
||||
set -g default-command "which reattach-to-user-namespace > /dev/null && reattach-to-user-namespace -l $SHELL || $SHELL -l"
|
||||
|
||||
- this is ok:
|
||||
|
||||
set -g default-command "reattach-to-user-namespace -l $SHELL"
|
||||
|
||||
Related [bug](https://github.com/tmux-plugins/tmux-resurrect/issues/98).
|
||||
|
||||
Alternatively, you can let
|
||||
[tmux-sensible](https://github.com/tmux-plugins/tmux-sensible)
|
||||
handle this option in a cross-platform way and you'll have no problems.
|
||||
@@ -0,0 +1,14 @@
|
||||
# Restoring previously saved environment
|
||||
|
||||
None of the previous saves are deleted (unless you explicitly do that). All save
|
||||
files are kept in `~/.tmux/resurrect/` directory, or `~/.local/share/tmux/resurrect`
|
||||
(unless `${XDG_DATA_HOME}` says otherwise).<br/>
|
||||
Here are the steps to restore to a previous point in time:
|
||||
|
||||
- make sure you start this with a "fresh" tmux instance
|
||||
- `$ cd ~/.tmux/resurrect/`
|
||||
- locate the save file you'd like to use for restore (file names have a timestamp)
|
||||
- symlink the `last` file to the desired save file: `$ ln -sf <file_name> last`
|
||||
- do a restore with `tmux-resurrect` key: `prefix + Ctrl-r`
|
||||
|
||||
You should now be restored to the time when `<file_name>` save happened.
|
||||
@@ -0,0 +1,205 @@
|
||||
# Restoring programs
|
||||
- [General instructions](#general-instructions)
|
||||
- [Clarifications](#clarifications)
|
||||
- [Working with NodeJS](#nodejs)
|
||||
- [Restoring Mosh](#mosh)
|
||||
|
||||
### General instructions <a name="general-instructions"></a>
|
||||
Only a conservative list of programs is restored by default:<br/>
|
||||
`vi vim nvim emacs man less more tail top htop irssi weechat mutt`.
|
||||
|
||||
This can be configured with `@resurrect-processes` option in `.tmux.conf`. It
|
||||
contains space-separated list of additional programs to restore.
|
||||
|
||||
- Example restoring additional programs:
|
||||
|
||||
set -g @resurrect-processes 'ssh psql mysql sqlite3'
|
||||
|
||||
- Programs with arguments should be double quoted:
|
||||
|
||||
set -g @resurrect-processes 'some_program "git log"'
|
||||
|
||||
- Start with tilde to restore a program whose process contains target name:
|
||||
|
||||
set -g @resurrect-processes 'irb pry "~rails server" "~rails console"'
|
||||
|
||||
- Use `->` to specify a command to be used when restoring a program (useful if
|
||||
the default restore command fails ):
|
||||
|
||||
set -g @resurrect-processes 'some_program "grunt->grunt development"'
|
||||
|
||||
- Use `*` to expand the arguments from the saved command when restoring:
|
||||
|
||||
set -g @resurrect-processes 'some_program "~rails server->rails server *"'
|
||||
|
||||
- Don't restore any programs:
|
||||
|
||||
set -g @resurrect-processes 'false'
|
||||
|
||||
- Restore **all** programs (dangerous!):
|
||||
|
||||
set -g @resurrect-processes ':all:'
|
||||
|
||||
Be *very careful* with this: tmux-resurrect can not know which programs take
|
||||
which context, and a `sudo mkfs.vfat /dev/sdb` that was just formatting an
|
||||
external USB stick could wipe your backup hard disk if that's what's attached
|
||||
after rebooting.
|
||||
|
||||
This option is primarily useful for experimentation (e.g., to find out which
|
||||
program is recognized in a pane).
|
||||
|
||||
### Clarifications <a name="clarfications"></a>
|
||||
|
||||
> I don't understand tilde `~`, what is it and why is it used when restoring
|
||||
programs?
|
||||
|
||||
Let's say you use `rails server` command often. You want `tmux-resurrect` to
|
||||
save and restore it automatically. You might try adding `rails server` to the
|
||||
list of programs that will be restored:
|
||||
|
||||
set -g @resurrect-processes '"rails server"' # will NOT work
|
||||
|
||||
Upon save, `rails server` command will actually be saved as this command:
|
||||
`/Users/user/.rbenv/versions/2.0.0-p481/bin/ruby script/rails server`
|
||||
(if you wanna see how is any command saved, check it yourself in
|
||||
`~/.tmux/resurrect/last` file).
|
||||
|
||||
When programs are restored, the `rails server` command will NOT be restored
|
||||
because it does not **strictly** match the long
|
||||
`/Users/user/.rbenv/versions/2.0.0-p481/bin/ruby script/rails server` string.
|
||||
|
||||
The tilde `~` at the start of the string relaxes process name matching.
|
||||
|
||||
set -g @resurrect-processes '"~rails server"' # OK
|
||||
|
||||
The above option says: "restore full process if `rails server` string is found
|
||||
ANYWHERE in the process name".
|
||||
|
||||
If you check long process string, there is in fact a `rails server` string at
|
||||
the end, so now the process will be successfully restored.
|
||||
|
||||
> What is arrow `->` and why is is used?
|
||||
|
||||
(Please read the above clarification about tilde `~`).
|
||||
|
||||
Continuing with our `rails server` example, when the process is finally restored
|
||||
correctly it might not look pretty as you'll see the whole
|
||||
`/Users/user/.rbenv/versions/2.0.0-p481/bin/ruby script/rails server` string in
|
||||
the command line.
|
||||
|
||||
Naturally, you'd rather want to see just `rails server` (what you initially
|
||||
typed), but that information is now unfortunately lost.
|
||||
|
||||
To aid this, you can use arrow `->`: (**note**: there is no space before and after `->`)
|
||||
|
||||
set -g @resurrect-processes '"~rails server->rails server"' # OK
|
||||
|
||||
This option says: "when this process is restored use `rails server` as the
|
||||
command name".
|
||||
|
||||
Full (long) process name is now ignored and you'll see just `rails server` in
|
||||
the command line when the program is restored.
|
||||
|
||||
> What is asterisk `*` and why is it used?
|
||||
|
||||
(Please read the above clarifications about tilde `~` and arrow `->`).
|
||||
|
||||
Continuing with the `rails server` example, you might have added flags for e.g.
|
||||
verbose logging, but with the above configuration, the flags would be lost.
|
||||
|
||||
To preserve the command arguments when restoring, use the asterisk `*`: (**note**: there **must** be a space before `*`)
|
||||
|
||||
set -g @resurrect-processes '"~rails server->rails server *"'
|
||||
|
||||
This option says: "when this process is restored use `rails server` as the
|
||||
command name, but preserve its arguments".
|
||||
|
||||
> Now I understand the tilde and the arrow, but things still don't work for me
|
||||
|
||||
Here's the general workflow for figuring this out:
|
||||
|
||||
- Set up your whole tmux environment manually.<br/>
|
||||
In our example case, we'd type `rails server` in a pane where we want it to
|
||||
run.
|
||||
- Save tmux env (it will get saved to `~/.tmux/resurrect/last`).
|
||||
- Open `~/.tmux/resurrect/last` file and try to find full process string for
|
||||
your program.<br/>
|
||||
Unfortunately this is a little vague but it should be easy. A smart
|
||||
thing to do for our example is to search for string `rails` in the `last`
|
||||
file.
|
||||
- Now that you know the full and the desired process string use tilde `~` and
|
||||
arrow `->` in `.tmux.conf` to make things work.
|
||||
|
||||
### Working with NodeJS <a name="nodejs"></a>
|
||||
If you are working with NodeJS, you may get some troubles with configuring restoring programs.
|
||||
|
||||
Particularly, some programs like `gulp`, `grunt` or `npm` are not saved with parameters so tmux-resurrect cannot restore it. This is actually **not tmux-resurrect's issue** but more likely, those programs' issues. For example if you run `gulp watch` or `npm start` and then try to look at `ps` or `pgrep`, you will only see `gulp` or `npm`.
|
||||
|
||||
To deal with these issues, one solution is to use [yarn](https://yarnpkg.com/en/docs/install) which a package manager for NodeJS and an alternative for `npm`. It's nearly identical to `npm` and very easy to use. Therefore you don't have to do any migration, you can simply use it immediately. For example:
|
||||
- `npm test` is equivalent to `yarn test`,
|
||||
- `npm run watch:dev` is equivalent to `yarn watch:dev`
|
||||
- more interestingly, `gulp watch:dev` is equivalent to `yarn gulp watch:dev`
|
||||
|
||||
Before continuing, please ensure that you understand the [clarifications](#clarifications) section about `~` and `->`
|
||||
|
||||
#### yarn
|
||||
It's fairly straight forward if you have been using `yarn` already.
|
||||
|
||||
set -g @resurrect-processes '"~yarn watch"'
|
||||
set -g @resurrect-processes '"~yarn watch->yarn watch"'
|
||||
|
||||
|
||||
#### npm
|
||||
Instead of
|
||||
|
||||
set -g @resurrect-processes '"~npm run watch"' # will NOT work
|
||||
|
||||
we use
|
||||
|
||||
set -g @resurrect-processes '"~yarn watch"' # OK
|
||||
|
||||
|
||||
#### gulp
|
||||
Instead of
|
||||
|
||||
set -g @resurrect-processes '"~gulp test"' # will NOT work
|
||||
|
||||
we use
|
||||
|
||||
set -g @resurrect-processes '"~yarn gulp test"' # OK
|
||||
|
||||
|
||||
#### nvm
|
||||
If you use `nvm` in your project, here is how you could config tmux-resurrect:
|
||||
|
||||
set -g @resurrect-processes '"~yarn gulp test->nvm use && gulp test"'
|
||||
|
||||
#### Another problem
|
||||
Let take a look at this example
|
||||
|
||||
set -g @resurrect-processes '\
|
||||
"~yarn gulp test->gulp test" \
|
||||
"~yarn gulp test-it->gulp test-it" \
|
||||
'
|
||||
**This will not work properly**, only `gulp test` is run, although you can see the command `node /path/to/yarn gulp test-it` is added correctly in `.tmux/resurrect/last` file.
|
||||
|
||||
The reason is when restoring program, the **command part after the dash `-` is ignored** so instead of command `gulp test-it`, the command `gulp test` which will be run.
|
||||
|
||||
A work around, for this problem until it's fixed, is:
|
||||
- the config should be like this:
|
||||
|
||||
set -g @resurrect-processes '\
|
||||
"~yarn gulp test->gulp test" \
|
||||
"~yarn gulp \"test-it\"->gulp test-it" \
|
||||
|
||||
- and in `.tmux/resurrect/last`, we should add quote to `test-it` word
|
||||
|
||||
... node:node /path/to/yarn gulp "test-it"
|
||||
|
||||
|
||||
### Restoring Mosh <a name="#mosh"></a>
|
||||
Mosh spawns a `mosh-client` process, so we need to specify that as the process to be resurrected.
|
||||
|
||||
set -g @resurrect-processes 'mosh-client'
|
||||
|
||||
Additionally a mosh-client strategy is provided to handle extracting the original arguments and re-run Mosh.
|
||||
@@ -0,0 +1,19 @@
|
||||
# Restoring vim and neovim sessions
|
||||
|
||||
- save vim/neovim sessions. I recommend
|
||||
[tpope/vim-obsession](https://github.com/tpope/vim-obsession) (as almost every
|
||||
plugin, it works for both vim and neovim).
|
||||
- in `.tmux.conf`:
|
||||
|
||||
# for vim
|
||||
set -g @resurrect-strategy-vim 'session'
|
||||
# for neovim
|
||||
set -g @resurrect-strategy-nvim 'session'
|
||||
|
||||
`tmux-resurrect` will now restore vim and neovim sessions if `Session.vim` file
|
||||
is present.
|
||||
|
||||
> If you're using the vim binary provided by MacVim.app then you'll need to set `@resurrect-processes`, for example:
|
||||
> ```
|
||||
> set -g @resurrect-processes '~Vim -> vim'
|
||||
> ```
|
||||
@@ -0,0 +1,15 @@
|
||||
# Resurrect save dir
|
||||
|
||||
By default Tmux environment is saved to a file in `~/.tmux/resurrect` dir.
|
||||
Change this with:
|
||||
|
||||
set -g @resurrect-dir '/some/path'
|
||||
|
||||
Using environment variables or shell interpolation in this option is not
|
||||
allowed as the string is used literally. So the following won't do what is
|
||||
expected:
|
||||
|
||||
set -g @resurrect-dir '/path/$MY_VAR/$(some_executable)'
|
||||
|
||||
Only the following variables and special chars are allowed:
|
||||
`$HOME`, `$HOSTNAME`, and `~`.
|
||||
2
files/system/usr/etc/skel/.tmux/plugins/tmux-resurrect/lib/tmux-test/.gitignore
vendored
Normal file
2
files/system/usr/etc/skel/.tmux/plugins/tmux-resurrect/lib/tmux-test/.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
.vagrant/
|
||||
lib/
|
||||
@@ -0,0 +1,19 @@
|
||||
# generic packages and tmux
|
||||
before_install:
|
||||
- sudo apt-get update
|
||||
- sudo apt-get install -y git-core expect
|
||||
- sudo apt-get install -y python-software-properties software-properties-common
|
||||
- sudo apt-get install -y libevent-dev libncurses-dev
|
||||
- git clone https://github.com/tmux/tmux.git
|
||||
- cd tmux
|
||||
- git checkout 2.5
|
||||
- sh autogen.sh
|
||||
- ./configure && make && sudo make install
|
||||
|
||||
install:
|
||||
- git fetch --unshallow --recurse-submodules || git fetch --recurse-submodules
|
||||
# manual `git clone` required for testing `tmux-test` plugin itself
|
||||
- git clone https://github.com/tmux-plugins/tmux-test lib/tmux-test; true
|
||||
- lib/tmux-test/setup
|
||||
|
||||
script: ./tests/run_tests_in_isolation
|
||||
@@ -0,0 +1,46 @@
|
||||
# Changelog
|
||||
|
||||
### master
|
||||
- move `setup` task to `.travis.yml` for travis tests
|
||||
- "merge" travis.yml and travis_for_plugins.yml files (no need to keep em
|
||||
separate)
|
||||
- add more useful helper functions
|
||||
- remove tmux-test repo as a submodule from self, this causes issues with
|
||||
`$ git submodule update --recursive --init` command that some users use for
|
||||
managing other plugins
|
||||
- add new helper `teardown_helper`
|
||||
- add `run_tests` helper
|
||||
- change CLI syntax for choosing vagrant machine to run the tests on
|
||||
- enable running just a single test via `run_tests` cli interface
|
||||
- add `--keep-running` cli option to continue running vagrant after the tests
|
||||
are done executing
|
||||
- start using tmux 2.0 for tests
|
||||
- use tmux 2.5 for tests
|
||||
|
||||
### v0.2.0, 2015-02-22
|
||||
- `setup` script gitignores `tests/helpers.sh`
|
||||
- move `tests/helpers.sh` to `tests/helpers/helpers.sh`
|
||||
- `setup` undo removes added lines from gitignore file
|
||||
|
||||
### v0.1.0, 2015-02-22
|
||||
- changes so that 'tmux-test' can be included with tmux plugins
|
||||
- do not gitignore submodules directory
|
||||
- add installation and usage instructions
|
||||
- copy `.travis.yml` to the project root when running `setup` script
|
||||
- add a brief mention of travis CI to the readme
|
||||
- add test helpers
|
||||
- `setup` script symlinks helpers file to `tests/` directory
|
||||
- `setup` script can undo most of its actions
|
||||
- add a tmux scripting test
|
||||
- `tmux-test` uses `tmux-test` to test itself
|
||||
- update `tmux-test` submodule
|
||||
- a different `travis.yml` for `tmux-test` and for plugins
|
||||
|
||||
### v0.0.1, 2015-02-21
|
||||
- git init
|
||||
- add vagrant provisioning scripts for ubuntu and debian
|
||||
- add a ".travis.yml" file
|
||||
- generic "run_tests" script
|
||||
- "run_tests_in_isolation" script
|
||||
- add "Vagrantfile"
|
||||
- enable passing VM names as arguments to "run_tests" script
|
||||
@@ -0,0 +1,19 @@
|
||||
Copyright (C) Bruno Sutic
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the "Software"),
|
||||
to deal in the Software without restriction, including without limitation
|
||||
the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
and/or sell copies of the Software, and to permit persons to whom the
|
||||
Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included
|
||||
in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||||
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
|
||||
OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
@@ -0,0 +1,134 @@
|
||||
# tmux-test
|
||||
|
||||
[](https://travis-ci.org/tmux-plugins/tmux-test)
|
||||
|
||||
A small framework for isolated testing of tmux plugins. Isolation is achieved by
|
||||
running the tests in `Vagrant`. Works on [travis](travis-ci.org) too.
|
||||
|
||||
Extracted from [tmux plugin manager](https://github.com/tmux-plugins/tpm) and
|
||||
[tmux-copycat](https://github.com/tmux-plugins/tmux-copycat).
|
||||
|
||||
Dependencies: `Vagrant` (not required when running on travis).
|
||||
|
||||
### Setup
|
||||
|
||||
Let's say you made tmux plugin with the following file hierarchy:
|
||||
|
||||
```text
|
||||
/tmux-plugin
|
||||
|-- plugin.tmux
|
||||
`-- scripts
|
||||
`-- plugin_script.sh
|
||||
```
|
||||
|
||||
From your project root directory (tmux-plugin/) execute the following shell
|
||||
command to fetch `tmux-test` and add it as a submodule:
|
||||
|
||||
$ git submodule add https://github.com/tmux-plugins/tmux-test.git lib/tmux-test
|
||||
|
||||
Run the `setup` script:
|
||||
|
||||
$ lib/tmux-test/setup
|
||||
|
||||
The project directory will now look like this (additions have comments):
|
||||
|
||||
```text
|
||||
/tmux-plugin
|
||||
|-- plugin.tmux
|
||||
|-- run_tests # symlink, gitignored
|
||||
|-- .gitignore # 2 lines appended to gitignore
|
||||
|-- .travis.yml # added
|
||||
|-- lib/tmux-test/ # git submodule
|
||||
|-- scripts
|
||||
| `-- plugin_script.sh
|
||||
`-- tests # dir to put the tests in
|
||||
`-- run_tests_in_isolation.sh # symlink, gitignored
|
||||
`-- helpers
|
||||
`-- helpers.sh # symlinked bash helpers, gitignored
|
||||
```
|
||||
|
||||
`tmux-test` is now set up. You are ok to commit the additions to the repo.
|
||||
|
||||
### Writing and running tests
|
||||
|
||||
A test is any executable with a name starting with `test_` in `tests/`
|
||||
directory.
|
||||
|
||||
Now that you installed `tmux-test` let's create an example test.
|
||||
|
||||
- create a `tests/test_example.sh` file with the following content (it's a
|
||||
`bash` script but it can be any executable):
|
||||
|
||||
#/usr/bin/env bash
|
||||
|
||||
CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||
|
||||
# bash helpers provided by 'tmux-test'
|
||||
source $CURRENT_DIR/helpers/helpers.sh
|
||||
|
||||
# installs plugin from current repo in Vagrant (or on Travis)
|
||||
install_tmux_plugin_under_test_helper
|
||||
|
||||
# start tmux in background (plugin under test is sourced)
|
||||
tmux new -d
|
||||
|
||||
# get first session name
|
||||
session_name="$(tmux list-sessions -F "#{session_name}")"
|
||||
|
||||
# fail the test if first session name is not "0"
|
||||
if [ "$session_name" == "0" ]; then
|
||||
# fail_helper is also provided by 'tmux-test'
|
||||
fail_helper "First session name is not '0' by default"
|
||||
fi
|
||||
|
||||
# sets the right script exit code ('tmux-test' helper)
|
||||
exit_helper
|
||||
|
||||
- make the test file executable with `$ chmod +x tests/test_example.sh`
|
||||
- run the test by executing `./run_tests` from the project root directory
|
||||
- the first invocation might take some time because Vagrant's ubuntu virtual
|
||||
machine is downloading. You should see `Success, tests pass!` message when it's
|
||||
done.
|
||||
|
||||
Check out more example test scripts in this project's [tests/ directory](tests/).
|
||||
|
||||
### Continuous integration
|
||||
|
||||
The setup script (`lib/tmux-test/setup`) added a `.travis.yml` file to the
|
||||
project root. To setup continuous integration, just add/enable the project on
|
||||
[travis](travis-ci.org).
|
||||
|
||||
### Notes
|
||||
|
||||
- The `tests/` directory for tests and `lib/tmux-test/` for cloning `tmux-test`
|
||||
into cannot be changed currently
|
||||
- Don't run `tests/run_tests_in_isolation` script on your local development
|
||||
environment. That's an internal test runner meant to be executed in an
|
||||
isolated environment like `vagrant` or `travis`.<br/>
|
||||
Use `./run_tests` script.
|
||||
- You can use `KEEP_RUNNING=true ./run_tests` for faster test running cycle.
|
||||
If this case `Vagrant` will keep running even after the tests are done.
|
||||
- You can use `VAGRANT_CWD=lib/tmux-test/ vagrant ssh ubuntu` for ssh login to
|
||||
`Vagrant`.
|
||||
|
||||
### Running `tmux-test` framework tests
|
||||
|
||||
`tmux-test` uses itself to test itself. To run framework tests:
|
||||
|
||||
- clone this project `$ git clone git@github.com:tmux-plugins/tmux-test.git`
|
||||
- `$ cd tmux-test`
|
||||
- run `$ ./run_framework_tests`
|
||||
|
||||
### Other goodies
|
||||
|
||||
- [tmux-copycat](https://github.com/tmux-plugins/tmux-copycat) - a plugin for
|
||||
regex searches in tmux and fast match selection
|
||||
- [tmux-continuum](https://github.com/tmux-plugins/tmux-continuum) - automatic
|
||||
restoring and continuous saving of tmux env
|
||||
|
||||
You might want to follow [@brunosutic](https://twitter.com/brunosutic) on
|
||||
twitter if you want to hear about new tmux plugins or feature updates.
|
||||
|
||||
### License
|
||||
|
||||
[MIT](LICENSE.md)
|
||||
17
files/system/usr/etc/skel/.tmux/plugins/tmux-resurrect/lib/tmux-test/Vagrantfile
vendored
Normal file
17
files/system/usr/etc/skel/.tmux/plugins/tmux-resurrect/lib/tmux-test/Vagrantfile
vendored
Normal file
@@ -0,0 +1,17 @@
|
||||
VAGRANTFILE_API_VERSION = "2"
|
||||
|
||||
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
|
||||
|
||||
config.vm.synced_folder "../../", "/vagrant"
|
||||
|
||||
config.vm.define :ubuntu do |ubuntu|
|
||||
ubuntu.vm.box = "hashicorp/precise64"
|
||||
ubuntu.vm.provision "shell", path: "vagrant_ubuntu_provisioning.sh"
|
||||
end
|
||||
|
||||
config.vm.define :centos do |centos|
|
||||
centos.vm.box = "chef/centos-6.5"
|
||||
centos.vm.provision "shell", path: "vagrant_centos_provisioning.sh"
|
||||
end
|
||||
|
||||
end
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user