今回は、8月17日に公開されたWindows Terminal 安定版v1.14.228(以下安定版と表記する)と、プレビュー版v1.15.228(同プレビュー版)についてレポートする。

○V1.14、V1.15のキー割り当て

新機能を紹介する前に、まずはv1.14、v1.15のキー割り当てを(表01)に、キーコード順に並べたものを(表02)示す。赤字の部分が、v1.13以前との変更部分で、後述するマークモード関連のキーが追加されている。なお、以前の連載(第1回「キーボードカスタマイズ 導入編」)で説明したように、キー割り当ては、ユーザーが自由に設定可能だ。この表はあくまでも標準の割り当てである。

■表01

■表02

○v1.14の新機能

Windows Terminalは、プレビュー版として先に公開が行われ、プレビュー版でマイナーバージョンアップ(v1.1からv1.2)が行われると、そのバージョンの安定版が作成される。今回の場合でいえば、v1.14は今年5月にプレビュー版v1.14.143として公開されたが、7月にv.1.15にマイナーバージョンアップが行われたため、同日、安定版v.1.14.186が公開された。

多くの場合、安定版は、プレビュー版の機能を引き継ぎ、プレビュー版が公開されている間に行われたバクフィックスなどが適用される。このバグフィックスに関していえば、次のプレビュー版(今回の場合はv1.15)と同等のものが含まれる。

基本的には、安定版は、同じバージョンのプレビュー版とほとんど同じだが、一部の実験的な機能などが安定版に含まれない場合がある。今回の安定版v1.14では、プレビュー版に含まれていた次期テキストレンダリングエンジン“Atlas”が含まれていない。

v1.14安定版の新機能としては、以下のものがある。

Alternate Screen Bufferの改良

“SelectAll”アクション

ペイン分割してもウィンドウ全体に1つの背景を表示

ConPTY対応の改良

Alternate Screen Bufferとは、2つめの表示バッファで、全画面を専有するプログラムが実行後に端末の表示を元の状態に戻すなどの目的で使われる。Linuxのmanコマンドやエディタなどで、プログラムの実行中にはAlternate Screen Bufferを使うことが多い。こうすることで、プログラムを終了したとき、manやエディタの実行前の状態に戻り、作業の続きが分かりやすくなる。

しかし、今までのWindows Terminalでは、その実装が不完全で、たとえば、vimなどを使っている最中にスクロールホィールを回すと、エディタの外側の画面が見えてしまっていた。v1.14では、このあたりが改良され、スクロールホィールを回してもウィンドウ内がスクロールしてしまうことがなくなった。

また、新しいアクションとして“SelectAll”が追加された。標準で「Ctrl+Shift+A」に割り当てられており、バッファ全体を選択することが可能になった。なお、1つのタブに表示された内容すべてを保存したいときには、タブの右クリックで「テキストのエクスポート」を使ってファイルに保存することもできる。

これまでのWindows Terminalは、ペインでウィンドウ(タブ)を分割すると、適用されたプロファイルで定義されていた背景を表示していた。しかし、settings.jsonで、

"experimental.useBackgroundImageForWindow":true

と設定することで、背景画像をウィンドウ全体に表示することができるようになる(写真01)。1つのウィンドウにあるペインでプロファイルが異なり背景画像が指定されていた場合、ペイン選択により、背景が切り替わる。これまでは、ペインの中だけにプロファイルで指定された背景が表示されていた。

写真01: v1.15では、ペイン分割しても背景画像をウィンドウ全体に表示させることができる(写真左上)。v1.14までは、ペインごとに背景画像を表示していた(写真右下)

ただし、“experimental”とあるようにまだ実験段階の機能である。まず、指定すると設定にかかわらず背景色が透明になり、背景のアクリル表示や背景画像の不透明度指定ができなくなる。また、プロファイルの背景関連の設定を変更したあとは、Windows Terminalを立ち上げ直さないと設定が正しく反映されない、といった問題がある。

○ConPTYの改良

ConPTY対応の改良は、直接目に見ることはできないが、内部的には、かなり大きいな改良点だ。ConPTY自体は、Windows Terminalではなく、Windowsに含まれるコンソールシステム(ConHost Core)の機能であり、Windows Terminalは、この機能を利用する。Windowsのバージョンアップで、ConHost Coreが改良されるが、安定するまでは、Windows SDKなどには改良点が取り込まれない。Windows Terminalは、オープンソースソフトウェアとしてConHost Coreのリファレンス実装としての役割を持つ。つまり、ConHostやConPTYの改良にいち早く対応するのがWindows Terminalの役割の1つでもある。

ConPTYとは、Windows 10 Ver.1803で行われた、コンソール表示の改良点で、従来のConHostウィンドウ(Windowsコンソール)と同じようにWindows Terminalなどの外部ターミナルエミュレーターを動作させるための仕組みだ(図01)。これは、Linux/Unixで使われているpty(Pseudo TTY/Pseudo Terminal)の仕組みを模したもの。Linux/Unix系では、歴史的経緯からコンピューター本体とは独立したハードウェア端末装置からの利用を想定していた。これをソフトウェア(ターミナルエミュレーターやシステムコンソール)で行うための仕組みがptyである。

図01: ConPTYは、Windowsのコンソール機能に追加された、端末エミュレータープログラムとの接続点。Unix/LinuxのPTY(仮想端末)の仕組みを模して、ConHost Coreを拡張した

これに対して、Windowsのコンソールは、最初からソフトウェアによるウィンドウで、コンソールAPIを介して表示を制御していた。ConPTYは、Linux/Unix系の端末接続のソフトウェアエミュレーションと、WindowsのコンソールAPIを両立させるための仕組みだ。

