Help us understand the problem. What is going on with this article?

端末上のghciでグラフィック

目的

近年、端末が画像に対応してきました。chromebookのcrostiniでつかうhterm、macos上のiterm2、linuxのxtermなどです。
今回端末上のghciで画像を表示するのが目的です。

これまでもIHaskellというjupyter notebook上でHaskellを動かすものがあり、hvegaやgnuplotパッケージをつかってグラフが書けました。

しかし、セットアップが難しく、必要なパッケージのセットアップ、GHCのバージョン、OSといった環境を一式そろえるのが大変した。
nixをつかってセットアップを安定化させるもののありますが、nixを使ってないプロジェクトや、既存のnixのプロジェクト上でIHaskellのセットアップをするのは難しいです。さらに動作フローが複雑で、プロセル間通信などがあり、バグやセットアップのミスをチェックすることも困難でした。

端末上のghciで画像を表示することで、これらのセットアップの手間を省きます。

端末上の画像のフォーマット

端末上の画像のフォーマットには次の二つがあります。
主要な端末はどちらかをサポートしているように見えますが、vscodeの端末xterm.jswindows 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になっていて端末上で画像として表示できます。

image.png

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インスタンスを定義しておけば、下記のように端末上でグラフが表示できます。

image.png

まとめ

  • SixelフォーマットとOSC1337フォーマットに対応した端末上で画像を表示するためのsixelパッケージを作成
  • ghci上で画像を表示。今回はhvegaのグラフをサンプルで使用。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away