[net.info-terms] autowrapping terminals

geoff@desint.UUCP (Geoff Kuenning) (10/20/84)

Let me see if I can summarize the various flavors of terminal autowrapping I
have seen or seen described (terminology is my own;  I invite more reasonable
suggestions):

    (1)	NO WRAP WHATSOEVER.  When the cursor reaches column 80, it stays
	there, no matter what.  Subsequent characters overwrite column 80.
	CR/LF produce the same behavior they would on a terminal of infinite
	width, given the same character stream.
    (2) "LAZY" AUTOWRAP.  When a character is written in column 80, the
	cursor immediately wraps to the following line.  CR/LF produce the
	same behavior you would get on a terminal of infinite width if the
	cursor were in the same column at the moment of receiving CR/LF.
	The disadvantage of this approach is that you cannot write line 24,
	column 80 (okay, 66/80 for you lucky ones with *usable* terminals)
	without scrolling the 	screen.
    (3) "SINGLE-SPACED" AUTOWRAP.  When a character is written in column 80,
	the cursor remains there, but an internal flag is set.  If the next
	character received is a printing character, the cursor is wrapped
	BEFORE the character is written to the screen (on column 1 of the
	following line).  This has two advantages:  you can write 24/80
	without scrolling the screen, and 80-character lines do not show up
	double-spaced.  Of course, from an editor's point of view this
	behavior can be thought of as eating the newline that follows an
	80-character line;  hence "eat_newline_glitch".  (But see #4).
	There has also been discussion on the net of various ways a
	terminal can respond to leftwards-motion commands when the cursor
	is in column 80 with the flag set.  This can either work exactly
	like there really was a column 81 ("virtual column 81"
	implementation) or in can work like the cursor was in column 80
	with the flag clear ("no column 81" implementation).  In any case,
	it appears that there is no way to set the internal flag without
	actually writing a character in column 80, and it is cleared as
	soon as you leave (physical) column 80 by any horizontal motion.
	My terminal (not a vt100) does *not* clear the flag if you give it
	vertical motion commands, including "<esc>[12;80H";  on other
	terminals the flag may be cleared in this case.  
    (4)	"BRAINDAMAGED SINGLE-SPACED" AUTOWRAP.  Operates like #2, "lazy"
	autowrap, except that an internal flag is set that causes an
	immediately following newline to be ignored.  I have never
	personally encountered a terminal that does this, but I infer
	from termcap(5) [or wherever your version of Unix puts it] that
	this is the behavior that is referred to by the "xn" capability.
	This differs from #3 above in that you cannot write 24/80 without
	scrolling the screen.

Note that there are a lot of variations here, especially when you consider the
sub-variations of #3.  Technically, since :am: and :xn: are both Boolean,
we could encode four states, but we would be stretching the meaning of the
capabilities by a lot, and we still wouldn't be able to handle the
sub-variations in #3.

My suggestion is to give up on this theory that a full-feature termcap
program (with vi as the obvious example) should be able to make *full* use
of *every* terminal in the most optimal fashion possible.  It's really neat
that vi will run at 300 baud without sending any excess characters across

naiman@pegasus.UUCP (Ephrayim J. Naiman) (10/23/84)

> Finally, if :am: is set but :xn: is *not* set, you should
> assume that you cannot safely write line 24, column 80.  (Although, on a
> terminal with reverse scrolling, you can actually get a character into that
> position by writing the line on line 23, reverse-scrolling it into line 24,
> and then painting or correcting the rest of the screen as appropriate.  Yuck.)

Another way, would be to put the character to be written into the 80th
column of the 24th line into the 79th column and using insert_char_mode, if the
terminal has it, to move it into the 80th column.  I think will be
implemented in some later version of curses.
-- 
==> Ephrayim J. Naiman @ AT&T Information Systems Laboratories (201) 576-6259
Paths: [ihnp4, allegra, hogpc, maxvax, cbosgd, lzmi, ...]!pegasus!naiman

mark@cbosgd.UUCP (Mark Horton) (10/23/84)

What an amazing amount of information and misinformation!

Here's the real story.  From termcap and terminfo's point of view,
there are three ways that terminals wrap.

(1) Auto-margins.  When you pass column 80 (or cols, actually) the
cursor goes back to the beginning of the next line.  This scrolls
the terminal if you're on the bottom line.  This terminal has am.

(2) No auto-margins.  The cursor hammers on the right margin no matter
how much you output.  This terminal has neither am nor xenl.  This
includes the VT100 with the auto-newline flag clear (e.g. vt100-nam).

(3) Eat-newline-glitch.  This includes the Concept 100, Concept 108,
and the VT100 when the auto-newline flag is set (vt100-am.)  On this
terminal, when you output something in column 80, it goes into a funny
state, and if you output a CRLF immediately it eats the CRLF and otherwise
acts like (1).  If you do anything else while in this state, the
action is undefined.  (In particular, the Concepts put the cursor on
the next line while in this state, the VT100 leaves it on the previous
line.)  Such terminals have am and xenl (that's am and xn on termcap.)

As far as I know, the SVR2 manual page is correct.

The Concepts also have in, but that's a different glitch.

Strictly speaking, this isn't quite true - the VT100 does not clear the
funny state until you actually send it a printing character, so if you
do certain things (e.g. go to col 80 of the NEXT line and output a char)
you get weird behavior.  I don't know how to get around this problem.

Some VT100 clones have xenl, some don't.  As far as I know, the Datamedia
version is a perfect clone except that it is said to need less padding.

As to people who want a 99% solution with 10% of the code, I wish you
the best of luck.  Curses one problem is that the code is rather large,
around 30K.  I don't recommend running my version on a 16 bit machine.
However, the great majority of applications run on 32 bit machines these
days and 30K is no big deal.  For those of you running on, say, an IBM PC,
there is nothing to prevent a special purpose back end from being written
that has the same function call interface as curses but only works on
the PC screen - it could be very small and simple.

Doug Gwyn points out that if you have a VT100 with the auto-newline
flag set, and use TERM=vt100-nam, things work.  I have not tried
this but it seems like it should work.

	Mark Horton

henry@utzoo.UUCP (Henry Spencer) (10/26/84)

> As to people who want a 99% solution with 10% of the code, I wish you
> the best of luck.  ...

Actually, a 99% solution with virtually no code is to set up your
screen-oriented programs so they simply *don't* *use* the last
column of the screen.  Sure, it's a waste, but in practice it seldom
bothers people.  The U of T paginator program, "p", wrapped lines one
character short for just this reason, and it was years before anybody
noticed.
-- 
				Henry Spencer @ U of Toronto Zoology
				{allegra,ihnp4,linus,decvax}!utzoo!henry

rh@mit-eddie.UUCP (Randy Haskins) (11/01/84)

>    > As to people who want a 99% solution with 10% of the code, I
>    > wish you the best of luck.  ...
>
>    Actually, a 99% solution with virtually no code is to set up
>    your screen-oriented programs so they simply *don't* *use* the
>    last column of the screen.  Sure, it's a waste, but in practice
>    it seldom bothers people.  The U of T paginator program, "p",
>    wrapped lines one character short for just this reason, and it
>    was years before anybody noticed.
>

Yeah, that's what I've done in a file-viewing program I'm writing
for a DEC-20.  I've since become more sensitive to the problems of
dealing with files that have lines wider than the screen.  Don't
forget that you can't just spit out W-1 characters, because some
of those characters may be Tabs.  Also, you have to keep track of
when you do lines that take up more than one line on the screen so
that you don't try to put too many on the screen.  And I just wanted
a little program to look at files bigger than those Emacs could deal
with....
-- 
Randwulf  (Randy Haskins);  Path= genrad!mit-eddie!rh