15 Commits

Author SHA1 Message Date
b2a67705b6 wip(commands): re-implement core commands as bash functions
Re-implement all libexec executables as bash functions, with the goal of
being able build a single standalone execuable bash script for
tmuxifier.
2025-12-01 23:17:41 +00:00
f268c12f3f Merge pull request #117 from jimeh/improve-shell-script-formatting 2025-12-01 23:11:59 +00:00
adb008b301 style(shell): improve shell script formatting and quoting
Apply shfmt formatting and fix some schellcheck complaints.
2025-12-01 23:04:40 +00:00
9941b28063 Merge pull request #109 from plaffitt/skip-run_cmd-history
Prepend commands in run_cmd with a space to prevent them to be stored in the history
2025-02-24 21:25:18 +00:00
Paul Laffitte
68b02f07b0 Prepend commands in run_cmd with a space to prevent them to be stored in the history 2024-09-30 17:57:15 +02:00
895dace853 fix(layout-helpers): split_h/split_v work correctly on latest tmux (#99)
The `-p` flag on `split-window` was deprecated in Tmux 3.1 in favor of
just adding a `%` suffix to the numeric value given to the `-l` flag.

This uses the new `-l <n>%` format on Tmux 3.1 and later, and uses the
old `-p <n>` format on 3.0 and older.
2024-02-18 00:42:44 +00:00
2b6239c6f0 Merge pull request #96 from gabyx/patch-1
fix: Wrong link in help command
2024-02-18 00:28:53 +00:00
de509d8a08 Merge pull request #95 from joaopedroaat/master
Bugfix: add fix to tmux next-* versions.
2024-02-18 00:28:39 +00:00
Gabriel Nützi
67ee31d783 fix: Wrong link in help command 2024-01-17 13:25:55 +01:00
João Pedro
2e4d5197ae Remove incorrect formatting. 2024-01-09 14:54:23 -03:00
João Pedro
c2cbd5d7ea Bugfix: add fix to tmux next-* versions. 2024-01-06 17:38:36 -03:00
fe1f6c4734 docs(readme): add TPM installation instructions 2023-04-11 19:24:15 +01:00
d147958750 docs(readme): format readme with prettier-js 2023-04-11 19:23:52 +01:00
957229a1e8 Merge pull request #88 from 0inp/master 2023-04-11 18:54:19 +01:00
Stephane Point
ea4a7aa57c Add TPM support 2023-04-09 14:17:14 -05:00
24 changed files with 381 additions and 282 deletions

140
README.md
View File

@@ -3,18 +3,18 @@
Tmuxify your Tmux. Create, edit, manage and load complex Tmux session, window Tmuxify your Tmux. Create, edit, manage and load complex Tmux session, window
and pane configurations with ease. and pane configurations with ease.
In short, Tmuxifier allows you to easily create, edit, and load "layout" In short, Tmuxifier allows you to easily create, edit, and load "layout" files,
files, which are simple shell scripts where you use the `tmux` command and which are simple shell scripts where you use the `tmux` command and helper
helper commands provided by `tmuxifier` to manage Tmux sessions and windows commands provided by `tmuxifier` to manage Tmux sessions and windows
### Window Layouts ### Window Layouts
Window layouts create a new Tmux window, optionally setting the window title Window layouts create a new Tmux window, optionally setting the window title and
and root path where all shells are cd'd to by default. It allows you to easily root path where all shells are cd'd to by default. It allows you to easily split
split a window into specifically sized panes and more as you wish. a window into specifically sized panes and more as you wish.
You can load a window layout directly into your current Tmux session, or into You can load a window layout directly into your current Tmux session, or into a
a session layout to have the window created along with the session. session layout to have the window created along with the session.
### Session Layouts ### Session Layouts
@@ -25,10 +25,11 @@ defined directly within the session layout file.
## Example ## Example
Given we have a window layout file called [example.window.sh][] which Given we have a window layout file called [example.window.sh][] which looks
looks like: like:
[example.window.sh]: https://github.com/jimeh/tmuxifier/blob/master/examples/example.window.sh [example.window.sh]:
https://github.com/jimeh/tmuxifier/blob/master/examples/example.window.sh
```bash ```bash
window_root "~/Desktop" window_root "~/Desktop"
@@ -39,8 +40,8 @@ split_h 60
select_pane 0 select_pane 0
``` ```
You can then load that window layout into a new window in the You can then load that window layout into a new window in the current tmux
current tmux session using: session using:
tmuxifier load-window example tmuxifier load-window example
@@ -50,6 +51,8 @@ Which will yield a Tmux window looking like this:
## Installation ## Installation
### Manual
Clone the repo to your machine: Clone the repo to your machine:
git clone https://github.com/jimeh/tmuxifier.git ~/.tmuxifier git clone https://github.com/jimeh/tmuxifier.git ~/.tmuxifier
@@ -57,33 +60,49 @@ Clone the repo to your machine:
Then add `$HOME/.tmuxifier/bin` to your PATH to make the `tmuxifier` executable Then add `$HOME/.tmuxifier/bin` to your PATH to make the `tmuxifier` executable
available to you: available to you:
__In bash & zsh:__ **In bash & zsh:**
```bash ```bash
export PATH="$HOME/.tmuxifier/bin:$PATH" export PATH="$HOME/.tmuxifier/bin:$PATH"
``` ```
__In tcsh:__ **In tcsh:**
```tcsh ```tcsh
set path = ( "~/.tmuxifier/bin" $path ) set path = ( "~/.tmuxifier/bin" $path )
``` ```
__In fish:__ **In fish:**
```bash ```bash
set -gx PATH "~/.tmuxifier/bin" $PATH set -gx PATH "~/.tmuxifier/bin" $PATH
``` ```
### Custom Installation Path #### Custom Installation Path
To install Tmuxifier somewhere else than the suggested `~/.tmuxifier`, simply To install Tmuxifier somewhere else than the suggested `~/.tmuxifier`, simply
clone the repository to your custom location, and ensure the `bin` folder is clone the repository to your custom location, and ensure the `bin` folder is
added to your PATH making the `tmuxifier` executable available to you. added to your PATH making the `tmuxifier` executable available to you.
### TPM
You can also install and update Tmuxifier with
[TPM](https://github.com/tmux-plugins/tpm):
```bash
set -g @plugin 'jimeh/tmuxifier'
```
Trigger TPM's install command with `prefix` + `I` to install Tmuxifier to TPM's
plugin directory (default is `$HOME/.tmux/plugins`).
To use the `tmuxifier` command, you will need to add the `bin` directory to your
PATH. If you are using the default TPM plugin directory, the `bin` directory
will be `$HOME/.tmux/plugins/tmuxifier/bin`.
## Setup ## Setup
__In bash & zsh:__ **In bash & zsh:**
And add the following to your `~/.profile`, `~/.bash_profile`, `~/.zshrc` or And add the following to your `~/.profile`, `~/.bash_profile`, `~/.zshrc` or
equivalent: equivalent:
@@ -92,7 +111,7 @@ equivalent:
eval "$(tmuxifier init -)" eval "$(tmuxifier init -)"
``` ```
__In tcsh:__ **In tcsh:**
Add the following to your `~/.cshrc`, `~/.tcshrc` or equivalent: Add the following to your `~/.cshrc`, `~/.tcshrc` or equivalent:
@@ -100,7 +119,7 @@ Add the following to your `~/.cshrc`, `~/.tcshrc` or equivalent:
eval `tmuxifier init -` eval `tmuxifier init -`
``` ```
__In fish:__ **In fish:**
And add the following to your `~/.config/fish/config.fish` or equivalent: And add the following to your `~/.config/fish/config.fish` or equivalent:
@@ -110,9 +129,9 @@ eval (tmuxifier init - fish)
### Custom Tmux Arguments ### Custom Tmux Arguments
If you need to pass custom arguments to `tmux` itself, you can do so by If you need to pass custom arguments to `tmux` itself, you can do so by setting
setting the `TMUXIFIER_TMUX_OPTS` environment variable. For example to set the `TMUXIFIER_TMUX_OPTS` environment variable. For example to set custom
custom arguments globally: arguments globally:
```bash ```bash
export TMUXIFIER_TMUX_OPTS="-L my-awesome-socket-name" export TMUXIFIER_TMUX_OPTS="-L my-awesome-socket-name"
@@ -134,7 +153,7 @@ git pull
## Usage ## Usage
*__Note:__ This section needs expanding upon.* _**Note:** This section needs expanding upon._
For a quick reference on available commands and their aliases, please run: For a quick reference on available commands and their aliases, please run:
@@ -142,8 +161,8 @@ For a quick reference on available commands and their aliases, please run:
Tmuxifier doesn't come with any layouts, so you'll want to create your own Tmuxifier doesn't come with any layouts, so you'll want to create your own
window and session layout files. New layout files are populated with examples window and session layout files. New layout files are populated with examples
and comments explaining what things do. Also, having a look at the and comments explaining what things do. Also, having a look at the [examples][]
[examples][] directory will also give you a good idea. directory will also give you a good idea.
### Window Layouts ### Window Layouts
@@ -151,16 +170,16 @@ First off you'll want to define a window layout:
tmuxifier new-window my-awesome-window tmuxifier new-window my-awesome-window
This will create a new layout file called `my-awesome-window.window.sh` in This will create a new layout file called `my-awesome-window.window.sh` in your
your `$TMUXIFIER_LAYOUT_PATH`, and open it with the editor defined in `$TMUXIFIER_LAYOUT_PATH`, and open it with the editor defined in `$EDITOR`.
`$EDITOR`. Customize it as you wish, and save. Customize it as you wish, and save.
You can now load *my-awesome-window* with the following command: You can now load _my-awesome-window_ with the following command:
tmuxifier load-window my-awesome-window tmuxifier load-window my-awesome-window
You should now have a new Tmux window open created from your custom and You should now have a new Tmux window open created from your custom and awesome
awesome window layout. window layout.
### Session Layouts ### Session Layouts
@@ -170,8 +189,9 @@ To create your first session layout, run:
Same deal as with creating a new window, except the filename ends with Same deal as with creating a new window, except the filename ends with
`.session.sh` instead of `.window.sh`, and the file's pre-populated content `.session.sh` instead of `.window.sh`, and the file's pre-populated content
looks different. To have your awesome window loaded, add `load_window looks different. To have your awesome window loaded, add
"my-awesome-window"` to the session layout next to existing examples. `load_window "my-awesome-window"` to the session layout next to existing
examples.
To load the session layout simply run: To load the session layout simply run:
@@ -195,8 +215,8 @@ export TMUXIFIER_LAYOUT_PATH="$HOME/.tmux-layouts"
### Disable Shell-Completion ### Disable Shell-Completion
Tmuxifier comes with shell-completion for bash, zsh, tcsh, and fish. If for Tmuxifier comes with shell-completion for bash, zsh, tcsh, and fish. If for any
any reason you need to disable it, just set `$TMUXIFIER_NO_COMPLETE`. reason you need to disable it, just set `$TMUXIFIER_NO_COMPLETE`.
```bash ```bash
export TMUXIFIER_NO_COMPLETE=1 export TMUXIFIER_NO_COMPLETE=1
@@ -208,13 +228,12 @@ export TMUXIFIER_NO_COMPLETE=1
Tmuxifier supports iTerm2's [Tmux integration][]. It can be used in two ways: Tmuxifier supports iTerm2's [Tmux integration][]. It can be used in two ways:
- Passing `-CC` as a second argument to the `load-session` command. For - Passing `-CC` as a second argument to the `load-session` command. For example:
example:
tmuxifier load-session my-awesome-session -CC tmuxifier load-session my-awesome-session -CC
- Setting the `TMUXIFIER_TMUX_ITERM_ATTACH` environment variable to `-CC` - Setting the `TMUXIFIER_TMUX_ITERM_ATTACH` environment variable to `-CC` before
before calling the `load-session` command. calling the `load-session` command.
[tmux integration]: https://gitlab.com/gnachman/iterm2/wikis/TmuxIntegration [tmux integration]: https://gitlab.com/gnachman/iterm2/wikis/TmuxIntegration
@@ -226,16 +245,16 @@ example:
## Tmuxifier vs. Tmuxinator ## Tmuxifier vs. Tmuxinator
Though Tmuxifier is largely inspired by the excellent [Tmuxinator][] project, Though Tmuxifier is largely inspired by the excellent [Tmuxinator][] project, it
it does set itself apart in a number of ways: does set itself apart in a number of ways:
- Uses shell scripts to define Tmux sessions and windows instead of YAML - Uses shell scripts to define Tmux sessions and windows instead of YAML files.
files. The benefit is total control over Tmux, but the definition files are The benefit is total control over Tmux, but the definition files are more
more complicated to work with. complicated to work with.
- Instead of using a "project" concept, Tmuxifier uses a concept of "sessions" - Instead of using a "project" concept, Tmuxifier uses a concept of "sessions"
and "windows" just like Tmux itself. This allows you to load a whole session and "windows" just like Tmux itself. This allows you to load a whole session
with multiple pre-defined window configurations, or just load a single with multiple pre-defined window configurations, or just load a single window
window configuration into your existing session. configuration into your existing session.
- Tmuxifier is a set of shell scripts, meaning it doesn't require Ruby to be - Tmuxifier is a set of shell scripts, meaning it doesn't require Ruby to be
installed on the machine. installed on the machine.
@@ -244,8 +263,8 @@ it does set itself apart in a number of ways:
## Todos ## Todos
* Improve Readme, specially Usage section. - Improve Readme, specially Usage section.
* Write up a detailed reference for all available layout helper functions. - Write up a detailed reference for all available layout helper functions.
## License ## License
@@ -253,20 +272,19 @@ it does set itself apart in a number of ways:
Copyright (c) 2014 Jim Myhrberg. Copyright (c) 2014 Jim Myhrberg.
Permission is hereby granted, free of charge, to any person obtaining a copy Permission is hereby granted, free of charge, to any person obtaining a copy of
of this software and associated documentation files (the "Software"), to deal this software and associated documentation files (the "Software"), to deal in
in the Software without restriction, including without limitation the rights the Software without restriction, including without limitation the rights to
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
copies of the Software, and to permit persons to whom the Software is the Software, and to permit persons to whom the Software is furnished to do so,
furnished to do so, subject to the following conditions: subject to the following conditions:
The above copyright notice and this permission notice shall be included in all The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software. copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
SOFTWARE.

View File

@@ -3,11 +3,12 @@ set -e
[ -n "$TMUXIFIER_DEBUG" ] && set -x [ -n "$TMUXIFIER_DEBUG" ] && set -x
resolve_link() { resolve_link() {
$(type -p greadlink readlink | head -1) $1 $(type -p greadlink readlink | head -1) "$1"
} }
abs_dirname() { abs_dirname() {
local cwd="$(pwd)" local cwd
cwd="$(pwd)"
local path="$1" local path="$1"
while [ -n "$path" ]; do while [ -n "$path" ]; do
@@ -20,6 +21,7 @@ abs_dirname() {
cd "$cwd" cd "$cwd"
} }
main() {
if [ -z "${TMUXIFIER}" ]; then if [ -z "${TMUXIFIER}" ]; then
# Set TMUXIFIER relative to the "tmuxifier" executable. # Set TMUXIFIER relative to the "tmuxifier" executable.
export TMUXIFIER="$(dirname "$(abs_dirname "$0")")" export TMUXIFIER="$(dirname "$(abs_dirname "$0")")"
@@ -28,11 +30,8 @@ else
export TMUXIFIER="${TMUXIFIER%/}" export TMUXIFIER="${TMUXIFIER%/}"
fi fi
# Load tmuxifier environment variables. # Bootstrap tmuxifier.
source "$TMUXIFIER/lib/env.sh" source "$TMUXIFIER/lib/load.sh"
# Add tmuxifier's internal commands to PATH.
export PATH="$TMUXIFIER/libexec:$PATH"
# Check Tmux version. # Check Tmux version.
export TMUXIFIER_MIN_TMUX_VERSION="1.6" export TMUXIFIER_MIN_TMUX_VERSION="1.6"
@@ -42,8 +41,13 @@ if [ "$(tmuxifier-tmux-version "$TMUXIFIER_MIN_TMUX_VERSION")" == "<" ]; then
exit 1 exit 1
fi fi
# Parse given command # Get command and shift arguments.
command="$1" local command="$1"
shift 1
# Resolve to full command name if an alias is given.
command="$(tmuxifier-alias "$command" || echo "$command")"
case "$command" in case "$command" in
"" | "-h" | "--help") "" | "-h" | "--help")
echo -e "tmuxifier $(tmuxifier-version)\n$(tmuxifier-help)" >&2 echo -e "tmuxifier $(tmuxifier-version)\n$(tmuxifier-help)" >&2
@@ -54,14 +58,26 @@ case "$command" in
;; ;;
*) *)
! command_path="$(tmuxifier-resolve-command-path "$command")" local command_path
local func_name
func_name="tmuxifier-$command"
# Check if command is available as a function.
if declare -f "$func_name" > /dev/null; then
"$func_name" "$@"
else
# Fall back to libexec executable.
command_path="$(tmuxifier-resolve-command-path "$command")" || true
if [ -z "$command_path" ]; then if [ -z "$command_path" ]; then
echo "tmuxifier: no such command '$command'" >&2 echo "tmuxifier: no such command '$command'" >&2
exit 1 exit 1
fi fi
shift 1
exec "$command_path" "$@" exec "$command_path" "$@"
fi
;; ;;
esac esac
}
main "$@"

