2012-09-10 9 views
8

Me gustaría enviar las pulsaciones del teclado del usuario a un canal directamente después de cada pulsación de tecla individual en stdin.Enviar pulsaciones de teclas estándar al canal sin nueva línea requerida

He intentado el siguiente código, pero esto no da el resultado deseado porque el método reader.ReadByte() bloquea hasta que se ingrese nueva línea.

func chars() <-chan byte { 
    ch := make(chan byte) 
    reader := bufio.NewReader(os.Stdin) 
    go func() { 
     for {   
      char, err := reader.ReadByte() 
      if err != nil { 
       log.Fatal(err) 
      } 
      ch <- char 
     } 
    }() 
    return ch 
} 

Gracias por cualquier consejo sobre cómo podría yo obtener cada carácter de entrada de usuario para ir inmediatamente al canal sin la necesidad de tener un carácter de nueva línea.

Respuesta

10

Stdin tiene un buffer de línea por defecto. Esto significa que no le dará ninguna entrada hasta que se encuentre una línea nueva. Esto no es algo específico.

Hacer que se comporte de una manera no amortiguada es altamente específico de la plataforma. Como Rami sugirió, ncurses es una forma de hacerlo. Otra opción es el paquete go-termbox mucho más liviano.

Si desea hacerlo todo de forma manual (al menos en Linux), puede buscar escribir enlaces C para termios o hacer syscalls directamente en Go.

Cómo manejan esto las plataformas como Windows, no sé. Puede profundizar en el código fuente de ncurses o termbox para ver cómo lo hicieron.

+0

Gracias por la información. Me alegro de haber hecho mi pregunta, o me habría equivocado inútilmente tratando de hacer que esto funcione por más tiempo. En cualquier caso, me gustan las sugerencias de termbox/ncurses que mencionaron usted y Rami. Nunca había considerado este enfoque, pero termbox en particular parece muy accesible y debería hacer exactamente lo que quiero de todos modos. – Kim

Cuestiones relacionadas