**ターミナルで複雑なスクリプトを描画し、OSC 66 を利用する**

2026/03/22 18:31

**ターミナルで複雑なスクリプトを描画し、OSC 66 を利用する**

RSS: https://news.ycombinator.com/rss

要約

Japanese Translation:

現代のターミナルエミュレータは、1970年代のビデオ端末から継承された「固定幅文字セル」の単純なグリッドに依存しており、1つのUnicodeコードポイントを1つのセルにマッピングします。この設計では、アラビア語やインド系スクリプト(マレーラム語、タミル語、デーヴァナーガリー文字など)のような複雑な文字体系が必要とする文脈的整形・合字・非線形のグリフ融合を受け入れられず、文字が乱れたり重なったりします。
モノスペースフォントはすべてのグリフに対して水平幅を等しいものとして想定するため、単一コードポイントごとに0、1、または2を返す標準関数

wcwidth()
は、複数コードポイントからなるグラフェムクラスターには不十分であり、カーソルのずれを引き起こします。
Kitty(および Foot)は OSC 66 を実装することでこの問題の一部に対処しています。OSC 66 はアプリケーションが各グラフェムクラスターの正確なピクセル幅を宣言できるエスケープシーケンスです。Rust の CLI ツール
osc66
は HarfBuzz でテキストを整形し、グリフをクラスターにまとめ、参照進行距離に対するセル幅を計算し、Kitty で可読性を向上させる OSC 66 シーケンスを発行する方法を示しています。ただし、OSC 66 はセル単位の粒度しか指定できず、小数点以下のセルは四捨五入されます。これにより目立つギャップや切り取られたグリフ(Key point 8)が生じます。
現在、OSC 66 は Kitty と Foot のみでサポートされており、Ghostty、tmux、Neovim に拡張する議論が進行中です。TCSS ワーキンググループは「ターミナルクラスター」モデルという長期的な提案をしており、文字列レベルで幅を測定し、各クラスターに明示的なセルメトリックを割り当て、コピー/ペーストや BiDi 処理のための論理順序を保持します(Key point 10)。もう一つの提案である Mode 2027 は完全なグラフェムクラスタリングサポートも求めていますが、最近はほとんど活動が見られません。
要するに、多言語コマンドラインワークフローを使用しているユーザーは今日 OSC 66 の恩恵を受けることができ、将来的には標準化されたクラスターモデルの導入でさらに利点があります。一方、Kitty、Foot、tmux、Neovim などのターミナル開発者は、プラットフォーム間で複雑な文字体系を完全にサポートするためにこれらのプロトコルを採用しなければなりません。

本文

私はプログラマとして、ほとんどの時間をKitty のようなターミナルアプリで過ごしています。
コード編集には Neovim を、CLI ベースの AI エージェントは同じくターミナル上で動かします。2026 年現在でも最大の痛手は、インド語族やアラビア文字のような複雑脚本を描画できるターミナルが存在しないことです。この制限は、私の仕事の大半が言語処理に関わるため、非常に重要です。

この記事では、未だ解決していない理由について簡潔にまとめます。

  • 文字セルグリッドモデル
  • 幅測定
  • テキストシェーピングとレンダリングの区別

また、進行中の取り組みや最近作成した小さなツール(osc66)が示す解決策への道筋についても触れます。


ターミナルで複雑脚本が描画しにくい理由

現代のターミナルエミュレータ(GNOME Terminal、Kitty、Ghostty)は、1970 年代のビデオディスプレイ端末のハードウェア制約を再現しています。
「文字セルグリッド」―行と列からなるマトリクスで、各交点に正確に 1 つのグラフィック文字が配置されるという仮定を前提にしています。テキストユーザーインタフェースはこの仮定に基づいてレイアウトやカーソル位置を計算します。

「1 文字 → 1 セル」のマッピング

このマッピングは、アラビア語やインド語族(マレーラム・タミル・デーヴァナーガリーなど)のような複雑な書字体系と根本的に不整合です。これらの脚本には次の特徴があります。

  • 文脈依存の形態変化
  • 文字の再配置(リオーダリング)
  • 非線形ギャフ融合

アラビア語は右から左へ書かれ、モノスペースフォントはすべての文字が同じ横幅を占めるように設計されているため、これらの脚本には対応できません。例えばマレーラムのリガチャは 1 つの視覚単位に折りたたまれるか、複数セルに広がる必要がありますが、硬直したグリッドに強制的に収めると文字が混乱・重なります。


2025 年時点でのターミナルエミュレータ:現状

幅予測

従来、ターミナルは

wcwidth()
関数を使って文字幅(0,1,2)を決定してきました。これは単一 Unicode コードポイントに対してのみ有効で、複雑脚本では 1 つのグラフェムクラスターが複数コードポイントから構成されるため失敗します。

Kitty は

wcwidth()
を使用せず、マレーラムのリガチャ സന്തോഷ് が「3 セル」を必要と判断し、それぞれのリガチャを 3 セルに収めようとして入力位置がずれたりビジュアルが崩れるという現象が発生します(スクリーンショット参照)。

