プログラミング
Lazydraw: 図やスケッチを描くためのターミナルASCIIエディタ
Lazydraw: Terminal ASCII editor for drawing diagrams and sketches (github.com)
要約
Lazydrawは、ターミナル上で図やスケッチを素早く描画できるASCIIエディタです。テキストファイルへのエクスポートやクリップボードへのコピー機能も備えています。Bunランタイム上で動作し、インストールや使用方法、豊富なキーバインディングやカスタマイズオプションが提供されています。
全文翻訳
lazydraw
lazydrawは、テキストファイルへのエクスポートやクリップボードへのコピーオプションを備えた、素早い図やスケッチを描くためのターミナルASCIIエディタです。
demo.mp4
謝辞
ASCIIFlow by Lewis Hemens: 元祖であり、lazydrawがターミナルで実現しようとしているものです。
termDRAW by Ben Vinegar: このクラスのエディタがターミナルで可能であることを示し、レンダリングループのアプローチを形成しました。
OpenTUI by SST: フロントエンド全体が構築されているターミナルUIエンジンです。
インストール
lazydrawはBunランタイム上で動作するため、Bun 1.3以降をインストールする必要があります。マウスサポートのあるターミナルも必要です。
bun install -g lazydraw
lazydraw
その後lazydrawコマンドが見つからない場合は、BunのグローバルbinディレクトリがPATHに含まれていません。シェルプロファイルに追加してください: export PATH="$HOME/.bun/bin:$PATH"
npmでも同様にインストールでき、通常はすでにPATHにある場所に配置されます: npm install -g lazydraw
または、インストールをスキップして直接実行することもできます: bunx lazydraw
herdr内
lazydrawはherdrプラグインマニフェストを同梱しているため、作業中のペインの右側に分割されたペインとしてマルチプレクサ内に配置できます: herdr plugin install mpospirit/lazydraw
インストール手順ではクローン内でbun install --productionを実行するため、BunがPATHにある必要があります。プラグインマニフェストは独自のキーバインディングを宣言できないため(herdrがその領域を所有します)、これを自身のconfig.toml(herdrの設定、または~/.config/herdr/config.tomlから開けます)に追加し、herdr server reload-configを実行してください:
[[keys.command]]
key = "prefix+ctrl+d"
type = "plugin_action"
command = "mpospirit.lazydraw.open"
description = "open lazydraw"
Ctrl+B Ctrl+Dでキャンバスが右側分割で開きます。キーを上記で変更して再バインドしてください。
lazydrawを実行
# 最後の描画を開く
lazydraw
# 名前で描画を開くか作成する
lazydraw architecture
# ファイルからインポートする
lazydraw ./diagram.ld.json
lazydraw --import notes.txt
UIを開かずに描画をエクスポートする:
lazydraw export architecture --basic --comment hashes --fenced -o diagram.txt
lazydraw list
ツールバー
≡ │ box select arrow line text eraser │ export │ ⟲ ⟳ │ ⚙ │ help
≡ 描画を切り替える; 新規作成、名前変更、フォーク、インポート、クリア、削除
box コーナーからコーナーへドラッグ
select ドラッグしてボックスを選択; ボックスの内部をドラッグして、アタッチされた矢印と共に移動させる
arrow / line ドラッグして開始から終了へ; Shiftキーを押すか、ドラッグ中にfキーを押すとエルボを反転させる
text クリックして入力; Enterで新しい行を開始、Escで終了
eraser ドラッグして消去; 接触した線から切り離す
export 拡張または基本文字、11種類のコメントスタイル、Markdownフェンス、プレビュー、コピー、保存
⟲ / ⟳ 元に戻す / やり直し
⚙ グリッドスタイル(格子、チェッカー、ドット、オフ)、テーマ(ターミナル+10 IDEテーマ)、選択時のコピー、再中央配置
help アクティブなツールのヘルプ、およびショートカットリスト
キー
キー アクション
1–6, Alt+1–Alt+6 ツールを切り替える
r v a l t e ツールを切り替える: box, select, arrow, line, text, eraser
Ctrl+Z / Ctrl+Y 元に戻す / やり直し (Ctrl+Shift+Zはkittyキーボードプロトコルを持つターミナルではやり直しも行います)
Ctrl+C Ctrl+X Ctrl+V 選択範囲のコピー、カット、ペースト (ブラケットペーストも機能します)
Del / 矢印キー 選択範囲を消去または微調整する
ホイール、Shift+ホイール 垂直/水平にパンする
Space+ドラッグ、中ドラッグ フリーにパンする
Ctrl+O Ctrl+E Ctrl+S ファイル / エクスポート / 保存
今すぐ?, Esc ヘルプ; ポップオーバーを閉じる、ドラッグをキャンセルする、選択を解除する
Ctrl+Q 2回終了; 最初のプレスでプロンプトが表示され、3秒以内に2回目のプレスで終了します (描画は自動保存されます)
テキストモードでは、数字、q、?を含む印刷可能なキーでテキストが入力されます。選択によってクリップボードにコピーすることもできます — settings → copy on select(デフォルトはオフ)。
ファイル
描画: ${XDG_DATA_HOME:-~/.local/share}/lazydraw/drawings/<name>.ld.json
設定: ${XDG_CONFIG_HOME:-~/.config}/lazydraw/config.json
描画は変更後500ミリ秒ごとに自動保存され、終了時にも再度保存されます。
ターミナルの注意点
tmux: set -g mouse on が必要です。OSC 52によるコピーには set -g set-clipboard on が必要です。
macOS: Alt+数字は「Option as Meta」が必要です(または数字のみを使用)。
色: デフォルトのターミナルテーマは、ターミナル自体のパレット(OSC 10/11/4)を読み込み、背景、テキスト、ANSIカラーを適用するため、lazydrawは透過してターミナルの外観に合わせます — settings → themeには10種類のIDEテーマ(dracula, nord, tokyo-night, catppuccin, one-dark, gruvbox, monokai, night-owl, solarized-dark, github-light)もあります。カラークエリに応答しないターミナルはnordにフォールバックします。
グリッド: デフォルトの格子スタイルは、各空のセルに🭼 (U+1FB7C) を描画し、背景からテキストカラーに向かって7%の色合いで薄く表示されます。ターミナルでセルエッジの細線としてレンダリングされない場合は、設定でチェッカーに切り替えてください。
開発
bun install
bun start # ソースから実行
bun test # 単体テスト、フィクスチャテスト、エンドツーエンドテスト
bun run typecheck
bun run build # dist/lazydraw にスタンドアロンバイナリが作成されます
src/core はターミナルコードを含まないピュアTypeScriptです。その描画ロジック(グリフ接続、スナップ、線ルーティング、ボックス/線/選択/移動ツール、エクスポートラッパー)はASCIIFlowのclient/から移植されています。
src/tui はOpenTUIフロントエンドです: キャンバス、ツールバー、ポップオーバー、ダイアログを描画するフルスクリーンサーフェスです。
test/fixtures/asciiflow には、ASCIIFlow自身のコードを通じてtest/scenarios/asciiflow.jsonを再生してキャプチャされたゴールデン出力が含まれています。それらを再生成するには:
git clone https://github.com/lewish/asciiflow /tmp/asciiflow && (cd /tmp/asciiflow && bun install)
bun run fixtures /tmp/asciiflow
test/upstream は、小さな互換性シムを通じて、ASCIIFlow自身の仕様ファイルをlazydrawのコアに対して実行します。