[RUBY] J'ai compris les bases de la saisie de caractères

Contexte

Quand je touche Vim, une action se produit chaque fois que j'entre un caractère, donc j'étais techniquement intéressé par son fonctionnement, alors j'ai essayé de lire le code source.

Niveau de connaissance

Je sais que je peux saisir ligne par ligne avec getc () et gets (), mais je ne sais pas comment traiter chaque entrée clé.

Comportement attendu

J'ai imaginé qu'il était facile de penser de ma propre connaissance que ce serait comme surveiller l'entrée de caractère dans un autre thread et notifier le thread principal s'il y avait une entrée clé.

Regardez wincons.rb

Je me souviens avoir écrit une bibliothèque de console Ruby appelée wincons.rb il y a longtemps qu'elle se terminerait après avoir entré un seul caractère, et je me demandais comment cela était réalisé.

Vous pouvez obtenir la source à partir de ce qui suit. http://texcell.co.jp/ruby/Lib/winconsole.html

En le regardant, il semble qu'il se réalise en appelant une fonction appelée PeekConsoleInputW de win32api.

http://texcell.co.jp/ruby/PLC/rubyc24.html ↑ En regardant les exemples ici, il semble que la vérification de l'entrée de clé est toujours effectuée dans la boucle, et elle se termine quand q arrive.

Afficher le code source de Vim

La manière dont wincons.rb est-elle vraiment correcte? J'avais aussi une question, alors j'ai décidé de jeter un œil au code source de Vim.

Le code source peut être obtenu à partir de github. https://github.com/vim/vim

Quand j'ai cherché l'endroit où PeekConsoleInputW mentionné plus tôt était utilisé, j'ai trouvé qu'il était utilisé dans la fonction read_console_input de src / os_win32.c.

Ce read_console_input semble être appelé de pas mal d'endroits, et je ne savais pas lequel était directement connecté à l'entrée du clavier, alors j'ai abandonné.

Afficher le code source readline

La ligne de lecture fournie avec ruby appelle le processus complémentaire lorsque vous appuyez sur la touche TAB. Je suppose qu'il doit y avoir un processus tel que l'appel de Proc lorsque la touche TAB est enfoncée.

Tout d'abord, le code lisant la ligne de lecture fournie avec ruby

La source du rubis peut être vue de ce qui suit. https://github.com/ruby/ruby

La source de readline est autour de ʻext / readline`.

Après de nombreuses recherches, j'ai trouvé que la fonction qui appelle Proc est readline_attempted_completion_function. La fonction est liée à rl_attempted_completion_function.

La fonction rl_attempted_completion_function n'est pas dans le code ruby, mais dans le code readline GNU, alors lisez cela.

La source de GNU readline peut être trouvée ci-dessous. https://github.com/JuliaLang/readline

Ce n'est pas exactement la véritable source de GNU readline, mais je ne pense pas que ce soit un problème pour cette compréhension.

La fonction rl_attempted_completion_function est dans complete.c, mais je n'ai pas pu arriver à ce point en remontant dans le temps.

Découvrez comment utiliser readline

En regardant ici, readline ressemble à une racine, alors j'ai décidé de le vérifier étape par étape depuis la racine. http://d.hatena.ne.jp/cocoatomo/20071112/1194855728

readline () se trouve dans readline.c. Au fur et à mesure que vous parcourez cette fonction, il semble que kbhit () dans rl_gather_tyi () de ʻinput.c` soit la clé de l'entrée clé.

Qu'est-ce que kbhit ()?

Si tu regardes ici http://tricky-code.net/mine/c/mc07kbhit.php

La fonction kbhit renvoie une valeur non nulle lorsqu'une touche est enfoncée, Une fonction qui renvoie 0 si aucune touche n'est enfoncée.

Il semble que cela ne détermine pas en soi quelle touche a été enfoncée.

Il semble que ce qui est réellement pris est d'appeler la fonction read () dans rl_getc (stream) et de lire un caractère de l'IO passé en argument.

En le retournant en boucle, il semble que l'entrée de la touche soit toujours vérifiée et vérifiée caractère par caractère.

Il n'y avait pas de fil.

Résumé

readline vérifie les frappes dans une boucle sans utiliser de threads.

J'utilise kbhit () pour déterminer s'il y a eu une frappe

Les caractères sont acquis un par un en utilisant read ().

Recommended Posts

J'ai compris les bases de la saisie de caractères
[jour: 5] J'ai résumé les bases de Java
J'ai résumé les types et les bases des exceptions Java
Surveillance Docker-expliquant les bases des bases-
Principes de base de l'utilisation des caractères (Java)
J'ai essayé de résumer les bases de kotlin et java
À propos des bases du développement Android
J'ai lu la source de ArrayList que j'ai lu
Les bases de SpringBoot + MyBatis + MySQL
J'ai lu la source d'Integer
J'ai lu la source de Long
J'ai lu la source de Short
J'ai lu la source de Byte
J'ai lu la source de String
J'ai essayé le type d'entrée / sortie de Java Lambda ~ Map edition ~
Je veux limiter l'entrée en réduisant la plage de nombres
[Challenge CircleCI from 0] Apprenez les bases de CircleCI
Maintenant, j'ai résumé les bases de RecyclerView
Enregistré parce que j'étais accro à l'entrée standard de la classe Scanner
J'ai étudié le traitement interne de Retrofit
Retour sur les bases de Java
Comparaison de chaînes de caractères: j'ai été pris dans le problème de vérification des compétences de Paisa
Qu'est-ce que JSP? ~ Connaissons les bases de JSP !! ~
[Ruby] Résumé des définitions de classe. Maîtrisez les bases.
J'ai vérifié la partie de java.net.URL # getPath
[Supprimer la première lettre de la chaîne de caractères] Ruby
J'ai comparé les caractéristiques de Java et .NET
Je veux var_dump le contenu de l'intention
Comment afficher le résultat du remplissage du formulaire
J'ai essayé d'utiliser le profileur d'IntelliJ IDEA
J'ai vérifié le nombre de taxis avec Ruby
Essayez Progate Free Edition [Java I]
Bases de Ruby
J'ai examiné le cycle de vie de l'extension de JUnit Jupiter
J'ai essayé d'utiliser la fonction Server Push de Servlet 4.0
DrainTo de LinkedBlockingQueue est-il sûr? J'ai suivi la source
[Pour les débutants] DI ~ Les bases de DI et DI au printemps ~
J'ai vu la liste du développement Android collectivement
05. J'ai essayé de supprimer la source de Spring Boot
J'ai essayé de réduire la capacité de Spring Boot
J'ai essayé le nouveau profileur de fonctionnalités d'IntelliJ IDEA 2019.2.
Je veux connaître la réponse de l'application Janken
Je souhaite afficher le nom de l'affiche du commentaire
J'ai résumé le format d'affichage de la réponse JSON de Rails
Rails6: saisissez les données initiales d'ActionText à l'aide de seed
J'ai écrit un diagramme de séquence de l'exemple j.u.c.Flow
Je suis parfaitement conscient de la commodité de graphql-code-generator partie 2
[Ruby] Imbrication de classes, héritage et principes de base de soi
Je ne peux pas sortir de l'écran de la console Rails db
Je veux retourner la position de défilement de UITableView!
J'ai une question sur la saisie de chiffres au clavier