シェーピング vs. レンダリング

グラフィカル環境では シェーピング(Unicode コードポイントをギャフ ID とピクセル位置に変換)→ レンダリング(実際の描画)の流れが標準です。
ほとんどのターミナルはシェーピングを省略し、コードポイント単位で描画します。そのため正確なカーソル位置を必要とするアプリケーションでは不具合が生じます。


Kitty のテキストサイズプロトコル

Kitty(Kovid Goyal 氏開発)は「text‑sizing protocol」を導入し、プログラム側で文字が占めるセル数を明示的に制御できるようにしました。これにより

wcwidth()
をバイパスし、複雑脚本の描画崩れを防げます。

OSC 66 フォーマット

ESC ] 66 ; <key>=<value>[:<key>=<value>...] ; <text> BEL
  • メタデータ:コロン区切りで key=value ペア
  • テキストペイロード:UTF‑8(最大 4096 バイト)

メタデータキー

Key意味
s
スケール係数 (1–7)。文字は
s * w
セル幅、
s
セル高さで描画される。
w
スケール済みセル幅 (0–7; 0 は Unicode から自動計算)。
n/d
分数スケールの分子/分母 (0–15)。
v/h
分数スケール時の垂直/水平揃え(0–2)。

クライアントは正しい

w
を提供します。私が書いた osc66 は、形状付け済みインド語テキストに対してこれら値を計算します。


osc66 ツール

osc66 は Rust で作られた CLI ユーティリティです。

  1. 標準入力からテキスト読み込み
  2. HarfBuzz を使って文字列をシェーピングし、クラスターごとにギャフをグループ化
  3. ASCII の基準文字 (
    0
    ) に対するアドバンスで各クラスターの幅を算出
  4. 各クラスターについて OSC 66 エスケープシーケンスを出力

ツールは fontconfig で適切なフォントを検索し、HarfBuzz で読み込みます。基準アドバンス(1 セル相当)は

0
をシェーピングした結果から取得します。入力行ごとに:

cells = ceil(cluster_advance / ref_advance)
0–7 の範囲へクリップ

ゼロ幅クラスター(virama、ZWJ)はスキップ。

Kitty で osc66 を適用したマレーラムの描画スクリーンショットは可読性が格段に向上していますが、フラクショナルセルの欠如によりギャップが残ります。さまざまな丸め戦略を試しましたが、グリッドは連続的な脚本に対して離散数学を強いるため完全解決には至りません。


受容と制限

  • サポート済み:Kitty, Foot
  • 進行中:Ghostty(PR 中)、Neovim(issue 32539)

注意点:

  1. tmux を Kitty 内で使用するとレンダリングが上書きされる。
  2. osc66 を適用後は、Kitty のフォント設定をツールが使うフォントに合わせる必要がある。

標準化と未来

TCSS ワーキンググループ

2023 年、Unicode 技術委員会は Terminal Complex Script Support (TCSS) WG を設立しました。Microsoft, Apple などの代表者と主要ターミナルプロジェクトが参加しています。目的は、固定幅グリッド上でシェープド・双方向・ワイドテキストを扱う新しい標準です。

主な提案:

  • Terminal Cluster model:コードポイントではなくクラスター単位で測定。
  • String‑based measurement:ターミナルが文字列全体を解析して幅決定。
  • Explicit metrics:各スクリーンバッファクラスターにセル数メトリックを付与。
  • Logical ordering:内部表現は論理順(入力順)を保ち、コピー・ペーストや検索を正しく行えるように。

Mode 2027

Contour の作者が提案した「Mode 2027」はターミナルで完全なグラフェムクラスタリングを有効化する仕組みです。最近の活動は少なく、Ghostty 1.3.0 は改善を主張していますが、マレーラムやインド語脚本にはまだ対応していません。


結論

現状は断片的で、機能したプロトコルを持つターミナル(Kitty)と議論中の他数台、標準化努力も並行しています。進展はあるものの遅々としており、マレーラムやその他インド語脚本を書き込むターミナルユーザーにとっては、osc66 のような部分的サポートでも「何もしないよりはるかに良い」改善です。

勢いがつくことを願っています。読んでいただきありがとうございました!


さらに読む

  • The TTY demystified
  • What happens when you press a key in your terminal?
  • A history of the tty
  • Understanding ASCII (and terminals)
  • Comprehensive keyboard handling in terminals
  • Fix Keyboard Input on Terminals – Please
  • Grapheme Clusters and Terminal Emulators
  • State of the Terminal Control Sequences – Ghostty documentation

同じ日のほかのニュース

一覧に戻る →

2026/03/26 6:11

テスラ・モデル 3 のコンピュータをデスク上で稼働させ、事故車から取り出した部品を使用しています。

