Domanda

Sto cercando di scrivere un guscio in Ruby, e di attuare il completamento scheda sto usando la funzione WinAPI getch a leggere in un carattere alla volta da parte dell'utente, controllando per le schede.

Il problema di questo è il backspace Chiave:

  1. muove il cursore più indietro rispetto alla richiesta (ad esempio, con il richiamo hello>, l'utente può tornare indietro il cursore al h. Desidero per arrestare lo spazio finale.
  2. Quando il testo dell'utente overflow alla riga successiva della console, backspace non si sposterà indietro fino alla riga precedente.

(so che entrambi questi comportamenti sono in base alla progettazione.)

mia soluzione a questi problemi immaginato coinvolgere controllare il movimento del cursore; Ho bisogno di sapere dove si trova il cursore, ed essere in grado di muoversi.

Su Linux, vorrei usare le sequenze di escape ANSI, ma questi non sono supportati dalla console di Windows.

Ho esaminato il WinAPI e cercato di trovare le funzioni che mi permetta di fare questo, ma tutto quello che riuscito a trovare era GetConsoleCursorInfo funzione che restituisce solo la dimensione e la visibilità del cursore.

Esempi sarebbe apprezzato, come io sono senza speranza al utilizzando la classe Win32API per qualcosa di diverso funzioni primitive.

Grazie.

È stato utile?

Soluzione

Siete probabilmente meglio utilizzare readline. E 'incluso nel Ruby One-Click installer. Una configurazione di base è:

require 'readline'

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

avrete già funzionalità di readline standard come backspacing, Alt + Backspace per cancellare una parola, la storia, e il completamento scheda. C'è una buona documentazione su come personalizzarlo per le vostre esigenze qui .


Modifica:

Se non si dispone di readline installato, si può ottenere e di altre librerie esterne qui . Vorrete il readline-4.3-2-MSWIN32 pacchetto. Copiare il file readline.dll (si trova nella directory bin) alla directory ruby\bin. Che dovrebbe farlo.

Anche se non è documentato sulla home page Ruby, sembra come se si può anche utilizzare readline 5, disponibile qui . In particolare, è necessario il href="http://gnuwin32.sourceforge.net/downlinks/readline-bin-zip.php" rel="nofollow noreferrer"> binari distribuzione bin) nella directory ruby\bin, e rinominarlo in readline.dll.

Inoltre, come nota a margine, non allarmatevi se require 'readline' restituisce false quando si utilizza IRB, dal momento che sembra pre-caricarlo.

Altri suggerimenti

Hmm, è certamente possibile eseguire il backup, e con il codice ragionevolmente portatile, come bash (1) può eseguire il backup alla riga precedente, anche in una finestra DOS. Immagino che sta usando termcap o ncurses, ed ha nel database termcap un insieme di codici di controllo che lavorano per la finestra DOS.

In Ruby, non credo che ci siano attacchi termcap, in modo da utilizzare ncurses, piuttosto che hardwiring nel tuo programma una serie di codici di controllo dipendenti dal dispositivo. (Si vorrebbe ncurses oltre termcap comunque.)

Una volta che si passa a ncurses credo troverete elementi API di fare tutto il necessario, compreso il backup di linee e non sovrascrivere il prompt. (E certamente non si deve eseguire il backup di più di tutto ciò che non hai fatto l'uscita per cominciare, non importa quale biblioteca è in uso.)

In realtà, un po 'come Pesto risposta s' . Utilizzare ncurses se readline non funziona o se avete bisogno del cursore di indirizzamento per qualche altro motivo.

Per un'implementazione readline finestre-friendly provare questo rubino a base

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top