PowerShellとLinuxシェルをタブ切り替え可能になる「Windows Terminal」を試用する:Windows 10 The Latest
Microsoftが開発した端末エミュレーターソフトウェア「Windows Terminal」のプレビュー版が公開された。早速、このWindows Terminalを使ってみた。これまでの端末エミュレーター(コンソール)との違いなどを含めて解説する。
Windows Terminalとは
Windows Terminalは、Microsoftが開発した「端末エミュレーター」ソフトウェアだ。端末エミュレーターとは、ハードウェアである端末装置をソフトウェアで実現するものだ。
端末エミュレーターソフトウェアは、外部のコンピュータシステムと接続して利用することが前提であり、シリアルインタフェースやネットワークプロトコル(SSHやTELNETなど)で接続を行うことが多い。
Windows XPまでは、Microsoftも「Hyper-Terminal(ハイパーターミナル)」という端末エミュレーターを提供していたことがあった。だが、シリアルインタフェースがUSBに置き換わるにつれて、利用場面が減り、標準ソフトウェアから外された。
Windows Terminalは、Windows 10 October 2018 Update(バージョン1809)で実装された仮想コンソール(ConPTY)を使い、PowerShellやcmd.exe、WSLといったWindows 10のコンソールアプリケーションで利用するものだ。ただし、Windows Terminalが利用できるのは、Windows 10 May 2019 Update(バージョン1903)以降となっている。
Windows TerminalはMicrosoft Storeから配布
Windows Terminalは、Microsoft Storeから配布される無償のオープンソースソフトウェアで、原稿執筆時点ではプレビュー版が公開されている。ソフトウェア開発プラットフォームのGitHubでソースコードが公開されている(GitHubのWindows Terminalページ「microsoft/terminal」)。
Windows TerminalはMicrosoft Storeで配布
Microsoft Storeを開き、「Windows Terminal」で検索すると、Windows Terminalのベータ版が見つかる。
Windows TerminalはMicrosoft Storeで配布
[入手]ボタンをクリックすると、[複数のデバイスで使用する]ダイアログが表示され、Microsoftアカウントの入力が求められるが、[必要ありません]をクリックすればよい。ただし利用できるのはWindows 10 May 2019 Update(バージョン1903)以降に限られる。
従来のコンソールウィンドウとは「併存」
あくまでもWindows Terminalは、オプションのソフトウェアという位置付けで、Windows 10自体には従来と同じくコンソールウィンドウが付属する。コンソールウィンドウは、Windows 10のコンソール処理の仕組みと一体になっており、これだけを廃止するというわけにもいかないからだ。
WSLで利用可能なWindows Terminal
Windows Terminalは、コンソールウィンドウとは違い、UTF-8による文字コード表示が可能な端末セッションをタブにより複数同時に扱うことが可能だ。これにより、従来のcmd.exeやPowerShellだけでなく、WSL/WSL 2のコンソールとしても利用できる(WSL 2については、Windows 10 The Latest「完全なLinuxがWindows 10上で稼働する? 『WSL 2』とは」参照のこと)。
ここでは、Microsoft Storeで公開されたプレビュー版のWindows Terminalを見ていくことにする。Windows Terminal自体は現在でも開発が続いており、現時点では完成状態ではないこと、また今後の開発に応じて仕様などが変わる可能性があることは理解していただきたい。
Windows OSのコンソールアプリケーションとは
Windows Terminalが登場したのは、1つには、WSL/WSL 2により、Windows OS内で、Linux系のアプリケーションの比重が高まっているからだ。Microsoftは、Windowsのコンソールを改良し、エスケープシーケンスなどに対応してきたが、現状のコンソールの設計は古く、段階的に改良していたのでは、時間がかかり過ぎる。
また、改良する際には、従来のWindowsコンソールアプリと互換性を持たせる必要がある。このためMicrosoftは、Windows OSのコンソールAPIと、UNIX/Linux型の仮想端末型の両方の要求を満たすために、ConPTY(Pseudo Console:疑似端末)とそれを使うWindows Terminalの提供に踏み切ったと考えられる。
Windows OSでコンソールアプリケーションは、APIを介してコンソールウィンドウを制御している。Windows OSでは、GUIを使うアプリケーションが通常形式であり、コンソールを利用するアプリケーションは、アプリケーションを開発者が「コンソールアプリケーション」として、GUIアプリケーションとは別に開発する必要がある。また、常にAPIを介して制御が可能であるため、表示する文字色などを自由に指定できる。いつでもコンソール状態を取得できるため、アプリケーションは現在のコンソールの状態などを意識したり、保存したりしておく必要はない。
Windows OSのコンソールアプリとLinuxのコンソールアプリ
Windows OSでは、コンソールアプリは、APIで直接コンソールウィンドウを制御できる。これに対してUNIX/Linux系では、端末装置からコンピュータを利用していたため、プログラムからの文字出力と文字入力は、常にテキストベースでのやりとりになる。
一方、UNIX/Linux系のアプリケーションは、歴史的な経緯から、アプリケーションは、STDOUT(標準出力)/STDIN(標準入力)を使ってテキストやエスケープシーケンスを入出力する形で表示を行ってきた。かつては、端末装置をシリアルインタフェースなどでコンピュータに接続していたため、この仕組みにTTYデバイスが使われていた。
のちにマルチウィンドウ表示が可能なUNIXワークステーションなどが使われるようになると、仮想的なTTYデバイスであるPTY(Pseudo-TTY)を介して接続するようになった。こうした構造であるため、アプリケーション側では、常にコンソールの状態を管理しておく必要があった。ただし、UNIX/Linuxでは端末によるコードの違いなどを含め、画面制御用のライブラリが整備されているため、ソフトウェアの開発自体は、それほど面倒なことではない。
Windows OSのコンソールアプリケーションの構造と進化
Windows OSのコンソールアプリケーションは、ConHost.exeというプログラムを介して、コンソールウィンドウを表示する。現在では、セキュリティ的な問題から、両者を分離するために間にConDrv.sysというデバイスを介して接続を行っているが、コンソールアプリケーションの側からは、APIを呼び出して制御しているようにしか見えない。
コンソールアプリケーションの実際の動作(Windows 7から)
WindowsコンソールアプリケーションとConHost.exeは、実際には、セキュリティ上の理由からConDrv.sysというデバイスドライバを介して接続されている。これによりAPIでの制御を行いながら、2つのプログラムは完全に別メモリ空間で動作できる。
ConHost.exeは、コンソールアプリケーションからのAPIを解釈して処理を行う。また、コンソールウィンドウへの描画には、GDI(Graphics Device Interface:Windows OS初期からの描画エンジン)が利用されている。このため、UTF-8をはじめとするUnicode文字の表示には限界があった。また、この構造は、SSHの実装などにも無理があった。出力テキストを単純なストリームとして受け取ることができないため、ConHost.exeが出力バッファーを使って「見えない」ウィンドウに描画したテキストをSSH側へ送るといった構造になっていた。
ConHost.exeの内部構成(Windows 10 April 2018 Update以前)
Windows 7からWindows 10 April 2018 Update(バージョン1803)までのConHost.exeは、ConDrv.sysからのAPIに対応するデータをAPIサーバで受け、出力バッファーと入力バッファーを持っていた。ConHost.exeはコンソールウィンドウを直接表示し、その制御を行っていた。
このため、Microsoftは、ConHost.exeを段階的に改良してきた。VT100互換のエスケープシーケンスへの対応や、出力バッファーのUnicode(UTF-8)対応などである。しかし、肝心なコンソールウィンドウのレンダリングは、GDIのままであった。最後に投入されたのが、ConPTYと呼ばれる「疑似端末」のインタフェースだ。これを利用することで、テキストベースの端末エミュレータープログラムを接続することが可能になる。こうして作られたのがWindows Terminalというわけだ。
ConHost.exeの改良(Windows 10 October 2018 Update以降)
Windows 10 October 2018 Update(バージョン1809)からのConHost.exeは、それまでとほぼ同等の仕組みに加えて、仮想コンソール用にConPTYと呼ばれる機構を持つ。これを使って、外部の端末エミュレーションソフトウェアと、テキストやエスケープシーケンスによる表示制御などを行う。
Windows Terminalを動かす
では、実際にWindows Terminalを動かしてみよう。標準では起動すると、PowerShellが起動するようになっている。ただし、後述するように設定の変更で他の「シェル」を起動させることも可能だ。
Windows Terminalは複数の端末セッションをタブで切り替え可能
ウィンドウは、一見、現在のコンソールウィンドウと同じように見える。しかし、複数の端末セッションをタブで表示して切り替えて利用できる。このとき、起動するプログラムに対応した「プロファイル」を作ることで、コンソールアプリケーション別に文字や背景の色、フォントなどを切り替えることができる。タブの右側には、新規タブをデフォルトプロファイル(後述)で作成する[+]ボタンとメニューがある。
[Ctrl]+[T]キーで新規タブが開ける
設定では、Windows Terminalが持つ基本的な機能、例えば新規タブの追加やタブの切り替えなどの「コマンド」に対して、キーボードショートカットを割り当てることが可能だ。デフォルトでは、[Ctrl]+[T]キーで新規タブが開き、標準プロファイルに登録されているシェルが起動する。もちろん、複数起動すれば、複数のコンソールウィンドウとして利用可能だ。
Unicode文字の表示に違いが
ざっと使った感じ、現在のコンソールウィンドウとほぼ同じなのだが、Unicode文字の表示は大きく違っている。
一般にTrueTypeやOpenTypeなどのフォントファイルは、Unicodeの全ての文字を含んでいるわけではなく、一部の文字に限られる。しかし、フォントフォールバック機能により、ユーザーが表示用に指定した文字フォントに含まれていないグリフ(字体)は、他のフォントファイルのグリフを使って表示が行われる。
分かりやすいのは「絵文字」だ。Unicodeの絵文字は、絵文字フォントファイルにグリフがあり、一般のフォントファイルは、絵文字グリフを含まない。絵文字には、スタイルやファミリーの意念がなく、そもそも「明朝体の絵文字」とか「タイムズローマンの絵文字」とかという区別はない。どのフォントが指定されていても、絵文字のグリフは含まれていないことが大半なので、このときフォントフォールバックにより、絵文字グリフは絵文字フォントファイル(Segoe UI Emojiフォント)を使って表示が行われる。
従来のWindows OSのコンソールでは、フォントフォールバックが動作しなかったため、コードページをUTF-8(65001)に切り替えても、絵文字を表示できなかった。これに対して、Windows Terminalは、絵文字を表示できる。
ただし、いまのところPowerShellもcmd.exeも従来のコンソールを前提として作られているため、入力ラインでは絵文字を正しく表示できない。これは、キー入力をコンソールに表示させるコンソールアプリケーションであるPowerShell.exeやcmd.exeがコードページで動作する従来のコンソールを前提に作られていて、Shift-JISまたはUTF-16のみに対応し、UTF-8に対応していないからである。これに対して入力がUTF-8に対応しているWSLのbashは、入力行も正しく表示できる。
絵文字が化けてしまうPowerShellの入力ライン
Windows Terminalでは、Direct Writeを使うため、通常のウィンドウと同じく、フォントフォールバックなどの機構が働き、絵文字などを表示できる。これに対して、従来のコンソールで実行した同じPowerShellでは、絵文字を正しく表示できない。
現バージョンの設定はJSONファイルで行う必要あり
評価に使ったバージョンは、Ver. 0.2.1715.0である。このバージョンでは、メニューに「設定」はあるものの、GUIがなく、単にJSONファイルを開くようになっている(JSONについては、Dev Basics/Keyword「JSON」参照のこと)。以下のパスにあるprofile.json(Json:JavaScript Object Notation)というファイルを開こうとするが、これは「.json」ファイルへの関連付けに応じてアプリが起動する。なお、現在、Microsoft Storeで配布されているプレビュー版Windows Terminalでは、メモ帳でJSONファイルが開くようになっている。
%UserProfile%\AppData\Local\Packages\Windows TerminalDev_8wekyb3d8bbwe\RoamingState\profiles.json
このファイルを抜粋したものを以下に示す。プロファイルでは、ウィンドウサイズやキーボードショートカットの定義などがあり、起動するプログラムは、背景色などの指定とともに「profiles」で指定する。また、コンソールウィンドウ内で使う色指定(パレット)は、「schemes」として定義してある。
Windows Terminalを起動したときに開かれる「シェル」を変更するには、「globals」にある「defaultProfile」に設定されているGUIDを変更する。このGUIDは、設定ファイル中にある「Profles」に定義されているプロファイルの「guid」値を使う。デフォルトでは、PowerShellのGUID値が設定されているので、これをcmdやWSLのプロファイルに指定されている「guid」の値と書き換える。
Windows Terminalの設定情報
設定にはWindows Terminal全体の設定項目(globals)、起動するコンソールアプリケーションに関するもの(profiles)、カラーパレットの定義(schemes)に分かれる。全体設定では、起動時や+ボタンを押したときのプロファイル指定があり、指定されたプロファイルの1つを使って最初のウィンドウを開く。
Windows Terminalは、高機能というわけではないが、複数タブを同時に表示可能なターミナルウィンドウを使うことができる。一部、従来のコンソールと文字コードの扱いなどが変わっており、WSLで「Byobu(ビョウブ:ウィンドウマネージャ/仮想端末マネージャ)」をデフォルトで起動しても正しく動作する。プレビューの開始されたWSL 2と合わせて使うと、MS-DOS仕様のコンソールウィンドウよりは使いやすいだろう。
Copyright© Digital Advantage Corp. All Rights Reserved.