41 Commits

Author SHA1 Message Date
307c959b65 Bump version to 0.3.1 2012-07-04 20:01:04 +01:00
b79125f55d Rename function to match existing naming convention 2012-07-04 19:56:00 +01:00
ddc11cc192 Merge pull request #6 from trobrock/work-with-rvm
When specifying a windows default path, rvm no longer works
2012-07-04 11:51:36 -07:00
Trae Robrock
5c2659c8e7 Use cd to set the working dir of a split or window so that rvm works 2012-06-27 17:46:12 -07:00
Trae Robrock
54a4f565c6 Merge branch 'master' of https://github.com/jimeh/tmuxifier 2012-06-27 14:03:49 -07:00
6a5bf32991 Bump version to 0.3.0 2012-06-27 21:47:12 +01:00
1f81e98e73 Add send_keys examples to window layout template 2012-06-27 21:40:59 +01:00
5989b1f516 Add send_keys layout helper 2012-06-27 21:39:54 +01:00
012526656e Remove send-keys -l support check as it is not needed
After some experimentation it turns out that if input to send-keys is
not a known key sequence like `C-m` or `C-l` for example, it it
automatically treated as literal input.

 Negating the need to use it and hence check if it's supported.
2012-06-27 21:29:29 +01:00
b2857b7df9 Merge pull request #4 from trobrock/no-l-flag
Support tmux versions that do not have the -l flag
2012-06-27 13:08:12 -07:00
Trae Robrock
8df639ae47 Merge branch 'no-l-flag' 2012-06-26 16:36:17 -07:00
Trae Robrock
75ae3ba142 Support tmux versions that do not have the -l flag 2012-06-26 16:35:23 -07:00
c862df2d82 Merge pull request #2 from greeneca/current_session_fix
fixed current session script
2012-06-04 11:52:19 -07:00
Charlie Greene
c06df475be fixed current session script 2012-06-04 14:25:02 -03:00
10104b7412 Update example window layout file with new helpers 2012-05-24 01:02:53 +01:00
3fa749dbf3 Update example in readme with new layout helpers 2012-05-24 00:58:48 +01:00
f8c0c8c749 Bump version to 0.2.1 2012-05-24 00:53:50 +01:00
147db787d5 Add completion to new-session and new-window commands
Complete names of existing sessions and windows for the `new` commands,
enabling easier creation of similarly named layouts.
2012-05-24 00:53:20 +01:00
4477b69f7a Bump version to 0.2.0 2012-05-24 00:42:37 +01:00
71303c8eba Update window template with new layout helpers 2012-05-24 00:42:36 +01:00
89325d0982 Add new layout helper functions for pane creation and command execution 2012-05-24 00:42:35 +01:00
8155740ceb Fix window specific root path
If a session root was set, any window layouts loaded with a window root
set caused the window root to be ignored. This resolves the issue.
2012-05-24 00:42:34 +01:00
ae70bae022 Reorganize functions a bit 2012-05-24 00:42:31 +01:00
a8ff37808a Clean up the code a bit 2012-05-24 00:41:37 +01:00
12100e7f79 Ensure default layouts directory exists after fresh git clone 2012-04-30 17:05:47 +01:00
98b50afb37 Bump version to 0.1.3 2012-04-30 02:18:57 +01:00
99bd6a9bd5 Improve error output from edit-session and edit-window commands 2012-04-30 02:15:50 +01:00
5a0e4c912c Remove useless piece of code left from "borrowing" it from rbenv 2012-04-30 02:15:22 +01:00
178bbdecff Make better use of conditional operators and quote vars properly 2012-04-30 02:14:52 +01:00
1fc854dbdd Move internal runtime functions to layout-helpers.sh file 2012-04-30 02:12:01 +01:00
addb754ac7 Use new tmuxifier-resolve-command-path everywhere 2012-04-30 02:10:43 +01:00
3063c6f1f3 Correctly resolve aliases in help command.
This resolves issue #1.
2012-04-30 02:08:40 +01:00
7d2c9aa49f Bump version to 0.1.2 2012-04-26 08:52:02 +01:00
b65355a35a Boolean logic is hard (and buggy? wtf?)
Fixed a bug with alias resolution not working, for reasons that are
currently beyond my understanding of shell scripting it would seem.
2012-04-26 08:51:49 +01:00
8e21664439 Bump version to 0.1.1 2012-04-26 08:29:39 +01:00
d4dfe39037 Improve how return value of certain commands are checked 2012-04-26 02:41:13 +01:00
b0b8d29d27 Make tmuxifier-alias return 1 when no alias is matched 2012-04-26 02:28:03 +01:00
855c522cf0 Avoid exiting with a cleaner syntax for commands that might fail 2012-04-26 02:22:40 +01:00
0d3cfb2494 Improve new_window helper function's internals 2012-04-26 02:10:30 +01:00
60e92c35e8 Improve readme formatting 2012-04-26 00:40:45 +01:00
1e50f0c2c3 Expand usage section in readme 2012-04-26 00:38:03 +01:00
19 changed files with 236 additions and 113 deletions

