Question

J'écris un programme qui ressemble à un shell. Une fois démarré, vous êtes invité à entrer certaines commandes spécifiques à une application.

Jusqu'à présent, cela fonctionne très bien. Cependant, je souhaite ajouter un support pour l'historique des commandes, comme dans Bash, afin que l'utilisateur puisse appuyer sur la flèche vers le haut ou vers le bas et voir les commandes entrées précédemment.

J'ai inclus la bibliothèque ncurses et j'ai fait un test de hello world avec getch () pour vérifier que les flèches haut et bas sont signalées correctement.

Ce qui me dérange, c’est qu’il semble nécessaire d’appeler initscr () pour effacer l’écran afin que je puisse utiliser getch ().

OK, LA QUESTION EST:

Quelqu'un sait-il comment utiliser la fonction ncurses getch () sans appeler initscr () au préalable? Sinon, est-ce que je peux éviter que l'écran ne soit effacé? En gros, je cherche à obtenir que getch () agisse de la même façon que getchar (), si cela a du sens.

Merci d'avance!

EDIT: Je pense que le meilleur exemple de cela est la façon dont Python fonctionne en mode interactif.

Était-ce utile?

La solution

Curses veut contrôler complètement l'écran et optimiser les écritures à l'écran, en particulier sur les lignes série lentes. Pour ce faire, il doit savoir ce qui est affiché à l'écran et le seul moyen raisonnable de le faire avec la plupart des terminaux est de démarrer à partir d'un écran vide et de garder une trace de ce que vous écrivez sur le terminal.

Ainsi, je soupçonne que (n) malédictions n’est pas le bon outil pour votre shell. Vous aurez probablement besoin de descendre d'une étape sur la couche d'abstraction et d'utiliser plutôt terminfo et les lectures non bloquantes du terminal (entrée standard).

(Ce n'est pas très utile. Désolé.)

Autres conseils

Il serait peut-être plus simple d'utiliser une interface du type readline () . plutôt que de recourir à des ncurses à part entière.

Vous pouvez simplement appeler votre programme à partir de rlwrap et disposer des fonctionnalités sans la douleur ...

Voici une autre discussion à propos de ce. Les solutions fournies sont les suivantes:

  1. "La fonction 'filter ()' vous permet d'utiliser des curses sur une seule ligne."
  2. "Vous pouvez écrire quelque chose d’équivalent en C en utilisant setupterm pour obtenir le données de terminal et tparm, tputs pour le formatage et la sortie. "

Bien sûr, il existe la troisième option permettant d’obtenir le code source ncurses et de le modifier afin qu’il n’efface plus l’écran.

Avez-vous envisagé de créer une entrée personnalisée terminfo ou termcap sans séquence pour effacer l’écran puis basculer les paramètres de votre terminal sur ce droit avant d’exécuter votre programme? Vous pouvez aussi simplement utiliser newterm () et set_term () dans ncurses. C’était plus simple avec termcap, car vous pouviez inclure un autre terminal et remplacer certaines de ses fonctionnalités.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top