[RUBY] Ich habe die Grundlagen der Zeicheneingabe verstanden

Hintergrund

Wenn ich Vim berührte, trat jedes Mal eine Aktion auf, wenn ich ein Zeichen eingab. Daher war ich technisch daran interessiert, wie es funktioniert, und versuchte, den Quellcode zu lesen.

Wissensstand

Ich weiß, dass ich mit getc () und get () Zeile für Zeile eingeben kann, aber ich weiß nicht, wie ich jede Tasteneingabe verarbeiten soll.

Erwartetes Verhalten

Ich stellte mir vor, dass es nach meinem eigenen Wissen leicht zu denken war, dass es so wäre, als würde man die Zeicheneingabe in einem anderen Thread überwachen und den Hauptthread benachrichtigen, wenn es eine Schlüsseleingabe gäbe.

Schauen Sie sich wincons.rb an

Ich erinnere mich, dass ich vor langer Zeit eine Ruby-Konsolenbibliothek namens wincons.rb geschrieben habe, die nach Eingabe eines einzelnen Zeichens enden würde, und ich habe mich gefragt, wie dies erreicht wurde.

Sie können die Quelle aus dem Folgenden beziehen. http://texcell.co.jp/ruby/Lib/winconsole.html

Wenn man es betrachtet, scheint es, dass es durch Aufrufen einer Funktion namens PeekConsoleInputW von win32api realisiert wird.

http://texcell.co.jp/ruby/PLC/rubyc24.html ↑ Wenn man sich die Beispiele hier ansieht, scheint es, dass die Schlüsseleingabeprüfung immer in der Schleife durchgeführt wird und endet, wenn q kommt.

Zeigen Sie den Vim-Quellcode an

Ist der Weg wincons.rb wirklich richtig? Ich hatte auch eine Frage und beschloss, mir den Vim-Quellcode anzusehen.

Der Quellcode kann von github bezogen werden. https://github.com/vim/vim

Als ich den Ort durchsuchte, an dem PeekConsoleInputW verwendet wurde, stellte ich fest, dass es in der Funktion read_console_input von src / os_win32.c verwendet wurde.

Dieser read_console_input scheint von einigen Stellen aus aufgerufen zu werden, und ich wusste nicht, welcher direkt mit der Tastatureingabe verbunden war, also gab ich auf.

Zeigen Sie den Readline-Quellcode an

Die mit Ruby gelieferte Readline ruft den Abschlussprozess auf, wenn Sie die TAB-Taste drücken. Ich gehe davon aus, dass es einen Prozess wie das Aufrufen von Proc geben muss, wenn die TAB-Taste gedrückt wird.

Zuerst Code, der die mit Ruby gelieferte Readline liest

Die Rubinquelle ist aus dem Folgenden ersichtlich. https://github.com/ruby/ruby

Die Quelle für readline ist "ext / readline".

Nach vielen Recherchen stellte ich fest, dass die Funktion, die Proc aufruft, "readline_attempted_completion_function" ist. Die Funktion ist an rl_attempted_completion_function gebunden.

Die rl_attempted_completion_function befindet sich nicht im Ruby-Code, sondern im GNU-Readline-Code. Lesen Sie das also.

Die Quelle der GNU-Readline finden Sie unten. https://github.com/JuliaLang/readline

Es ist nicht gerade die wahre Quelle der GNU-Readline, aber ich denke nicht, dass es ein Problem für dieses Verständnis ist.

Die rl_attempted_completion_function ist in complete.c, aber ich konnte diesen Punkt nicht erreichen, indem ich in der Zeit zurückging.

Erfahren Sie, wie Sie readline verwenden

Wenn ich mich hier umsehe, sieht readline wie eine Wurzel aus, also habe ich beschlossen, es Schritt für Schritt von der Wurzel aus zu überprüfen. http://d.hatena.ne.jp/cocoatomo/20071112/1194855728

readline () befindet sich in readline.c. Während Sie diese Funktion durchlaufen, scheint es, dass "kbhit ()" in "rl_gather_tyi ()" von "input.c" der Schlüssel zur Schlüsseleingabe ist.

Was ist kbhit ()?

Wenn Sie hier schauen http://tricky-code.net/mine/c/mc07kbhit.php

Die kbhit-Funktion gibt einen Wert ungleich Null zurück, wenn eine Taste gedrückt wird. Eine Funktion, die 0 zurückgibt, wenn keine Taste gedrückt wird.

Es scheint, dass dies selbst nicht bestimmt, welche Taste gedrückt wurde.