56
lib/commands/alias.sh Normal file
View File

@@ -0,0 +1,56 @@
# Resolve a tmuxifier command alias to its full command name.
#
# Usage:
# tmuxifier-alias <alias>
#
# Arguments:
# $1 - Alias to resolve
#
# Output:
# The full command name if alias is recognized, empty otherwise.
#
# Returns:
# 0 - Alias was recognized
# 1 - Alias was not recognized
tmuxifier-alias() {
# Provide tmuxifier help
if calling-help "$@"; then
echo "usage: tmuxifier alias <alias>
Resolve a command alias to it's full name."
return
fi
case "$1" in
"session" | "ses" | "s")
echo "load-session"
;;
"window" | "win" | "w")
echo "load-window"
;;
"new-ses" | "nses" | "ns")
echo "new-session"
;;
"new-win" | "nwin" | "nw")
echo "new-window"
;;
"edit-ses" | "eses" | "es")
echo "edit-session"
;;
"edit-win" | "ewin" | "ew")
echo "edit-window"
;;
"l")
echo "list"
;;
"list-ses" | "lses" | "ls")
echo "list-sessions"
;;
"list-win" | "lwin" | "lw")
echo "list-windows"
;;
*)
return 1
;;
esac
}

View File

@@ -0,0 +1,43 @@
# Resolve the absolute path to a tmuxifier command or alias.
#
# Usage:
# tmuxifier-resolve-command-path <command_or_alias>
#
# Arguments:
# $1 - Command name or alias to resolve
#
# Output:
# The absolute path to the command executable, or empty if not found.
#
# Returns:
# 0 - Command was found
# 1 - Command was not found
tmuxifier-resolve-command-path() {
# Provide tmuxifier help
if calling-help "$@"; then
echo "usage: tmuxifier resolve-command-path <command_or_alias>
Outputs the absolute path to the given command or command alias."
return
fi
local command_path=""
if [ -n "$1" ]; then
# Look for executable file, not functions.
command_path="$(type -P "tmuxifier-$1" 2> /dev/null)" || true
if [ -z "$command_path" ]; then
local resolved
resolved="$(tmuxifier-alias "$1")"
if [ -n "$resolved" ]; then
command_path="$(type -P "tmuxifier-$resolved" 2> /dev/null)" || true
fi
fi
fi
if [ -n "$command_path" ]; then
echo "$command_path"
else
return 1
fi
}

