Frage

Ich versuche, eine Schale in Ruby zu schreiben, und Tabulatorvervollständigung zu implementieren ich die WinAPI Funktion getch bin mit in einem Zeichen in einer Zeit von dem Benutzer zu lesen, für Registerkarten zu überprüfen.

Das Problem dabei ist, die Backspace Taste:

  1. Er bewegt den Cursor weiter zurück als die Eingabeaufforderung (zB mit prompter hello>, kann der Benutzer den Cursor ein Zeichen zurückzugehen auf die h. Ich kann es in der letzten Raum stoppen möchten.
  2. Wenn der Text des Benutzers in die nächste Zeile der Konsole überläuft auf, Backspace nicht wieder in die vorherige Zeile.

(Ich weiß, diese beiden Verhaltensweisen sind von Entwurf.)

Meine vorstellen Lösung für diese Probleme betreffen die Steuerung der Cursor-Bewegung; Ich muss wissen, wo sich der Cursor befindet, und in der Lage, ihn zu bewegen.

Unter Linux würde ich verwenden ANSI Escape-Sequenzen, aber diese sind nicht von der Windows-Konsole unterstützt.

Ich habe in die WinAPI geschaut und versucht, Funktionen zu finden, die mir dies tun lassen würde, aber alles, was ich konnte war GetConsoleCursorInfo Funktion, die nur die Größe und die Sichtbarkeit des Cursors zurück.

Beispiele würden geschätzt, wie ich die Win32API Klasse bei Verwendung für etwas anderes als primitive Funktionen hoffnungslos bin.

Danke.

War es hilfreich?

Lösung

Du bist wahrscheinlich besser dran Readline- verwenden. Es ist in dem Ruby-One-Click-Installer enthalten. Eine Grundeinstellung ist:

require 'readline'

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

Schon werden Sie Standard Readline- Fähigkeiten haben wie backspacing, Alt + Backspace ein Wort, Geschichte und Tabulatorvervollständigung zu löschen. Es gibt gute Dokumentation, wie Sie für Ihre Bedürfnisse anpassen es hier .


Edit:

Wenn Sie nicht Readline- installiert haben, können Sie es bekommen und andere externe Bibliotheken hier . Sie verlassen nun die Readline--4.3-2-mswin32 Paket. Kopieren Sie die readline.dll Datei (befindet sich im Verzeichnis bin) zu Ihrem ruby\bin Verzeichnis. Das sollte es tun.

Auch wenn es auf der Ruby-Homepage nicht dokumentiert ist, sieht es aus, als ob Sie auch Readline- 5, verfügbar hier . Insbesondere müssen Sie die Binärdateien Verteilung. Kopieren readline5.dll (im bin Verzeichnis), um Ihre ruby\bin Verzeichnis, und benennen Sie sie in readline.dll.

Auch als eine Randnotiz, nicht beunruhigt, wenn require 'readline' false zurückgibt, wenn irb verwenden, da sie es vorab geladen wird.

Andere Tipps

Hmm, es ist sicherlich möglich zu sichern, und mit recht portablen Code, wie bash (1) bis zu der vorherige Zeile auch in einem Kasten dos zurück. Ich stelle mir vor es termcap oder ncurses verwendet, und es hat in der termcap Datenbank einen Satz von Steuercodes, die für die DOS-Box funktionieren.

In Ruby, ich glaube nicht, dass es irgendwelche Termcap Bindungen, so dass Sie ncurses verwenden, anstatt feste Verdrahtung in Ihr Programm eine Reihe von geräteabhängigen Steuercodes. (Sie würden ncurses über Termcap wollen sowieso.)

Wenn Sie auf ncurses schalte ich glaube, Sie API-Elemente finden alles, was Sie tun müssen, einschließlich Linien Sichern und die Eingabeaufforderung nicht überschrieben werden. (Und natürlich sollten Sie nicht über alles sichern, dass Sie nicht ausgegeben haben, mit zu beginnen, egal zu welcher Bibliothek wird verwendet.)

Eigentlich habe ich ein bisschen wie Pesto 's Antwort. Verwenden Sie ncurses wenn readline nicht funktioniert oder wenn Sie den Cursor aus einem anderen Grund Adressierung.

Für eine Windows-freundliche Readline- Implementierung versuchen, diese Rubin-basierte Readline-

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top