on master help sign in

A high-level ncurses alternative written in Haskell

git clone ssh://git.iko.soy/vty

Build Status

vty is a terminal interface library. It provides a high-level interface for doing terminal I/O. Vty is supported on GHC versions 7.10.1 and up.

Install via git with:

git clone git://github.com/jtdaugherty/vty.git

Install via cabal with:

cabal install vty

Features

Development Notes

Vty uses threads internally, so programs made with Vty need to be compiled with the threaded runtime using the GHC -threaded option.

Platform Support

Posix Terminals

For the most part, Vty uses terminfo to determine terminal protocol with some special rules to handle some omissions from terminfo.

Windows

Windows is not supported.

Multi-Column Character Support

Vty supports rendering of multi-column characters such as two-column Asian characters and Emoji characters. This section details how to take advantage of this feature, since its behavior will depend on the terminal emulator in use.

Terminal emulators support Unicode to varying degrees, and each terminal emulator relies on a table of column widths for each supported Unicode character. Vty also needs to rely on such a table to compute the width of Vty images to do image layout. Since those tables can disagree if Vty and the terminal emulator support different versions of Unicode, and since different terminal emulators will support different versions of Unicode, it's likely that for some wide characters, Vty applications will exhibit rendering problems. Those rendering problems arise from Vty and the terminal emulator coming to different conclusions about how wide some characters are.

To address this, Vty supports loading custom character width tables that are based on the terminal's behavior in order to eliminate these disagreements. By default, though, Vty will use its built-in Unicode character width table. Since the built-in table is likely to eventually disagree with your terminal, Vty provides an API and a command-line tool to generate and install custom tables.

Custom Unicode width tables based on your terminal emulator can be built by running Vty's built-in tool, vty-build-width-table. The tool works by querying the current terminal emulator to obtain its width measurements for the entire supported Unicode range. The results are then saved to a disk file. These custom tables can also be generated programmatically by using the API in Graphics.Vty.UnicodeWidthTable.Query.

Saved width tables can then be loaded in one of two ways:

The Vty configuration file supports the widthMap directive to allow users to specify which custom width table should be loaded for a given terminal type. This is done by specifying, e.g.,

widthMap "xterm" "/path/to/map.dat"

where the first argument is the value that TERM must have in order for the table to be loaded, and the second argument is the path to the table file itself as generated by the two alternatives listed above. If the Vty configuration file contains multiple matching widthMap directives for the current value of TERM, the last one listed in the file is used.

The tables declared in the configuration file are only ever automatically loaded when applications set up Vty by calling Graphics.Vty.mkVty.

Before a custom table has been loaded, calls to the library's character width functions (e.g. wcwidth) will use the default built-in table. Once a custom table has been loaded, the functions will use the new custom table. Only one custom table load can be performed in a Vty program. Once a custom table has been loaded, it cannot be replaced or removed.

Without using a custom width table, users of Vty-based applications are likely to eventually experience rendering problems with with wide characters. We recommend that developers of Vty-based applications either:

The best option will depend on a number of factors: the user audience, the amount of risk posed by wide character rendering, the terminal emulators in use, etc.

Contributing

If you decide to contribute, that's great! Here are some guidelines you should consider to make submitting patches easier for all concerned:

Known Issues

Further Reading

Good sources of documentation for terminal programming are: