github.com/koron/hk@v0.0.0-20150303213137-b8aeaa3ab34c/term/unix.go (about) 1 // +build darwin freebsd linux netbsd openbsd 2 3 package term 4 5 import ( 6 "os" 7 "os/exec" 8 "strconv" 9 "strings" 10 ) 11 12 func IsANSI(f *os.File) bool { 13 return IsTerminal(f) 14 } 15 16 // IsTerminal returns true if f is a terminal. 17 func IsTerminal(f *os.File) bool { 18 cmd := exec.Command("test", "-t", "0") 19 cmd.Stdin = f 20 return cmd.Run() == nil 21 } 22 23 func MakeRaw(f *os.File) error { 24 return stty(f, "-icanon", "-echo").Run() 25 } 26 27 func Restore(f *os.File) error { 28 return stty(f, "icanon", "echo").Run() 29 } 30 31 func Cols() (int, error) { 32 cols, err := tput("cols") 33 if err != nil { 34 return 0, err 35 } 36 return strconv.Atoi(cols) 37 } 38 39 func Lines() (int, error) { 40 cols, err := tput("lines") 41 if err != nil { 42 return 0, err 43 } 44 return strconv.Atoi(cols) 45 } 46 47 // helpers 48 49 func stty(f *os.File, args ...string) *exec.Cmd { 50 c := exec.Command("stty", args...) 51 c.Stdin = f 52 return c 53 } 54 55 func tput(what string) (string, error) { 56 c := exec.Command("tput", what) 57 c.Stderr = os.Stderr 58 out, err := c.Output() 59 if err != nil { 60 return "", err 61 } 62 return strings.TrimSpace(string(out)), nil 63 }