【问题标题】:Read SPACE without ENTER as input from terminal从终端读取没有 ENTER 的空格作为输入
【发布时间】:2018-03-22 06:49:13
【问题描述】:

我有一个 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”,我怎样才能使它“按空格显示下一页,按q退出”,就像Linux命令“更多”等。

说清楚:

  • 要继续的现有控件是“ENTER”,我想使用“SPACE”(只是 SPACE,而不是 SPACE+ENTER);
  • 现有要退出的控件是“任意键+ENTER”,我想使用“q”(只是q,而不是q+ENTER)

【问题讨论】:

标签: go terminal stdin


【解决方案1】:

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.")
        }
    }
}

【讨论】:

  • 我想你忘记了tb.Close(),所以在程序退出后它的行为是有线的。但无论如何,感谢这个例子
【解决方案2】:

有一个内置的 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-06
    • 2014-05-04
    • 1970-01-01
    • 2013-08-03
    相关资源
    最近更新 更多