2009-10-07 19 views
6

Ich versuche zu bestimmen, wie das System Zeichen auf Standardeingabe druckt - das heißt, wie es Zeichen druckt, die der Benutzer löschen kann und die als Eingabe gelten, wenn der Benutzer auf "Enter" klickt.Wie würde man eine bash-ähnliche Tab-Vervollständigung implementieren?

Ich benutze zufällig C, aber ich wäre sehr überrascht, wenn die Lösung sprachabhängig wäre.

Danke für alle Einsichten! : D

+0

Was ist hier der Zweck? Die GNU Readline-Bibliothek enthält Unterstützung für die Fertigstellung und ist natürlich GPL. – Cascabel

+0

Ich bin wirklich mehr als alles andere neugierig. Es ist mir nicht klar, wie es Bash gelingt, dies zu erreichen, und ich würde es gerne wissen - es scheint etwas zu sein, das ich gut in Skripten/Dienstprogrammen einsetzen könnte. Danke, dass du mich auf die GNU Readline Library verwiesen hast, ich kannte sie nicht. Ich bin mir sicher, dass ich mich dem zuwenden werde, wenn ich diese Funktionalität jemals implementieren muss. Jetzt denke ich muss ich herausfinden, wie die Readline-Bibliothek es tut. – zslayton

+0

Zack: Ich denke, meine Antwort adressiert das "wie die Readline-Bibliothek das tut". –

Antwort

4

Mehrere Leute haben darauf hingewiesen, dass Bash readline verwendet, was wahr ist, aber ich denke, was Sie " Es fragt wirklich, wie es in der Lage ist zu sehen, was Sie eingegeben haben, bevor Sie Enter drücken.

Die Antwort ist, dass ttys (dh: Terminals) in den "Rohmodus" geschaltet werden können, in dem die Eingabeverarbeitung des Terminals deaktiviert ist, und dann wird jedes Zeichen wie es kommt angezeigt. Dies deaktiviert auch automatisches Echo von getippten Zeichen.

Weitere Informationen finden Sie in dieser Anleitung unter Reading a single character from a file or a terminal.

+0

Ist der "rohe Modus" von ttys, was es einem Programm erlaubt, den Vorschlag so auf den Bildschirm zu schreiben, dass, wenn Sie "enter" drücken, es so eingeschlossen ist, als ob der Benutzer es selbst eingegeben hätte? Wenn ja, wie bekommt man Zugriff auf ein TYT zum Lesen und Schreiben? Ist es ein einfacher offener ("/ dev/tty") Anruftyp? – zslayton

+0

Im Raw-Modus sieht das Programm die Tastenanschläge, noch bevor der Benutzer Enter drückt. Wenn Sie eine druckbare Taste eingeben (zB: Buchstabe, Zahlensymbol), gibt das Programm diese zurück.Wenn Sie die Eingabetaste drücken, wird bereits nachgezeichnet, was Sie eingegeben haben, und der Puffer wird nur als Antwort auf die Eingabetaste akzeptiert. –

+0

Im "gekochten Modus" gibt das Terminal stattdessen alles wieder, was Sie eingegeben haben, sendet jedoch nicht das, was Sie eingegeben haben, an das Programm, bis Sie die Eingabetaste drücken. bash schaltet die tty kurz vor dem Ausführen anderer Programme in den gekochten Modus zurück. Sie können eine Vorstellung davon bekommen, wie sich der gekochte Modus anders als der rohe Modus verhält, indem Sie "sleep 300" ausführen und dann eingeben, während der Befehl "sleep" ausgeführt wird. Beachten Sie, dass Sie Zeilen eingeben können und sogar * sehr * grundlegende Bearbeitungsfunktionen haben (zB: Rückschritt). Sobald Sie die Eingabetaste drücken, wird diese Zeile festgeschrieben und wenn der Schlafbefehl abgeschlossen ist, wird Bash versuchen, diese Zeilen auszuführen (also seien Sie vorsichtig!). –

1

Es verwendet readline-Bibliothek, um die Eingabe zu behandeln, und readline liefert den Verlauf und den Abschluss.

Um die Vervollständigung tatsächlich zu implementieren, ist der Zugriff auf die Tastatureingabe erforderlich. Die Vervollständigung muss in der Lage sein, den von ihr verwendeten Puffer zu ändern. Danach geht es nur darum, die aktuelle Eingabe zu betrachten und zu prüfen, welche Ergänzungen gefunden wurden. Die tatsächliche Beendigungslogik kann auf viele Arten funktionieren.

5

Wie iny sagt, verwendet bash readline für seine Eingabe. Die Quelle ist verfügbar here, und es gibt eine Datei namens complete.c.

Um Ihre Frage zu beantworten, glaube ich nicht, dass sie tatsächlich auf Standardeingabe gedruckt werden. Readline enthält eine Art Puffer für den Inhalt der Zeile, die der Benutzer bearbeitet, und die Fertigstellung wird in diese Zeile gedruckt. Wenn der Benutzer die Eingabetaste drückt, wird der Inhalt des Puffers an jedes Programm gesendet, das eine Zeile lesen möchte, und im Fall von bash wird es an die Standardeingabe weitergegeben. (Readline tut das nicht - andere Programme, die readline verwenden, speichern den Wert einfach in einer Zeichenfolge für die spätere Verwendung.)

+0

Danke, das macht Sinn! Danke auch an iny. – zslayton

Verwandte Themen