View File

@@ -33,9 +33,10 @@ looks like:
```bash ```bash
window_root "~/Desktop" window_root "~/Desktop"
new_window "Example Window" new_window "Example Window"
tmux split-window -t "$session:$window.0" -v -p 20 "watch -t date" split_v 20
tmux split-window -t "$session:$window.1" -h -p 60 run_cmd "watch -t date"
tmux select-pane -t "$session:$window.0" split_h 60
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
@@ -65,7 +66,7 @@ And add the following to your `~/.profile`, `~/.bash_profile` or equivalent:
*__Note:__ This section needs expanding upon.* *__Note:__ This section needs expanding upon.*
For a quick reference on available commands, please run: For a quick reference on available commands and their aliases, please run:
tmuxifier help tmuxifier help
@@ -74,6 +75,41 @@ 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][] directory will also give you a good idea. [examples][] directory will also give you a good idea.
### Window Layouts
First off you'll want to define a window layout:
tmuxifier new-window my-awesome-window
This will create a new layout file called `my-awesome-window.window.sh` in
your `$TMUXIFIER_LAYOUT_PATH`, and open it with the editor defined in
`$EDITOR`. Customize it as you wish, and save.
You can now load *my-awesome-window* with the following command:
tmuxifier load-window my-awesome-window
You should now have a new Tmux window open created from your custom and
awesome window layout.
### Session Layouts
To create your first session layout, run:
tmuxifier new-session my-awesome-session
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
looks different. To have your awesome window loaded, add `load_window
"my-awesome-window"` to the session layout next to existing examples.
To load the session layout simply run:
tmuxifier load-session my-awesome-session
You'll now have a new Tmux session with your previously defined awesome window
in it.
[examples]: https://github.com/jimeh/tmuxifier/tree/master/examples [examples]: https://github.com/jimeh/tmuxifier/tree/master/examples
## Configure & Customize ## Configure & Customize
@@ -168,4 +204,3 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 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 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE. SOFTWARE.

View File

@@ -24,15 +24,7 @@ case "$command" in
;; ;;
* ) * )
command_path="$(command -v "tmuxifier-$command" || true)" ! command_path="$(tmuxifier-resolve-command-path "$command")"
# Attempt to resolve aliases
if [ -z "$command_path" ]; then
resolved="$(tmuxifier-alias "$command")"
if [ ! -z "$resolved" ]; then
command_path="$(command -v "tmuxifier-$resolved" || true)"
fi
fi
if [ -z "$command_path" ]; then if [ -z "$command_path" ]; then
echo "tmuxifier: no such command '$command'" >&2 echo "tmuxifier: no such command '$command'" >&2

View File

@@ -7,8 +7,9 @@ window_root "~/Desktop"
new_window "Example Window" new_window "Example Window"
# Split window into panes. # Split window into panes.
tmux split-window -t "$session:$window.0" -v -p 20 "watch -t date" split_v 20
tmux split-window -t "$session:$window.1" -h -p 60 run_cmd "watch -t date"
split_h 60
# Set active pane. # Set active pane.
tmux select-pane -t "$session:$window.0" select_pane 0

View File

@@ -10,7 +10,7 @@ export PATH="$TMUXIFIER/bin:$PATH"
# If `tmuxifier` is available, and `$TMUXIFIER_NO_COMPLETE` is not set, then # If `tmuxifier` is available, and `$TMUXIFIER_NO_COMPLETE` is not set, then
# load tmuxifier shell completion. # load tmuxifier shell completion.
if [ ! -z $(command -v "tmuxifier") ] && [ -z "$TMUXIFIER_NO_COMPLETE" ]; then if [ -n "$(command -v "tmuxifier")" ] && [ -z "$TMUXIFIER_NO_COMPLETE" ]; then
if [ -n "$BASH_VERSION" ]; then if [ -n "$BASH_VERSION" ]; then
source "$TMUXIFIER/completion/tmuxifier.bash" source "$TMUXIFIER/completion/tmuxifier.bash"
elif [ -n "$ZSH_VERSION" ]; then elif [ -n "$ZSH_VERSION" ]; then

