開発メモ

開発関係のメモをいろいろと。たぶん。

Rubyでcursesの実験 【属性編】

Rubycursesを使う実験をした時のメモ。文字の属性編。

基本編はこちら。

Rubycursesの実験 【基本編】 - 開発メモ
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

やってることは、それぞれの属性で順番に文字列を出力してるだけ。簡単。

実際に実行するとこんな感じになる。

f:id:see_ku:20130628222244p:plain

f:id:see_ku:20130628222257p:plain

f:id:see_ku:20130628222311p:plain

それぞれ、気になるところをまとめるとこんな感じ。

属性 意味 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はデフォルトの設定(背景が黒、文字が白)で固定されてる。

実際に実行するとこんな感じに。

f:id:see_ku:20130628222330p:plain

f:id:see_ku:20130628222341p:plain

f:id:see_ku:20130628222355p:plain

色の数(colorsの方)は環境によっていろいろ違うけど、デフォルトの設定だけ使うのが無難そう。組み合わせの数(color_pairsの方)は1から63だけ使っておくのが無難か。

情報元

module Curses
http://doc.ruby-lang.org/ja/2.0.0/class/Curses.html