
2026/03/13 12:32
ターミナルエミュレータ内でのハイパーリンク (Note: The phrase “Hyperlinks in terminal emulators” is translated as a concise, natural Japanese title while preserving the original meaning and length.)
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
Summary
OSC 8 エスケープシーケンスは、ターミナルがコマンドライン出力に直接クリック可能なハイパーリンクを表示できるようにします。この機能は 2017 年春に GNOME Terminal と iTerm2 によって導入され、現在は VTE ターミナルエンジンの一部です。OSC 8 の採用状況をまとめた「OSC 8 adoption」ページが維持されており、今後さらに多くの VTE ベースのエミュレータが OSC 8 を採用することが期待されています。
Syntax
ESC ] 8 ; params ; URI ST …text… ESC ] 8 ; ; ST
はオプションの key=value ペア(現在はparams
のみ)です。id
はパーセントエンコードされている必要があり、サポートされるスキーム(URI
,http://
,https://
,ftp://
,file://
)で始まらなければならず、mailto:
URI の場合はホスト名がローカルホストと一致する必要があります(短い名前、完全修飾名、file://
、または空文字)。localhost- ターミナルは OSC 8 を ST (
) または BEL (ESC \
) で終了できます。ST が推奨されます。\a
Examples
printf '\e]8;;http://example.com\e\\This is a link\e]8;;\e\\'
Use cases
のバグ ID を自動リンク化する。apt-changelog
でコミット ID をハイライト表示する。git log- エディタやユーティリティ(
,ls
など)で URL、ファイルパス、mailto リンクをリンク化する。find
Link grouping & limits
ターミナルは隣接したセルをグループ化するためにオプションの小文字
id を使用できます。VTE は ID が指定されていない場合、自動的に一意の ID を割り当てます。iTerm2 はヒューリスティックに隣接セルを結合します。URI の長さは VTE と iTerm2 で約 2083 バイトまで制限され、VTE の
id 制限は 250 バイト(iTerm2 にハードリミットはありません)。すべてのパラメータと URI 文字は ASCII 32–126 必須で、エスケープされていない : や ; は禁止です。
Security & compatibility
OSC 8 は通常のウェブ閲覧以外に新たなセキュリティリスクを導入しません。ターミナルはスキームをホワイトリスト化したり、クリック時に確認を要求したり、高いセキュリティ環境では機能を無効化することができます。OSC 8 を無視するターミナルは単にテキストを表示しますが、バグのあるターミナル(例:古い VTE バージョン、Windows Terminal ≤0.9)は出力を破損させる可能性があります。
Impact
ユーザーはシェルを離れずにクリック可能な URL を利用できるようになり、開発者はユーティリティやドキュメントにリンクを埋め込むことができます。一方で組織は適切に OSC 8 のホワイトリスト化または無効化を検討する必要があります。
本文
ターミナルエミュレーターにおけるハイパーリンク(HTML 風アンカー)
2025‑03‑24 更新: コメントは永久に無効化されています。以前のコメントは https://web.archive.org にアーカイブ済みです。
ほとんどのターミナルエミュレーターは画面上の URL を自動検出し、Ctrl+クリック、Cmd+クリック、または右クリックメニューで開くことができます。
以前は任意のテキストをウェブページのように URL にリンクさせることはできませんでしたが、2017 年春に GNOME Terminal と iTerm2 がこの機能を追加しました。GNOME Terminal は VTE ウィジェットを使用しており、他の VTE ベースのターミナルも追いつく予定です。また、参加したい任意のターミナルは歓迎されます。
速やかな例
printf '\e]8;;http://example.com\e\\This is a link\e]8;;\e\\\n'
出力は HTML のリンクと同様に振る舞います:
対応アプリ
OSC 8 ハイパーリンクをサポートするターミナルやターミナルベースのアプリは、Alhadis が「OSC 8 adoption in terminal emulators」ページで一覧化しています。
使いどころ
- apt‑changelog – バグ ID を対応トラッカーへのリンクとしてフォーマット。
- git log – コミット ID をリポジトリのウェブフロントエンドへリンク。
- ファイルビューア / エディタ – URI を自動検出し、画面に表示される一部だけでもハイパーリンク化。
例: 仮想テキストエディタで二つのファイルが開かれているスクリーンショット
╔═ file1 ════╗ ║ ╔═ file2 ═══╗ ║http://exa║Lorem ipsum║ ║le.com ║ dolor sit ║ ║ ║amet, conse║ ╚══════════║ctetur adip║ ╚═══════════╝
http://example.com の任意の部分を Ctrl‑クリックするとそのページが開きます。
- コアユーティリティ(ls、find) – 省略可能に
URI を付与し、グラフィカルアプリでワンクリックで開けるように。file://… - less -R – OSC 8 シーケンスを色と同様に認識するため、パイプ経由で出力した際にもハイパーリンクが残ります。
エスケープシーケンス
ハイパーリンクは OSC 8 エスケープシーケンスで開きます:
OSC 8 ; params ; URI ST
- OSC(Operating System Command) =
。ESC ] - params – コロンで区切ったキー=値ペアの任意リスト(例:
)。現時点ではid=xyz123
キーのみが定義されています。id - URI – URI エンコードされたターゲット(
,http://
,https://
,ftp://
,file://
など)。mailto: - ST(String Terminator) =
。BEL (ESC \
) も受け付けますが推奨されません。\a
ハイパーリンクを閉じるには、同じシーケンスでパラメータと URI を空にします:
OSC 8 ; ; ST
開閉の注意点
- ターミナルは状態機械です。OSC 8 は現在のハイパーリンクを変更するだけです。
- 前のリンクを閉じずに新しいリンクに切り替えても、また逆も許容されます。
- ハイパーリンクは色や太字など他の属性と同様に扱われます。
file://
URI とホスト名
file://ユーティリティはローカルホスト名(
gethostname())を file://hostname/path に含めるべきです。ターミナルはこれをローカルマシンと照合し、違えばファイルを開かずに代替案(例:scp)を提示します。許容されるホスト名には空文字列と localhost が含まれます。
ホバー時の下線 & id
パラメータ
idターミナルはマウスホバーでハイパーリンクに下線を引きます。同じリンクに属するセルをグループ化するには、小文字の
id を使用します。同一ターゲット URI と非空の同一 id を持つセルは常に一緒に下線が付くようになります。
- VTE は明示的な
が無い場合、自動でユニーク ID を割り当てます。id - iTerm2 は隣接するセルで ID が無く同じ URI を共有しているものをグループ化します。
アプリがホバー時に下線を付けたくない場合は
id を無視すれば OK です。
アプリケーション向けガイドライン
| シチュエーション | 推奨実装 |
|---|---|
| 標準出力へ単純に印字するユーティリティ | ID を割り当てない。 |
| ビューア / エディタなど複雑なアプリ | 明示的にユニークな (例:ファイルオフセット、 位置)を付与。マルチウィンドウ対応ならウィンドウ ID を含める。 |
| OSC 8 コンテンツ自体を表示するアプリ(multiplexer, less -R 等) | 受信したハイパーリンクに既に がある場合は、パネル/ウィンドウごとのユニーク文字列で接頭辞を付ける。無い場合は順序付き整数等で生成する。明示的な と衝突しないよう注意。 |
| 画面上に残るフルスクリーンアプリ | スクロールバックで以前のセッションと重複しないよう、プロセス固有の識別子を に追加する。 |
機能可否検出
現時点ではアプリがターミナルがハイパーリンクに対応しているかどうかを検知する方法はありません(将来変更される可能性があります)。
後方互換性
ECMA‑48 に従って OSC を正しく解析するターミナルは、サポートされていないハイパーリンクを無視し、ターゲット URI のテキストだけを表示します。OSC 8 でゴミデータを出力するターミナルはバグとみなされます(例:VTE ≤ 0.46.2, 0.48.1; Windows Terminal ≤ 0.9; Emacs 内蔵ターミナル; very long URLs の
screen)。
長さ制限
| 項目 | 制限 |
|---|---|
| URI 長(VTE & iTerm2) | 2083 バイト(実際は約2000)。 |
| ID 長(VTE) | 250 バイト(変更の可能性あり)。iTerm2 には制限なし。 |
| OSC 8 シーケンス全体長 | ターミナルにより制限される場合がある。VTE は長いリンクを多く書くとスクロールバックで遅くなることがあります。 |
ユーティリティは ID をこれらの制限内に抑えるべきです。
エンコーディング
パラメータと URI にはバイト 32–126 のみを使用してください。その他のバイトは未定義動作となります。URI 内で 32–126 外のバイトが現れる場合は必ず URI‑エンコードします。
: と ; はパラメータや値内でエスケープしないといけません。
セキュリティ
この機能はウェブ特有の脆弱性を新たに導入するものではありませんが、ターミナル側で以下のような対策が考えられます:
- 既知スキームのみホワイトリスト化し、未知スキームは確認後に開く。
- 単なるクリックではなく Ctrl+クリックや右クリックメニューを要求する。
- URI を表示してから確認を求める。
- ハイパーリンク機能を完全に無効化できるオプションを提供。
リンク
- [GNOME Terminal の議論]
- [iTerm2 の議論]
- [テストファイル]