2017-10-16 5 views
2

J'écris une interface de texte dans golang, et si vous tapez pendant qu'il imprime, il va interférer avec le texte présenté. Je sais que « stty -echo » arrêtera l'écho de sortie et « stty echo » du clavier Réactive, mais quand j'écris des fonctions comme:comment désactiver le clavier lors de l'impression dans le terminal dans golang

func disableKeyboard() { 
    c := exec.Command("stty -echo") 
    c.Stdout = os.Stdout 
    c.Run() 
} 

func enableKeyboard() { 
    c := exec.Command("stty echo") 
    c.Stdout = os.Stdout 
    c.Run() 
} 

ceux-ci ont aucun impact sur ma production de programmes. Est-ce qu'il y a quelque chose qui ne va pas dans la façon dont j'expédie ces commandes?

Quelque chose comme:

disableKeyboard() 
time.Sleep(time.Second) 
enableKeyboard() 

ne fonctionne pas. J'utilise un mac actuellement.

+2

Lorsque vous utilisez 'exec.Command', vous passez à un nouveau processus d'arrière-plan. Cela n'affectera pas le TTY utilisé par l'utilisateur pour interagir avec votre application. – Adrian

+0

c'est ce que je pensais, y a-t-il un moyen de contourner cela afin que je puisse désactiver temporairement le clavier dans le processus en cours? – Rob

+1

aussi, pourquoi le downvote? – Rob

Répondre

4

Le crypto/ssh/terminal package (qui n'est pas une librairie standard pour quelque raison que ce soit) a un code qui répond à vos besoins, même s'il utilise des appels système de bas niveau pour que cela se produise. Vous pouvez probablement l'adapter à ce que vous essayez de faire (en utilisant syscall.Stdin comme descripteur de fichier). Comme Flimzy l'a fait remarquer, cependant, cela ne désactive toujours pas l'entrée clavier, il la supprime simplement de l'écho au terminal, donc vous devrez peut-être vider l'entrée si vous en dépendez plus tard.

+0

c'est assez bon cependant, je pense que vous avez parfaitement capturé mon intention – Rob