Terminal raw mode не поддерживает стрелки в Windows - PullRequest
0 голосов
/ 04 октября 2019

Я пытаюсь сделать мою консоль необработанной (в Windows), и я использую пакет ssh / терминал:

package main

import (
    "fmt"
    "os"

    "golang.org/x/crypto/ssh/terminal"
)

type sh struct{}

func (sh *sh) Read(b []byte) (int, error) {
    return os.Stdin.Read(b)
}

func (sh *sh) Write(b []byte) (int, error) {
    return os.Stdout.Write(b)
}

func main() {
    oldstate, err := terminal.MakeRaw(int(os.Stdin.Fd()))
    if err != nil {
        panic(err)
    }

    defer terminal.Restore(int(os.Stdin.Fd()), oldstate)

    term := terminal.NewTerminal(&sh{}, "")
    term.AutoCompleteCallback = func(line string, pos int, key rune) (newLine string, newPos int, ok bool) {
        fmt.Println("callback:", line, pos, key)

        return "", 0, false
    }

    line, err := term.ReadLine()
    fmt.Println("result:", line, err)
}

Это прекрасно работает, и я могу поймать Ctrl-C и другие специальные клавиши, но я не могу использовать клавиши со стрелками.

Я хочу, чтобы клавиши со стрелками перемещали курсор или, по крайней мере, вызывали AutoCompleteCallback, где я могу переместить курсор самостоятельно.

1 Ответ

1 голос
/ 04 октября 2019

Использовал github.com/containerd/console пакет, чтобы сделать терминал необработанным, и теперь он работает как шарм.

Новый код:

package main

import (
    "fmt"
    "os"

    "github.com/containerd/console"
    "golang.org/x/crypto/ssh/terminal"
)

func main() {
    current := console.Current()
    defer current.Reset()

    if err := current.SetRaw(); err != nil {
        panic(err)
    }

    term := terminal.NewTerminal(current, "")
    term.AutoCompleteCallback = func(line string, pos int, key rune) (newLine string, newPos int, ok bool) {
        // fmt.Println("callback:", line, pos, key)

        return "", 0, false
    }

    line, err := term.ReadLine()
    fmt.Println("result:", line, err)
}

...