wget のプログレスバーや, lynx, w3m などの CUI ブラウザ、NetHack などの CUI ゲームなどのように、CUI 画面内の一部だけを動的に書き換える、という処理を実装する方法をメモしておきます。
基本として、CUI の描画方法を制御するには特定のキーコードに割り当てられている画面描画の処理命令を利用します。
標準出力に出力された時点で命令が実行されるので、制御コードを知ってさえいれば echo だけで画面描画が実現できてしまいます。次のように入力すると画面をクリアします。
$ echo \
capname については man terminfo の Cap-Name を参照。
例:
% zmodload zsh/terminfo
% echoti setaf 2
% echo Hello,world
Hello,world
参考: http://d.hatena.ne.jp/lurker/20061121
・tput
zsh 以外のシェルからでも使える汎用プログラム。Curses や NCurses に含まれています。なお、FreeBSD に最初から含まれている /usr/bin/tput は Curses 版です。
Curses 版の書式 (FreeBSDなど):
$ tput <TCapCode> [ 引数… ]
TCapCode については man termcap の TCapCode を参照。
NCurses 版の書式 (FreeBSD ports や Linux など):
$ tput <CapName>
CapName については man terminfo の Cap-Name を参照。
curses よりこちらのほうが一般的です。
curses tput の例:
15 行 20 文字目に文字列 OK を書き込む。
$ tput sc; tput cm 20 15; tput al;echo OK; tput rc
文字に下線を入れる
$ tput us ; echo hello; tput ue
Ncurses tput の例:
文字の色を赤に。
$ tput setaf 1
白に戻す。
$ tput setaf 9
参考: http://www.ibm.com/developerworks/jp/linux/aix/library/au-learningtput/index.html