2009-10-07 4 views
6

Sto cercando di determinare come il sistema stampa i caratteri sullo standard input, ovvero come stampa caratteri che l'utente può cancellare e quali sono considerati input se l'utente preme "Invio".Come si implementa il completamento della scheda di tipo bash?

Mi capita di usare C, ma sarei molto sorpreso se la soluzione fosse dipendente dalla lingua.

Grazie per eventuali approfondimenti! : D

+0

Qual è lo scopo qui? La libreria GNU Readline contiene il supporto per il completamento ed è ovviamente in GPL. – Cascabel

+0

Sono davvero curioso più di ogni altra cosa. Non è chiaro per me come Bash riesca a realizzare questo e mi piacerebbe sapere - sembra qualcosa che potrei usare a dovere in script/utilità. Grazie per avermi indirizzato alla libreria GNU Readline, non mi era familiare. Sono sicuro che mi rivolgerò a questo se dovrò mai implementare questa funzionalità. Ora immagino di dover capire come funziona la Readline Library. – zslayton

+0

Zack: Penso che la mia risposta affronti il ​​"come funziona la libreria Readline". –

risposta

4

Diverse persone hanno sottolineato che bash usa readline, il che è vero, ma penso che tu sia " chiedo davvero è come è in grado di vedere ciò che hai digitato prima di premere invio.

La risposta è che i tty (cioè i terminali) possono essere commutati in "modalità raw", in cui l'elaborazione di input del terminale è disabilitata, e quindi vedrai ogni carattere mentre entra. Ciò disabilita anche l'eco automatico di caratteri digitati.

Vedere questa guida su Reading a single character from a file or a terminal per ulteriori informazioni.

+0

La "modalità raw" di ttys permette a un programma di scrivere il suggerimento sullo schermo in modo tale che quando si preme "enter" è incluso come se l'utente lo avesse digitato? In tal caso, come si accede a una tty per leggere e scrivere? È un tipo di chiamata semplice aperto ('/ dev/tty')? – zslayton

+0

In modalità raw il programma vede le sequenze di tasti ancora prima che l'utente entri. Quando si digita una chiave stampabile (ad esempio: lettera, simbolo numerico), il programma lo riecheggia.Quando si preme Invio, è già stato tenuto traccia di ciò che è stato digitato e semplicemente "accetta" il buffer in risposta al tasto Invio. –

+0

In "modalità cotta", il terminale farà invece eco a tutto ciò che scrivi, ma non invierà ciò che hai digitato sul programma finché non premi Invio. bash riporta il tty alla modalità di cottura appena prima di eseguire altri programmi. Puoi avere un'idea di come la modalità cotta si comporta diversamente dalla modalità raw eseguendo "sleep 300" e poi digitando mentre il comando sleep è in esecuzione. Nota che puoi scrivere linee e persino avere * molto * facilità di editing di base (es .: backspace). Una volta che premi entri, quella linea sarà impegnata e quando il comando sleep sarà completato, bash proverà ad eseguire quelle linee (quindi fai attenzione!). –

1

Utilizza la libreria readline per gestire l'input e readline fornisce la cronologia e il completamento.

Per implementare effettivamente il completamento, è necessario l'accesso alla gestione degli input da tastiera. Il completamento deve essere in grado di modificare il buffer utilizzato da esso. Dopodiché si tratta semplicemente di esaminare l'input corrente e verificare quali completamenti sono stati trovati. La logica di completamento reale può funzionare in molti modi.

5

Come dice in precedenza, bash usa readline come input. La fonte è disponibile here e c'è un file chiamato complete.c.

Per rispondere alla tua domanda, non penso che siano effettivamente stampati sullo standard input. Readline contiene una sorta di buffer per i contenuti della linea che l'utente sta modificando e il completamento viene stampato in questo. Quando l'utente preme Invio, il contenuto del buffer viene inviato a qualunque programma volesse leggere una riga e, nel caso di bash, passato in input standard. (Readline non lo fa - altri programmi che usano readline potrebbero semplicemente archiviare il valore in una stringa per un uso futuro.)

+0

Grazie, ha senso! Grazie anche a iny. – zslayton