0
layouts/.gitkeep Normal file
View File

View File

@@ -13,16 +13,36 @@
# - $2: (optional) Shell command to execute when window is created. # - $2: (optional) Shell command to execute when window is created.
# #
new_window() { new_window() {
if [ ! -z "$1" ]; then if [ -n "$1" ]; then window="$1"; fi
window="$1" if [ -n "$2" ]; then local command=("$2"); fi
fi if [ -n "$window" ]; then local winarg=(-n "$window"); fi
if [ ! -z "$2" ]; then
local command="\"$2\"" tmux new-window -t "$session:" "${winarg[@]}" "${command[@]}"
fi __go_to_window_or_session_path
if [ ! -z "$window" ]; then }
local winarg="-n \"$window\""
fi # Split current window/pane vertically.
eval "tmux new-window -t \"$session:\" $winarg $command" #
# Arguments:
# - $1: (optional) Percentage of frame the new pane will use.
# - $2: (optional) Target pane ID to split in current window.
#
split_v() {
if [ -n "$1" ]; then local percentage=(-p "$1"); fi
tmux split-window -t "$session:$window.$2" -v "${percentage[@]}"
__go_to_window_or_session_path
}
# Split current window/pane horizontally.
#
# Arguments:
# - $1: (optional) Percentage of frame the new pane will use.
# - $2: (optional) Target pane ID to split in current window.
#
split_h() {
if [ -n "$1" ]; then local percentage=(-p "$1"); fi
tmux split-window -t "$session:$window.$2" -h "${percentage[@]}"
__go_to_window_or_session_path
} }
# Select a specific window. # Select a specific window.
@@ -34,6 +54,60 @@ select_window() {
tmux select-window -t "$session:$1" tmux select-window -t "$session:$1"
} }
# Select a specific pane in the current window.
#
# Arguments:
# - $1: Pane ID to select.
#
select_pane() {
tmux select-pane -t "$session:$window.$1"
}
# Send/paste keys to the currently active pane/window.
#
# Arguments:
# - $1: String to paste.
# - $2: (optional) Target pane ID to send input to.
#
send_keys() {
tmux send-keys -t "$session:$window.$2" "$1"
}
# Runs a shell command in the currently active pane/window.
#
# Arguments:
# - $1: Shell command to run.
# - $2: (optional) Target pane ID to run command in.
#
run_cmd() {
send_keys "$1" "$2"
send_keys "C-m" "$2"
}
# Cusomize session root path. Default is `$HOME`.
#
# Arguments:
# - $1: Directory path to use for session root.
#
session_root() {
local dir="$(__expand_path $@)"
if [ -d "$dir" ]; then
session_root="$dir"
fi
}
# Customize window root path. Default is `$session_root`.
#
# Arguments:
# - $1: Directory path to use for window root.
#
window_root() {
local dir="$(__expand_path $@)"
if [ -d "$dir" ]; then
window_root="$dir"
fi
}
# Load specified window layout. # Load specified window layout.
# #
# Arguments: # Arguments:
@@ -44,7 +118,7 @@ load_window() {
if [ -f "$file" ]; then if [ -f "$file" ]; then
window="$1" window="$1"
source "$file" source "$file"
window="" window=
# Reset `$window_root`. # Reset `$window_root`.
if [[ "$window_root" != "$session_root" ]]; then if [[ "$window_root" != "$session_root" ]]; then
@@ -76,30 +150,6 @@ load_session() {
fi fi
} }
# Cusomize session root path. Default is `$HOME`.
#
# Arguments:
# - $1: Directory path to use for session root.
#
session_root() {
local dir="$(__expand_path $@)"
if [ -d "$dir" ]; then
session_root="$dir"
fi
}
# Customize window root path. Default is `$session_root`.
#
# Arguments:
# - $1: Directory path to use for window root.
#
window_root() {
local dir="$(__expand_path $@)"
if [ -d "$dir" ]; then
cd "$dir"
fi
}
# Create a new session, returning 0 on success, 1 on failure. # Create a new session, returning 0 on success, 1 on failure.
# #
# Arguments: # Arguments:
@@ -113,7 +163,7 @@ window_root() {
# fi # fi
# #
initialize_session() { initialize_session() {
if [ ! -z "$1" ]; then if [ -n "$1" ]; then
session="$1" session="$1"
fi fi
@@ -121,14 +171,14 @@ initialize_session() {
tmux start-server tmux start-server
# Check if the named session already exists. # Check if the named session already exists.
if ! tmux has-session -t "$session" 2>/dev/null; then if ! tmux has-session -t "$session:" 2>/dev/null; then
# Create the new session. # Create the new session.
env TMUX= tmux new-session -d -s "$session" env TMUX="" tmux new-session -d -s "$session"
# Set default-path for session # Set default-path for session
if [ ! -z "$session_root" ] && [ -d "$session_root" ]; then if [ -n "$session_root" ] && [ -d "$session_root" ]; then
cd "$session_root" cd "$session_root"
tmux set-option -t "$session" default-path "$session_root" 1>/dev/null tmux set-option -t "$session:" default-path "$session_root" 1>/dev/null
fi fi
# In order to ensure only specified windows are created, we move the # In order to ensure only specified windows are created, we move the
@@ -155,9 +205,42 @@ initialize_session() {
# If the session was created, we've already been switched to it. If it was not # If the session was created, we've already been switched to it. If it was not
# created, the session already exists, and we'll need to specifically switch # created, the session already exists, and we'll need to specifically switch
# to it here. # to it here.
#
finalize_and_go_to_session() { finalize_and_go_to_session() {
tmux kill-window -t "$session:99" 2>/dev/null || true ! tmux kill-window -t "$session:99" 2>/dev/null
if [[ "$(tmuxifier-current-session)" != "$session" ]]; then if [[ "$(tmuxifier-current-session)" != "$session" ]]; then
__go_to_session __go_to_session
fi fi
} }
#
# Internal functions
#
# Expands given path.
#
# Example:
#
# $ __expand_path "~/Projects"
# /Users/jimeh/Projects
#
__expand_path() {
echo $(eval echo "$@")
}
__go_to_session() {
if [ -z "$TMUX" ]; then
tmux -u attach-session -t "$session:"
else
tmux -u switch-client -t "$session:"
fi
}
__go_to_window_or_session_path() {
local window_or_session_root=${window_root-$session_root}
if [ -n "$window_or_session_root" ]; then
run_cmd "cd \"$window_or_session_root\""
send_keys "C-l"
fi
}

View File

@@ -30,4 +30,6 @@ case "$1" in
"list-win" | "lsw" ) "list-win" | "lsw" )
echo "list-windows" echo "list-windows"
;; ;;
* )
exit 1
esac esac

View File

@@ -7,7 +7,7 @@ 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##sh-} echo "$command"
done done
done done
} | sort | uniq } | sort | uniq

