使用Go

时间:2015-09-02 22:36:01

标签: shell go command-line-interface tty stty

我正在尝试构建一个全屏终端应用程序。我使用Go作为我的首选语言。我已经弄清楚如何从os.Stdin读取,但我不清楚如何清除终端窗口并操纵光标位置。我还希望捕获终端输入而不打印(回显)。

我的问题是:

  1. 如何使用列/行坐标有效清除并打印到终端?
  2. 如何停止打印终端按键
  3. 我的意图:

    我想创建一个全屏终端应用程序,它可以呈现自己的UI并在内部处理输入(热键/导航等等)。

    如果有任何图书馆涵盖此类用例,请随时提出建议。

3 个答案:

答案 0 :(得分:2)

清除终端和设置位置的最简单方法是通过ansi转义码。然而,这可能不是理想的方式,因为终端的变化可能会让你感到厌烦。

fmt.Print("\033[2J") //Clear screen
fmt.Printf("\033[%d;%dH", line, col) // Set cursor position

更好的选择是使用像goncursestermbox-go这样的库(信用:第二个来自Tim Cooper的评论)。

使用这样的库你可以做这样的事情:

import (
    gc "code.google.com/p/goncurses"
)

func main() {
    s, err := gc.Init()
    if err != nil {
        panic(err)
    }
    defer gc.End()
    s.Move(5, 2)
    s.Println("Hello")
    s.GetChar()
}

Rosetta Code

复制的上述代码

答案 1 :(得分:0)

要停止终端打印按键,您可以使用以下代码:

    import (
        "fmt"
        "syscall"
        "golang.org/x/crypto/ssh/terminal"
    )

    func main(){
        fmt.Print("Enter Value: ")
        byteInput, _ := terminal.ReadPassword(int(syscall.Stdin))
        input:= string(byteInput)
        fmt.Println() // it's necessary to add a new line after user's input
        fmt.Printf("Your input is '%s'", input)
    }

答案 2 :(得分:0)

从2019年12月开始,我建议使用rivo/tview库。

(@ vastlysuperiorman提到的goncurses自2019年6月以来没有更新过,termbox-go被明确声明为未维护)。


这里是“ hello world”应用程序,该应用程序来自项目的自述文件(经过重新格式化以提高可读性):

package main

import (
    "github.com/rivo/tview"
)

func main() {

    box := tview.NewBox().
        SetBorder(true).
        SetTitle("Hello, world!")

    if err := tview.NewApplication().SetRoot(box, true).Run(); err != nil {
        panic(err)
    }
}


tview提供了screenshots and example code和标准的godoc reference