LoginSignup
2
0

ansicolumn というコマンドを作っていて、こんな風にテキストファイルをマルチカラムで表示することができる。

less lib/App/ansicolumn.pm | ansicolumn -DPC2 | less

スクリーンショット 2023-06-18 19.17.16.png

最初に 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

スクリーンショット 2023-06-18 19.28.41.png

なかなかいいじゃないの。これは、--inner-box というスタイルを使って、枠の色とテキストの背景色を合わせることで実現している。しかし、ハイライトしたデータを表示するとこうなった。

less lib/App/ansicolumn.pm | ansicolumn -DPC2 --black-board | less

スクリーンショット 2023-06-18 19.31.37.png

台無しだ。ansicolumnTerm::ANSIColor::Concise というライブラリを使ってそれぞれのテキスト行に色を着けている。これはまあまあよくできていて、すでに色情報が一部に含まれている文字列に着色する場合、色が着いていないすべての部分にそれを適用するようになっている。そのような工夫をしないライブラリの場合には、最初の既存の着色部分でリセットされてしまうので、それより後方には効果が反映されない。

しかし、それぞれの着色部分の終わりでリセットしているので、既存の着色部分の中には効果が及ばない。ハイライトで指定しているのはテキスト色だけなので、背景色の指定とは両立可能なのにだ。

今回ライブラリをアップデートして終了部分ではリセットしないようにした。その結果がこれ。

スクリーンショット 2023-06-18 19.41.18.png

いいじゃないの。ちなみに green-boardwhite-boardslate-board というオプションも定義されている。

スクリーンショット 2023-06-18 19.51.10.png

オプションの定義はこう。

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

リポジトリはこちら。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0