端末上でグリグリ操作するようなアプリケーションは、これを使わなければ実現できない。端末上で動作するviやEmacs、nanoなんかのコマンドラインエディタ(テキストエディタ)もこれを使って実装してあるんだろう。
RubyやPythonなどのスクリプト言語などでもNcurses(またはCurses)が使えるようになってたりする。
C言語でNcursesを使う場合、まずinitscr()で初期化し、最後にendwin()で後処理をする。
これで、addstr()などで端末上の好きな場所に文字列を表示したりできる。
Ncursesは標準のライブラリでないので、コンパイル時にgccには-lncursesオプションを付けなければならないので注意。
そして、日本語(2バイト文字)を扱う場合はちょっと1手間必要なので、ここに書いておく。
まず、ダメな例。1秒間「ほげほげ」とだけ表示して終了するプログラム。
#include <ncurses.h>
main(){
initscr();
addstr("ほげほげ");
refresh();
usleep(1000000);
endwin();
}
これだと、「ほげほげ」が文字化けしてしまう。
日本語(2バイト文字)に対応させるには次のようにコードを書き、なおかつgccには-lncursesオプションではなく-lncurseswオプションを付ける。(末尾にwを付加)
#include <ncurses.h>
#include <locale.h>
main(){
setlocale(LC_ALL,"");
initscr();
addstr("ほげほげ");
refresh();
usleep(1000000);
endwin();
}
これだと、日本語(2バイト文字)が扱える。
wはwide charactorの意味。Ncursesを2バイト文字に対応させたもので、Ncurseswという。
NcursesとNcurseswは別のパッケージとして配布されているので、自分の環境を要確認。
UbuntuのSynapticだとNcursesはlibncurses5,libncurses5-devというパッケージ名。Ncurseswはlibncursesw5,libncursesw5-devだった。
ちなみに、RubyではまだNcurseswには対応していないらしい。そのせいでRubyで書こうと思っていたプログラムを、今Cで書いているのです。。。
<追記>
コードの < と > をエスケープし忘れてたのを直しました。
0 件のコメント:
コメントを投稿