ソフトな忘却力(32) NCURSES、New Cursesライブラリを使ってみる

Joseph Halfmoon

前回に続き「いつもお世話になっている」割には使った記憶のないライブラリを使ってみます。今回は ncursesライブラリ、古い curses ライブラリの置き換えで”New” がついての ncurses みたいです。忘却力の年寄はターミナルウインドウ上でもncursesベースのユーティリティに頼ってます。ほんとに便利。

※「ソフトな忘却力」投稿順 Index はこちら

※実行確認はWindows11上のWSL2にのせてあるUbuntu20.04LTSで行ってます。

ncursesベースのブログラムは、sshなどリモートログインした端末の中でも画面全体を使い、また色をつけたり、マウスも使えたりと至れり尽くせりです。これがあればGUIなどいらん?ホントか。

さて、ncursesのホームページは以下です。

ncurses

さらに以下のHOWTOページも充実。これがあれば何でもできそう?

NCURSES Programming HOWTO

さて、いつものWSL2上のUbuntu20.04LTSでのncursesの状況ですが、実行用のライブラリは勿論のこと、開発用の-dev パッケージも最初から入ってました。何も追加インストールしなくても即プログラムを書いてビルドできる状態でした。

念のため、以下のパッケージを追加インストール。

$ sudo apt install ncurses-doc ncurses-examples

上記をインストールしておくと、info ncurses とかやるとドキュメントが読めるようになってます。

サンプルプログラムをもってきて勝手改造

上記のProgramming HOWTOのページに Hello World もおかれていたので、これを参考に以下のファイルを作成いたしました。これまたお世話になっているWindows11の「ターミナル」内でUbuntu動かしてです。この「ターミナル」何気に強力で良いソフトだと気にいってます。WSL2のUbuntuだけでなく、リモートのRaspberry Pi OSにSSH接続して使ったりもしているのですが、どのウインドウでも完璧にmc (midnight commander)が動きます。マウスもサポート(唯一の例外はMSYS2上でmcを動かすとマウス使えないんですけど。)まあ、Ubuntu動かしている「ターミナル」内ならncursesは縦横無人の筈。

Hello Worldのサンプルプログラムに、画面サイズの報告機能などを若干加えてみました。helloWorldncursesC

念のため、テキスト形態でもソースおいておきます。

#include <ncurses.h>

int main()
{
        int row, col;

        initscr();
        printw("Hello World !!!\n");
        getmaxyx(stdscr, row, col);
        printw("Screen size Row=%d Col=%d", row, col);
        mvprintw(5, 10, "Type any key>");
        refresh();
        getch();
        endwin();

        return 0;
}

一か所、あれっと思ったのが getmaxyx()のところですかね。これはrow, colにそのときの画面サイズをセットしてくれるものなのです。なんで引数に & ついてないの? ドキュメントを見たら疑問氷解。getmaxyxはマクロでした。関数じゃありません。

ビルドして実行

例によって、pkg-configが使用可能であったので使わせていただいています。上記のドキュメント上は -lncurses すればOKみたいに書かれてましたが確かめてないっす。

$ gcc -o ncursesHello2 ncursesHello2.c $(pkg-config --cflags --libs ncurses)

実行するとこんな感じ。この環境では画面はクリアされて、左上にカーソルがいる状態に初期化されるようです。30行120列はWindows11の「ターミナル」のデフォルトの画面サイズです。知らんけど。Results_ncurses2C

一文字キーを触ればプロンプトに戻ります。

ソフトな忘却力(31) GNU Readlineライブラリを使ってみる へ戻る

ソフトな忘却力(33) MD5ハッシュを計算してみる、OpenSSL へ進む