[linux-users: 108872] Re: screenでの色指定について

Takashi SHIRAI shirai @ unixusers.net
2012年 1月 5日 (木) 06:03:38 JST


 しらいです。

 判らないなりに頑張って回答してあげたいという姿勢はいいと思
うんですが、調べた訳でも確信がある訳でもないのに憶測だけで回
答すると却って混乱を広げるばかりだと思うんですが如何?

In Message-Id <CAA1rjqYwfPTO-baYak592WTu-P0Rc23Z_-xL_ziPtjw+q0aWdQ @ mail.gmail.com>
        sato akihiko <satoake9 @ gmail.com>さんwrites:
> さとあけです。

> --enable-colors256を有効になったんだから色数増えてるはずだと思い、http://frexx.de/xterm-256-notes/の
> 256colors2.plを走らせて表示されてるのを確認して、screenのhardstatusやcaptionにも使ってみよう、
> とここまでは良かったのですが、躓きました。

 256colors2.pl を走らせるとそれなりに 256 色で表現された表
示が実現されたんですよね?なら、その 256colors.pl の出力を、
od なり less なりで覗いて見れば参考になるのでは?
 一般に、端末制御に用いられる escape sequence って単なる文
字列なんで、普通に text として見ることが出来ます。印字不能文
字は先頭の ESC だけで、後は普通の plain text ですよ。
 実際に見てみると、先頭部分に 240 (256 - 16) 個のパレット定
義があって、次にシステム色 16 色を出力した後、定義しておいた
各色で出力しているのが判ると思います。

 パレット定義は例えば次のような書式になってますね。「4」は
Xterm の仕様で色定義を行なうコマンドです。
	<ESC> ] 4 ; 16 ; rgb : ab / cd / ef
 これは 16 番のパレットに、RGB 値が十六進数で (ab, cd, ef)
となる色を定義するという意味です。例えば「00/00/00」なら真っ
黒で「ff/ff/ff」なら真っ白になります。

 背景色の指定は例えば次のような書式になってますね。「48」及
び「5」は Xterm の仕様でパレット指定を行なうコマンドです。
	<ESC> [ 48 ; 5 ; 16 m
 これは先ほど定義した 16 番のパレットを背景色として指定する
という意味です。これに plain text を続けると、その text は指
定色の背景で表示されます。

 ここから先は 256colors2.pl のサンプルに存在しないので、あ
る程度 escape sequence を知らないと判らないことですが、上記
の「48」を「38」に置換えると表示色の指定になります。
	<ESC> [ 38 ; 5 ; 16 m
 これで表示色の方を 16 番パレットに指定するという意味になり
ます。まぁ普通は背景色と表示色は違う色にするので、両方指定す
るならパレット定義も二色分必要になりますね。


> 「色は 16 進数か、あるいは背景色と前景色を示す 2 つの文字 (背景、前景の順) で指定する。次の色がある:」

 それは screen(1) の記述ですよね。.screenrc の中などで文字
列を定義する場合、screen は内部処理で「%」をメタ文字とする構
文解析を行ないます。その場合の色指定法のことを言っています。
 この文法では、例えば「= 12」が「= rg」と同値になるようです
ね。単に色名として十六進数値を用いているだけと見なしても構わ
ないでしょう。
 これでは 256 色を指定することが出来ませんね。

 上で言っている escape sequence は、端末に直接出力する文字
列の話なんで、screen の上で動いている何らかのコマンドがそう
いう文字列を出力する場合に有効になります。
 caption や hardstatus に色指定を行なうとなると、screen が
動いている端末がその色指定を解釈出来ないといけません。例えば
xterm とか TeraTerm とか。
 その前提が成立つなら、.screenrc の中で直接 escape sequence
を記述してやれば 256 色対応は可能です。

 .screenrc の中では <ESC> は「^[」の二文字で表現されます。
また \ はメタ文字なので「\\」の二文字で表現されます。これを
踏まえると例えばこんな感じ。
"^[]4;16;rgb:ab/cd/ef^[\\^[]4;17;rgb:54/32/10^[\\^[[38;5;16m^[[48;5;17m+++^[[0m"
 16 番と 17 番のパレット定義を行なって、表示色を 16 番に背
景色を 17 番にした後、「+++」を表示して色指定をリセットして
います。
 最後の「^[[0m」によるリセットを忘れると、これ以降の出力文
字に全てこの色指定が持続してしまうので要注意です。

 んー、ちょっと長ったらしいですね。実は「rgb:XX/XX/XX」の部
分は Xterm 仕様では「#XXXXXX」でも置換えられるので、そうする
ともう少し短くなりますね。
 あと、端末制御の escape sequence のお約束として、同系統の
コマンドは一まとめに出来てしまうので、それを利用することでも
短縮化が図れます。
 合わせると上記の設定行はこうなります。
"^[]4;16;#abcdef;17;#543210^[\\^[[38;5;16;48;5;17m++^[[0m"

 但し、escape sequence を直接記述すると、他の端末上での動作
が保証出来なくなるので、一般的には余りお奨め出来る方法ではあ
りません。
 普通はそういう指定は termcap や terminfo のデータベースに
問い合わせて適用するルールになっているので、escape sequence
の直接記法は飽くまでも緊急回避的な手法だと思って下さい。

                                               しらい たかし


linux-users メーリングリストの案内