Rubyでcursesの実験 【属性編】
Rubyでcursesを使う実験をした時のメモ。文字の属性編。
基本編はこちら。
Rubyでcursesの実験 【基本編】 - 開発メモ
http://seeku.hateblo.jp/entry/2013/06/27/213848
文字の属性を設定
cursesに用意されてる属性を実際に試してみる。実験用のプログラムはこんな感じ。
# encoding: utf-8 # 文字列の属性変更のサンプル require 'curses' # 指定された属性で文字列を出力 def atr_str(y,atr,str) cu = Curses cu.setpos(y,0) cu.addstr(str+" ->") cu.attron(atr) cu.setpos(y,20) cu.addstr(str) cu.attroff(atr) end # それぞれの属性で文字列を出力 def atr_sample() (0..10).each { |i| case i when 0 # 反転表示 atr_str(i,Curses::A_REVERSE,"A_REVERSE") when 1 # 点滅表示 atr_str(i,Curses::A_BLINK,"A_BLINK") when 2 # 太字表示 atr_str(i,Curses::A_BOLD,"A_BOLD") when 3 # 半分の明るさ表示 atr_str(i,Curses::A_DIM,"A_DIM") when 4 # 不可視表示 atr_str(i,Curses::A_INVIS,"A_INVIS") when 5 # 通常表示 atr_str(i,Curses::A_NORMAL,"A_NORMAL") when 6 # 最強調表示 atr_str(i,Curses::A_STANDOUT,"A_STANDOUT") when 7 # 下線表示 atr_str(i,Curses::A_UNDERLINE,"A_UNDERLINE") when 8 # 代替文字セット表示? atr_str(i,Curses::A_ALTCHARSET,"A_ALTCHARSET") when 9 # 文字を抽出表示? atr_str(i,Curses::A_CHARTEXT,"A_CHARTEXT") when 10 # プロテクト表示? atr_str(i,Curses::A_PROTECT,"A_PROTECT") end } end # メインの処理 Curses.init_screen begin atr_sample Curses.refresh Curses.getch ensure Curses.close_screen end
やってることは、それぞれの属性で順番に文字列を出力してるだけ。簡単。
実際に実行するとこんな感じになる。
それぞれ、気になるところをまとめるとこんな感じ。
属性 | 意味 | Mac OS X | Windows | CentOS |
---|---|---|---|---|
A_REVERSE | 反転 | |||
A_BLINK | 点滅 | 点滅しない | 点滅しない | |
A_BOLD | 太字か最大明度 | |||
A_DIM | 明度半分 | |||
A_INVIS | 非表示 | 表示される? | ||
A_NORMAL | 通常 | |||
A_STANDOUT | 最強調 | 微妙 | ||
A_UNDERLINE | 下線 | 微妙すぎ | ||
A_ALTCHARSET | 代替文字? | 表示される? | ||
A_CHARTEXT | 通常文字? | |||
A_PROTECT | プロテクト | 変化無し | 微妙 | 変化無し |
これでわかることは・・・ あまり、属性は当てにならないって事か。当てに出来そうなのはA_REVERSE・A_BOLD・A_DIMぐらい? A_INVISすら信頼できないのがおもしろい。
文字色・背景色を設定
文字と背景の色を設定してみる。プログラムはこんな感じで。
# encoding: utf-8 # カラー関係の実験 require 'curses' # 色の一覧 $col_a = [ Curses::COLOR_BLACK, Curses::COLOR_BLUE, Curses::COLOR_CYAN, Curses::COLOR_GREEN, Curses::COLOR_MAGENTA, Curses::COLOR_RED, Curses::COLOR_WHITE, Curses::COLOR_YELLOW ] # 背景色・文字色の組み合わせを作成 def make_pair() # 0は実際には変更不可 no = 0 $col_a.each { |c0| $col_a.each { |c1| Curses.init_pair(no,c0,c1) no += 1 } } end # すべての組み合わせを表示 def col_sample() cu = Curses max = $col_a.size # それぞれ表示 no = 0 max.times { |y| max.times { |x| cu.setpos(y,x*6) s = " %03d "%no cu.attron(cu.color_pair(no)) cu.addstr(s) cu.attroff(cu.color_pair(no)) no += 1 } } # 色関係の情報を表示 s = "colors: %d"%(cu.colors) cu.setpos(12,0) cu.addstr(s) s = "color_pairs: %d"%(cu.color_pairs) cu.setpos(13,0) cu.addstr(s) end # メインの処理 Curses.init_screen Curses.start_color begin make_pair col_sample Curses.refresh Curses.getch ensure Curses.close_screen end
背景色と文字色の組み合わせを登録して、文字を出力するときは登録した番号を指定する、と。考え方さえわかれば難しいことはない。番号0はデフォルトの設定(背景が黒、文字が白)で固定されてる。
実際に実行するとこんな感じに。
色の数(colorsの方)は環境によっていろいろ違うけど、デフォルトの設定だけ使うのが無難そう。組み合わせの数(color_pairsの方)は1から63だけ使っておくのが無難か。
情報元
module Curses
http://doc.ruby-lang.org/ja/2.0.0/class/Curses.html