従来との互換性を保つため、コンソール対応プログラム(WSLなど)からのエスケープシーケンスをVT Parserで解釈し、コンソールAPIで同等の処理(カーソル位置の制御や表示色など)を行う。従来のコンソールにはAPIを介して描画するが、ConPTY側には再度VTエスケープシーケンスに変換して送出する。無駄な仕組みのようだが、従来のコンソールウィンドウはエスケープシーケンスを解釈しないため、ConHost Core側で対応する必要がある。

エスケープシーケンスの解釈、再レンダリングという手間を省くため、現在のWindows 11に装備されているConHost Coreには、「パススルー」機能が装備されている。Windows Terminal v1.14の「 VT パススルー モード」とは、これを使うためのもの。

この設定は、プロファイルごとに行う。具体的には、Settings.jsonで“experimental.connection.passthroughMode=true”を指定したプロファイルでは、VTパススルーモードが有効になる。未指定もしくは“experimental.connection.passthroughMode=false”では、従来通りの挙動となる。名称からわかるようにいまのところ実験的な機能であり、通常は利用する必要はない。WSLのbashなどの表示速度は向上するが、Windows PowerShellなどでは表示が正しくおこなえない場合がある。

そのほか、安定版では、ConPTYとの接続が見なおされ、さまざまな状態をWindows TerminalとConHost Core側で共有できるようになった。たとえば、コンソールからエクスプローラーなどのウィンドウアプリケーションを起動した場合、ConHost Core側はウィンドウの出現位置やZオーダーを正しく配置し、Windows Terminalの下ではなく、上に表示するなどが可能になった。

○プレビュー版v1.15の新機能

プレビュー版の新機能には、以下のようなものがある。

キーボードによるテキスト選択

スクロールバーマーカー

エスケープシーケンスの強化(タブ色変更、サウンド再生)

キーボードによるテキスト選択は新規の機能で従来マウスでしか行うことができなかった、コンソールウィンドウ内のテキスト選択&コピーがキーボード操作のみで可能になる。新たに3つのアクションが追加され、選択中には(表03)のようなキーで操作が可能だ。markModeアクション(デフォルト割り当てはCtrl+Shift+M)でマークモードを開始、カーソルキーで選択開始位置に移動し、シフトキー+カーソルキーで選択範囲指定を行う。最後にEnterキーを押せば、選択範囲がクリップボードにコピーされる。なお、選択前、選択後のカーソル移動キーは割り当てを変更できない。

■表03

スクロールバーマークは、出力バッファの任意の行にマーカーを設定、キー操作でマーカー位置まで画面スクロールさせる機能だ。マーカーのある行がタブ内の先頭行の位置に来るものだが、スクロールバーがバッファの先頭または末尾に来ている場合には、マーカーがあってもそれ以上、スクロールしない。

この機能は、標準ではキー割り当てが行われておらずユーザーが自分で割り当てを行う必要がある(表04)。また、シェルのプロンプトが出力された位置に自動でマーカーを配置する機能(表05)もあり、長い出力があっても、一気に先頭部分に戻ることができる。設定により、マーカー位置をスクロールバー表示させることが可能で、マーカーに色を付けることもできる(写真02)。

■表04

■表05

写真02: スクロールバーマーカーは、スクロールバー上の位置にマーカーを配置する機能で、マーカーの位置まで表示をスクロールさせることができる。ウィンドウ右側のスクロールバーに見える点でマーカーの位置

エスケープシーケンスの拡張は3つある。1つは、タブの色を設定できるDECACシーケンス、もう1つは、音程を出力できるDECPSシーケンスの2つ。

DECACは、「Esc [ 2 ; 文字色 ; 背景色 , |」(表06)というシーケンスで、タブの背景色を指定する(文字色は変わらない)。これは、ウィンドウ内の文字色、背景色の指定にも利用できるものだが、最初のパラメーターに“2”を指定することで、ウィンドウフレームに対する文字色、背景色の指定となる。これをタブの色設定用に利用しているわけだ。

■表06

DECPSシーケンス(表07)は、「Esc [ 音量 ; 長さ ; 音程 , ~」というシーケンスで、指定した音量、長さで音程を再生する。標準のベル音以外にメロディなどを出力できる。

■表07

3つめは、前述のスクロールバーマークを設定するエスケープシーケンスFTCS_PROMPT(finaltermが実装したエスケープシーケンス)だ。具体的には、「Esc ] 133 ; A Esc \」を出力すると、そのときのカーソル行にスクロールバーマーカーが設定される(表08)。このエスケープシーケンスをプロンプト表示文字列などに入れると自動的にその位置が登録される。これは、前述のスクロールバーマークの設定とは独立して行える。

■表08

v1.15は、プレビュー版であるため、次期テキストレンダリングエンジンAtlasを装備している。Atlasは、プレビュー版v1.13で装備された機能で、現在も実験的機能として評価中だ。settings.jsonで「"experimental.useAtlasEngine": true」をプロファイル内で設定するか、GUI設定の「プロファイル」の詳細設定で「試験的なテキストレンダリングエンジンを有効にする」をオンにする。なお、Atlasは、表示速度向上やCPU利用率低下を目的とするレンダリングエンジンである。

v1.15のキーボードからのテキスト選択やスクロールバーマークの導入など、機能面でも強化が行われている。ある程度、機能が実装され、今後は次世代レンダリングエンジンAtlasなどのようにパフォーマンス面での強化が行われることになると思われる。

>> Windows Terminal ベスト設定 連載バックナンバー

https://news.mynavi.jp/tag/winterminal/