ncursesを使用してLinux画面上の特定の位置にテキストを配置すると、よりユーザーフレンドリーなインターフェイス体験が得られます。
Linuxのユーティリティの多くは、単に画面の下部だけにテキストをスクロールさせるものです。ゲームやデータ表示など、画面の中央にテキストを配置したい場合は、ncursesを試してみてください。
cursesは、テキスト端末のインターフェイスでカーソルを制御するための古いUnixライブラリです。cursesの名前は""に由来します。数年後、他の人々が新しい機能を追加するために curses の新しいバージョンを書き、new curses または "ncurses" と呼ばれるようになりました。ncurses は、開発ライブラリ、ヘッダ、ドキュメントがデフォルトではインストールされていないかもしれませんが、すべての一般的な Linux ディストリビューションで見つけることができます。例えば、Fedora では、以下のコマンドで ncurses-devel パッケージをインストールする必要があります:
$ sudo dnf install ncurses-devel
プログラムでのncursesの使用
画面上で直接アドレスを指定するには、まずncursesライブラリを初期化する必要があります。ほとんどのプログラムは次の3行でこれを行います:
- initscr(): windowオブジェクトとncursesコードを初期化し、画面全体を表すwindowオブジェクトを返します。
- cbreak(): バッファリングを無効にし、タイプされた入力を即座に利用可能にします。
- noecho(): ディスプレイバックがオフになっているため、ユーザー入力は画面に表示されません。
これらの関数はcurses.hヘッダーファイルで定義されており、以下の方法でプログラムにインクルードする必要があります:
#include <curses.h>
ターミナルを初期化した後は、ncurses関数を自由に使用することができます。
ncursesの使用が終わり、通常のターミナル・モードに戻りたい場合は、endwin()を使用してすべてをリセットします。このコマンドは画面の色をリセットし、カーソルを画面の左下隅に移動させ、カーソルを見えるようにします。これは通常、プログラムを終了するときに行います。
オンスクリーンアドレス
ncursesは画面を識別するために2つのグローバル変数を定義しています:LINESは画面の行数、COLSは画面の列数です。画面の右下はLINES-1,COLS-1です。
例えば、カーソルを10行30列に移動させたい場合、move()関数を使えばこれらの座標に移動できます:
move(10, 30);
それ以降に表示されるテキストは、画面上のその位置から始まります。個々の文字を表示するには、個々の文字に対して addch(c) 関数を使用します。文字列を表示するには、addstr(s)関数を使います。printfのような書式付き出力には、printw(fmt, ...)を通常のオプションで使用します。を通常のオプションで使用します。
mvaddch(row,col,c)関数は行, col, sの位置にある文字を画面に表示し、mvaddstr(row,col,s)関数は行, colの位置にある文字列を画面に表示します。mvaddstr(row,col,s)関数は、行(row)、列(col)に文字列を表示します。より直接的な例として、プログラムの中で mvaddstr(10, 30, "Welcome to ncurses"); 関数を使用すると、画面の行と列から ncurses へようこそというテキストが表示され、mvaddch(0, 0, '+') 関数を使用すると、画面の左上隅の行と列にプラス記号が表示されます。
端末の画面上にテキストを描画することは、特に古いハードウェア端末の場合、システムによってはパフォーマンスに影響を与えることがあります。そこで ncurses では、画面に表示するテキストの束を "スタック" して、refresh() 関数を使用してすべての変更をユーザーに見えるようにすることができます。
以上のことをまとめた簡単な例を見てみましょう:
#include <curses.h>
initscr();
cbreak();
noecho();
mvaddch(0, 0, '+');
mvaddch(LINES - 1, 0, '-');
mvaddstr(10, 30, "press any key to quit");
refresh();
getch();
endwin();
プログラムの冒頭では、ターミナル・ウィンドウを初期化し、画面の左上隅にプラス記号、左下隅にマイナス記号を表示し、行と列でpress any key to quitというテキストを表示します。プログラムはgetch()関数を使用してキーボードから1文字を受信し、endwin()関数を使用して端末をリセットしてから完全に終了します。
getch()はいろいろなことに使えるとても便利な関数です。私はプログラムを終了する前に一時停止するためによく使います。ほとんどのncurses関数と同様に、mvgetch(row, col)と呼ばれるgetch()のバージョンもあります。
ncursesを使ったコンパイル
例題のプログラムを通常の方法、例えばgcc pause.cでコンパイルしようとすると、リンカから大量のエラー・リストが表示されるかもしれません。これは、GNU Cコンパイラがncursesライブラリを自動的にリンクしないからです。その代わりに、-l ncursesコマンドラインオプションでロードしてリンクする必要があります。
$ gcc -o pause pause.c -lncurses
新しいプログラムを実行すると、画面のほぼ中央にシンプルな press any key to quit表示されます:
ncursesによるより良いプログラムの構築
$ man 3x curs_printw
もっとシンプルです:
$ man curs_printw
ncurses を使えば、さらに面白いプログラムを作ることができます。画面上の特定の位置にテキストを印刷することで、 ターミナルで動作するゲームや高度なユーティリティを作成できます。