## 日本語訳: ## 要約: この記事では、セキュリティ研究のためにテスラ・モデル 3 MCU(モーター制御ユニット)の取得とセットアップ方法を説明しています。テスラのバグバウンティプログラムが研究者に車両内の脆弱性発見を奨励していることを強調し、筆者はeBayから安価な部品(約 $200–$300)を購入し、DC電源と最大8 Aまで供給可能な12 Vアダプタで組み立てました。さらに、Rosenbergerケーブル(パーツ番号1067960‑XX‑E)が必要で、個別販売されていないためダッシュボードロウムを購入しました。BMW LVDSコネクタを使った初期試行ではMAX16932制御チップがショートし、筆者は現地で修復して2つの機能的MCUを得ました。テスラの電気参照書にケーブル部品番号が確認されています。次のステップとして、MCUのユーザーインターフェース、ネットワークインターフェース(CANバス、ポート 22のSSH、ポート 8080のREST‑ライクAPI)を探索し、システム稼働時にファームウェアを抽出する可能性があります。これらの方法でルートアクセスを取得すると、研究者はテスラの「Root Access Program」のための重要な脆弱性を特定でき、車両セキュリティの向上につながる可能性があります。 ## 要約骨格 **本文が主に伝えたいこと(メインメッセージ)** 筆者はテスラ・モデル 3 MCUを取得し設定する方法を示し、その電源供給とネットワークサービスへのアクセス手順を強調しています。 **根拠/推論(なぜこう言われているか)** - テスラのバグバウンティプログラムは研究者に脆弱性発見を促している。 - 筆者はeBayから安価な部品($200–$300)を購入し、DC電源と最大8 Aまで供給可能な12 Vアダプタで組み立てた。 - 配線には特定のRosenbergerケーブル(パーツ番号1067960‑XX‑E)が必要で、個別販売されていないためダッシュボードロウムを購入した。 **関連ケース/背景(文脈・過去事例・周辺情報)** - BMW LVDSコネクタを使用した初期試行は失敗し、即席配線でMAX16932制御チップがショートした。 - 損傷したチップは現地で修復され、2つの機能的MCUが得られた。 - テスラ公開電気参照書に必要なケーブル部品番号が記載されている。 **今後起こりうること(本文中の将来展望/予測)** 筆者はMCUのユーザーインターフェース、ネットワークインターフェース、CANバスを探索し、システム稼働時にファームウェアを抽出する計画だ。 **影響(利用者・企業・業界への影響)** SSH(ポート 22)またはREST‑ライクAPI(ポート 8080)でMCUにアクセスできれば、研究者はテスラのバグバウンティ「Root Access Program」のための根本的脆弱性を特定し、車両セキュリティ向上に寄与する可能性がある。

2026/03/26 3:16

ARC‑AGI‑3(アーク・AGI・3)

## Japanese Translation: ARC‑AGI‑3は、AIエージェントを真に適応的かつ継続的な学習へと導く新しい対話型推論ベンチマークです。モデルに探索・目標追求・環境変化への世界モデリングを課し、単発の回答ではなく効率的なスキル獲得と長期計画を評価します。完璧なスコア(100 %)は、エージェントがすべてのゲームで人間よりも優れたまたは同等の性能を示し、多様なタスクにおける習熟度を証明することを意味します。 ベンチマーク設計は、事前学習済み知識なし、明確な目標、有意義なフィードバック、およびブルートフォース記憶化を防ぐ新規性を重視しています。開発者向けには、エージェントの意思決定が構造化されたタイムラインに記録される再生可能実行、使いやすいAPI、環境アクセスとエージェント統合用の包括的ドキュメント、およびリアルタイムでエージェント挙動を確認できるUIが提供されています。 ARC‑AGI‑3は迅速な反復と透明性のある評価を奨励し、研究者が多様なシナリオで継続的に学習可能なAIシステムを構築する手助けとなります。ユーザーはプラットフォーム上のインタラクティブインターフェースを通じて「エージェントをテストしよう!」と呼びかけられ、プレビュー再生でエージェント挙動を反復的にテスト・検査できます。

2026/03/26 5:27

EUは、依然としてあなたの個人メッセージや写真をスキャンしようとしています。

## Japanese Translation: ## 改訂概要 保守党(欧州人民党)は、無差別スキャンに関する議会の以前の「NO」決定を覆すため、4月26日木曜日に新たな国会投票を求めています。彼らはこの決定を逆転させることが民主主義への攻撃であり、プライバシー権を明白に無視する行為だと主張し、「No means no」というスローガンのもと支持者を集結させています。この要求は、議会が無差別スキャンを承認しなかったことに続くものであり、保守党はこれを政府の過剰介入として捉え、民主主義原則および個人プライバシーを侵害するものと見ています。今後の投票結果は、そのような広範なデータ監視ツールが実施可能かどうかを決定し、市民のプライバシー保護を再構築するとともに、管轄区域内のテクノロジー企業の規制慣行にも影響を与える可能性があります。

**ターミナルで複雑なスクリプトを描画し、OSC 66 を利用する** | そっか~ニュース