2010-11-12 25 views
0

Je souhaite implémenter la fonction d'auto-complétion pour mon application CLI. Le comportement par défaut de getc() est renvoyé uniquement lorsque la liste de caractères suivante est entrée: NEW_LINE ou EOF. Je veux ajouter TAB à cette liste afin que je puisse déclencher mon algorithme d'auto-complétion.Comment modifier la configuration de termios, de sorte que getc() renvoie immédiatement lorsque l'utilisateur appuie sur la touche <tab>?

Existe-t-il un moyen de le faire, par exemple, en utilisant des termios? La bibliothèque editline (http://www.thrysoee.dk/editline/) peut le faire mais je ne pouvais pas comprendre comment cela se passe?

Répondre

0

Manipulation du terminal IO prend environ 40 pages dans la deuxième édition de « Programmation avancée dans l'environnement UNIX » ... Rapidement, vous pouvez définir les caractères eol et eol2 (termios.c_cc [EOL] et termios.c_cc [EOL2]) pour que les caractères supplémentaires se comportent comme \ n.

Vous pouvez même essayer avec stty

$ cat - 
abc\tdef 
abc\tdef 
^d 
$stty eol ^i 
abc\tabc\tdef 
def 
^d 

Exemple de le faire dans un programme (en pratique, ne pas oublier la gestion des erreurs et la restauration de l'état d'origine à la fin, lorsqu'il est suspendu, lorsque Signalé , et ainsi de suite ... c'est pourquoi utiliser une librairie packagée pour le faire, c'est mieux, il y a beaucoup de détails pour obtenir une application robuste).

struct termios term; 
tcgetattr(STDIN_FILENO, &term); 
term.c_cc[EOL] = '\t'; 
tcsetattr(STDION_FILENO, TCSAFLUSH, &term); 
0

vous devriez utiliser gnu readline isntead de vous tuer avec getc() ...;)

+0

merci, je vais enquêter sur son code source :) –

0

L'approche la plus simple, qui tout ne nécessite pas tcsetattr() ou tcgetattr(), est d'utiliser cbreak() pour mettre le terminal en mode « cbreak », qui n'a pas en mémoire tampon ou le traitement des caractères de contrôle, puis d'utiliser nocbreak() lorsque vous avez terminé pour le réinitialiser.

La page de manuel pour cbreak documente diverses fonctions connexes, notamment raw() et noecho() que vous pouvez utiliser pour contrôler le terminal sans avoir à comprendre complètement les termios.

Si vous souhaitez un contrôle plus précis, vous devez utiliser des termios directement. J'ai écrit il y a un petit moment un blog post qui devrait vous aider à démarrer.