我正在尝试构建一个全屏终端应用程序。我使用 Go 作为我选择的语言。我已经想出了如何阅读os.Stdin
,但我不清楚如何清除终端窗口和操纵光标位置。我还想捕获终端输入而不打印(回显)。
我的问题是:
- 如何使用列/行坐标有效地清除并打印到终端?
- 如何阻止终端打印按下的键
我的意图:
我想创建一个全屏终端应用程序来呈现它自己的 UI 并在内部处理输入(热键/导航/等...)。
如果有任何库涵盖此类用例,请随时提出建议。
我正在尝试构建一个全屏终端应用程序。我使用 Go 作为我选择的语言。我已经想出了如何阅读os.Stdin
,但我不清楚如何清除终端窗口和操纵光标位置。我还想捕获终端输入而不打印(回显)。
我的问题是:
我的意图:
我想创建一个全屏终端应用程序来呈现它自己的 UI 并在内部处理输入(热键/导航/等...)。
如果有任何库涵盖此类用例,请随时提出建议。
清除终端和设置位置的最简单方法是通过 ansi 转义码。但是,这可能不是理想的方式,因为终端的变化可能会反过来咬你。
fmt.Print("\033[2J") //Clear screen
fmt.Printf("\033[%d;%dH", line, col) // Set cursor position
更好的选择是使用像goncurses或termbox-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()
}
截至 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)
}
}
要停止终端打印按下的键,您可以使用以下代码:
进口 ( “fmt” “系统调用” “golang.org/x/crypto/ssh/终端” ) 函数主(){ fmt.Print("输入值:") byteInput, _ := terminal.ReadPassword(int(syscall.Stdin)) 输入:=字符串(字节输入) fmt.Println() // 需要在用户输入后添加一个新行 fmt.Printf("你的输入是'%s'", input) }