2016-10-03 5 views
3

사용자 입력을 루프로 받아들이고 백그라운드에서 응답을 출력하는 대화 형 응용 프로그램을 작성 중입니다. 이제Go에서 사용자 입력을 기다리는 동안 콘솔로 인쇄하는 방법?

>> Some text 
>> :: Hi I'm the user and I'm 

: 나는 사용자 입력을 기다리고있는 동안

scanner := bufio.NewReader(os.Stdin) 
for { 
    fmt.Print(":: ")    // prompt for user to enter stuff 
    in,_:=scanner.ReadString('\n') 
} 

그러나, 나는과 같이 네트워크를 통해 가지고 몇 가지 비동기 데이터를 인쇄하려면 : 내 코드의 리더 부분은 같다

>> Some text 
>> This data was printed while user was inputting 
>> :: Hi I'm the user and I'm 

을 이제 사용자는 자신의 입력을 완료 할 수 있습니다 : 몇 가지 배경 데이터가 도착

>> Some text 
>> This data was printed while user was inputting 
>> :: Hi I'm the user and I'm entering some text 
>> :: 

배경 루틴이 텍스트의 경우 stdin을 스캔하고, 어떻게 든 지우고, 자체 데이터를 인쇄하고, 원본 텍스트를 복원해야한다고 생각합니다. Enter 키를 통해 입력되지 않은 텍스트를 스캔하는 방법이나 선을 지우는 방법을 모르겠습니다. 어떻게해야합니까?

+2

아마 이러한 https://github.com/avelino/awesome-go#advanced-console-uis 중 하나를 사용하여 이와 유사한 작업을 수행 할 수 있습니다. 특히 termbox 또는 그 위에 구축 된 패키지 중 하나가 될 수 있습니까? 덕분에 @ 0cbwlkr – jcbwlkr

+0

. 나는 당신의 링크에서'termbox-go'를 사용하여 끝내었다. 내 자신의 인쇄 기능을 작성하고 커서 위치 등을 관리해야했지만 결국에는 내가 원하는 효과를 얻었습니다. – hazrmard

답변

1

줄을 지우려면 \r을 사용하여 줄의 시작 부분으로 커서를 놓은 다음 줄의 모든 문자를 공백으로 바꾸고 다시 \r을 입력하여 줄의 처음으로 다시 돌아갑니다. 예를 들어 (필요한 경우 더 많은 공백을 추가) :

fmt.Printf("\r              \r") 

이제 입력 한 데이터를 사용자의 상단에 배경 데이터를 인쇄 할 수 있습니다.

그러면 사용자가 입력 한 데이터를 어떻게 다시 인쇄합니까? 터미널 자체에서 읽을 수 없으므로 입력하는 동안 어딘가에 저장해야합니다. 이렇게하는 한 가지 방법은 터미널에서 입력 버퍼링을 비활성화하여 입력 한 각 문자를 즉시 ​​읽을 수있는 stdin으로 플러시하는 것입니다. 예를 들면 :

var input []byte 
reader := bufio.NewReader(os.Stdin) 
// disables input buffering 
exec.Command("stty", "-F", "/dev/tty", "cbreak", "min", "1").Run() 
// append each character that gets typed to input slice 
for { 
     b, err := reader.ReadByte() 
     if err != nil { 
       panic(err) 
     } 
     input = append(input, b) 
} 

그래서 당신은 다음, 첫번째 라인을 취소, 배경 데이터를 삽입하여 배경 데이터를 인쇄하고 마지막으로 다음 줄에 입력 변수의 내용을 인쇄해야 할 때.

+0

감사합니다. 그러나 이것은 'exec.Command'에 인수가 주어지면 윈도우가 아닌 리눅스에서만 작동합니다. – hazrmard

관련 문제