Scintilla cursesでの色指定
Scintillaのcurses向け実装の色についてのメモ。 何度も調べては忘れるを繰り返すので、いい加減書いておく。
Scintillaはテキストエディタ用のライブラリで、gtkやwindows向けのライブラリがある。 ncurses用は、以前は別に開発されていたようだが、その後本体に取り込まれた。 が、最新版(4.x)には含まれておらず、LongTerm3ブランチというバージョン3系統で提供されている。 最新版は、C++の新しい機能を使っており、対応できない環境があるためLongTerm3ブランチが用意されたものと、理解している。 機能的には、後追いで追随されている模様。
以上が前置きで、ここからが本題。
テキストエディタの機能として、カラーマップを好みに変えたいが、 残念ながらScintilla cursesは最大16色までしかサポートしていない。 端末がどれだけサポートしてても関係ない。
使える色も決まっていて、次の16色。色の指定は0xBBGGRRの書式。RGBでは無い。 REAMDE.mdだとこのBBGGRRで説明があるのだけれども、ソースだとRGBが使われていて、ややこしい。
- black (
0x000000
) 0 - red (
0x000080
) 1 - green (
0x008000
) 2 - yellow (
0x008080
) 3 - blue (
0x800000
) 4 - magenta (
0x800080
) 5 - cyan (
0x808000
) 6 - white (
0xC0C0C0
) 7 - light black (
0x404040
) 8 - light red (
0x0000FF
) 9 - light green (
0x00FF00
) 10 - light yellow (
0x00FFFF
) 11 - light blue (
0xFF0000
) 12 - light magenta (
0xFF00FF
) 13 - light cyan (
0xFFFF00
) 14 - light white (
0xFFFFFF
) 15
Scintillaの色の設定はRGBでそれぞれ0から255の範囲で行う。 cursesでは、上記16色以外が設定されると、白(0xC0C0C0)になる。
さすがに16色では寂しい。
どうするか?
- [案1]ターミナルエミュレータにまかせる
ターミナルエミュレータで、お気に入りの配色を設定してしまえば、Scintilla cursesでは、色の対応だけ気にしておけばよい。
ただ・・・ターミナルの配色と、エディタの配色は変えたいという気分になるときもあるので、 独立して設定できる方法も欲しい。
- [案2]デフォルトのカラーマップを変更
色番号0-15番をcursesのinit_colorを使って変更する。 色番号とR,G,Bの値を指定するのだが、RGBの範囲は0から1000の範囲なので、値の変換が必要。約4倍だ。
で、やってみたらinit_colorがエラーになった。 どこに問題があるのか探ってみたら、tmux上では上手くいかないことがあった。 色々設定を変えて、トライしていたら、そのうち動くようになった。
なにかのタイミングで、tmuxが8色しか使えない状態になっていたようだが、よく分からない。
この過程で、tmux -2 で起動すると、強制的に256色モードで起動するという知見を得た。
ということで、16色の範囲であれば、256色ぐらいは使えるようになったかな。