コードやコマンド出力を画像化するコマンドラインツール「Freeze」の紹介
Charm がまた最高なツールを出してました。
例えばこういうコマンドを実行すると、
$ freeze main.js \
--window \
--show-line-numbers \
--border.radius 8 \
--shadow.blur 4 \
--margin 12
こういう画像を作れます。

こういうの
この記事では Freeze の基本的な使い方について簡単に紹介します。
インストール
Homebrew を使用している場合は brew install でインストールできます。
$ brew install charmbracelet/tap/freeze
もしくは go install でインストールすることもできます。
$ go install github.com/charmbracelet/freeze@latest
その他のインストール方法については公式の README をご参照ください。
基本的な使い方
基本的には以下のように、 freeze コマンドに画像化したいファイルを渡すだけです。
$ freeze <ファイル名>
# 例
$ freeze main.js
今回は以下のような内容の main.js を例にします。
function fibonacci(length) {
let nums = [0, 1];
for (let i = 2; i < length; i++) {
nums[i] = nums[i - 1] + nums[i - 2];
}
return nums;
}
console.log(fibonacci(10));
// => [
// 0, 1, 1, 2, 3,
// 5, 8, 13, 21, 34
// ]
freeze コマンドを実行してみます。
$ freeze main.js
次のような画像が freeze.png という名前で保存されます。

出力された画像
素敵ですね。
画像はデフォルトでは freeze.png という名前で保存されますが、 -o もしくは --output フラグで名前を指定することもできます。
# hoge.png という名前で保存
$ freeze main.js --output hoge.png
また、保存ファイル名の拡張子によって画像形式を指定することもできます。
v0.1.6 時点では PNG, WebP, SVG に対応しています。
# PNG 形式で保存
$ freeze main.js --output out.png
# WebP 形式で保存
$ freeze main.js --output out.webp
# SVG 形式で保存
$ freeze main.js --output out.svg
コマンドの実行結果を画像化
Freeze が画像化できるのはファイルだけではありません。
--execute フラグにコマンドを指定すると、そのコマンドの出力を画像化することもできます。
# eza を実行してみる
$ freeze --execute 'eza -alh'

ちゃんと色もつく
すごい。
見た目のカスタマイズ
フラグによって画像の見た目をカスタマイズすることができます。
ここではいくつかの例を紹介します。
フォント
--font.family フラグでフォントを指定することができます。
デフォルトは JetBrains Mono です。
今回は例として Unifont を指定してみます。
# Unifont を指定 (ローカルにフォントがインストールされている必要があります)
$ freeze main.js --font.family 'Unifont'

出力された画像
mac のウィンドウっぽくする
--window フラグを指定すると mac のウィンドウっぽくなります。
$ freeze main.js --window

出力された画像
枠線
枠線を設定することもできます。
-
--border.width: 枠線の幅 -
--border.color: 枠線の色 -
--border.radius: 角の丸み
$ freeze main.js --border.width 8 --border.color "#ff0000" --border.radius 8

出力された画像
行番号
--show-line-numbers フラグを指定すると行番号が表示されます。
$ freeze main.js --show-line-numbers

出力された画像
ここで紹介したのは一部ですが、他にも様々なオプションが用意されています。
- シンタックスハイライトのテーマ
- 影
- margin, padding
- フォントサイズ
- etc...
詳しくは公式の README をご参照ください。
設定ファイル
毎回フラグを指定するのは面倒なので、自分で設定ファイルを作成して使い回すことも可能です。
例えば freeze --interactive を実行すると対話的に設定を行うことができます。

公式の README より引用
freeze --interactive で行った設定はローカルに保存され、次回以降は -c もしくは --config フラグに user を指定することで再利用することができます。
# `freeze --interactive` で作成した設定を使う
$ freeze main.js --config user
デフォルトで用意されている設定もあります。
例えば -c もしくは --config フラグに full を指定すると mac のスクショっぽくなります。
$ freeze main.js --config full

mac のスクショっぽい
設定ファイルについて詳しくは公式の README をご参照ください。
まとめ
最高すぎます。
Charm は他にも最高なツールや Go ライブラリをたくさん出しているので、興味があればこれらもチェックしてみてください。
Discussion