Es scheint, dass tatsächlich die Funktion "read ()" in "rl_getc (stream)" aufgerufen und ein Zeichen aus dem als Argument übergebenen E / A gelesen wird.

Wenn Sie es in einer Schleife drehen, scheint es, dass die Tasteneingabe immer zeichenweise überprüft und überprüft wird.

Es gab keinen Thread.

Zusammenfassung

readline prüft Tastenanschläge in einer Schleife ohne Verwendung von Threads.

Ich benutze kbhit (), um festzustellen, ob es einen Tastenanschlag gab

Zeichen werden einzeln mit "read ()" erfasst.

Recommended Posts

Ich habe die Grundlagen der Zeicheneingabe verstanden
[Tag: 5] Ich habe die Grundlagen von Java zusammengefasst
Ich habe die Typen und Grundlagen von Java-Ausnahmen zusammengefasst
Docker-Überwachung - Erläuterung der Grundlagen der Grundlagen
Grundlagen der Zeichenoperation (Java)
Ich habe versucht, die Grundlagen von Kotlin und Java zusammenzufassen
Über die Grundlagen der Android-Entwicklung
Ich habe die Quelle von ArrayList gelesen, die ich gelesen habe
Die Grundlagen von SpringBoot + MyBatis + MySQL
Ich habe die Quelle von Integer gelesen
Ich habe die Quelle von Long gelesen
Ich habe die Quelle von Short gelesen
Ich habe die Quelle von Byte gelesen
Ich habe die Quelle von String gelesen
Ich habe den Eingabe- / Ausgabetyp von Java Lambda ~ Map Edition ~ ausprobiert
Ich möchte die Eingabe begrenzen, indem ich den Zahlenbereich einschränke
[Herausforderung CircleCI von 0] Lernen Sie die Grundlagen von CircleCI
Jetzt habe ich die Grundlagen von RecyclerView zusammengefasst
Aufgenommen, weil ich süchtig nach der Standardeingabe der Scannerklasse war
Ich habe die interne Verarbeitung von Retrofit untersucht
Rückblick auf die Grundlagen von Java
Zeichenfolgenvergleich: Ich war in das Skill-Check-Problem von Paisa verwickelt
Was ist JSP? ~ Lassen Sie uns die Grundlagen von JSP kennen !! ~
[Ruby] Zusammenfassung der Klassendefinitionen. Beherrsche die Grundlagen.
Ich habe den Teil von java.net.URL # getPath überprüft
[Löschen Sie den ersten Buchstaben der Zeichenfolge] Ruby
Ich habe die Eigenschaften von Java und .NET verglichen
Ich möchte den Inhalt der Absicht var_dump
So zeigen Sie das Ergebnis des Ausfüllens des Formulars an
Ich habe versucht, den Profiler von IntelliJ IDEA zu verwenden
Ich habe die Anzahl der Taxis mit Ruby überprüft
Probieren Sie Progate Free Edition [Java I]
Grundlagen von Ruby
Ich habe den Lebenszyklus der Erweiterung von JUnit Jupiter untersucht
Ich habe versucht, die Server-Push-Funktion von Servlet 4.0 zu verwenden
Ist drainTo von LinkedBlockingQueue sicher? Ich bin der Quelle gefolgt
[Für Anfänger] DI ~ Die Grundlagen von DI und DI im Frühjahr ~
Ich habe die Listenansicht der Android-Entwicklung gemeinsam gesehen
05. Ich habe versucht, die Quelle von Spring Boot zu löschen
Ich habe versucht, die Kapazität von Spring Boot zu reduzieren
Ich habe den neuen Feature-Profiler von IntelliJ IDEA 2019.2 ausprobiert.
Ich möchte die Antwort der Janken-App wissen
Ich möchte den Namen des Posters des Kommentars anzeigen
Ich habe das Anzeigeformat der JSON-Antwort von Rails zusammengefasst
Rails6: Geben Sie die Anfangsdaten von ActionText mit seed ein
Ich habe ein Sequenzdiagramm des j.u.c.Flow-Beispiels geschrieben
Ich bin mir der Bequemlichkeit des Graphql-Code-Generators Teil 2 sehr bewusst
[Ruby] Klassenverschachtelung, Vererbung und die Grundlagen des Selbst
Ich kann den Bildschirm der Rails-Datenbankkonsole nicht verlassen
Ich möchte die Bildlaufposition von UITableView zurückgeben!
Ich habe eine Frage zur Tastatureingabe von Zahlen