いろいろ

256 色版 xterm で色を指定するためには xterm で定義されている色番号 (?) を使わないといけないんだけどそこらへんの変換をする関数を提供する autoload script file 。というか最初ここ ( http://d.hatena.ne.jp/goth_wrist_cut/20090812/1250063695 ) のを使わせてもらってたんだけどせっかく autoload という小技を覚えたんだからということで上記 entry 経由で見つけた http://d.hatena.ne.jp/kakurasan/20080701/p1 を参考に書き直させてもらった感じ。

あと以下の file に依存しているので使う場合はご一緒に。

こっちは RGB ぽい値を赤、緑、青の順の List に変換する関数と List から文字列に変換する関数を詰め込んである。大体ひとが考え得る RGB の指定方法には対応しているつもり。

でまぁ例えば自前で xterm 用 colorscheme とか書く場合に以下のようにするとわかりやすい、というのは上記 entry と同じだね。

execute 'highlight' 'Normal' 'ctermfg=' . color#xterm256#RGB2Nr('#ffffff')
        \                    'ctermbg=' . color#xterm256#RGB2Nr('#333333')
        \                    'guifg=#ffffff'
        \                    'guibg=#333333'

あと本家に比べて質的にも速度的にも安定してるというか、まぁ平均速度は圧倒的にこっちが遅いんだけど。質的というのは本家は厳密に一番近いものを探すわけではないのでそれっぽいものを返すこともあるんだけどこっちは愚直にすべての色との距離を測っているので必ず一番近いものが返るという意味。で、速度的というのはそれっぽいものを見つけた時点で探索を終了するので指定された値によってムラが出る本家に比べてこっちは基本 16 色だろうが grayscale だろうが colorcube 色だろうが order が一緒という意味。一応測ってみたんだけどそこらへんの違いが結構如実に出る結果で。計測方法は http://d.hatena.ne.jp/janus_wel/20091215/1260865291 で書いた plugin をいれて以下の command で。

:let g:profile_numoftrials = 100

:Profile color#xterm256#RGB2Nr('#000000')   " return   0, time: 0.010981 msec
:Profile RGB2ESC('#000000')                 " return   0, time: 0.000228 msec
:Profile color#xterm256#RGB2Nr('#808080')   " return 244, time: 0.011079 msec
:Profile RGB2ESC('#808080')                 " return   8, time: 0.007508 msec
:Profile color#xterm256#RGB2Nr('#ffff80')   " return 228, time: 0.011023 msec
:Profile RGB2ESC('#ffff80')                 " return 228, time: 0.017075 msec

heuristic な方法を使えばもっと高速化出来そうなんだけど色空間への感覚がおれの中に芽生えそうもないのでナシということで。