• Stars
    star
    320
  • Rank 131,126 (Top 3 %)
  • Language
    Haskell
  • License
    BSD 3-Clause "New...
  • Created over 13 years ago
  • Updated 5 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

A high-level ncurses alternative written in Haskell

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

  • Supports a large number of terminals, i.e., vt100, ansi, hurd, linux, screen, etc., or anything with a sufficient terminfo entry.

  • Automatically handles window resizes.

  • Supports Unicode output on terminals with UTF-8 support.

  • Provides an efficient output algorithm. Output buffering and terminal state changes are minimized.

  • Minimizes repaint area, which virtually eliminates the flicker problems that plague ncurses programs.

  • Provides a pure, compositional interface for efficiently constructing display images.

  • Automatically decodes keyboard keys into (key,[modifier]) tuples.

  • Automatically supports refresh on Ctrl-L.

  • Supports a keypress timeout after for lone ESC. The timeout is customizable.

  • Provides extensible input and output interfaces.

  • Supports ANSI graphics modes (SGR as defined in console_codes(4)) with a type-safe interface and graceful fallback for terminals with limited or nonexistent support for such modes.

  • Properly handles cleanup (but not due to signals).

  • Provides a comprehensive test suite.

  • Supports "normal" and "extended" (SGR) mouse modes as described at http://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h2-Mouse-Tracking

  • Supports bracketed paste mode as described at http://cirw.in/blog/bracketed-paste

  • Supports multi-column Unicode characters such as emoji characters. In cases where Vty and your terminal emulator disagree on character widths, Vty provides a tool vty-build-width-table and library functionality to build a width table that will work for your terminal and load it on application startup.

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:

  • Via the library API in Graphics.Vty.UnicodeWidthTable.IO
  • By adding a widthMap directive to your Vty configuration file and then invoking mkVty to initialize Vty

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:

  • Provide the vty-build-width-table tool and documentation for running it and updating the Vty configuration, or
  • Have the application invoke the Vty library's table-building functionality and load the table at startup without using the Vty configuration.

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:

  • Please ensure that the examples and test suites build along with the library by running build.sh in the repository.
  • If you want to take on big things, talk to me first; let's have a design/vision discussion before you start coding. Create a GitHub issue and we can use that as the place to hash things out.
  • If you make changes, make them consistent with the syntactic conventions already used in the codebase.
  • Please provide Haddock documentation for any changes you make.

Known Issues

  • Terminals have numerous quirks and bugs, so mileage may vary. Please report issues as you encounter them and provide details on your terminal emulator, operating system, etc.

  • STOP, TERM and INT signals are not handled.

  • The character encoding of the terminal is assumed to be UTF-8 if unicode is used.

  • Terminfo is assumed to be correct unless there is an override configured. Some terminals will not have correct special key support (shifted F10 etc). See Config for customizing vty's behavior for a particular terminal.

  • Vty uses the TIOCGWINSZ ioctl to find the current window size, which appears to be limited to Linux and BSD.

Further Reading

Good sources of documentation for terminal programming are:

More Repositories

1

brick

A declarative Unix terminal UI library written in Haskell
Haskell
1,601
star
2

tart

Tart - draw ASCII art in the terminal with your mouse!
Haskell
381
star
3

dbmigrations

A library for the creation, management, and installation of schema updates for relational databases.
Haskell
76
star
4

vty-ui

A terminal user interface programming library similar to graphical interfaces such as GTK and QT. (DEPRECATED, see https://github.com/jtdaugherty/brick)
Haskell
72
star
5

mathblog

A package for managing a static, mathematically-inclined web log
Haskell
25
star
6

tracy

A Haskell ray tracer largely based on http://www.raytracegroundup.com/
Haskell
23
star
7

text-zipper

A text editor zipper libary
Haskell
18
star
8

brick-skylighting

Display syntax-highlighted text in Brick user interfaces
Haskell
12
star
9

dbmigrations-postgresql

This is the PostgreSQL support package for dbmigrations.
Haskell
8
star
10

word-wrap

A Haskell library for wrapping long lines of text
Haskell
8
star
11

tmux-config

My tmux configuration
Shell
7
star
12

mutt-tutorial

7
star
13

vty-unix

Unix backend for Vty
Haskell
5
star
14

ccat

Colorize just about any text file in a terminal with Pygments
Python
4
star
15

toot

Console twitter client
Haskell
3
star
16

t2

An interactive ray tracer powered by OpenCL
C
3
star
17

text-markup

Text markup data structure
Haskell
3
star
18

smtp

Haskell client support for SMTP
Haskell
3
star
19

vty-crossplatform

Build-time cross-platform package for Vty
Haskell
3
star
20

vty-ui-builder-tool

A command-line tool interface for the vty-ui-builder library and document reader backends
Haskell
2
star
21

flux

A ray tracer implementation in Rust
Rust
2
star
22

vty-ui-builder

A user interface code generator for vty-ui
Haskell
2
star
23

dbmigrations-client

An interactive terminal client for dbmigrations
Haskell
2
star
24

dbmigrations-mysql

This is the MySQL support package for dbmigrations.
Haskell
2
star
25

vimrc

My Vim configuration
Vim Script
2
star
26

rules

A library for structured data validation and extraction
Haskell
2
star
27

vty-ui-extras

Extra functionality not included in the core vty-ui package
Haskell
2
star
28

mix-assembler

Haskell implementation of an assembler for the MIXAL assembly language
Haskell
2
star
29

language-mixal

Haskell parser and pretty-printer for the MIXAL assembly language
Haskell
2
star
30

vty-ui-builder-xml

vty-ui-builder XML input document reader
Haskell
2
star
31

jtdaugherty.github.com

github site
CSS
2
star
32

prj

A shell script tool for managing project environment configurations
Shell
2
star
33

rttest

Haskell
1
star
34

rebound

A ray tracer project in Rust based on Ray Tracing In One Weekend
Rust
1
star
35

brick-devlunch

Haskell
1
star
36

dbmigrations-sqlite

This is the SQLite support package for dbmigrations.
Haskell
1
star
37

sdl-sandbox

An SDL sandbox codebase for 2-D game engine explorations
C++
1
star
38

text-zipper-benchmarks

Criterion benchmarks for the text-zipper library
Haskell
1
star
39

emacs-config

Obligatory emacs configuration repository
Emacs Lisp
1
star