add tmux plugin: tmux-sidebar
A sidebar with the directory tree for the current path. Tries to make tmux more IDE like.
This commit is contained in:
204
.tmux/scripts/toggle.sh
Executable file
204
.tmux/scripts/toggle.sh
Executable file
@@ -0,0 +1,204 @@
|
||||
#!/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
|
||||
Reference in New Issue
Block a user