• The OSC Project

ターミナルエミュレータ・ソフトウェア(以下ターミナルソフトと略記)では、エスケープシーケンスを使って実行しているシェルやアプリケーションが端末を制御する。このあたりに関しては、以前ちょっと書いた。

・窓辺の小石(46) ANSI Terminal Echo
https://news.mynavi.jp/article/pebble_in_the_window-46/

ターミナルソフトの中で動作しているシェルからターミナルソフトやホストOSの制御ができると便利だ。たとえば、ターミナルソフトのウィンドウタイトルに実行中のシェルからの情報を表示させることで、ウィンドウの区別が容易になる。

こうした制御のためのエスケープシーケンスに「OSC」(Operating System Command)がある。OSCを活用し始めたのはX Windows Systemのxtermあたりから。xtermには、ウィンドウタイトルやアイコンを設定するOSCシーケンスがあった。なお、OSCシーケンスは、問いあわせの応答にも使われる。OSCとは、ターミナルソフトの中で動作しているシェル(ローカルで実行されているとは限らない)と、ターミナルソフトやそのホストOSが「会話」するためのものだ。

具体的には、OSCは、以下のパターンになり、OSCは、“Esc]”(0x27 0x5D)、STは、“String Termination”の意味で“Esc\”(0x27 0x5C)になる。


OSC〈引数1〉;〈引数2〉ST

という形式で使うが、「引数2」がセミコロンで区切られた複数のパラメーターになることもある。

現在では、多数のターミナルソフトがある。筆者がインターネット検索しただけでも40個以上見つかった。これらのOSCシーケンスは、xtermのものを基本としているが、実装している機能などに細かい違いがある。逆にいうと、このOSCにどんな機能を載せるかで他のターミナルソフトとの差別化ができる。

Windowsの標準コンソールとしてオープンソースで開発されているWindows Terminalでは、10種のOSCシーケンスが実装されている(表01)。

  • ■表01

ターミナルウィンドウ内にクリック可能なハイパーリンクを置きたいなら、以下のようにする。


$Esc=[char]27
Write-Host "$Esc]8;;https://news.mynavi.jp/series/pebble_in_the_window/$Esc\Link$Esc]8;;$Esc\ TEXT"

実行すると、下線がついた“Link”が表示されるので、コントロールキーを押しながらクリックするとブラウザでURLが開く(写真01)。後ろに空のOSC 8シーケンスを置くことで後続する文字列をハイパーリンクから分離できる。

  • 写真01: 1行目の例は、ハイパーリンクの表示。“Link”に下線がついている。2つめはクリップボードに「窓辺の小石」という文字を設定、PowerShellのGet-Clipboardコマンドで内容が変わったことを確かめている。3つめは、プログレスインジケータの表示。下のアイコンに進行状態を示す緑の領域が表示され、その大きさが進行程度を表す。隣の安定版Windows Terminalのアイコンはインジケータを表示していない状態

クリップボードにテキストを直接コピーしたいときには、OSC 52を使う。まず、クリップボードに設定したい文字列をBase64でエンコードしておく。


$B64Str=[Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes("窓辺の小石"))
$Esc=[char]27;Write-Host "$Esc]52;;$B64Str$Esc\"

れで、クリップボードに"窓辺の小石"という文字列が入る。

最後にWindows Terminalのタスクバーアイコンで処理などの進行状態をプログレスインジケータで表示させてみよう。プログレスインジケータは0~100の間の数値で進行状態を表示できる。


$Esc=[char]27;Write-Host "$Esc]9;4;1;70$Esc\"

とすると、70%の進行状態が表示される。これを解除するには、


$Esc=[char]27;Write-Host "$Esc]9;4;0$Esc\"

とする。

このほか、Windows Terminalにカレントディレクトリを通知し、タブの複製や複製ペイン(ウィンドウの分割)を行うときに同じディレクトリを使うようにするには、OSC 9;9を使う。これをプロンプトなどの表示に入れておくと、プロンプトを表示するたびにカレントディレクトリがWindows Terminalに通知される。.bashrcやPowerShellのPrompt関数、cmd.exeのPROMPT環境変数などに定義しておくとよい。具体的な方法は、Microsoftのサイトに記述がある。

・同じディレクトリ内のタブまたはペインを開く
https://docs.microsoft.com/ja-jp/windows/terminal/tutorials/new-tab-same-directory

今回のタイトルの元ネタは、1970年の映画“Colossus: The Forbin Project”(邦題:地球爆破作戦)である。原作はDennis Feltham JonesのColossus(1966。三部作の第一作)。米国の防衛を司るコンピュータColossusは起動すると、ソ連(当時)にある、自分と同等のシステムとの通信を要求する……。いまから50年も前の映画なので、端末やテレビ電話にレトロな感じはあるものの、内容的には古さを感じさせない。コンピュータ同士が通信して独自の言語を作るところが秀逸。The Terminator(1984)などのコンピュータ反乱映画の本家とでもいうべきか。