读取 SPACE 没有 ENTER 作为来自终端的输入
Read SPACE without ENTER as input from terminal
我有一个 CLI 程序,它会要求用户键入 ENTER 以继续,然后按其他键以中止。
for {
show() // list one page
fmt.Printf("Press ENTER to show next page, press any other key then Enter to quit")
var input string
fmt.Scanln(&input)
if strings.Trim(input, " ") == "" {
continue
} else {
break
}
}
我想改善用户体验:而不是"ENTER or press something then ENTER",我怎样才能做到"Press SPACE to show next page, press q to quit",就像Linux命令"more" 等人。
要说清楚:
- 要继续的现有控件是"ENTER",我想使用"SPACE"(只是SPACE,而不是SPACE+ENTER);
- 现有的退出控件是"any key + ENTER",我想用"q"(只是q,不是q+ENTER)
有一个内置的 shell 命令 read -n1 -r -p "Press SPACE to show next page, press q to quit" key
。也许你可以执行那个。
有关功能更全面的 golang 解决方案,请参阅 github.com/nsf/termbox-go
。很好的例子:https://www.socketloop.com/tutorials/golang-get-ascii-code-from-a-key-press-cross-platform-example
github.com/nsf/termbox-go
的简单解决方案
package main
import (
"fmt"
tb "github.com/nsf/termbox-go"
)
func main() {
err := tb.Init()
if err != nil {
panic(err)
}
defer tb.Close()
for {
fmt.Println("Press any key")
event := tb.PollEvent()
switch {
case event.Ch == 'a':
fmt.Println("a")
case event.Key == tb.KeyEsc:
fmt.Println("Bye!")
return
case event.Key == tb.KeySpace:
fmt.Println("ANY KEY! You pressed SPACE!")
case event.Key == tb.KeyEnter:
fmt.Println("ANY KEY! You pressed ENTER!")
default:
fmt.Println("Any key.")
}
}
}
我有一个 CLI 程序,它会要求用户键入 ENTER 以继续,然后按其他键以中止。
for {
show() // list one page
fmt.Printf("Press ENTER to show next page, press any other key then Enter to quit")
var input string
fmt.Scanln(&input)
if strings.Trim(input, " ") == "" {
continue
} else {
break
}
}
我想改善用户体验:而不是"ENTER or press something then ENTER",我怎样才能做到"Press SPACE to show next page, press q to quit",就像Linux命令"more" 等人。
要说清楚:
- 要继续的现有控件是"ENTER",我想使用"SPACE"(只是SPACE,而不是SPACE+ENTER);
- 现有的退出控件是"any key + ENTER",我想用"q"(只是q,不是q+ENTER)
有一个内置的 shell 命令 read -n1 -r -p "Press SPACE to show next page, press q to quit" key
。也许你可以执行那个。
有关功能更全面的 golang 解决方案,请参阅 github.com/nsf/termbox-go
。很好的例子:https://www.socketloop.com/tutorials/golang-get-ascii-code-from-a-key-press-cross-platform-example
github.com/nsf/termbox-go
package main
import (
"fmt"
tb "github.com/nsf/termbox-go"
)
func main() {
err := tb.Init()
if err != nil {
panic(err)
}
defer tb.Close()
for {
fmt.Println("Press any key")
event := tb.PollEvent()
switch {
case event.Ch == 'a':
fmt.Println("a")
case event.Key == tb.KeyEsc:
fmt.Println("Bye!")
return
case event.Key == tb.KeySpace:
fmt.Println("ANY KEY! You pressed SPACE!")
case event.Key == tb.KeyEnter:
fmt.Println("ANY KEY! You pressed ENTER!")
default:
fmt.Println("Any key.")
}
}
}