View File

@@ -0,0 +1,63 @@
# Enable extended globbing for version string cleanup.
shopt -s extglob
# Output current Tmux version, or compare against a target version.
#
# Usage:
# tmuxifier-tmux-version # Outputs current Tmux version
# tmuxifier-tmux-version "1.9" # Outputs "=", "<", or ">"
#
# Arguments:
# $1 - Optional target version to compare against
#
# Output:
# Without arguments: The current Tmux version string
# With target version: One of "=", "<", or ">" indicating if the current
# Tmux version is equal to, less than, or greater than
# the target version.
#
# Returns:
# 0 - Always succeeds
tmuxifier-tmux-version() {
# Provide tmuxifier help
if calling-help "$@"; then
echo "usage: tmuxifier tmux-version [<target-version>]
Outputs current Tmux version. If given optional target-version it outputs one
of three possible characters indicating if the current Tmux version number is
equal to, less than, or greater than the <target-version>.
The three possible outputs are \"=\", \"<\", and \">\"."
return
fi
local version
version="$(tmux -V)"
version="${version/tmux /}"
# Fix for tmux next-* versions
version="${version/next-/}"
if [ -z "$1" ]; then
echo "$version"
return
fi
if [ "$version" == "master" ]; then
# When version string is "master", tmux was compiled from source, and we
# assume it's later than whatever the <target-version> is.
echo '>'
else
# Fix for "1.9a" version comparison, as vercomp() can only deal with
# purely numeric version numbers.
version="${version//+([a-zA-Z])/}"
local result
vercomp "$version" "$1" && result=$? || result=$?
case $result in
0) echo '=' ;;
1) echo '>' ;;
2) echo '<' ;;
esac
fi
}

