Was ist Ncurses?

Mo, 30. August 2021, Ralf Hersel

Die Curses-Bibliothek bietet eine terminalunabhängige Möglichkeit zur Bildschirmdarstellung und Tastaturbedienung für textbasierte Terminals; zu solchen Terminals gehören VT100s, die Linux-Konsole und das simulierte Terminal, das von verschiedenen Programmen bereitgestellt wird. Anzeigeterminals unterstützen verschiedene Steuercodes, um gängige Operationen wie das Bewegen des Cursors, das Scrollen des Bildschirms und das Löschen von Bereichen auszuführen. Die verschiedenen Terminals verwenden sehr unterschiedliche Codes und haben oft ihre eigenen kleinen Macken.


In einer Welt mit grafischen Bildschirmen könnte man sich fragen: "Wozu die Mühe"? Es stimmt, dass Terminals mit Zeichenzellen eine veraltete Technologie sind, aber es gibt Nischen, in denen die Möglichkeit, ausgefallene Dinge mit ihnen zu tun, immer noch wertvoll ist. Eine Nische ist die der kleinen oder eingebetteten Unixe, auf denen kein X-Server läuft. Eine andere sind Werkzeuge wie Betriebssystem-Installationsprogramme und Kernel-Konfiguratoren, die möglicherweise ausgeführt werden müssen, bevor grafische Unterstützung verfügbar ist.


Die Curses-Bibliothek bietet eine recht grundlegende Funktionalität, die dem Programmierer eine Abstraktion eines Bildschirms mit mehreren sich nicht überlappenden Textfenstern bietet. Der Inhalt eines Fensters kann auf verschiedene Weise verändert werden, indem man Text hinzufügt, ihn löscht oder sein Aussehen verändert - und die Curses-Bibliothek findet heraus, welche Steuercodes an das Terminal gesendet werden müssen, um die richtige Ausgabe zu erzeugen.

Die Curses Bibliothek wurde ursprünglich für BSD Unix geschrieben; die späteren System V Versionen von Unix von AT&T haben viele Verbesserungen und neue Funktionen hinzugefügt. BSD Curses wird nicht mehr gepflegt und wurde durch Ncurses ersetzt, eine Open-Source-Implementierung der AT&T-Schnittstelle. Wenn man ein Open-Source-Unix wie Linux oder FreeBSD verwendet, benutzt das System mit ziemlicher Sicherheit Ncurses.

Selbstverständlich kann man eine Ncurses-Anwendung in C schreiben, kompilieren und ausführen. Wer es einfacher mag, verwendet Python mit der Curses-Bibliothek. Hier ist ein kleines Beispielprogramm, welches einen Texteditor im Terminal mit Ncurses implementiert:

#!/usr/bin/env python3

import curses
import curses.textpad

stdscr = curses.initscr()
curses.noecho()
begin_x = 20
begin_y = 7
height = 5
width = 40
win = curses.newwin(height, width, begin_y, begin_x)
tb = curses.textpad.Textbox(win)
text = tb.edit()
curses.addstr(4,1,text.encode('utf_8'))

curses.endwin()

Was passiert hier?

Nach dem Shebang in der ersten Zeile wird die Curses-Bibliothek und das Curses-Textpad importiert. Dann wird Curses initialisiert und das Echo abgeschaltet, um eine doppelte Zeichenausgabe zu vermeiden. Anschliessend wird die Fenstergeometrie über x, y, Höhe und Breite angegeben. Mit diesen Angaben wird dann eine neue Instanz des Fensters erstellt (win = curses.newwin) und in dieses Fenster ein Textpad eingebettet (tb). Die Methode tb.edit() erlaubt die Eingabe von Text im Pad und curses.addstr() zeigt den Text im Fenster an. Zum Schluss beendet die Methode curses.endwin() den ganzen Zauber.

Wie ihr seht, kann man mit Ncurses relativ leicht einfache Benutzeroberflächen bauen, ohne in die Tiefen einer GUI-Bibliothek (z.B. GTK) einsteigen zu müssen. Ein Beispiel für eine grosse Anwendung, die auf Ncurses basiert, ist der E-Mail-Client Mutt. Da Curses bzw. Ncurses uralte Technologien sind, finden sich tausende Beschreibungen und Programmbeispiele im Internet dazu. Eine kleine Auswahl seht ihr in den Quellen.

Quellen:

https://de.wikipedia.org/wiki/Curses

https://invisible-island.net/ncurses/announce.html

https://docs.python.org/3/howto/curses.html