• Home
  • History
  • Annotate
Name Date Size #Lines LOC

..22-Nov-2021-

terminfo-ca9a967f8778/H07-May-2022-4,8983,093

.gitignoreH A D22-Nov-202174 106

LICENSEH A D22-Nov-20211.1 KiB2217

README.mdH A D22-Nov-20213 KiB140117

caps.goH A D22-Nov-2021774 3419

capvals.goH A D22-Nov-202163.7 KiB2,0241,012

color.goH A D22-Nov-20212.2 KiB9273

go.modH A D22-Nov-202139 42

load.goH A D22-Nov-20211.5 KiB7350

param.goH A D22-Nov-20217.8 KiB491353

stack.goH A D22-Nov-2021661 4940

terminfo.goH A D22-Nov-202112.7 KiB539294

util.goH A D22-Nov-20215.6 KiB267198

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