2

我正在为 Go 中的 CLI 编写向导。我想做的是询问用户他想做什么,准备适当的 CLI 命令,并将其写入控制台。然后,用户可能会在先编辑它之后通过按 Enter 将命令提交到 CLI。换句话说,我想将输出写入标准输出,当用户按 Enter 时,该输出将成为标准输入的输入。有没有办法在 Go 中做到这一点?

4

2 回答 2

1

直接从用户获取输入:

var s string
_, err := fmt.Scanf("%s", &s)

对于类似诅咒的应用程序,请看这里: https ://github.com/rthornton128/goncurses/blob/master/ncurses.go

它具有 C 绑定。

于 2015-06-25T09:32:47.503 回答
0

我找到了一个 Go 命令行编辑器包https://github.com/peterh/liner,它包含了所需的功能以及更多功能。它允许您编写具有历史记录和命令完成的 CLI,命令完成功能提供了我在问题中所要求的内容:它显示了用户可以编辑并提交给 CLI 的文本。它支持 Windows、Linux 和 Mac。这是其 README 中示例的略微修改版本,它运行带有命令完成功能的简单 CLI。例如,用户可以键入“j”并按 Tab 键循环浏览名称列表,编辑其中一个以品尝,然后按 Enter 提交。

package main

import (
    "fmt"
    "log"
    "os"
    "strings"

    "github.com/peterh/liner"
)

var (
    history_fn = ".liner_history"
    names      = []string{"jack", "john", "james", "mary", "mike", "nancy"}
)

func main() {
    line := liner.NewLiner()
    defer line.Close()

    line.SetCompleter(func(line string) (c []string) {
        for _, n := range names {
            if strings.HasPrefix(n, strings.ToLower(line)) {
                c = append(c, n)
            }
        }
        return
    })

    if f, err := os.Open(history_fn); err == nil {
        line.ReadHistory(f)
        f.Close()
    }

    line.SetCtrlCAborts(true)
    for true {
        if name, err := line.Prompt("What is your name? "); err != nil {
            if err.Error() == "EOF" || err == liner.ErrPromptAborted {
                break
            }
            log.Print("Error reading line: ", err)
        } else {
            log.Print("Got: ", name)
            line.AppendHistory(name)
        }
    }
    fmt.Printf("End of test\n")

    if f, err := os.Create(history_fn); err != nil {
        log.Print("Error writing history file: ", err)
    } else {
        line.WriteHistory(f)
        f.Close()
    }
}
于 2015-07-10T16:24:25.417 回答