From c4ae2519dc8238390624af05602c364b39b5b77d Mon Sep 17 00:00:00 2001 From: eug-vs Date: Thu, 10 Dec 2020 18:32:12 +0300 Subject: feat: bind all movements to Super+hjkl --- .local/bin/tmux_sys_win_aware_navigation.sh | 115 ++++++++++++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100755 .local/bin/tmux_sys_win_aware_navigation.sh (limited to '.local/bin/tmux_sys_win_aware_navigation.sh') diff --git a/.local/bin/tmux_sys_win_aware_navigation.sh b/.local/bin/tmux_sys_win_aware_navigation.sh new file mode 100755 index 0000000..4fed4ae --- /dev/null +++ b/.local/bin/tmux_sys_win_aware_navigation.sh @@ -0,0 +1,115 @@ +#!/bin/bash + +#export PS4="\$LINENO: " # Prints out the line number being executed by debug +#set -xv # Turn on debugging + +exists_another_pane_in_direction() { + local direction=$1 + local result=1 #false + + local paneList=$( + tmux list-panes -F '#{pane_top} #{pane_left} #{?pane_active,active,} ' + ) + + local paneActive=$( + echo "$paneList" | \ + grep 'active' | \ + tr -s ' ' + ) + + local paneNoActive=$( + echo "$paneList" | \ + grep -v 'active' + ) + + local paneActiveTop="$(echo "$paneActive" | cut -d' ' -f1)" + local paneActiveLeft="$(echo "$paneActive" | cut -d' ' -f2)" + + while read -r line; do + local left="$(echo "$line" | cut -d' ' -f2 | tr -d "[:blank:]" | tr -d "\n")" + local top="$(echo "$line" | cut -d' ' -f1)" + + if [ "$top" = '' ] && [ "$left" = '' ]; then + break # There is not other window + fi + + if [ "$direction" = 'up' ] + then + + if [ "$top" -lt "$paneActiveTop" ] && [ "$left" -eq "$paneActiveLeft" ] + then + local result=0 #true + break + fi + fi + + if [ "$direction" = 'right' ] + then + + if [ "$left" -gt "$paneActiveLeft" ] + then + local result=0 #true + break + fi + fi + + if [ "$direction" = 'down' ] + then + if [ "$top" -gt "$paneActiveTop" ] && [ "$left" -eq "$paneActiveLeft" ] + then + local result=0 #true + break + fi + fi + + if [ "$direction" = 'left' ] + then + if [ "$left" -lt "$paneActiveLeft" ] + then + local result=0 #true + break + fi + fi + done <<< "$paneNoActive" + + echo "$result" +} + +dir=$1 #direction +mode=$2 #if value = "tmux-only", navigation shortcuts won't apply in system's window scope + # ....so this script won't be used and navigation will be handled by tmux only + +if [ "$dir" = "up" ] +then + tmuxArg="U" +elif [ "$dir" = "right" ] +then + tmuxArg="R" +elif [ "$dir" = "down" ] +then + tmuxArg="D" +elif [ "$dir" = "left" ] +then + tmuxArg="L" +else + echo -e "Invalid dirrection parameter supplied\nUsage: tmux_sys_win_aware_navigation up|right|down|left" + exit 1 +fi + +if [ "$mode" = "tmux-only" ] +then + tmux select-pane -$tmuxArg + exit 0 +fi + +exists=$(exists_another_pane_in_direction $dir) + + +if [ $exists = '0' ] +then + tmux select-pane -$tmuxArg +else + i3-msg -q focus $dir +fi +exit 0 +#set +xv #end of debug -- cgit v1.2.3