112 lines
3.1 KiB
Bash
112 lines
3.1 KiB
Bash
#!/usr/bin/env bash
|
|
|
|
CURRENT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
HELPERS_DIR="$CURRENT_DIR"
|
|
TMUX_COPY_MODE=""
|
|
|
|
REMOTE_SHELL_WAIT_TIME="0.4"
|
|
|
|
# shellcheck source=scripts/helpers.sh
|
|
source "${HELPERS_DIR}/helpers.sh"
|
|
|
|
# sets a TMUX_COPY_MODE that is used as a global variable
|
|
get_tmux_copy_mode() {
|
|
TMUX_COPY_MODE="$(tmux show-option -gwv mode-keys)"
|
|
}
|
|
|
|
# The command when on ssh with latency. To make it work in this case too,
|
|
# sleep is added.
|
|
add_sleep_for_remote_shells() {
|
|
local pane_command
|
|
pane_command="$(tmux display-message -p '#{pane_current_command}')"
|
|
if [[ $pane_command =~ (ssh|mosh) ]]; then
|
|
sleep "$REMOTE_SHELL_WAIT_TIME"
|
|
fi
|
|
}
|
|
|
|
go_to_the_beginning_of_current_line() {
|
|
if [ "$(shell_mode)" == "emacs" ]; then
|
|
tmux send-key 'C-a'
|
|
else
|
|
tmux send-key 'Escape' '0'
|
|
fi
|
|
}
|
|
|
|
enter_tmux_copy_mode() {
|
|
tmux copy-mode
|
|
}
|
|
|
|
start_tmux_selection() {
|
|
if tmux_is_at_least 2.4; then
|
|
tmux send -X begin-selection
|
|
elif [ "$TMUX_COPY_MODE" == "vi" ]; then
|
|
# vi copy mode
|
|
tmux send-key 'Space'
|
|
else
|
|
# emacs copy mode
|
|
tmux send-key 'C-Space'
|
|
fi
|
|
}
|
|
|
|
# works when command spans accross multiple lines
|
|
end_of_line_in_copy_mode() {
|
|
if tmux_is_at_least 2.4; then
|
|
tmux send -X -N 150 'cursor-down' # 'down' key. 'vi' mode is faster so we're
|
|
# jumping more lines than emacs.
|
|
tmux send -X 'end-of-line' # End of line (just in case we are already at the last line).
|
|
tmux send -X 'previous-word' # Beginning of the previous word.
|
|
tmux send -X 'next-word-end' # End of next word.
|
|
elif [ "$TMUX_COPY_MODE" == "vi" ]; then
|
|
# vi copy mode
|
|
# This sequence of keys consistently selects multiple lines
|
|
tmux send-key '150' # Go to the bottom of scrollback buffer by using
|
|
tmux send-key 'j' # 'down' key. 'vi' mode is faster so we're
|
|
# jumping more lines than emacs.
|
|
tmux send-key '$' # End of line (just in case we are already at the last line).
|
|
tmux send-key 'b' # Beginning of the previous word.
|
|
tmux send-key 'e' # End of next word.
|
|
else
|
|
# emacs copy mode
|
|
for ((c = 1; c <= '30'; c++)); do # go to the bottom of scrollback buffer
|
|
tmux send-key 'C-n'
|
|
done
|
|
tmux send-key 'C-e'
|
|
tmux send-key 'M-b'
|
|
tmux send-key 'M-f'
|
|
fi
|
|
}
|
|
|
|
yank_to_clipboard() {
|
|
if tmux_is_at_least 2.4; then
|
|
# shellcheck disable=SC2119
|
|
tmux send -X copy-pipe-and-cancel "$(clipboard_copy_command)"
|
|
else
|
|
tmux send-key "$(yank_wo_newline_key)"
|
|
fi
|
|
}
|
|
|
|
go_to_the_end_of_current_line() {
|
|
if [ "$(shell_mode)" == "emacs" ]; then
|
|
tmux send-keys 'C-e'
|
|
else
|
|
tmux send-keys '$' 'a'
|
|
fi
|
|
}
|
|
|
|
yank_current_line() {
|
|
go_to_the_beginning_of_current_line
|
|
add_sleep_for_remote_shells
|
|
enter_tmux_copy_mode
|
|
start_tmux_selection
|
|
end_of_line_in_copy_mode
|
|
yank_to_clipboard
|
|
go_to_the_end_of_current_line
|
|
display_message 'Line copied to clipboard!'
|
|
}
|
|
|
|
main() {
|
|
get_tmux_copy_mode
|
|
yank_current_line
|
|
}
|
|
main
|