Pregunta

Estoy intentando escribir una concha en Ruby, y para poner en práctica la implementación del tabulador estoy usando el getch función de API de Windows para leer en un carácter a la vez por parte del usuario, la comprobación de las pestañas.

El problema con esto es el retroceso clave:

  1. Se mueve el cursor más atrás que el símbolo (por ejemplo, con hello> aviso, el usuario puede hacer retroceder el cursor a la h. Me gustaría que se detenga en el espacio final.
  2. Cuando el texto del usuario se desborda a la siguiente fila de la consola, la tecla de retroceso no se moverá de nuevo hasta la línea anterior.

(sé tanto de estos comportamientos son por diseño.)

Mi solución imaginado a estos problemas implicar controlar el movimiento del cursor; Necesito saber donde está el cursor, y ser capaz de moverlo.

En Linux, me gustaría utilizar secuencias de escape ANSI, pero estos no son apoyados por la consola de Windows.

He mirado en la API de Windows y trató de encontrar funciones que me dejaría hacer esto, pero todo lo que pudo encontrar fue función GetConsoleCursorInfo , que sólo devuelve el tamaño y la visibilidad del cursor.

Ejemplos serían apreciados, como estoy sin esperanza en el uso de la clase Win32API para otra cosa que funciones primitivas nada.

Gracias.

¿Fue útil?

Solución

Usted es probablemente mejor usar readline. Se incluye en el Rubí de Un clic instalador. Una configuración básica es:

require 'readline'

while line = Readline.readline('hello> ', true)
  #do something with line
  break if line == 'quit'
end

Ya que tendrá capacidades de readline estándar, como el retroceso, Alt + tecla de retroceso para eliminar una palabra, la historia y la implementación del tabulador. Hay una buena documentación sobre cómo personalizarlo para sus necesidades aquí .


Editar:

Si no tiene instalado readline, lo puede conseguir y otras bibliotecas externas aquí . Usted querrá que la readline-4.3-2-mswin32 paquete. Copiar el archivo readline.dll (ubicado en el directorio bin) a su directorio ruby\bin. Eso debería hacerlo.

A pesar de que no está documentada en la página principal Ruby, parece que también se puede utilizar readline 5, disponible aquí . En concreto, se necesita el binarios distribución . Copiar readline5.dll (en el directorio bin) a su directorio ruby\bin, y cambiarle el nombre a readline.dll.

Además, como nota al margen, no se alarme si require 'readline' devuelve falso cuando se utiliza IRB, ya que parece pre-cargarlo.

Otros consejos

Hmm, es ciertamente posible hacer copias de seguridad, y con código razonablemente portátil, como bash (1) puede realizar copias de seguridad a la línea anterior, incluso en una ventana de DOS. Me imagino que está utilizando termcap o ncurses, y tiene en la base de datos termcap un conjunto de códigos de control que trabajan para el cuadro de DOS.

En Ruby, no creo que hay ningún enlace Termcap, por lo que utilizar ncurses, en lugar de hardwiring en su programa un conjunto de códigos de control dependientes del dispositivo. (Usted quiere ncurses más de termcap de todos modos.)

Una vez que se cambia a ncurses Creo que va a encontrar los elementos de la API de hacer todo lo necesario, incluyendo copias de seguridad de las líneas y no sobrescribir el símbolo. (Y, ciertamente, no se debe realizar copias de seguridad sobre cualquier cosa que usted no lo hizo de salida para empezar, no importa lo que la biblioteca está en uso.)

En realidad, me gusta Pesto respuesta 's. Usar ncurses si readline no funciona o si necesita direccionamiento del cursor por alguna otra razón.

Para una implementación readline ventanas amigables a probar esto readline a base de rubí href="http://github.com/luislavena/rb-readline" rel="nofollow noreferrer">

scroll top