205 lines
4.8 KiB
Bash
Executable File
205 lines
4.8 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
|
|
|
source "$CURRENT_DIR/helpers.sh"
|
|
source "$CURRENT_DIR/variables.sh"
|
|
|
|
# script global vars
|
|
ARGS="$1" # example args format: "tree | less,right,20,focus"
|
|
PANE_ID="$2"
|
|
COMMAND="$(echo "$ARGS" | cut -d',' -f1)" # "tree | less"
|
|
POSITION="$(echo "$ARGS" | cut -d',' -f2)" # "right"
|
|
SIZE="$(echo "$ARGS" | cut -d',' -f3)" # "20"
|
|
FOCUS="$(echo "$ARGS" | cut -d',' -f4)" # "focus"
|
|
|
|
PANE_WIDTH="$(get_pane_info "$PANE_ID" "#{pane_width}")"
|
|
PANE_CURRENT_PATH="$(get_pane_info "$PANE_ID" "#{pane_current_path}")"
|
|
|
|
supported_tmux_version_ok() {
|
|
$CURRENT_DIR/check_tmux_version.sh "$SUPPORTED_TMUX_VERSION"
|
|
}
|
|
|
|
sidebar_registration() {
|
|
get_tmux_option "${REGISTERED_PANE_PREFIX}-${PANE_ID}" ""
|
|
}
|
|
|
|
sidebar_pane_id() {
|
|
sidebar_registration |
|
|
cut -d',' -f1
|
|
}
|
|
|
|
sidebar_pane_args() {
|
|
echo "$(sidebar_registration)" |
|
|
cut -d',' -f2-
|
|
}
|
|
|
|
register_sidebar() {
|
|
local sidebar_id="$1"
|
|
set_tmux_option "${REGISTERED_SIDEBAR_PREFIX}-${sidebar_id}" "$PANE_ID"
|
|
set_tmux_option "${REGISTERED_PANE_PREFIX}-${PANE_ID}" "${sidebar_id},${ARGS}"
|
|
}
|
|
|
|
registration_not_for_the_same_command() {
|
|
local registered_args="$(sidebar_registration | cut -d',' -f2-)"
|
|
[[ $ARGS != $registered_args ]]
|
|
}
|
|
|
|
sidebar_exists() {
|
|
local pane_id="$(sidebar_pane_id)"
|
|
tmux list-panes -F "#{pane_id}" 2>/dev/null |
|
|
\grep -q "^${pane_id}$"
|
|
}
|
|
|
|
has_sidebar() {
|
|
if [ -n "$(sidebar_registration)" ] && sidebar_exists; then
|
|
return 0
|
|
else
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
current_pane_width_not_changed() {
|
|
if [ $PANE_WIDTH -eq $1 ]; then
|
|
return 0
|
|
else
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
kill_sidebar() {
|
|
# get data before killing the sidebar
|
|
local sidebar_pane_id="$(sidebar_pane_id)"
|
|
local sidebar_args="$(sidebar_pane_args)"
|
|
local sidebar_position="$(echo "$sidebar_args" | cut -d',' -f2)" # left or defults to right
|
|
local sidebar_width="$(get_pane_info "$sidebar_pane_id" "#{pane_width}")"
|
|
|
|
$CURRENT_DIR/save_sidebar_width.sh "$PANE_CURRENT_PATH" "$sidebar_width"
|
|
|
|
# kill the sidebar
|
|
tmux kill-pane -t "$sidebar_pane_id"
|
|
|
|
# check current pane "expanded" properly
|
|
local new_current_pane_width="$(get_pane_info "$PANE_ID" "#{pane_width}")"
|
|
if current_pane_width_not_changed "$new_current_pane_width"; then
|
|
# need to expand current pane manually
|
|
local direction_flag
|
|
if [[ "$sidebar_position" =~ "left" ]]; then
|
|
direction_flag="-L"
|
|
else
|
|
direction_flag="-R"
|
|
fi
|
|
# compensate 1 column
|
|
tmux resize-pane "$direction_flag" "$((sidebar_width + 1))"
|
|
fi
|
|
PANE_WIDTH="$new_current_pane_width"
|
|
}
|
|
|
|
sidebar_left() {
|
|
[[ $POSITION =~ "left" ]]
|
|
}
|
|
|
|
no_focus() {
|
|
if [[ $FOCUS =~ (^focus) ]]; then
|
|
return 1
|
|
else
|
|
return 0
|
|
fi
|
|
}
|
|
|
|
size_defined() {
|
|
[ -n $SIZE ]
|
|
}
|
|
|
|
desired_sidebar_size() {
|
|
local half_pane="$((PANE_WIDTH / 2))"
|
|
if directory_in_sidebar_file "$PANE_CURRENT_PATH"; then
|
|
# use stored sidebar width for the directory
|
|
echo "$(width_from_sidebar_file "$PANE_CURRENT_PATH")"
|
|
elif size_defined && [ $SIZE -lt $half_pane ]; then
|
|
echo "$SIZE"
|
|
else
|
|
echo "$half_pane"
|
|
fi
|
|
}
|
|
|
|
# tmux version 2.0 and below requires different argument for `join-pane`
|
|
use_inverted_size() {
|
|
[ tmux_version_int -le 20 ]
|
|
}
|
|
|
|
split_sidebar_left() {
|
|
local sidebar_size=$(desired_sidebar_size)
|
|
if use_inverted_size; then
|
|
sidebar_size=$((PANE_WIDTH - $sidebar_size - 1))
|
|
fi
|
|
local sidebar_id="$(tmux new-window -c "$PANE_CURRENT_PATH" -P -F "#{pane_id}" "$COMMAND")"
|
|
tmux join-pane -hb -l "$sidebar_size" -t "$PANE_ID" -s "$sidebar_id"
|
|
echo "$sidebar_id"
|
|
}
|
|
|
|
split_sidebar_right() {
|
|
local sidebar_size=$(desired_sidebar_size)
|
|
tmux split-window -h -l "$sidebar_size" -c "$PANE_CURRENT_PATH" -P -F "#{pane_id}" "$COMMAND"
|
|
}
|
|
|
|
create_sidebar() {
|
|
local position="$1" # left / right
|
|
local sidebar_id="$(split_sidebar_${position})"
|
|
register_sidebar "$sidebar_id"
|
|
if no_focus; then
|
|
tmux last-pane
|
|
fi
|
|
}
|
|
|
|
current_pane_is_sidebar() {
|
|
local var="$(get_tmux_option "${REGISTERED_SIDEBAR_PREFIX}-${PANE_ID}" "")"
|
|
[ -n "$var" ]
|
|
}
|
|
|
|
current_pane_too_narrow() {
|
|
[ $PANE_WIDTH -lt $MINIMUM_WIDTH_FOR_SIDEBAR ]
|
|
}
|
|
|
|
execute_command_from_main_pane() {
|
|
# get pane_id for this sidebar
|
|
local main_pane_id="$(get_tmux_option "${REGISTERED_SIDEBAR_PREFIX}-${PANE_ID}" "")"
|
|
# execute the same command as if from the "main" pane
|
|
$CURRENT_DIR/toggle.sh "$ARGS" "$main_pane_id"
|
|
}
|
|
|
|
exit_if_pane_too_narrow() {
|
|
if current_pane_too_narrow; then
|
|
display_message "Pane too narrow for the sidebar"
|
|
exit
|
|
fi
|
|
}
|
|
|
|
toggle_sidebar() {
|
|
if has_sidebar; then
|
|
kill_sidebar
|
|
# if using different sidebar command automatically open a new sidebar
|
|
# if registration_not_for_the_same_command; then
|
|
# create_sidebar
|
|
# fi
|
|
else
|
|
exit_if_pane_too_narrow
|
|
if sidebar_left; then
|
|
create_sidebar "left"
|
|
else
|
|
create_sidebar "right"
|
|
fi
|
|
fi
|
|
}
|
|
|
|
main() {
|
|
if supported_tmux_version_ok; then
|
|
if current_pane_is_sidebar; then
|
|
execute_command_from_main_pane
|
|
else
|
|
toggle_sidebar
|
|
fi
|
|
fi
|
|
}
|
|
main
|