chzyer / readline

Readline is a pure go(golang) implementation for GNU-Readline kind library
MIT License
2.08k stars 275 forks source link

Autocomplete using net.Conn #236

Open vl-axentia opened 3 months ago

vl-axentia commented 3 months ago

Im trying to use this to get autocomplete through a socket connection, something like this:

var completer = readline.NewPrefixCompleter(
    readline.PcItem("version"),
)

func (c *Console) consoleHandler(conn net.Conn) {
    defer conn.Close()

    rl, err := readline.NewEx(&readline.Config{
        Prompt:         "> ",
        AutoComplete:   completer,
        Stdin:          conn,
        Stdout:         conn,
        Stderr:         conn,
        UniqueEditLine: true,
    })
    if err != nil {
        log.Printf("ERROR: Failed to setup readline: %+v", err)
        return
    }
    defer rl.Close()

    for {
        line, err := rl.Readline()
        if err != nil {
            break
        }

        c.executeCommand(strings.TrimSpace(line), rl)
    }
}

func (c *Console) executeCommand(cmd string, r io.Writer) {
    switch cmd {
    case "version":
        fmt.Fprintf(r, "%s\n", config.Version)
    default:
        fmt.Fprintf(r, "unknown command\n")
    }
}

If I remove the three lines redirecting stdin/stdout/stderr to the conn object, things work like I would expect when pressing TAB. However, when using conn, it instead seems to autocomplete when pressing TAB without displaying it and instead simply adds a TAB character. The second time I wrote version, I pressed TAB before pressing enter.

image