# Curses

Curses est le nom d'une bibliothèque logicielle permettant le développement sous Unix d'environnements plein écran en mode texte, indépendamment du terminal informatique utilisé, et pour tout type d'applications.
Elle est issue de la distribution BSD d'Unix, dans laquelle elle était employée pour l'éditeur de texte vi et le jeu Rogue.
En utilisant curses, les programmeurs peuvent concevoir des applications basées sur le mode texte, sans tenir compte des particularités de chaque terminal. La bibliothèque curses s'occupe d'envoyer les caractères de contrôle appropriés vers le moniteur lors de l'exécution du programme, en essayant d'optimiser ce qu'elle peut quand elle le peut.
Rester en mode texte, mais en y utilisant ainsi l'adressage direct de tout endroit de l'écran, permet aussi de ne pas avoir à s'occuper du gestionnaire graphique utilisé parmi les nombreux que peut utiliser Linux ou Unix.
Plusieurs installeurs de Linux dans les années 1990 utilisaient le mode texte en plein écran, à commencer par celui de la célèbre Slackware.

## Avantages

Avec curses, il est possible d'écrire à tout moment en toute position de l'écran, ce qui permet de suivre facilement le déroulement d'un programme dans des conditions moins fatigantes que le mode de déroulement du genre machine à écrire. On peut également effectuer des entrées par ce moyen, et créer par exemple des formulaires simples en mode texte, voire simuler complètement un terminal plein écran comme un 3270. Des variantes existent même permettant de simuler un Minitel.

## Fonctionnement

Les fonctions principales sont très simples :
initscr initialise le mode plein écran.
endwin met fin au mode plein écran et restaure l'état où était l'écran avant que l'on ne s'y place.
Curses/ncurses est installé en standard dans quelques distributions. Sur d'autres comme Ubuntu Studio ou Mint, on doit l'installer par exemple comme ceci pour le gcc5 depuis une console : sudo apt install libncurses5-dev.

## Exemple simple

Le très simple programme suivant compte en les répartissant par longueur les mots du dictionnaire français /usr/share/dict/french de GNU/Linux.

## Portabilité

L'utilisation sur Windows des fonctionnalités de la librairie curses est rendu possible via l'emploi de la librairie PDcurses qui se base sur ncurses. Celle ci n'est pas identique mais permet d'utiliser la plupart des fonctions. Par exemple avec le langage Python et depuis sa version 3.7, cela peut se faire simplement en installant le package windows-curses.

## Alternative

L'envoi direct de commandes de déplacement du curseur au terminal (ainsi que de changement de teinte de caractère et de fond) est également possible sur la plupart des écrans caractère, ceux-ci honorant en général les séquences ANSI dites CSI (Control Sequence Introducer), en compatibilité avec le VT100. Dans la pratique, l'emploi de curses rend plus aisée la maintenance des programmes (l'usage de CSI reste inévitable dans des scripts). Par ailleurs, le fait qu'un nouvel affichage n'ait lieu avec curses qu'à chaque refresh et non à chaque nouvelle écriture sur le terminal peut procurer une meilleure expérience visuelle à l'utilisateur par l'affichage de tout l'écran une fois complet plutôt qu'à chaque modification partielle de celui-ci.