diff --git a/.config/tmux/textobjs.sh b/.config/tmux/textobjs.sh index 65805da..a394211 100755 --- a/.config/tmux/textobjs.sh +++ b/.config/tmux/textobjs.sh @@ -10,23 +10,6 @@ command_prompt() { tmux command-prompt -k -I "$2" -p "$1" 'display-message -p "%%"' } -copy_exec() { - num_cmds=$# - - # since POSIX shell does not include arrays I use `set` here. This keeps - # the initial arguments though (for now), since I cannot copy $@ (as an - # array) to a different variable to have a clean $@ in the first - # iteration. - for arg in "$@"; do - set -- "$@" \; send -X "$arg" - done - - # get rid of initial arguments + first semicolon - shift $((num_cmds + 1)) - - tmux "$@" -} - mode="$(get_var pane_mode)" if [ "$mode" != copy-mode ]; then >&2 printf "%s: Not in copy mode\n" "$0" @@ -36,13 +19,16 @@ fi # cancel copy-mode when not in 'visual' mode (i.e. selection is present) selection_present="$(get_var selection_present)" if [ "$selection_present" -eq 0 ]; then - copy_exec cancel + tmux send -X cancel exit 0 fi # get motion motion="$(command_prompt "(operator-pending)")" +# ignore any args +set -- + case "$motion" in w) copy_x="$(get_var copy_cursor_x)" @@ -62,12 +48,13 @@ case "$motion" in if [ "${copy_line_post#"$copy_word"}" = "$copy_line_post" ]; then # not on beginning of word - copy_exec previous-word other-end + set -- "$@" send -X previous-word \; + set -- "$@" send -X other-end \; fi if [ "${copy_line_pre%"$copy_word"}" = "$copy_line_pre" ]; then # not on end of word - copy_exec next-word-end + set -- "$@" send -X next-word-end \; fi ;; W) @@ -89,17 +76,18 @@ case "$motion" in # send "BoE" if [ "$char_pre" != " " ]; then # not on beginning of WORD - copy_exec previous-space other-end + set -- "$@" send -X previous-space \; + set -- "$@" send -X other-end \; fi if [ "$char_post" != " " ]; then # not on end of WORD - copy_exec next-space-end + set -- "$@" send -X next-space-end \; fi ;; p) # send "{j0o}k$" - copy_exec previous-paragraph + set -- "$@" send -X previous-paragraph \; scroll_pos="$(get_var scroll_position)" hist_size="$(get_var history_size)" @@ -107,10 +95,12 @@ case "$motion" in # don't move down if we're at the very first paragraph if [ "$scroll_pos" -lt "$hist_size" ] || [ "$cursor_y" -gt 0 ] then - copy_exec cursor-down + set -- "$@" send -X cursor-down \; fi - copy_exec start-of-line other-end next-paragraph + set -- "$@" send -X start-of-line \; + set -- "$@" send -X other-end \; + set -- "$@" send -X next-paragraph \; scroll_pos="$(get_var scroll_position)" cursor_y="$(get_var copy_cursor_y)" @@ -119,46 +109,48 @@ case "$motion" in # don't move up if we're at the very last paragraph if [ "$scroll_pos" -gt 0 ] || [ "$cursor_y" -lt "$pane_height" ] then - copy_exec cursor-up + set -- "$@" send -X cursor-up \; fi - copy_exec end-of-line + set -- "$@" send -X end-of-line \; ;; # TODO: All following break when the cursor sits on the start or end \") - copy_exec jump-to-backward '"' - copy_exec other-end - copy_exec jump-to-forward '"' + set -- "$@" send -X jump-to-backward '"' \; + set -- "$@" send -X other-end \; + set -- "$@" send -X jump-to-forward '"' \; ;; \') - copy_exec jump-to-backward "'" - copy_exec other-end - copy_exec jump-to-forward "'" + set -- "$@" send -X jump-to-backward "'" \; + set -- "$@" send -X other-end \; + set -- "$@" send -X jump-to-forward "'" \; ;; \`) - copy_exec jump-to-backward '`' - copy_exec other-end - copy_exec jump-to-forward '`' + set -- "$@" send -X jump-to-backward '`' \; + set -- "$@" send -X other-end \; + set -- "$@" send -X jump-to-forward '`' \; ;; '[|]') - copy_exec jump-to-backward '[' - copy_exec other-end - copy_exec jump-to-forward ']' + set -- "$@" send -X jump-to-backward '[' \; + set -- "$@" send -X other-end \; + set -- "$@" send -X jump-to-forward ']' \; ;; 'b|(|)') - copy_exec jump-to-backward '(' - copy_exec other-end - copy_exec jump-to-forward ')' + set -- "$@" send -X jump-to-backward '(' \; + set -- "$@" send -X other-end \; + set -- "$@" send -X jump-to-forward ')' \; ;; '<|>') - copy_exec jump-to-backward '<' - copy_exec other-end - copy_exec jump-to-forward '>' + set -- "$@" send -X jump-to-backward '<' \; + set -- "$@" send -X other-end \; + set -- "$@" send -X jump-to-forward '>' \; ;; 'B|{|}') # TODO: make this work over multiple lines - copy_exec jump-to-backward '{' - copy_exec other-end - copy_exec jump-to-forward '}' + set -- "$@" send -X jump-to-backward '{' \; + set -- "$@" send -X other-end \; + set -- "$@" send -X jump-to-forward '}' \; ;; esac + +[ $# -eq 0 ] || tmux "$@"