2015-06-07 15 views
7

Tworzę aplikację Go do użycia w terminalu. Poniższy kod prosi użytkownika o wprowadzenie tekstu do terminalu.Wejście terminalu klucza kursora w 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) 
     } 
    } 
} 

Problem polega na tym, że użytkownik nie może używać strzałek w lewo i w prawo, aby przejść do właśnie wprowadzonego tekstu, aby go zmodyfikować. Gdy naciśnie strzałki, konsola wypisze znaki.

Wyjście:

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

Jak zrobić przyciski strzałek zachowywać bardziej przyjazny dla użytkownika i niech człowiek nawigować po prostu wprowadzonym tekście, używając strzałek w prawo i lewo?

Chyba powinienem zwrócić uwagę na biblioteki takie jak termbox-go lub gocui, ale jak z nich korzystać dokładnie w tym celu, nie wiem.

Odpowiedz

3

Prostszym przykładem może być carmark/pseudo-terminal-go, w którym można umieścić terminal in raw mode i korzystać z pełnych ruchów kursora góra-dół-lewo-prawo.

Od 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 

Zobacz terminal/terminal.go i terminal/terminal_test.go, jak również MakeRaw()

+1

Nie mogę zainstalować tej biblioteki. '$ go get github.com/carmark/pseudo-terminal-go' wyjścia 'pakiet github.com/carmark/pseudo-terminal-go \t terminal importu: nierozpoznany import ścieżki" terminal "' –

+0

@MaximYefremov Zgadzam się. Chodziło raczej o podanie kodu dotyczącego implementacji terminala i faktu, że musi on zostać włączony w tryb raw. – VonC

+0

Działa wspaniale, musisz zaimportować "github.com/carmark/pseudo-terminal-go/terminal" –