2016-05-02 21:15:29 +02:00
|
|
|
#!/usr/bin/env bash
|
2016-04-26 21:44:18 +02:00
|
|
|
|
2016-04-30 01:26:43 +02:00
|
|
|
CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
2016-05-08 17:06:02 +02:00
|
|
|
|
2016-04-30 01:26:43 +02:00
|
|
|
source $CURRENT_DIR/config.sh
|
|
|
|
source $CURRENT_DIR/actions.sh
|
2016-04-30 02:42:56 +02:00
|
|
|
source $CURRENT_DIR/hints.sh
|
2016-07-31 19:02:21 +02:00
|
|
|
source $CURRENT_DIR/utils.sh
|
2016-10-10 23:49:34 +02:00
|
|
|
source $CURRENT_DIR/debug.sh
|
2016-04-30 00:35:52 +02:00
|
|
|
|
2016-05-12 09:11:58 +02:00
|
|
|
FINGERS_COPY_COMMAND=$(tmux show-option -gqv @fingers-copy-command)
|
|
|
|
|
2016-04-26 21:44:18 +02:00
|
|
|
current_pane_id=$1
|
|
|
|
fingers_pane_id=$2
|
2016-04-30 01:03:45 +02:00
|
|
|
tmp_path=$3
|
2016-04-24 01:36:09 +02:00
|
|
|
|
2016-04-30 01:36:21 +02:00
|
|
|
BACKSPACE=$'\177'
|
2016-04-24 01:36:09 +02:00
|
|
|
|
2016-07-16 10:40:49 +02:00
|
|
|
function is_pane_zoomed() {
|
|
|
|
local pane_id=$1
|
|
|
|
|
|
|
|
tmux list-panes \
|
|
|
|
-F "#{pane_id}:#{?pane_active,active,nope}:#{?window_zoomed_flag,zoomed,nope}" \
|
|
|
|
| grep -c "^${pane_id}:active:zoomed$"
|
|
|
|
}
|
|
|
|
|
|
|
|
function zoom_pane() {
|
|
|
|
local pane_id=$1
|
|
|
|
|
|
|
|
tmux resize-pane -Z -t "$pane_id"
|
2016-04-24 01:36:09 +02:00
|
|
|
}
|
|
|
|
|
2016-04-26 21:44:18 +02:00
|
|
|
function handle_exit() {
|
2016-05-02 21:15:29 +02:00
|
|
|
tmux swap-pane -s "$current_pane_id" -t "$fingers_pane_id"
|
2016-07-16 10:40:49 +02:00
|
|
|
[[ $pane_was_zoomed == "1" ]] && zoom_pane "$current_pane_id"
|
2016-05-02 21:15:29 +02:00
|
|
|
tmux kill-pane -t "$fingers_pane_id"
|
2016-07-16 10:40:49 +02:00
|
|
|
rm -rf "$tmp_path"
|
2016-04-26 21:44:18 +02:00
|
|
|
}
|
|
|
|
|
2016-04-30 02:42:56 +02:00
|
|
|
function copy_result() {
|
|
|
|
local result=$1
|
2016-05-12 09:11:58 +02:00
|
|
|
|
2016-05-24 22:57:31 +02:00
|
|
|
clear
|
|
|
|
echo -n "$result"
|
|
|
|
start_copy_mode
|
|
|
|
top_of_buffer
|
|
|
|
start_of_line
|
|
|
|
start_selection
|
|
|
|
end_of_line
|
|
|
|
cursor_left
|
|
|
|
copy_selection
|
|
|
|
|
|
|
|
if [ ! -z "$FINGERS_COPY_COMMAND" ]; then
|
|
|
|
echo -n "$result" | eval "nohup $FINGERS_COPY_COMMAND" > /dev/null
|
2016-05-12 09:11:58 +02:00
|
|
|
fi
|
2016-04-30 02:42:56 +02:00
|
|
|
}
|
|
|
|
|
2016-07-31 19:02:21 +02:00
|
|
|
function is_valid_input() {
|
|
|
|
local input=$1
|
|
|
|
local is_valid=1
|
|
|
|
|
|
|
|
for (( i=0; i<${#input}; i++ )); do
|
|
|
|
char=${input:$i:1}
|
|
|
|
|
|
|
|
if [[ ! $(is_alpha $char) == "1" ]]; then
|
|
|
|
is_valid=0
|
|
|
|
break
|
|
|
|
fi
|
|
|
|
done
|
|
|
|
|
|
|
|
echo $is_valid
|
|
|
|
}
|
|
|
|
|
2016-05-08 17:06:02 +02:00
|
|
|
function hide_cursor() {
|
|
|
|
echo -n $(tput civis)
|
|
|
|
}
|
|
|
|
|
2016-04-26 21:44:18 +02:00
|
|
|
trap "handle_exit" EXIT
|
|
|
|
|
2016-10-17 22:28:24 +02:00
|
|
|
compact_state=$FINGERS_COMPACT_HINTS
|
|
|
|
|
2016-05-08 17:06:02 +02:00
|
|
|
pane_was_zoomed=$(is_pane_zoomed "$current_pane_id")
|
2016-10-17 22:28:24 +02:00
|
|
|
show_hints_and_swap $current_pane_id $fingers_pane_id $compact_state
|
2016-05-08 17:06:02 +02:00
|
|
|
[[ $pane_was_zoomed == "1" ]] && zoom_pane "$fingers_pane_id"
|
2016-07-31 19:02:21 +02:00
|
|
|
|
2016-05-08 17:06:02 +02:00
|
|
|
hide_cursor
|
|
|
|
input=''
|
2016-10-10 23:49:34 +02:00
|
|
|
|
2016-10-17 21:44:28 +02:00
|
|
|
function toggle_compact_state() {
|
|
|
|
if [[ $compact_state == "0" ]]; then
|
|
|
|
compact_state=1
|
2016-10-10 23:49:34 +02:00
|
|
|
else
|
2016-10-17 21:44:28 +02:00
|
|
|
compact_state=0
|
2016-10-10 23:49:34 +02:00
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
2016-07-31 19:02:21 +02:00
|
|
|
while read -rsn1 char; do
|
|
|
|
# Escape sequence, flush input
|
|
|
|
if [[ "$char" == $'\x1b' ]]; then
|
|
|
|
read -rsn1 -t 0.1 next_char
|
|
|
|
|
|
|
|
if [[ "$next_char" == "[" ]]; then
|
|
|
|
read -rsn1 -t 0.1
|
|
|
|
fi
|
|
|
|
|
|
|
|
continue
|
|
|
|
fi
|
|
|
|
|
|
|
|
if [[ ! $(is_valid_input "$char") == "1" ]]; then
|
|
|
|
continue
|
|
|
|
fi
|
|
|
|
|
2016-04-30 02:42:56 +02:00
|
|
|
if [[ $char == "$BACKSPACE" ]]; then
|
2016-04-30 01:36:21 +02:00
|
|
|
input=""
|
2016-07-31 19:02:21 +02:00
|
|
|
continue
|
2016-10-10 23:49:34 +02:00
|
|
|
elif [[ $char == "" ]]; then
|
2016-10-17 21:44:28 +02:00
|
|
|
toggle_compact_state
|
|
|
|
show_hints "$fingers_pane_id" $compact_state
|
2016-04-30 01:36:21 +02:00
|
|
|
else
|
|
|
|
input="$input$char"
|
|
|
|
fi
|
|
|
|
|
2016-04-30 02:42:56 +02:00
|
|
|
result=$(lookup_match "$input")
|
2016-04-24 01:36:09 +02:00
|
|
|
|
2016-04-26 21:44:18 +02:00
|
|
|
tmux display-message "$input"
|
|
|
|
|
2016-04-30 02:42:56 +02:00
|
|
|
if [[ -z $result ]]; then
|
|
|
|
continue
|
|
|
|
fi
|
2016-04-26 21:44:18 +02:00
|
|
|
|
2016-05-01 19:50:57 +02:00
|
|
|
copy_result "$result"
|
2016-07-16 10:40:49 +02:00
|
|
|
revert_to_original_pane "$current_pane_id" "$fingers_pane_id"
|
2016-04-30 02:42:56 +02:00
|
|
|
|
|
|
|
exit 0
|
2016-04-26 21:44:18 +02:00
|
|
|
done < /dev/tty
|