curses(カーシス、カーズィス)はUnix系システムでの端末制御ライブラリである。テキストユーザインタフェース (TUI) アプリケーションを作成するのに使われる。名称は“cursor optimization”に由来する。文字のみを表示する端末(例えばVT100)を表示に使うアプリケーションが画面を管理する機能を集めたライブラリである[1]。
cursesのAPIの解説書はいくつかある[2]。最も一般的な実装では、数千に及ぶ様々な端末の機能を示したデータベースを利用している。端末データベースではなく専用デバイスドライバを採用している実装としては PDCurses があるが、そのような例は少ない。ほとんどの実装ではterminfoを使っており、一部はtermcapを使っている。古い端末でもほとんどの場合動作可能であり、単純な点が長所である。ビットマップ画像や様々なフォントを必要としないアプリケーションでは、X Window System を使うよりも curses を使った実装の方が単純で高速である。
cursesを使用すると、プログラマは特定の端末装置を考慮せずに文字ベースのアプリケーションを書くことができる。cursesライブラリは、実行時に使用している端末装置を判別して適切に制御コードを送ることができる。cursesでは、実画面を1つ以上のウィンドウをマップしたものとしてモデル化する。各ウィンドウは文字の行列であり、プログラマは必要なウィンドウを実際に表示させたいように内容を設定して、cursesに対して画面の更新を指示する。cursesは内容の更新状況を調べ、実際に画面上で書き換える必要があるところだけを書き換えるような制御文字列を生成する。つまり、プログラマは画面にどう表示したいのかを文字行列で示し、cursesがそれを実際に表示する作業を受け持つ。
ケン・アーノルドが開発し、BSD UNIXの一部としてリリースし、ローグというゲームなどで使用された[3][4][5]。
"curses" という名称はcursor optimizationに由来する[6]。また、ときおりviエディタでcursesが使われているという趣旨の解説が記載されている場合があるが、実際にはその逆で、viのカーソル移動のコードを参考にしてcursesが書かれた[4]。
当初、termcapライブラリを使って実装された。数年後、カリフォルニア大学バークレー校でviとtermcapを改良していたマーク・ホートンがAT&Tに行き、terminfoを使った別のバージョンを作り、それがUNIX System IIIとUNIX System Vに採用された。後者はライセンス上の制限があるため、BSDとAT&Tそれぞれのバージョンは独立に開発されている。AT&T版ではterminfoを使っただけでなく、以下のような改良も行われている。
AT&Tでのcurses開発は1990年代中ごろに終り、同じころX/OpenがcursesのAPIを定義した[7]。その後もncursesとPDCursesの開発は継続されている。BSD版cursesはNetBSDで保守されており、多バイト文字対応、termcapからterminfoへの移行などが行われている。
ncursesはcursesの代替としてLinux、OpenBSD、FreeBSD、NetBSD向けにGNUプロジェクトで作られたライブラリであり、その後、POSIX準拠のUNIXに移植されていった。PDCurses (Public Domain Curses) はUNIX以外の DOS、Windows、OS/2など向けに作られたcursesとほぼ同じ機能を提供するライブラリである。クロスプラットフォームのゲームなどで、Linuxではncurses、WindowsではPDCursesを使っているものがある。
1990年代には、4.4BSDでBSD版cursesにハイライト表示方法を複数サポートするなどの改良を施した。しかしこちらはあまり普及しなかった。それとは別に、AT&T版を真似た別のバージョンの開発が始まっていた。これには少なくとも2つの実装がある。pcurses(1982年開始)とPDCurses(Public Domain curses、1987年開始)である。
ncurses (new curses) はpcursesから派生したもので、1993年にバージョン1.8.1から始まった[8]。ncursesは今では最も普及している実装であり、これに刺激されてNetBSDプロジェクトでのBSD版cursesの開発などが進められた[9][10]。
ncursesライブラリは当初Linux、OpenBSD、FreeBSD、NetBSDを対象としていたが、その後POSIX準拠の各種Unix系システムに移植された。PDCursesはAPIや機能はncursesと全く同一ではないが、DOS、Win32、OS/2のコンソール端末やX11などで動作する。この両者間での移植は難しくはない。例えばローグライクゲームのADOMはLinux上でncursesを使って書かれたが、後にDOS上でPDCursesを使って移植された[11]。
cursesは、テキストのみの表示デバイス(PCのコンソールモード、ANSI端末、telnetやSSHのクライアントなど)でGUI風の機能を提供するよう設計されている。
cursesを使ったプログラムは、テキストのみの表示デバイスでよくあるコマンドラインインタフェース (CLI) ではなく、一般的なGUIに似たユーザインタフェースを採用することが多く、テキストボックスやスクロール可能なリストといったウィジェットを使う。それによってCLIよりも使いやすいものになり、同時にテキストのみを表示する各種デバイスでも利用可能である。また、GUIを使うよりも少ないリソースで動作可能である。
SVR4ではcursesを利用した言語 FMLI を導入し、それを使ったテキストのみのユーザインタフェースFACEを実装した。FACEはシステム管理用インタフェースに使われた。FMLIはSolarisでも使われていた。
cursesを使ったソフトウェアが必ずGUI風のテキストユーザインタフェースを採用するとは限らない。例えばviエディタはTUI/GUI的なインタフェースではない。