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  }