diff --git a/regress/copy-mode-search-count.sh b/regress/copy-mode-search-count.sh new file mode 100755 index 000000000..842bf4e2e --- /dev/null +++ b/regress/copy-mode-search-count.sh @@ -0,0 +1,161 @@ +#!/bin/sh + +PATH=/bin:/usr/bin +TERM=screen + +[ -z "$TEST_TMUX" ] && TEST_TMUX=$(readlink -f ../tmux) +TMUX="$TEST_TMUX -LtestA$$ -f/dev/null" +$TMUX kill-server 2>/dev/null + +cleanup() +{ + $TMUX kill-server 2>/dev/null +} +trap cleanup 0 +trap 'exit 1' 1 2 3 15 + +$TMUX new -d -x40 -y10 \ + "printf 'zero needle\none needle\ntwo needle\n'; cat" || exit 1 +$TMUX set -g window-size manual || exit 1 + +check_count() +{ + [ "$($TMUX display-message -p \ + '#{search_count_current}/#{search_count}')" = "$1" ] || exit 1 +} + +check_unsearched() +{ + check_count / + [ -z "$($TMUX display-message -p '#{search_count_present}')" ] || + exit 1 + case "$($TMUX display-message -p \ + '#{E:copy-mode-position-format}')" in + *match*|*result*) exit 1 ;; + esac +} + +for keys in vi emacs; do + $TMUX set -g mode-keys "$keys" || exit 1 + $TMUX copy-mode || exit 1 + check_unsearched + $TMUX send-keys -X scroll-up || exit 1 + check_unsearched + $TMUX resize-window -x40 -y10 || exit 1 + check_unsearched + $TMUX send-keys -X history-top || exit 1 + $TMUX send-keys -X start-of-line || exit 1 + + $TMUX send-keys -X search-forward-text needle || exit 1 + check_count 1/3 + $TMUX send-keys -X search-again || exit 1 + check_count 2/3 + $TMUX resize-window -x30 -y8 || exit 1 + check_count 2/3 + $TMUX send-keys -X search-again || exit 1 + check_count 3/3 + $TMUX send-keys -X search-again || exit 1 + check_count 1/3 + $TMUX send-keys -X search-reverse || exit 1 + if [ "$keys" = vi ]; then + reverse_index=3 + else + reverse_index=1 + fi + check_count "$reverse_index/3" + case "$($TMUX display-message -p \ + '#{E:copy-mode-position-format}')" in + *"($reverse_index of 3 matches)") ;; + *) exit 1 ;; + esac + + $TMUX send-keys -X cancel || exit 1 + $TMUX copy-mode || exit 1 + check_unsearched + $TMUX send-keys -X history-bottom || exit 1 + $TMUX send-keys -X search-backward-text needle || exit 1 + check_count 3/3 + $TMUX send-keys -X cancel || exit 1 + + # Moving onto the second match before searching again skips to the third. + $TMUX copy-mode || exit 1 + $TMUX send-keys -X history-top || exit 1 + $TMUX send-keys -X start-of-line || exit 1 + $TMUX send-keys -X search-forward-text needle || exit 1 + $TMUX send-keys -X cursor-down || exit 1 + $TMUX send-keys -X search-again || exit 1 + check_count 3/3 + $TMUX send-keys -X cancel || exit 1 +done + +$TMUX copy-mode || exit 1 +$TMUX send-keys -X history-top || exit 1 +$TMUX send-keys -X search-forward-text absent || exit 1 +check_count /0 +case "$($TMUX display-message -p '#{E:copy-mode-position-format}')" in + *'(0 matches)') ;; + *) exit 1 ;; +esac +$TMUX send-keys -X search-forward-text one || exit 1 +check_count 1/1 +case "$($TMUX display-message -p '#{E:copy-mode-position-format}')" in + *'(1 of 1 match)') ;; + *) exit 1 ;; +esac +$TMUX send-keys -X cancel || exit 1 + +# Backward searches can find an overlapping start inside a marked match. +# The index must refer to the match after the cursor moves to its beginning. +$TMUX new-window -n adjacent "printf 'aaaa'; cat" || exit 1 +for keys in vi emacs; do + $TMUX set -g mode-keys "$keys" || exit 1 + $TMUX copy-mode || exit 1 + check_unsearched + $TMUX send-keys -X search-backward-incremental -- '=aa' || exit 1 + check_count 2/2 + $TMUX send-keys -X search-backward-incremental -- '-aa' || exit 1 + check_count 1/2 + case "$($TMUX display-message -p \ + '#{E:copy-mode-position-format}')" in + *'(1 of 2 matches)') ;; + *) exit 1 ;; + esac + $TMUX send-keys -X search-backward-incremental -- '-aa' || exit 1 + check_count 2/2 + $TMUX send-keys -X search-backward-incremental -- '-aa' || exit 1 + check_count 1/2 + $TMUX send-keys -X search-backward-incremental -- '=' || exit 1 + check_unsearched + $TMUX send-keys -X cancel || exit 1 + + $TMUX copy-mode || exit 1 + check_unsearched + $TMUX send-keys -X search-backward-text aa || exit 1 + check_count 2/2 + $TMUX send-keys -X search-again || exit 1 + check_count 1/2 + $TMUX send-keys -X search-again || exit 1 + check_count 2/2 + $TMUX send-keys -X cancel || exit 1 +done + +# Scrolling into real history must not create a search count. +$TMUX new-window -n scroll \ + 'i=0; while [ $i -lt 80 ]; do echo "line $i"; i=$((i + 1)); done; cat' || + exit 1 +$TMUX copy-mode -u || exit 1 +[ "$($TMUX display-message -p '#{scroll_position}')" -gt 0 ] || exit 1 +check_unsearched +$TMUX send-keys -X history-top || exit 1 +check_unsearched +$TMUX resize-window -x40 -y10 || exit 1 +check_unsearched +$TMUX send-keys -X cancel || exit 1 + +format=$($TMUX show -gv copy-mode-position-format) || exit 1 +case "$format" in + *'#{search_count_current} of '*'#{search_count} matches'*) ;; + *) exit 1 ;; +esac + +exit 0