README.md
1# About terminfo [![GoDoc][1]][2]
2
3Package `terminfo` provides a pure-Go implementation of reading information
4from the terminfo database.
5
6`terminfo` is meant as a replacement for `ncurses` in simple Go programs.
7
8## Installing
9
10Install in the usual Go way:
11
12```sh
13$ go get -u github.com/xo/terminfo
14```
15
16## Using
17
18Please see the [GoDoc API listing][2] for more information on using `terminfo`.
19
20```go
21// _examples/simple/main.go
22package main
23
24import (
25 "bytes"
26 "fmt"
27 "log"
28 "os"
29 "os/signal"
30 "strings"
31 "sync"
32 "syscall"
33
34 "github.com/xo/terminfo"
35)
36
37func main() {
38 //r := rand.New(nil)
39
40 // load terminfo
41 ti, err := terminfo.LoadFromEnv()
42 if err != nil {
43 log.Fatal(err)
44 }
45
46 // cleanup
47 defer func() {
48 err := recover()
49 termreset(ti)
50 if err != nil {
51 log.Fatal(err)
52 }
53 }()
54
55 terminit(ti)
56 termtitle(ti, "simple example!")
57 termputs(ti, 3, 3, "Ctrl-C to exit")
58 maxColors := termcolors(ti)
59 if maxColors > 256 {
60 maxColors = 256
61 }
62 for i := 0; i < maxColors; i++ {
63 termputs(ti, 5+i/16, 5+i%16, ti.Colorf(i, 0, "█"))
64 }
65
66 // wait for signal
67 sigs := make(chan os.Signal, 1)
68 signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)
69 <-sigs
70}
71
72// terminit initializes the special CA mode on the terminal, and makes the
73// cursor invisible.
74func terminit(ti *terminfo.Terminfo) {
75 buf := new(bytes.Buffer)
76 // set the cursor invisible
77 ti.Fprintf(buf, terminfo.CursorInvisible)
78 // enter special mode
79 ti.Fprintf(buf, terminfo.EnterCaMode)
80 // clear the screen
81 ti.Fprintf(buf, terminfo.ClearScreen)
82 os.Stdout.Write(buf.Bytes())
83}
84
85// termreset is the inverse of terminit.
86func termreset(ti *terminfo.Terminfo) {
87 buf := new(bytes.Buffer)
88 ti.Fprintf(buf, terminfo.ExitCaMode)
89 ti.Fprintf(buf, terminfo.CursorNormal)
90 os.Stdout.Write(buf.Bytes())
91}
92
93// termputs puts a string at row, col, interpolating v.
94func termputs(ti *terminfo.Terminfo, row, col int, s string, v ...interface{}) {
95 buf := new(bytes.Buffer)
96 ti.Fprintf(buf, terminfo.CursorAddress, row, col)
97 fmt.Fprintf(buf, s, v...)
98 os.Stdout.Write(buf.Bytes())
99}
100
101// sl is the status line terminfo.
102var sl *terminfo.Terminfo
103
104// termtitle sets the window title.
105func termtitle(ti *terminfo.Terminfo, s string) {
106 var once sync.Once
107 once.Do(func() {
108 if ti.Has(terminfo.HasStatusLine) {
109 return
110 }
111 // load the sl xterm if terminal is an xterm or has COLORTERM
112 if strings.Contains(strings.ToLower(os.Getenv("TERM")), "xterm") || os.Getenv("COLORTERM") == "truecolor" {
113 sl, _ = terminfo.Load("xterm+sl")
114 }
115 })
116 if sl != nil {
117 ti = sl
118 }
119 if !ti.Has(terminfo.HasStatusLine) {
120 return
121 }
122 buf := new(bytes.Buffer)
123 ti.Fprintf(buf, terminfo.ToStatusLine)
124 fmt.Fprint(buf, s)
125 ti.Fprintf(buf, terminfo.FromStatusLine)
126 os.Stdout.Write(buf.Bytes())
127}
128
129// termcolors returns the maximum colors available for the terminal.
130func termcolors(ti *terminfo.Terminfo) int {
131 if colors := ti.Num(terminfo.MaxColors); colors > 0 {
132 return colors
133 }
134 return int(terminfo.ColorLevelBasic)
135}
136```
137
138[1]: https://godoc.org/github.com/xo/terminfo?status.svg
139[2]: https://godoc.org/github.com/xo/terminfo
140