runtime(syntax-tests): Apply stronger synchronisation between buffers

The current lightweight synchronisation with ":redraw" needs further
reinforcement in the light of v9.1.1110.  And, with v9.1.0820, make
another synchronisation point _before_ the first (or only) screenful is
dumped.

Also add a script to regenerate all screendumps.

closes: #16632

Signed-off-by: Aliaksei Budavei <0x000c70@gmail.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
diff --git a/runtime/syntax/testdir/tools/regenerate_screendumps.sh b/runtime/syntax/testdir/tools/regenerate_screendumps.sh
new file mode 100755
index 0000000..f85252a
--- /dev/null
+++ b/runtime/syntax/testdir/tools/regenerate_screendumps.sh
@@ -0,0 +1,126 @@
+#!/bin/sh -e
+#
+# The following steps are to be taken by this script:
+# 1) Remove all files from the "dumps" directory.
+# 2) Generate screendumps for each syntax test and each self-test.
+# 3) Unconditionally move each batch of screendumps to "dumps"; if generated
+#	files differ on repeated runs, always remove these files from "dumps".
+# 4) Repeat steps 2) and 3) once or as many times as requested with the "$1"
+#	argument.
+# 5) Summarise any differences.
+#
+# Provided that "git difftool" is set up (see src/testdir/commondumps.vim),
+# run "git difftool HEAD -- '**/*.dump'" to collate tracked and generated
+# screendumps.
+
+case "$1" in
+-h | --help)
+	printf >&2 "Usage: [time VIM_SYNTAX_TEST_LOG=/tmp/log] $0 [1 | 2 | ...]\n"
+	exit 0
+	;;
+esac
+
+tries="${1:-1}"
+shift $#
+
+case "$tries" in
+0* | *[!0-9]*)
+	exit 80
+	;;
+esac
+
+test -x "$(command -v make)"	|| exit 81
+test -x "$(command -v git)"	|| exit 82
+
+case "$(git status --porcelain=v1)" in
+'')	;;
+*)	printf >&2 'Resolve ALL changes before proceeding.\n'
+	exit 83
+	;;
+esac
+
+templet=$(printf "\t\t\t\t$(tput rev)%%s$(tput sgr0)") || exit 84
+cd "$(dirname "$0")/../../../syntax" || exit 85
+set +f
+rm testdir/dumps/*.dump || exit 86
+spuriosities=''
+
+# Because the clean target of Make will be executed before each syntax test,
+# this environment variable needs to be pointed to an existing file that is
+# created in a directory not affectable by the target.
+if test -w "$VIM_SYNTAX_TEST_LOG"
+then
+	log=-e VIM_SYNTAX_TEST_LOG="$VIM_SYNTAX_TEST_LOG"
+else
+	log=
+fi
+
+for f in testdir/input/*.*
+do
+	test ! -d "$f" || continue
+	b=$(basename "$f")
+	i=0
+	printf "$templet\n\n" "$b"
+
+	while test "$i" -le "$tries"
+	do
+		make $log clean "$b" test || :
+
+		case "$i" in
+		0)	mv testdir/failed/*.dump testdir/dumps/
+			;;
+		*)	case "$(printf '%s' testdir/failed/*.dump)" in
+			testdir/failed/\*.dump)
+				# (Repeatable) success.
+				;;
+			*)	spuriosities="${spuriosities}${b} "
+				p=${b%.*}
+				rm -f testdir/dumps/"$p"_[0-9][0-9].dump \
+					testdir/dumps/"$p"_[0-9][0-9][0-9].dump \
+					testdir/dumps/"$p"_[0-9][0-9][0-9][0-9].dump
+				;;
+			esac
+			;;
+		esac
+
+		i=$(($i + 1))
+		sleep 1
+	done
+done
+
+# For a 20-file set, initially fail for a series of: 1-6, 7-12, 13-18, 19-20.
+tries=$(($tries + 3))
+i=0
+
+while test "$i" -le "$tries"
+do
+	make $log clean self-testing test || :
+
+	case "$i" in
+	[0-3])	mv testdir/failed/dots_*.dump testdir/dumps/
+		;;
+	*)	case "$(printf '%s' testdir/failed/*.dump)" in
+		testdir/failed/\*.dump)
+			# (Repeatable) success.
+			;;
+		*)	spuriosities="${spuriosities}dots_xy "
+			rm -f testdir/dumps/dots_*.dump
+			;;
+		esac
+		;;
+	esac
+
+	sleep 1
+	i=$(($i + 1))
+done
+
+make clean
+git diff --compact-summary
+
+if test -n "$spuriosities"
+then
+	printf '\n%s\n' "$spuriosities"
+	exit 87
+fi
+
+# vim:sw=8:ts=8:noet:nosta: