Wie bekomme ich ein einzelnes Zeichen, ohne Enter zu drücken?
Wie kann ich eine einzelne Taste auf der Tastatur Zeichen aus dem terminal mit Ruby ohne drücken der EINGABETASTE?
Ich habe versucht Curses::getch
, aber das hat nicht wirklich funktioniert für mich.
Kommentar zu dem Problem
mögliche Duplikate von einzelne char von der Konsole sofort
InformationsquelleAutor der Frage Nino | 2008-10-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/2999
(Getestet auf meinem OS X system, vielleicht nicht portierbar auf alle Ruby-Plattformen). Sehen http://www.rubyquiz.com/quiz5.html für ein paar zusätzliche Anregungen, auch für Windows.
InformationsquelleAutor der Antwort Jay
Da ruby 2.0.0, es ist ein 'io/console" in der stdlib, die mit dieser Funktion
InformationsquelleAutor der Antwort iNecas
@Jay gab eine großartige Antwort, aber es gibt zwei Probleme:
Eine einfache Lösung dafür ist, um zu speichern der frühere tty, und verwenden Sie folgenden Parameter:
-icanon
- disable canonical-Eingang (ERASE und KILL-Verarbeitung);isig
- aktivieren der überprüfung von Zeichen gegen das spezielle Zeichen INTR, QUIT, SUSP.Am Ende hätte man eine Funktion wie diese:
InformationsquelleAutor der Antwort Andrew
Raw-Modus (
stty raw -echo
) leider bewirkt, dass control-C zum Holen geschickt, als Zeichen, nicht als SIGINT. Also, wenn Sie wollen, blockieren Eingang wie oben, aber dem Benutzer erlauben, hit Ctrl-C um das Programm zu stoppen, während Sie warten, stellen Sie sicher, dies zu tun:Und wenn Sie wollen, non-blocking input -- , ist regelmäßig zu prüfen, wenn der Benutzer eine Taste drücken, aber in der Zwischenzeit, gehen Sie anderes zu tun-dann können Sie dies tun:
Beachten Sie, dass Sie brauchen nicht eine spezielle SIGINT-handler für die nicht-blockierende version, da die tty-Schnittstelle ist nur im raw-Modus für einen kurzen moment.
InformationsquelleAutor der Antwort AlexChaffee
Hinweis: Dies ist eine alte Antwort und die Lösung nicht mehr funktioniert auf den meisten Systemen.
Aber die Antwort könnte immer noch nützlich sein, für einige Umgebungen, wo die anderen Methoden nicht funktionieren. Bitte Lesen Sie die Kommentare unten.
Zuerst müssen Sie installieren highline:
Dann versuchen, ob die highline-Methode für Sie funktioniert:
InformationsquelleAutor der Antwort mit
Und wenn Sie Gebäude Flüche Anwendung ist, müssen Sie rufen
http://www.ruby-doc.org/stdlib-1.9.3/libdoc/curses/rdoc/Curses.html#method-c-cbreak
InformationsquelleAutor der Antwort lzap