View File

@@ -37,7 +37,12 @@ new_window() {
# - $2: (optional) Target pane ID to split in current window. # - $2: (optional) Target pane ID to split in current window.
# #
split_v() { split_v() {
if [ "$(tmuxifier-tmux-version "3.0")" == ">" ]; then
# Tmux 3.1 and later.
if [ -n "$1" ]; then local percentage=(-l "$1"'%'); fi
else
if [ -n "$1" ]; then local percentage=(-p "$1"); fi if [ -n "$1" ]; then local percentage=(-p "$1"); fi
fi
tmuxifier-tmux split-window -t "$session:$window.$2" -v "${percentage[@]}" tmuxifier-tmux split-window -t "$session:$window.$2" -v "${percentage[@]}"
__go_to_window_or_session_path __go_to_window_or_session_path
} }
@@ -49,7 +54,12 @@ split_v() {
# - $2: (optional) Target pane ID to split in current window. # - $2: (optional) Target pane ID to split in current window.
# #
split_h() { split_h() {
if [ "$(tmuxifier-tmux-version "3.0")" == ">" ]; then
# Tmux 3.1 and later.
if [ -n "$1" ]; then local percentage=(-l "$1"'%'); fi
else
if [ -n "$1" ]; then local percentage=(-p "$1"); fi if [ -n "$1" ]; then local percentage=(-p "$1"); fi
fi
tmuxifier-tmux split-window -t "$session:$window.$2" -h "${percentage[@]}" tmuxifier-tmux split-window -t "$session:$window.$2" -h "${percentage[@]}"
__go_to_window_or_session_path __go_to_window_or_session_path
} }
@@ -204,8 +214,8 @@ load_window() {
if [ $# -gt 1 ]; then if [ $# -gt 1 ]; then
window="$2" window="$2"
else else
window="${1/%.window.sh}" window="${1/%.window.sh/}"
window="${window/%.sh}" window="${window/%.sh/}"
fi fi
source "$file" source "$file"
window= window=
@@ -248,8 +258,8 @@ load_session() {
if [ $# -gt 1 ]; then if [ $# -gt 1 ]; then
session="$2" session="$2"
else else
session="${1/%.session.sh}" session="${1/%.session.sh/}"
session="${session/%.sh}" session="${session/%.sh/}"
fi fi
set_default_path=true set_default_path=true
@@ -340,7 +350,6 @@ finalize_and_go_to_session() {
fi fi
} }
# #
# Internal functions # Internal functions
# #
@@ -372,7 +381,7 @@ __get_current_window_index() {
-F "#{window_active}:#{window_index}" 2> /dev/null | grep "^1:") -F "#{window_active}:#{window_index}" 2> /dev/null | grep "^1:")
if [ -n "$lookup" ]; then if [ -n "$lookup" ]; then
echo "${lookup/1:}" echo "${lookup/1:/}"
fi fi
} }

17
lib/load.sh Normal file
View File

@@ -0,0 +1,17 @@
# Setup layout path.
if [ -z "${TMUXIFIER_LAYOUT_PATH}" ]; then
export TMUXIFIER_LAYOUT_PATH="${TMUXIFIER}/layouts"
else
export TMUXIFIER_LAYOUT_PATH="${TMUXIFIER_LAYOUT_PATH%/}"
fi
# Add tmuxifier's internal commands to PATH.
export PATH="$TMUXIFIER/libexec:$PATH"
# Load utility functions.
source "$TMUXIFIER/lib/util.sh"
# Load command functions from lib/commands/ directory directly.
source "$TMUXIFIER/lib/commands/alias.sh"
source "$TMUXIFIER/lib/commands/resolve-command-path.sh"
source "$TMUXIFIER/lib/commands/tmux-version.sh"

View File

@@ -1,11 +1,11 @@
calling-help() { calling-help() {
if [[ " $@ " != *" --help "* ]] && [[ " $@ " != *" -h "* ]]; then if [[ " $* " != *" --help "* ]] && [[ " $* " != *" -h "* ]]; then
return 1 return 1
fi fi
} }
calling-complete() { calling-complete() {
if [[ " $@ " != *" --complete "* ]]; then if [[ " $* " != *" --complete "* ]]; then
return 1 return 1
fi fi
} }

View File

@@ -1,46 +1,6 @@
#! /usr/bin/env bash #! /usr/bin/env bash
set -e
[ -n "$TMUXIFIER_DEBUG" ] && set -x [ -n "$TMUXIFIER_DEBUG" ] && set -x
# Load internal utility functions. source "$TMUXIFIER/lib/load.sh"
source "$TMUXIFIER/lib/util.sh"
# Provide tmuxifier help tmuxifier-alias "$@"
if calling-help "$@"; then
echo "usage: tmuxifier alias <alias>
Resolve a command alias to it's full name."
exit
fi
case "$1" in
"session" | "ses" | "s" )
echo "load-session"
;;
"window" | "win" | "w" )
echo "load-window"
;;
"new-ses" | "nses" | "ns" )
echo "new-session"
;;
"new-win" | "nwin" | "nw" )
echo "new-window"
;;
"edit-ses" | "eses" | "es" )
echo "edit-session"
;;
"edit-win" | "ewin" | "ew" )
echo "edit-window"
;;
"l" )
echo "list"
;;
"list-ses" | "lses" | "ls" )
echo "list-sessions"
;;
"list-win" | "lwin" | "lw" )
echo "list-windows"
;;
* )
exit 1
esac

