ハイパーリンクのエスケープシーケンス

端末エミュレータで URL に飛ぶといえば,たいていのものについている URL の自動検出機能 を使うというのがまあ普通の答えになる気がするんですが,任意のテキストに URL を割り当てる エスケープシーケンスというのが世の中には存在するという話。(今日知った)

TL;DR

ハイパーリンクは次のようなエスケープシーケンスで実現できる。1

"\e]8;;${URL}\a${LABEL}\e]8;;\a"

例えば,http://example.com に飛ぶ 「Click here」というリンクを作りたかったら, 下のようにする。

"\e]8;;http://example.com/\aClick here\e]8;;\a"

経緯

これを知ったきっかけというのは,

$ coredumpctl --help

というコマンドを実行したことだった。ヘルプの下の方に coredumpctl(1) man page という点線のついた文字が表示されていて,右クリックのメニューからリンクをたどってみると, マニュアルページのウィンドウが表示されて驚いた。僕は plain-old な man コマンドでの 表示の方が好きなので,HTML 変換されたものが表示されたのには納得がいかなかったが。 まあそんなことはさておき……。

検索してみると,日本語の情報が驚くほどない。issue で,2, 3年前に出てきたっぽい(?)

このページによると, 2, 3 年前に出てきたみたいだが,そこそこの数のソフトウェアがこれに対応しようとしているらしい。 代表的なものでいうと,gcc とかで,バージョン 10 からは diagnosis がクリックできるように なるらしい。手元の gcc のバージョンを見てみたら,9.2.1 で,なるほど,対応してない。 あと,ls とかはもう対応したバージョンがリリースされているらしく, ls --hyperlink とかすると,項目が clickable になる。うーん,面白いけど使うことなさそう。

Web の URL だと自明だけど,man ページだと man:${PAGE}(${SECTION}) って感じで URL のところにいれるといいみたい。

ls だと,nautilus で開くんじゃなくて,さらにそれが同じオプションで ls されるとかだと嬉しいかな。 コマンドを URL にする方法がなさそうだけど。まあとりあえず,端末から別の GUI アプリが起動してしまう というのは体験としてあまりよいものではない。

検索力が残念なので,どこかの公式ドキュメントみたいなのが見つけられなかったが, こういうのは慣習的なものでみんな実装していくんだろうか……。

追記

これは超大事な話なので追記しますが,

$ ls -kokifukuda

はちゃんと動きます。(ls の流れで誰かに話したい欲を発散する)

$ ls -kokifukuda
12845058 .

………………。

参考


  1. 参考にした gist は間違っていて,xterm.js の issue が合っているっぽい。 ↩︎