ansicolumn
というコマンドを作っていて、こんな風にテキストファイルをマルチカラムで表示することができる。
less lib/App/ansicolumn.pm | ansicolumn -DPC2 | less
最初に less
を使ってるのはなぜかというと、それによってソースコードをハイライトする設定になっているからだ。具体的には LESSOPEN
という環境変数を設定して、最終的にはこんなコマンドが実行されているのだが、めんどくさくて打ってられない。
source-highlight -f esc -i lib/App/ansicolumn.pm
ansicolumn
は、この例のように各ページに枠をつけることができる。これは --border-style
というオプションで指定できて、上で使っているのは heavy-box
というスタイルで --cm BORDER=C
というオプションでシアン色を指定している。さて、少し前に、枠線ではなくボード状の形式で表示してみようと思って --black-board
というスタイルを作ってみた。
ansicolumn -DPC2 --black-board lib/App/ansicolumn.pm | less
なかなかいいじゃないの。これは、--inner-box
というスタイルを使って、枠の色とテキストの背景色を合わせることで実現している。しかし、ハイライトしたデータを表示するとこうなった。
less lib/App/ansicolumn.pm | ansicolumn -DPC2 --black-board | less
台無しだ。ansicolumn
は Term::ANSIColor::Concise
というライブラリを使ってそれぞれのテキスト行に色を着けている。これはまあまあよくできていて、すでに色情報が一部に含まれている文字列に着色する場合、色が着いていないすべての部分にそれを適用するようになっている。そのような工夫をしないライブラリの場合には、最初の既存の着色部分でリセットされてしまうので、それより後方には効果が反映されない。
しかし、それぞれの着色部分の終わりでリセットしているので、既存の着色部分の中には効果が及ばない。ハイライトで指定しているのはテキスト色だけなので、背景色の指定とは両立可能なのにだ。
今回ライブラリをアップデートして終了部分ではリセットしないようにした。その結果がこれ。
いいじゃないの。ちなみに green-board
、white-board
、slate-board
というオプションも定義されている。
オプションの定義はこう。
option --board-color --bs=inner-box --cm=BORDER=Z$<2>,TEXT=$<shift>/$<shift>
option --white-board --board-color 000 L24
option --black-board --board-color 555 L05
option --green-board --board-color 555 (30,77,43)
option --slate-board --board-color 555 <dark_slategray>
--board-color
はテキスト色と背景色の2つのパラメータを受ける。これを使って独自のオプションを定義することもできる。
ansicolumn
コマンドについては、こちらの記事をどうぞ。
インストールはこんな風に。
cpanm -n App::ansicolumn
リポジトリはこちら。