7
votes

Comment impliquerait-on l'achèvement de l'onglet de type Bash?

J'essaie de déterminer comment le système imprime les caractères à une entrée standard - c'est-à-dire comment il imprime les caractères que l'utilisateur peut supprimer et qui sont considérés comme une entrée si l'utilisateur frappe "Entrée".

J'arrive à utiliser c, mais je serais très surpris si la solution dépendait de la langue.

Merci pour des idées! : D


3 commentaires

Quel est le but ici? La bibliothèque GNU Readline contient un support d'achèvement et est bien sûr gpl'ed.


Je suis vraiment curieux plus que tout. Ce n'est pas clair pour moi comment Bash parvient à accomplir cela et j'aimerais savoir - cela semble être quelque chose que je pouvais mettre à bon usage dans les scripts / services publics. Merci de me faire remarquer la bibliothèque GNU Readline, je n'étais pas familière avec ça. Je suis sûr que je vais me tourner vers cela si j'ai besoin de mettre en œuvre cette fonctionnalité. Maintenant, je suppose que je dois comprendre comment la bibliothèque de readline le fait.


Zack: Je pense que ma réponse aborde la "Comment la bibliothèque Readline le fait".


4 Réponses :


1
votes

Il utilise la bibliothèque Readline pour gérer l'entrée et la lecture en ligne fournit l'historique et l'achèvement.

Pour mettre en œuvre réellement l'achèvement, l'accès à la manipulation des entrées du clavier est nécessaire. L'achèvement doit être en mesure de modifier le tampon utilisé par celui-ci. Après cela, il s'agit simplement de regarder la saisie actuelle et de vérifier les acheminements trouvés. La logique d'achèvement réelle peut fonctionner à bien des égards.


0 commentaires

5
votes

Comme Iny dit, Bash utilise readline pour son entrée. La source est disponible ici , et il y a un fichier appelé complet. c.

Pour répondre à votre question, je ne pense pas qu'ils sont en réalité imprimés à une entrée standard. Readline contient une sorte de tampon pour le contenu de la ligne L'utilisateur édition et l'achèvement des impressions dans cette option. Lorsque l'utilisateur appuie sur ENTER, le contenu du tampon est envoyé à tout programme souhaitait lire une ligne et, dans le cas de Bash, passait dans l'entrée standard. (Readline ne fait pas cela - les autres programmes utilisés en lectureale pourraient simplement stocker la valeur dans une chaîne pour une utilisation ultérieure.)


1 commentaires

Merci, ça a du sens! Merci aussi à Iny.



4
votes

Plusieurs personnes ont souligné que Bash utilise readline, ce qui est vrai, mais je pense que ce que vous demandez vraiment, c'est comment est-ce que cela est capable de voir ce que vous avez saisi avant de toucher l'entrée.

La réponse est que les TTYS (c.-à-d. Les terminaux) peuvent être modifiés en "Mode RAW", où le traitement de l'entrée du terminal est désactivé, puis vous verrez chaque personnage tel qu'il l'entre. Cela désactive également l'écho automatique de caractères typés.

Voir ce guide sur Lecture d'un seul caractère à partir d'un fichier ou d'un terminal Pour plus d'informations.


3 commentaires

Est-ce que le "mode brut" des TTYS est ce qui permet à un programme d'écrire la suggestion à l'écran de manière à ce que lorsque vous appuyez sur "Entrée", il est inclus comme si l'utilisateur l'ait saisi? Si oui, comment a-t-on accès à une TTY pour la lecture et l'écriture? Est-ce un type d'appel simple ouvert ('/ dev / tty')?


En mode RAW, le programme voit les touches de frappe avant même que l'utilisateur ne frappe pas. Lorsque vous tapez une clé imprimable (par exemple: lettre, symbole de numéro), le programme l'écho à l'arrière. Lorsque vous appuyez sur ENTRÉE, il est déjà en train de garder une trace de ce que vous avez saisi, et il suffit de «accepter» le tampon en réponse à la touche Entrée.


En "mode cuit", le terminal échoue plutôt tout ce que vous tapez, mais n'envoie pas ce que vous avez saisi au programme jusqu'à ce que vous appuyez sur Entrée. BASH interdit le dos TTY en mode cuit juste avant d'exécuter d'autres programmes. Vous pouvez avoir une idée de la manière dont le mode cuit se comporte différemment du mode RAW en exécutant "SLEEP 300", puis en tapant pendant que la commande de sommeil est en cours d'exécution. Notez que vous pouvez taper des lignes et même avoir Très Installations d'édition de base (par exemple: Backspace). Une fois que vous avez frappé Entrée, cette ligne sera commise et lorsque la commande de sommeil se termine, Bash tentera d'exécuter ces lignes (alors soyez prudent!).



1
votes

Voici un extrait C implémenté l'achèvement de l'onglet via readline:

http://github.com/rupa/el


0 commentaires