Some of the UI tests screen:expect() the same screen state twice in a
row. This ends up waiting the entire timeout period for a screen redraw
event that never happens. So check at the start of screen:wait() that
the screen is not already in the desired end state.
This shaves a third off the total run-time of the functional tests on
FreeBSD. Some of the tests that look for the same state twice are
mouse_spec tests, which have their timeouts raised to a quarter of a
minute for each screen:expect() in the test.
This fixes a test failure caused by dfaecb25f6a9a94f29a38d9f2d24a579b3dff5f
not tracking what the current visibility is and whether it matches the
current business state.
When higher layers flush the TUI layer output buffer, but there is
nothing in the buffer to flush, no longer does the TUI layer write out
unnecessary cnorm/civis sequences surrounding that nothing.
This is a new convention pioneered by tmux. It does not do much for
nvim; since nvim always looks to see whether it should be making up
"setrgbf" and "setrgbb" capabilities. But it is a way for terminfo to
force this, irrespective of the hardwired list in the code, for more
terminal types. On the gripping hand, updating terminfo descriptions to
actually have "setrgbf" and "setrgbb" capabilities so that nvim never
has to try to invent them in the first place, is as good if not better
an approach for overriding what is baked into the code.
From observation, there are several different possible behaviours:
1. Deferred wrap like a real DEC VT. The cursor stays visible in the last
column, and CUB is calculated relative to that column.
Examples: xterm, Unicode rxvt, PuTTY, nosh console-terminal-emulator,
FreeBSD kernel's built-in emulator, Linux's built-in emulator
2. Deferred wrap like a real DEC VT. CUB is calculated relative to the last
column. But the cursor is invisible.
Examples: emulators using newer libvte
3. Non-deferred wrap. The cursor has already wrapped to the next line and CUB
does not wrap back.
Examples: cygwin, Interix
4. Non-deferred wrap that acts like deferred wrap. The cursor has already
visibly wrapped to the next line, but CUB can wrap back around the left
margin.
Examples: Konsole
5. Deferred wrap with visibly out of bounds cursor. The cursor visibly moves
outwith the screen boundaries. CUB is calculated relative to a cursor
column that has overflowed the end of the screen grid array.
Examples: iTerm2
6. Deferred wrap with invisibly out of bounds cursor. CUB is calculated
relative to a cursor column that has overflowed the end of the screen grid
array. And the cursor is invisible.
Examples: emulators using older libvte
In many cases, nvim does not have enough information to know which behaviour
the terminal will exhibit, and thus the correct amount of CUB to issue.
Partly undo 8ab08a65ba3bc9a44741a2ec9aa81fbcc77467fb. Further testing
by Enrico Ghirardi suggests limiting the non-deferred automatic wrap to
only the bottom line, whose rightmost column is not printed for iTerm.
They are now in their own nvim/tui/terminfo.c file.
Also turn the TERMINAL_FAMILY macro into a function. Use the terminfo_
prefix for its name as other parts of the program are unlikely to want
that namespace, and the prefix is already used for some other TUI
functions.
Testing by Enrico Ghirardi and review of the source indicates that
iTerm2 is a second terminal emulator that does not defer automatic wrap
at the right margin.
The example used &term which is no longer meaningful.
Fortunately, we can change this into a useful example using $TERM that also
shows how to address a common need with termguicolors at the same time.
PM...ST actually sends the string to screen's message area. Sending the
string to the status line requires a different control sequence peculiar to
screen.
Also make iTerm2 SGR 38/48 consistent.
The Interix termcap entry is missing the carriage_return capability which nvim
relies upon. And Interix is one of the few terminal emulators that does not
defer automatic wrap at the right margin, which is now accounted for when
moving the cursor left and when outputting whole lines at a time.
tmux has its own code path, now; and the tmux wrapping was not the ideal thing
to do in the first place.
Also improve the commentary on the built-in terminfo records.
The details are in the on-line help under :help true-color .
The brief precis is that nvim is (I hope.) converging with tmux and libvte.
It is taking the same approach with setrgbf and setrgbb terminfo capabilities
that it does with the Ss and Se terminfo capabilities.