View File

@@ -18,17 +18,9 @@ if [ -z "$command" ]; then
exit 1 exit 1
fi fi
command_path="$(command -v "tmuxifier-$command" || true)" ! command_path="$(tmuxifier-resolve-command-path "$command")"
# Attempt to resolve aliases if [ -n "$command_path" ] && has-completions "$command_path"; then
if [ -z "$command_path" ]; then
resolved="$(tmuxifier-alias "$command")"
if [ ! -z "$resolved" ]; then
command_path="$(command -v "tmuxifier-$resolved" || true)"
fi
fi
if [ ! -z "$command_path" ] && has-completions "$command_path"; then
shift shift
exec "$command_path" --complete "$@" exec "$command_path" --complete "$@"
fi fi

View File

@@ -2,12 +2,10 @@
set -e set -e
[ -n "$TMUXIFIER_DEBUG" ] && set -x [ -n "$TMUXIFIER_DEBUG" ] && set -x
if [ ! -z $TMUX ]; then if [ -n "$TMUX" ]; then
for item in $(tmux list-sessions -F "#{?session_attached,1,0}:#S"); do for item in $(tmux list-pane -F "#{session_name}");do
if [[ "$item" == "1:"* ]]; then echo $item
echo ${item/1:/} exit 0
exit 0
fi
done done
fi fi

View File

@@ -22,7 +22,7 @@ if [ ! -f "$layout_file" ]; then
echo "tmuxifier: session layout '$layout_name' does not exist." >&2 echo "tmuxifier: session layout '$layout_name' does not exist." >&2
echo "" >&2 echo "" >&2
echo "You can create it with:" >&2 echo "You can create it with:" >&2
echo " tmuxifier new-session $layout_name" >&2 echo " tmuxifier new-session '$layout_name'" >&2
exit 1 exit 1
fi fi

View File

@@ -22,7 +22,7 @@ if [ ! -f "$layout_file" ]; then
echo "tmuxifier: window layout '$layout_name' does not exist." >&2 echo "tmuxifier: window layout '$layout_name' does not exist." >&2
echo "" >&2 echo "" >&2
echo "You can create it with:" >&2 echo "You can create it with:" >&2
echo " tmuxifier new-window $layout_name" >&2 echo " tmuxifier new-window '$layout_name'" >&2
exit 1 exit 1
fi fi

View File

@@ -9,14 +9,12 @@ if [ "$1" == "--complete" ]; then
fi fi
command="$1" command="$1"
command_path="$(command -v "tmuxifier-$command" || true)"
# Attempt to resolve aliases # Ensure we have the correct command name in case an alias was given.
if [ -z "$command_path" ]; then if [ -n "$command" ]; then
resolved="$(tmuxifier-alias "$command")" ! resolved="$(tmuxifier-alias "$command")"
if [ ! -z "$resolved" ]; then if [ -n "$resolved" ]; then
command="$resolved" command="$resolved"
command_path="$(command -v "tmuxifier-$command" || true)"
fi fi
fi fi
@@ -111,14 +109,16 @@ Aliases: list-win, lsw
List all window layouts." List all window layouts."
;; ;;
* ) * )
if [ ! -z "$command_path" ]; then ! command_path="$(tmuxifier-resolve-command-path "$command")"
if [ -n "$command_path" ]; then
echo "Sorry, the '$command' command isn't documented yet." echo "Sorry, the '$command' command isn't documented yet."
echo echo
echo "You can view the command's source here:" echo "You can view the command's source here:"
echo "$command_path" echo "$command_path"
echo echo
else else
echo "tmuxifier: no such command '$command'" echo "tmuxifier: no such command '$command'" >&2
exit 1
fi fi
;; ;;
esac esac

View File

@@ -2,6 +2,14 @@
set -e set -e
[ -n "$TMUXIFIER_DEBUG" ] && set -x [ -n "$TMUXIFIER_DEBUG" ] && set -x
# Provide tmuxifier completions
if [ "$1" == "--complete" ]; then
for item in $(tmuxifier-list-sessions); do
echo "$item"
done
exit
fi
if [ -z "$1" ]; then if [ -z "$1" ]; then
echo "$(tmuxifier-help new-session)" >&2 echo "$(tmuxifier-help new-session)" >&2
exit 1 exit 1

View File

@@ -2,6 +2,14 @@
set -e set -e
[ -n "$TMUXIFIER_DEBUG" ] && set -x [ -n "$TMUXIFIER_DEBUG" ] && set -x
# Provide tmuxifier completions
if [ "$1" == "--complete" ]; then
for item in $(tmuxifier-list-windows); do
echo "$item"
done
exit
fi
if [ -z "$1" ]; then if [ -z "$1" ]; then
echo "$(tmuxifier-help new-window)" >&2 echo "$(tmuxifier-help new-window)" >&2
exit 1 exit 1

View File

@@ -0,0 +1,19 @@
#! /usr/bin/env bash
set -e
[ -n "$TMUXIFIER_DEBUG" ] && set -x
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

@@ -2,4 +2,4 @@
set -e set -e
[ -n "$TMUXIFIER_DEBUG" ] && set -x [ -n "$TMUXIFIER_DEBUG" ] && set -x
echo "0.1.0" echo "0.3.1"

View File

@@ -10,27 +10,3 @@ session_root="$HOME"
# Load layout helper functions. # Load layout helper functions.
source "$TMUXIFIER/lib/layout-helpers.sh" source "$TMUXIFIER/lib/layout-helpers.sh"
#
# Internal functions
#
# Expands given path.
#
# Example:
#
# $ __expand_path "~/Projects"
# /Users/jimeh/Projects
#
__expand_path() {
echo $(eval echo "$@")
}
__go_to_session() {
if [ -z $TMUX ]; then
tmux -u attach-session -t "$session"
else
tmux -u switch-client -t "$session"
fi
}

View File

@@ -7,7 +7,16 @@
new_window "{{WINDOW_NAME}}" new_window "{{WINDOW_NAME}}"
# Split window into panes. # Split window into panes.
#tmux split-window -t "$session:$window.0" -h -p 20 #split_v 20
#split_h 50
# Run commands.
#run_cmd "top" # runs in active pane
#run_cmd "date" 1 # runs in pane 1
# Paste text
#send_keys "top" # paste into active pane
#send_keys "date" 1 # paste into active pane
# Set active pane. # Set active pane.
#tmux select-pane -t "$session:$window.0" #select_pane 0