View File

@@ -16,7 +16,8 @@ fi
shopt -s nullglob shopt -s nullglob
{ for path in ${PATH//:/$'\n'}; do {
for path in ${PATH//:/$'\n'}; do
for command in "${path}/tmuxifier-"*; do for command in "${path}/tmuxifier-"*; do
command="${command##*tmuxifier-}" command="${command##*tmuxifier-}"
echo "$command" echo "$command"

View File

@@ -24,7 +24,7 @@ has-completions() {
} }
if [ -z "$1" ]; then if [ -z "$1" ]; then
echo "$(tmuxifier-help completions $@)" >&2 tmuxifier-help completions "$@" >&2
exit 1 exit 1
fi fi

View File

@@ -15,7 +15,7 @@ fi
if [ -n "$TMUX" ]; then if [ -n "$TMUX" ]; then
for item in $(tmuxifier-tmux list-pane -F "#{session_name}"); do for item in $(tmuxifier-tmux list-pane -F "#{session_name}"); do
echo $item echo "$item"
exit 0 exit 0
done done
fi fi

View File

@@ -22,7 +22,7 @@ if calling-complete "$@"; then
fi fi
if [ -z "$1" ]; then if [ -z "$1" ]; then
echo "$(tmuxifier-help edit-session $@)" >&2 tmuxifier-help edit-session "$@" >&2
exit 1 exit 1
fi fi

View File

@@ -22,7 +22,7 @@ if calling-complete "$@"; then
fi fi
if [ -z "$1" ]; then if [ -z "$1" ]; then
echo "$(tmuxifier-help edit-window $@)" >&2 tmuxifier-help edit-window "$@" >&2
exit 1 exit 1
fi fi

View File

@@ -64,8 +64,8 @@ Load Tmuxifier by adding the following to your ${profile}:
fi fi
# Print help if "-" argument is not given # Print help if "-" argument is not given
if [[ " $@ " != *" - "* ]]; then if [[ " $* " != *" - "* ]]; then
echo "$(tmuxifier-help init $@)" >&2 tmuxifier-help init "$@" >&2
exit 1 exit 1
fi fi

View File

@@ -19,7 +19,7 @@ Arguments:
directory, or path to a session layout file. directory, or path to a session layout file.
<iterm mode> - When given as \"-CC\" tmux will be called with <iterm mode> - When given as \"-CC\" tmux will be called with
the -CC argument enabling iTerm2 integration. the -CC argument enabling iTerm2 integration.
More info: http://bit.ly/1yDbMlm" More info: https://iterm2.com"
exit exit
fi fi
@@ -30,7 +30,7 @@ if calling-complete "$@"; then
fi fi
if [ -z "$1" ]; then if [ -z "$1" ]; then
echo "$(tmuxifier-help load-session $@)" >&2 tmuxifier-help load-session "$@" >&2
exit 1 exit 1
fi fi

View File

@@ -26,14 +26,14 @@ if calling-complete "$@"; then
fi fi
if [ -z "$1" ]; then if [ -z "$1" ]; then
echo "$(tmuxifier-help load-window $@)" >&2 tmuxifier-help load-window "$@" >&2
exit 1 exit 1
fi fi
# Load runtime functions. # Load runtime functions.
source "$TMUXIFIER/lib/runtime.sh" source "$TMUXIFIER/lib/runtime.sh"
if [ ! -z $TMUX ]; then if [ ! -z "$TMUX" ]; then
session="$(tmuxifier-current-session)" session="$(tmuxifier-current-session)"
load_window "$1" load_window "$1"
else else

View File

@@ -22,7 +22,7 @@ if calling-complete "$@"; then
fi fi
if [ -z "$1" ]; then if [ -z "$1" ]; then
echo "$(tmuxifier-help new-session $@)" >&2 tmuxifier-help new-session "$@" >&2
exit 1 exit 1
fi fi

View File

@@ -22,7 +22,7 @@ if calling-complete "$@"; then
fi fi
if [ -z "$1" ]; then if [ -z "$1" ]; then
echo "$(tmuxifier-help new-window $@)" >&2 tmuxifier-help new-window "$@" >&2
exit 1 exit 1
fi fi

View File

@@ -1,30 +1,6 @@
#! /usr/bin/env bash #! /usr/bin/env bash
set -e
[ -n "$TMUXIFIER_DEBUG" ] && set -x [ -n "$TMUXIFIER_DEBUG" ] && set -x
# Load internal utility functions. source "$TMUXIFIER/lib/load.sh"
source "$TMUXIFIER/lib/util.sh"
# Provide tmuxifier help tmuxifier-resolve-command-path "$@"
if calling-help "$@"; then
echo "usage: tmuxifier resolve-command-path <command_or_alias>
Outputs the absolute path to the given command or command alias."
exit
fi
if [ -n "$1" ]; then
! command_path="$(command -v "tmuxifier-$1")"
if [ -z "$command_path" ]; then
resolved="$(tmuxifier-alias "$1")"
if [ -n "$resolved" ]; then
! command_path="$(command -v "tmuxifier-$resolved")"
fi
fi
fi
if [ -n "$command_path" ]; then
echo "$command_path"
else
exit 1
fi

View File

@@ -1,67 +1,6 @@
#! /usr/bin/env bash #! /usr/bin/env bash
shopt -s extglob
[ -n "$TMUXIFIER_DEBUG" ] && set -x [ -n "$TMUXIFIER_DEBUG" ] && set -x
# Load internal utility functions. source "$TMUXIFIER/lib/load.sh"
source "$TMUXIFIER/lib/util.sh"
# Provide tmuxifier help tmuxifier-tmux-version "$@"
if calling-help "$@"; then
echo "usage: tmuxifier tmux-version [<target-version>]
Outputs current Tmux version. If given optional target-version it outputs one
of three possible characters indicating if the current Tmux version number is
equal to, less than, or greater than the <target-version>.
The three possible outputs are \"=\", \"<\", and \">\"."
exit
fi
# The vercomp() function is shamelessly ripped/borrowed from the following
# StackOverflow answer: http://stackoverflow.com/a/4025065/42146
vercomp () {
if [[ $1 == $2 ]]; then return 0; fi
local IFS=.
local i ver1=($1) ver2=($2)
# fill empty fields in ver1 with zeros
for ((i=${#ver1[@]}; i<${#ver2[@]}; i++)); do ver1[i]=0; done
for ((i=0; i<${#ver1[@]}; i++)); do
# fill empty fields in ver2 with zeros
if [[ -z ${ver2[i]} ]]; then ver2[i]=0; fi
if ((10#${ver1[i]} > 10#${ver2[i]})); then
return 1
elif ((10#${ver1[i]} < 10#${ver2[i]})); then
return 2
fi
done
return 0
}
version=$(tmux -V)
version=${version/tmux /}
if [ -z "$1" ]; then
echo "$version"
exit
fi
if [ "$version" == "master" ]; then
# When version string is "master", tmux was compiled from source, and we
# assume it's later than whatever the <target-version> is.
echo '>'
else
# Fix for "1.9a" version comparison, as vercomp() can only deal with
# purely numeric version numbers.
version=${version//+([a-zA-Z])/}
vercomp "$version" "$1"
case $? in
0) echo '=';;
1) echo '>';;
2) echo '<';;
esac
fi

1
tmuxifier.tmux Executable file
View File

@@ -0,0 +1 @@
#!/usr/bin/env bash