Pomstowanie

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 .

Korzyści

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 .

Operacja

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.

Prosty przykład

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 }

Ruchliwość

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.

Alternatywny

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.

Uwagi i odniesienia

  1. Symulacja terminala 3270 z curses .
  2. Minikursy: symulacja Minitela „à la curses” .
  3. Biblioteki curses i ncurses nie różnią się tutaj funkcjonalnie
  4. szczególnie jeśli nie trzeba było rozróżniać między liczbą bajtów a liczbą znaków w Unicode . Byłoby to łatwe dzięki przekonwertowaniu pliku z kodowania UTF-8 na kodowanie ISO-8859-15, w którym każdy znak francuski mieści się w jednym bajcie ( iconv -f UTF-8 -t ISO8859-15 /usr/share/dict/french >xxx). Plik w wersji z kwietnia 2016 r. Zawierał od 1 542 061 znaków do 1 480 824 znaków o ściśle równej zawartości. Stosunkowo niska kara (4%) Unicode za swobodę, jaką zapewnia, odegrała wpływ na jego szybkie przyjęcie.
  5. „  Wsparcie dla standardowego modułu curses w systemie Windows  ” , na https://pypi.org ,16 października 2019 r

Zobacz też

Powiązane artykuły

  • ncurses , następca curses.
  • PDcurses , wersja curses w domenie publicznej.

Bibliografia

  • (en) John Strang, Programming with curses , O'Reilly ( ISBN  0-937175-02-1 ) .

Linki zewnętrzne