3

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

我的问题是:

  1. 如何使用列/行坐标有效地清除并打印到终端?
  2. 如何阻止终端打印按下的键

我的意图:

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

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

4

3 回答 3

4

清除终端和设置位置的最简单方法是通过 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复制而来

于 2015-09-02T22:39:18.830 回答
2

截至 2019 年 12 月,我建议使用rivo/tview库。

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


这是“hello world”应用程序,取自项目的 README(为了便于阅读而重新格式化):

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 提供屏幕截图和示例代码以及标准的godoc 参考

于 2019-12-26T07:52:41.617 回答
0

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

    进口 (
        “fmt”
        “系统调用”
        “golang.org/x/crypto/ssh/终端”
    )

    函数主(){
        fmt.Print("输入值:")
        byteInput, _ := terminal.ReadPassword(int(syscall.Stdin))
        输入:=字符串(字节输入)
        fmt.Println() // 需要在用户输入后添加一个新行
        fmt.Printf("你的输入是'%s'", input)
    }
于 2019-08-01T20:23:18.743 回答