Przekleństwa jest nazwa biblioteki oprogramowania umożliwiającego rozwój pod Unix z pełnymi środowiskach ekranie w trybie tekstowym , niezależnie od terminala komputerowego stosowanego, a dla wszystkich typów aplikacji.
Pochodzi z dystrybucji Unix BSD , w której był używany w edytorze tekstu vi i grze Rogue .
Korzystając z curses, programiści mogą projektować aplikacje w trybie tekstowym, niezależnie od specyfiki każdego terminala. Biblioteka curses dba o wysyłanie odpowiednich znaków sterujących do monitora podczas działania programu, próbując zoptymalizować to, co może, kiedy tylko jest to możliwe.
Pozostawanie w trybie tekstowym, ale używanie go w ten sposób, bezpośrednie adresowanie w dowolnym miejscu ekranu, eliminuje również potrzebę martwienia się o menedżera grafiki używanego spośród wielu, których może używać Linux lub Unix.
Kilka instalatorów Linuksa w latach 90. używało pełnoekranowego trybu tekstowego, zaczynając od słynnego Slackware .
Dzięki curses możliwe jest pisanie w dowolnym momencie w dowolnej pozycji na ekranie, co ułatwia śledzenie postępu programu w mniej męczących warunkach niż w trybie typowym dla maszyny do pisania. Możesz także wprowadzać wpisy w ten sposób i na przykład tworzyć proste formularze w trybie tekstowym, a nawet całkowicie symulować pełnoekranowy terminal, taki jak 3270 . Istnieją nawet warianty symulujące Minitela .
Główne funkcje są bardzo proste:
initscr() inicjuje tryb pełnoekranowy.
move(ligne, colonne) wirtualnie przesuń kursor
addstr(chaîne) napisz ciąg, w którym znajduje się kursor
refresh() wyrównuje rzeczywisty ekran i wirtualny wyświetlacz
endwin() kończy tryb pełnoekranowy i przywraca ekran do stanu, w jakim był przed wejściem do niego.
Curses / ncurses jest standardowo instalowane w niektórych dystrybucjach. Na innych, takich jak Ubuntu Studio lub Mint , trzeba zainstalować taką aplikację dla gcc 5 z konsoli sudo apt install libncurses5-dev.
Poniższy bardzo prosty program liczy słowa ze słownika francuskiego / usr / share / dict / french systemu GNU / Linux wzdłuż długości .
// Se compile par exemple avec gcc cursef.c -lcurses && ./a.out #include <curses.h> #include <string.h> int c; // colonne ((0,0) en haut à gauche) int count[128], total; // à 0; comptage des mots de chaque longueur int main() { WINDOW* win; FILE* infile; char d, xxx[128], out[128]; infile = fopen("/usr/share/dict/french", "r"); // Dictionnaire win = initscr(); // Initialisation cbreak(); // Ne pas exiger ENTER noecho(); // Pas d'écho demandé clear(); // Fenêtre à blanc refresh(); // Exécution de ce qui a été préparé dans la fenêtre int octets, glyphes; // En unicode, quelques glyphes sont multi-octets while (!feof(infile)) { fgets(xxx, 100,infile); // Bidouillage pour unicode (car glyphes multioctets) octets=0; glyphes=0; while (xxx[octets]) { if ((xxx[octets] & 0xC0) != 0x80 ) ++glyphes; ++octets; } --glyphes; ++count[glyphes]; // négliger retour ligne // Fin du bidouillage sprintf(out, "%7d %s", count[glyphes], xxx); move(glyphes-1,0); addstr(out); // préparer la ligne dans la fenêtre refresh(); // afficher la fenêtre ++total; } sprintf(out, "%7d mots au total", total); move (26,0); addstr(out); refresh(); d=getch(); // Attente d'un caractère pour effacer fenêtre et sortir endwin(); // curses call to restore the original window and leave }Korzystanie w systemie Windows z funkcjonalności biblioteki curses jest możliwe dzięki wykorzystaniu biblioteki PDcurses opartej na ncurses . Nie jest to identyczne, ale umożliwia korzystanie z większości funkcji. Na przykład w przypadku języka Python i od wersji 3.7 można to zrobić po prostu instalując pakiet windows-curses.
Bezpośrednie wysyłanie poleceń ruchu kursora do terminala (jak również zmiana koloru znaków i tła) jest również możliwe na większości ekranów znaków, te generalnie honorujące sekwencje ANSI zwane CSI ( Control Sequence Introductioncer). ), Kompatybilne z VT100 . W praktyce użycie curses ułatwia obsługę programu (użycie CSI pozostaje nieuniknione w skryptach). Ponadto fakt, że nowe wyświetlanie odbywa się z przekleństwami tylko za każdym razem, refresh()a nie za każdym razem, gdy dokonywany jest nowy wpis na terminalu, może zapewnić użytkownikowi lepsze wrażenia wizualne, wyświetlając cały ekran raz. Zakończona, a nie każda częściowa modyfikacja tego.