io --plain runs the session without animation: nothing turns, nothing moves,
the ASCII glyph set is forced, and each state the session enters — working,
ready — is committed into the terminal's own scrollback as a line of text. In
the default interface that one state is carried by a word that only ever repaints
and an indicator that only ever moves, which makes it the single thing a reader
who cannot see the viewport cannot follow; everything else a run does already
writes a line. For a screen reader, a braille display, a serial console and a
captured log.
The flag is global, so io --plain, io --plain exec "…" and io exec --plain "…" are all accepted. [app.io-cli] plain = true is the same switch for every
session. The flag wins over the file, and there is deliberately no --no-plain:
accessibility is something switched on on purpose, and a mode that can be lost to
a stray flag is not one to rely on. It reaches an interactive session and stops
there — io exec constructs no theme, draws nothing and animates nothing already.
Four properties this product keeps, whether or not that flag is set:
- Colour is never the only thing carrying a meaning. Every refusal, error and
warning also carries a word, a diff's additions and removals are marked as well
as coloured, and an approval says what is being asked for in words before it
says it in colour.
NO_COLORis honoured on presence, whatever its value, and now survives the first-run wizard and/theme: choosing a theme with the variable set records the preference and leaves the session uncoloured, and says so. - Every mark has an ASCII form. The separator, the tool bullet, the selection
marker, the ellipsis, the elision, the dash, the transcript rule, the quotes,
the credential mask and the working indicator each exist in two sets, and each
ASCII form carries its counterpart's meaning rather than merely standing in
the same column.
[app.io-cli] glyphsnames a set —unicodeorascii— and an absent key asks the locale:LC_ALL, thenLC_CTYPE, thenLANG, the first one present deciding. The set is an axis of its own, in both directions:NO_COLORkeeps the Unicode marks, and the ASCII set arrives at a fully coloured theme. The IO CLI wordmark is the one exception, and it is suppressed rather than transliterated — a wordmark redrawn in#is a different and worse image wearing its name. - The cursor sits where input is expected, on every frame that accepts any: the composer, including at a width too narrow to draw it; the approval overlay; the selected row of a picker; and every step of the wizard. It is the focus indicator a screen reader follows, and a frame that leaves it hidden reports no focus at all.
- A frame whose content did not change is not drawn. An idle session writes no bytes to the terminal, so nothing announces itself twice for having merely repainted.