| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279 |
- = tcell
- image:https://img.shields.io/travis/gdamore/tcell.svg?label=linux[Linux Status,link="https://travis-ci.org/gdamore/tcell"]
- image:https://img.shields.io/appveyor/ci/gdamore/tcell.svg?label=windows[Windows Status,link="https://ci.appveyor.com/project/gdamore/tcell"]
- image:https://img.shields.io/badge/license-APACHE2-blue.svg[Apache License,link="https://github.com/gdamore/tcell/blob/master/LICENSE"]
- image:https://img.shields.io/badge/godoc-reference-blue.svg[GoDoc,link="https://godoc.org/github.com/gdamore/tcell"]
- image:http://goreportcard.com/badge/gdamore/tcell[Go Report Card,link="http://goreportcard.com/report/gdamore/tcell"]
- image:https://img.shields.io/discord/639503822733180969?label=discord[Discord,link="https://discord.gg/urTTxDN"]
- image:https://codecov.io/gh/gdamore/tcell/branch/master/graph/badge.svg[codecov,link="https://codecov.io/gh/gdamore/tcell"]
- [cols="2",grid="none"]
- |===
- |_Tcell_ is a _Go_ package that provides a cell based view for text terminals, like _xterm_.
- It was inspired by _termbox_, but includes many additional improvements.
- a|[.right]
- image::logos/tcell.png[float="right"]
- |===
- ## Examples
- * https://github.com/gdamore/proxima5[proxima5] - space shooter (https://youtu.be/jNxKTCmY_bQ[video])
- * https://github.com/gdamore/govisor[govisor] - service management UI (http://2.bp.blogspot.com/--OsvnfzSNow/Vf7aqMw3zXI/AAAAAAAAARo/uOMtOvw4Sbg/s1600/Screen%2BShot%2B2015-09-20%2Bat%2B9.08.41%2BAM.png[screenshot])
- * mouse demo - included mouse test (http://2.bp.blogspot.com/-fWvW5opT0es/VhIdItdKqJI/AAAAAAAAATE/7Ojc0L1SpB0/s1600/Screen%2BShot%2B2015-10-04%2Bat%2B11.47.13%2BPM.png[screenshot])
- * https://github.com/gdamore/gomatrix[gomatrix] - converted from Termbox
- * https://github.com/zyedidia/micro/[micro] - lightweight text editor with syntax-highlighting and themes
- * https://github.com/viktomas/godu[godu] - simple golang utility helping to discover large files/folders.
- * https://github.com/rivo/tview[tview] - rich interactive widgets for terminal UIs
- * https://github.com/marcusolsson/tui-go[tui-go] - UI library for terminal apps (_deprecated_)
- * https://github.com/rgm3/gomandelbrot[gomandelbrot] - Mandelbrot!
- * https://github.com/senorprogrammer/wtf[WTF]- Personal information dashboard for your terminal
- * https://github.com/browsh-org/browsh[browsh] - A fully-modern text-based browser, rendering to TTY and browsers (https://www.youtube.com/watch?v=HZq86XfBoRo[video])
- * https://github.com/sachaos/go-life[go-life] - Conway's Game of Life.
- * https://github.com/gcla/gowid[gowid] - compositional widgets for terminal UIs, inspired by urwid
- * https://termshark.io[termshark] - a terminal UI for tshark, inspired by Wireshark, built on gowid
- * https://github.com/MichaelS11/go-tetris[go-tetris] - Go Tetris with AI option
- * https://github.com/junegunn/fzf[fzf] - A command-line fuzzy finder
- * https://github.com/esimov/ascii-fluid[ascii-fluid] - A terminal based ASCII fluid simulation controlled by webcam
- * https://gitlab.com/tslocum/cbind[cbind] - Provides key event encoding, decoding and handling
- * https://github.com/spinzed/tpong[tpong] - The old-school Pong remade in terminal
- ## Pure Go Terminfo Database
- _Tcell_ includes a full parser and expander for terminfo capability strings,
- so that it can avoid hard coding escape strings for formatting. It also favors
- portability, and includes support for all POSIX systems.
- The database is also flexible & extensible, and can modified by either running
- a program to build the entire database, or an entry for just a single terminal.
- ## More Portable
- _Tcell_ is portable to a wide variety of systems.
- _Tcell_ is believed
- to work with all of the systems officially supported by golang with
- the exception of nacl (which lacks any kind of a terminal interface).
- (Plan9 is not supported by _Tcell_, but it is experimental status only
- in golang.) _Tcell_ is pure Go, without any need for CGO.
- ## No Async IO
- _Tcell_ is able to operate without requiring `SIGIO` signals (unlike _termbox_),
- or asynchronous I/O, and can instead use standard Go file
- objects and Go routines.
- This means it should be safe, especially for
- use with programs that use exec, or otherwise need to manipulate the
- tty streams.
- This model is also much closer to idiomatic Go, leading
- to fewer surprises.
- ## Rich Unicode & non-Unicode support
- _Tcell_ includes enhanced support for Unicode, including wide characters and
- combining characters, provided your terminal can support them.
- Note that
- Windows terminals generally don't support the full Unicode repertoire.
- It will also convert to and from Unicode locales, so that the program
- can work with UTF-8 internally, and get reasonable output in other locales.
- _Tcell_ tries hard to convert to native characters on both input and output, and
- on output _Tcell_ even makes use of the alternate character set to facilitate
- drawing certain characters.
- ## More Function Keys
- _Tcell_ also has richer support for a larger number of special keys that some terminals can send.
- ## Better Color Handling
- _Tcell_ will respect your terminal's color space as specified within your terminfo
- entries, so that for example attempts to emit color sequences on VT100 terminals
- won't result in unintended consequences.
- In legacy Windows mode, _Tcell_ supports 16 colors, bold, dim, and reverse,
- instead of just termbox's 8 colors with reverse. (Note that there is some
- conflation with bold/dim and colors.)
- Modern Windows 10 can benefit from much richer colors however.
- _Tcell_ maps 16 colors down to 8, for terminals that need it.
- (The upper 8 colors are just brighter versions of the lower 8.)
- ## Better Mouse Support
- _Tcell_ supports enhanced mouse tracking mode, so your application can receive
- regular mouse motion events, and wheel events, if your terminal supports it.
- (Note: The Windows 10 Terminal application suffers from a flaw in this regard,
- and does not support mouse interaction. The stock Windows 10 console host
- fired up with cmd.exe or PowerShell works fine however.)
- ## _Termbox_ Compatibility
- A compatibility layer for _termbox_ is provided in the `compat` directory.
- To use it, try importing `github.com/gdamore/tcell/termbox` instead.
- Most _termbox-go_ programs will probably work without further modification.
- ## Working With Unicode
- Internally Tcell uses UTF-8, just like Go.
- However, Tcell understands how to
- convert to and from other character sets, using the capabilities of
- the `golang.org/x/text/encoding packages`.
- Your application must supply
- them, as the full set of the most common ones bloats the program by about 2MB.
- If you're lazy, and want them all anyway, see the `encoding` sub-directory.
- ## Wide & Combining Characters
- The `SetContent()` API takes a primary rune, and an optional list of combining runes.
- If any of the runes is a wide (East Asian) rune occupying two cells,
- then the library will skip output from the following cell, but care must be
- taken in the application to avoid explicitly attempting to set content in the
- next cell, otherwise the results are undefined. (Normally wide character
- is displayed, and the other character is not; do not depend on that behavior.)
- Experience has shown that the vanilla Windows 8 console application does not
- support any of these characters properly, but at least some options like
- _ConEmu_ do support Wide characters.
- ## Colors
- _Tcell_ assumes the ANSI/XTerm color model, including the 256 color map that
- XTerm uses when it supports 256 colors. The terminfo guidance will be
- honored, with respect to the number of colors supported. Also, only
- terminals which expose ANSI style `setaf` and `setab` will support color;
- if you have a color terminal that only has `setf` and `setb`, please let me
- know; it wouldn't be hard to add that if there is need.
- ## 24-bit Color
- _Tcell_ _supports true color_! (That is, if your terminal can support it,
- _Tcell_ can accurately display 24-bit color.)
- To use 24-bit color, you need to use a terminal that supports it. Modern
- xterm and similar teminal emulators can support this. As terminfo lacks any
- way to describe this capability, we fabricate the capability for
- terminals with names ending in `*-truecolor`. The stock distribution ships
- with a database that defines `xterm-truecolor`.
- To try it out, set your
- `TERM` variable to `xterm-truecolor`.
- When using TrueColor, programs will display the colors that the programmer
- intended, overriding any "`themes`" you may have set in your terminal
- emulator. (For some cases, accurate color fidelity is more important
- than respecting themes. For other cases, such as typical text apps that
- only use a few colors, its more desirable to respect the themes that
- the user has established.)
- If you find this undesirable, you can either use a `TERM` variable
- that lacks the `TRUECOLOR` setting, or set `TCELL_TRUECOLOR=disable` in your
- environment.
- ## Performance
- Reasonable attempts have been made to minimize sending data to terminals,
- avoiding repeated sequences or drawing the same cell on refresh updates.
- ## Terminfo
- (Not relevent for Windows users.)
- The Terminfo implementation operates with two forms of database. The first
- is the built-in go database, which contains a number of real database entries
- that are compiled into the program directly. This should minimize calling
- out to database file searches.
- The second is in the form of JSON files, that contain the same information,
- which can be located either by the `$TCELLDB` environment file, `$HOME/.tcelldb`,
- or is located in the Go source directory as `database.json`.
- These files (both the Go and the JSON files) can be generated using the
- mkinfo.go program. If you need to regnerate the entire set for some reason,
- run the mkdatabase.sh file. The generation uses the infocmp(1) program on
- the system to collect the necessary information.
- The `mkinfo.go` program can also be used to generate specific database entries
- for named terminals, in case your favorite terminal is missing. (If you
- find that this is the case, please let me know and I'll try to add it!)
- _Tcell_ requires that the terminal support the `cup` mode of cursor addressing.
- Terminals without absolute cursor addressability are not supported.
- This is unlikely to be a problem; such terminals have not been mass produced
- since the early 1970s.
- ## Mouse Support
- Mouse support is detected via the `kmous` terminfo variable, however,
- enablement/disablement and decoding mouse events is done using hard coded
- sequences based on the XTerm X11 model. As of this writing all popular
- terminals with mouse tracking support this model. (Full terminfo support
- is not possible as terminfo sequences are not defined.)
- On Windows, the mouse works normally.
- Mouse wheel buttons on various terminals are known to work, but the support
- in terminal emulators, as well as support for various buttons and
- live mouse tracking, varies widely. Modern _xterm_, macOS _Terminal_, and _iTerm_ all work well.
- ## Testablity
- There is a `SimulationScreen`, that can be used to simulate a real screen
- for automated testing. The supplied tests do this. The simulation contains
- event delivery, screen resizing support, and capabilities to inject events
- and examine "`physical`" screen contents.
- ## Platforms
- ### POSIX (Linux, FreeBSD, macOS, Solaris, etc.)
- For mainstream systems with a suitably well defined system call interface
- to tty settings, everything works using pure Go.
- For the remainder (right now means only Solaris/illumos) we use POSIX function
- calls to manage termios, which implies that CGO is required on those platforms.
- ### Windows
- Windows console mode applications are supported. Unfortunately _mintty_
- and other _cygwin_ style applications are not supported.
- Modern console applications like ConEmu, as well as the Windows 10
- console itself, support all the good features (resize, mouse tracking, etc.)
- I haven't figured out how to cleanly resolve the dichotomy between cygwin
- style termios and the Windows Console API; it seems that perhaps nobody else
- has either. If anyone has suggestions, let me know! Really, if you're
- using a Windows application, you should use the native Windows console or a
- fully compatible console implementation.
- ### Plan9 and Native Client (Nacl)
- The nacl and plan9 platforms won't work, but compilation stubs are supplied
- for folks that want to include parts of this in software targetting those
- platforms. The Simulation screen works, but as Tcell doesn't know how to
- allocate a real screen object on those platforms, `NewScreen()` will fail.
- If anyone has wisdom about how to improve support for either of these,
- please let me know. PRs are especially welcome.
- ### Commercial Support
- _Tcell_ is absolutely free, but if you want to obtain commercial, professional support, there are options.
- [cols="2",align="center",frame="none", grid="none"]
- |===
- ^.^|
- image:logos/tidelift.png[100,100]
- a|
- https://tidelift.com/[Tidelift] subscriptions include support for _Tcell_, as well as many other open source packages.
- ^.^|
- image:logos/staysail.png[100,100]
- a|
- mailto:info@staysail.tech[Staysail Systems, Inc.] offers direct support, and custom development around _Tcell_ on an hourly basis.
- ^.^|
- image:logos/patreon.png[100,100]
- a|I also welcome donations at https://www.patreon.com/gedamore/[Patreon], if you just want to make a contribution.
- |===
|