2015-06-07 9 views
7

Sto creando un'applicazione Go per l'utilizzo in un terminale. Il seguente codice chiede a un utente di inserire il testo nel terminale.Ingresso terminale chiave a cursore in Go

package main 

import (
    "bufio" 
    "fmt" 
    "os" 
) 

func main() { 
    for { 
     fmt.Println("Please input something and use arrows to move along the text left and right") 
     in := bufio.NewReader(os.Stdin) 
     _, err := in.ReadString('\n') 
     if err != nil { 
      fmt.Println(err) 
     } 
    } 
} 

Il problema è che l'utente non può utilizzare le frecce destra e sinistra per percorrere il testo appena immesso per modificarlo. Quando preme le frecce, la console stampa i segni ^[[D^[[C^[[A^[[B.

L'output:

Please input something and use arrows to move along the text left and right 
hello^[[D^[[C^[[A^[[B 

Come fare tasti freccia si comportano più user-friendly e lasciare che un essere umano naviga lungo il testo appena immesso, utilizzando le frecce destra e sinistra?

Immagino che dovrei prestare attenzione alle librerie come termbox-go o gocui ma come utilizzarle esattamente per questo scopo, non lo so.

risposta

3

Un esempio più semplice sarebbe carmark/pseudo-terminal-go, in cui è possibile inserire uno terminal in raw mode e trarre vantaggio dalle mosse del cursore su-giù sinistra-destra.

Da terminal.go#NewTerminal()

// NewTerminal runs a VT100 terminal on the given ReadWriter. If the ReadWriter is 
// a local terminal, that terminal must first have been put into raw mode. 
// prompt is a string that is written at the start of each input line (i.e. 
// "> "). 
func NewTerminal(c io.ReadWriter, prompt string) *Terminal 

Vedi terminal/terminal.go e terminal/terminal_test.go, così come MakeRaw()

+1

non posso installare questa libreria. '$ Andare a prendere github.com/carmark/uscite pseudo-terminal-go' ' pacchetto github.com/carmark/pseudo-terminal-go \t importazioni terminale: non riconosciuta percorso di importazione "terminale" ' –

+0

@MaximYefremov sono d'accordo. Era più per dare un esempio di codice riguardante l'implementazione di un terminale, e il fatto che ha bisogno di essere messo in modalità raw. – VonC

+0

Funziona alla grande, devi importare "github.com/carmark/pseudo-terminal-go/terminal" –