定義ファイルの公開は難しい:エディタとシンタックスハイライトに関する考察

プログラマの端くれなので、使用するテキストエディタには大抵シンタックスハイライトの機能が付いている。

世の中には沢山のプログラミング言語が存在するわけで、大抵のエディタはシンタックスハイライト等の定義を追加できるようになっている。

追加した定義は、多くの場合ファイルとして保存される。なのでユーザがそのファイルを公開することで、わざわざ自分で定義を作ることなく新たなシンタックスハイライトを追加できるように思われる。

しかし、実際には追加した定義の情報を何の問題なく公開できるケースは少ないのではないだろうか?

ケーススタディ:Notepad++

Notepad++はシンタックスハイライトのXMLファイルを追加することができる。例えばデフォルトではawkシンタックスに対応していないのだが、公式サイト経由で配布されているXMLファイルを組み込むことで、awkソースコードにも対応できる。

とはいうものの、私の環境にそのXMLファイルを組み込んでも使い物にならないのだ。使い物にならないと予想していて、実際に組み込んだら案の定使い物にならなかった。

というのも、XMLファイルに具体的な色分けの色の情報まで含まれるのが難点なのだ。

大抵の定義ファイルはデフォルトの色設定(通常文字が黒で背景が白)の元で使用する前提で作られているが、私の環境は「通常文字が明るいグレーで背景が黒」という設定になっている。なので私の環境で誰かが作った定義ファイルをエディタに登録すると、十中八九文字が見えない。色つきの文字も背景色(黒)にマッチしていない。結局、色設定については改めて設定し直す必要があるのだ。

という訳で、具体的な色分けの色の情報が定義ファイルに含まれている場合、私の手元では大抵問題が起きる。

ケーススタディ秀丸エディタ

では色の情報を直接持たない場合はどうか?

例えば秀丸エディタでは、シンタックスハイライト自体は色情報を直接持たない。「強調表示1」とか「文字定数」といった抽象化された色情報を指定するようになっている。

実際の色は「強調表示1は黄色」「文字定数はピンク」といった具合に別途設定することになる。

一見して問題は無さそうだが、実際にはこれも微妙な所で、何が微妙かというと「文字定数」はまだしも「強調表示1」などは意味が曖昧すぎるのだ。

例えば各個人が色情報を変更する時、私と他人では「強調表示1」に持たせる意味合いが異なってくるだろう。その異なった意味合いを土台にしてシンタックスハイライトの情報を構築することになる。

その結果、他人の作ったシンタックスハイライトの定義を導入した時、非常に違和感のある表示になってしまうことが多い。

この問題は「私と他人」だけでなく言語Aと言語Bでも起こる。特にそのプログラミング言語において色分けしたい要素が複数あって「強調表示2」や「強調表示3」等を使用する場合だ。言語Aで2色に色分けする時の色の組み合わせと言語Bでの組み合わせが異なるのに両者とも「強調表示1」と「強調表示2」を使用……というようなことが起きる。

こうなってくると結局、複数言語に跨って色分け設定を色々と修正しなくてはならない。

ケーススタディ:Peggy Pad

ならば「強調表示1」などよりも意味が明確ならどうか?

例えばPeggyのCRECには文法色という考え方があり、プログラミング言語の文法の各要素ごとに色を設定できる。組み込み関数ならFgBuiltinFunction、システムコールならFgSystemCall……といった具合だ。

色分けするキーワードを追加する際は、これら文法色を指定することになる。

この方法なら単なる「強調表示1」よりも意味が明確な分、自分と他人の認識の齟齬で躓く可能性は低くなる。しかし問題が無いわけではない。文法色にうまく当てはまらない要素の扱いに困るのだ。

例えばPeggyの仲間であるPeggy PadのC言語の色分けを拡張しようとしたことがあるのだが、標準ライブラリの関数、変数、定数、データ型の扱いに困った。

関数は「組み込み関数」、変数は「定義済み変数」を割り当てたのだが、定数、データ型に合致する要素が無いのだ。

思案した挙句、

定数 システムシンボル
データ型 システムデータ型

このように割り当てたのだが、果たしてこれが適切だったのやら?

個人的に、システムシンボルやシステムデータ型というと、Windows APIUnixシステムコールで使用する定数やデータ型を思い浮かべてしまうので、違和感がある。

結局……

こうなってくると結局、

  • エディタの色設定は極力デフォルト設定のままで使う。
  • その状態で新たな定義を作成する。

こういった運用をするのが一番楽、ということになってしまう。それか色分け定義は労を惜しまずに自作するとか。

何というか、表示色を変更できないようなっていたらこんな苦労はしないのだが、それはそれで不便極まりない話だ。