From ec417a439c73ce6b16ce81462b46718f174698ac Mon Sep 17 00:00:00 2001 From: Julian Prein Date: Wed, 4 Sep 2024 16:29:24 +0200 Subject: [PATCH] tmux:textobjs: Merge all copy-mode commands `copy_exec` was stupid since it brought unnecessary shell overhead even though it was meant to improve performance (one could argue that it is not even necessary here). Continue the idea of reducing calls to `tmux` by "globally" chaining together all copy-mode commands instead of doing it only "locally" with `copy_exec`. This has the added benefit that also calls having arguments can be included and merged. --- .config/tmux/textobjs.sh | 88 ++++++++++++++++++---------------------- 1 file changed, 40 insertions(+), 48 deletions(-) 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 "$@"