2009-10-07 10 views
6

J'essaie de déterminer comment le système imprime des caractères à l'entrée standard - c'est-à-dire, comment il imprime les caractères que l'utilisateur peut supprimer et qui sont considérés comme entrée si l'utilisateur frappe "Entrée". Il se trouve que j'utilise C, mais je serais très surpris si la solution dépendait de la langue.Comment pourrait-on implémenter l'achèvement d'une tabulation de type bash?

Merci pour toute idée! : D

+0

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

+0

Je suis vraiment curieux plus que tout. Ce n'est pas clair pour moi comment Bash parvient à accomplir cela et je voudrais savoir - il semble que quelque chose que je pourrais mettre à profit dans les scripts/utilitaires. Merci de m'avoir indiqué la bibliothèque GNU Readline, je ne le connaissais pas. Je suis sûr que j'y reviendrai si jamais j'ai besoin d'implémenter cette fonctionnalité. Maintenant, je suppose que je dois comprendre comment la bibliothèque Readline le fait. – zslayton

+0

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

Répondre

4

Plusieurs personnes ont fait remarquer que bash utilise readline, ce qui est vrai, mais je pense que vous Re vraiment demander est comment est-il capable de voir ce que vous avez tapé avant d'appuyer sur Entrée. La réponse est que ttys (c.-à-d.: Terminaux) peut être commuté en "mode brut", où le traitement d'entrée du terminal est désactivé, et alors vous verrez tous les caractères quand il entre. Cela désactive également l'écho automatique de caractères dactylographiés.

Voir ce guide au Reading a single character from a file or a terminal pour plus d'informations.

+0

Est-ce que le "mode brut" de ttys permet à un programme d'écrire la suggestion à l'écran de telle sorte que lorsque vous appuyez sur "Entrée", il est inclus comme si l'utilisateur l'avait tapé lui-même? Si oui, comment avoir accès à un tty pour lire et écrire? Est-ce un simple type d'appel ouvert ('/ dev/tty')? – zslayton

+0

En mode brut, le programme voit les frappes avant même que l'utilisateur n'entre. Lorsque vous tapez une touche imprimable (par ex.: Lettre, symbole numérique), le programme renvoie l'écho.Lorsque vous appuyez sur Entrée, il garde déjà la trace de ce que vous avez tapé, et il "accepte" simplement le tampon en réponse à la touche Entrée. –

+0

En "mode cuisson", le terminal fera plutôt écho à tout ce que vous tapez, mais n'envoie pas ce que vous avez tapé au programme tant que vous n'avez pas appuyé sur Entrée. bash bascule le tty en mode cuit juste avant d'exécuter d'autres programmes. Vous pouvez avoir une idée de la façon dont le mode cuit se comporte différemment du mode brut en exécutant "sleep 300" puis en tapant pendant que la commande sleep est en cours d'exécution. Notez que vous pouvez taper des lignes et même des possibilités d'édition * très * basiques (par exemple: retour arrière). Une fois que vous frappez, entrez cette ligne sera validée et lorsque la commande sleep sera terminée, bash essaiera d'exécuter ces lignes (attention donc!). –

1

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

Pour réellement mettre en œuvre l'achèvement, l'accès à la gestion des entrées au clavier est nécessaire. L'achèvement doit être capable de modifier le tampon utilisé par celui-ci. Après cela, il suffit de regarder l'entrée actuelle et de vérifier ce que les complétions sont trouvées. La logique d'achèvement peut fonctionner de plusieurs façons.

5

Comme le dit iny, bash utilise readline pour son entrée. La source est disponible here, et il y a un fichier appelé complete.c.

Pour répondre à votre question, je ne pense pas qu'ils soient réellement imprimés sur une entrée standard. Readline contient une sorte de tampon pour le contenu de la ligne que l'utilisateur est en train d'éditer, et l'impression est terminée. Lorsque l'utilisateur appuie sur Entrée, le contenu de la mémoire tampon est envoyé à tout programme voulant lire une ligne et, dans le cas de bash, transmis à l'entrée standard. (Readline ne fait pas cela - d'autres programmes qui utilisent readline peuvent simplement stocker la valeur dans une chaîne pour une utilisation ultérieure.)

+0

Merci, c'est logique! Merci aussi à iny. – zslayton

Questions connexes