目的
近年、端末が画像に対応してきました。chromebookのcrostiniでつかうhterm、macos上のiterm2、linuxのxtermなどです。
今回端末上のghciで画像を表示するのが目的です。
これまでもIHaskellというjupyter notebook上でHaskellを動かすものがあり、hvegaやgnuplotパッケージをつかってグラフが書けました。
しかし、セットアップが難しく、必要なパッケージのセットアップ、GHCのバージョン、OSといった環境を一式そろえるのが大変した。
nixをつかってセットアップを安定化させるもののありますが、nixを使ってないプロジェクトや、既存のnixのプロジェクト上でIHaskellのセットアップをするのは難しいです。さらに動作フローが複雑で、プロセル間通信などがあり、バグやセットアップのミスをチェックすることも困難でした。
端末上のghciで画像を表示することで、これらのセットアップの手間を省きます。
端末上の画像のフォーマット
端末上の画像のフォーマットには次の二つがあります。
主要な端末はどちらかをサポートしているように見えますが、vscodeの端末xterm.jsやwindows terminalはどちらもサポートしてません。
今回この二つを出力するライブラリを作成しました。
-
Sixel
- DECが開発した物理端末上の画像のフォーマット
- カラーパレットを使い6ピクセルごとにエンコードする方式
- 対応端末:xterm、mlterm、rlogin
-
OSC1337
- iterm2で開発された画像フォーマット
- jpegやpngなどのデータをbase64エンコードするだけの方式
- 対応端末:hterm(chromebook)、iterm2、mlterm、rlogin
Sixelライブラリ
端末上で画像を出力するsixelライブラリを作りました。
ToSixelまたはToOSCのtype-classのinstanceなら画像になるようにしています。
JuicyPixelsの画像データもそのinstanceになっていて端末上で画像として表示できます。
ghci上での使い方
画像をサポートした端末上で、sixelライブラリをインストールしておきます。
interactive-printを下記のようにしてghciを起動します。
OSC 1337をサポートした環境(iterm2やhtermなど)の場合
> cabal repl "package名" --repl-options "-interactive-print=Data.OSC1337.putOSC"
or
Sixelをサポートした環境(xtermやmltermなど)の場合
> cabal repl "package名" --repl-options "-interactive-print=Data.Sixel.putSixel"
hvegaを使ったサンプルプログラムはこちらです。
あらかじめ表示したいものに対してToSixelまたはToOSCインスタンスを定義しておけば、下記のように端末上でグラフが表示できます。
まとめ
- SixelフォーマットとOSC1337フォーマットに対応した端末上で画像を表示するためのsixelパッケージを作成
- ghci上で画像を表示。今回はhvegaのグラフをサンプルで使用。