Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Get terminal size in Go

Tags:

go

tty

How to get tty size with Golang? I am trying do this with executing stty size command, but I can't craft code right.

package main  import (   "os/exec"   "fmt"   "log" )  func main() {   out, err := exec.Command("stty", "size").Output()   fmt.Printf("out: %#v\n", out)   fmt.Printf("err: %#v\n", err)   if err != nil {     log.Fatal(err)   } } 

Output:

out: []byte{} err: &exec.ExitError{ProcessState:(*os.ProcessState)(0xc200066520)} 2013/05/16 02:35:57 exit status 1 exit status 1 

I think this is because Go spawns a process not related to the current tty, with which it is working. How can I relate the command to current terminal in order to get its size?

like image 287
Ilia Sidorenko Avatar asked May 15 '13 15:05

Ilia Sidorenko


2 Answers

I just wanted to add a new answer since I ran into this problem recently. There is a terminal package which lives inside the official ssh package https://godoc.org/golang.org/x/crypto/ssh/terminal.

This package provides a method to easily get the size of a terminal.

width, height, err := terminal.GetSize(0)

0 would be the file descriptor of the terminal you want the size of. To get the fd or you current terminal you can always do int(os.Stdin.Fd())

Under the covers it uses a syscall to get the terminal size for the given fd.

like image 76
pech0rin Avatar answered Sep 18 '22 17:09

pech0rin


I was stuck on a similar problem. Here is what I ended up with.

It doesn't use a subprocess, so might be desirable in some situations.

import (     "syscall"     "unsafe" )  type winsize struct {     Row    uint16     Col    uint16     Xpixel uint16     Ypixel uint16 }  func getWidth() uint {     ws := &winsize{}     retCode, _, errno := syscall.Syscall(syscall.SYS_IOCTL,         uintptr(syscall.Stdin),         uintptr(syscall.TIOCGWINSZ),         uintptr(unsafe.Pointer(ws)))      if int(retCode) == -1 {         panic(errno)     }     return uint(ws.Col) } 
like image 45
deft_code Avatar answered Sep 21 '22 17:09

deft_code