Microsoftが開発中のターミナルソフトウェア「Windows Terminal」の現在の状況を解説する。正式リリースが近づいており、タブ内を複数ペインに分割したり、日本語IMEの利用が可能になったりしている。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
開発が続くMicrosoftのオープンソースソフトウェアである「Windows Terminal」だが、2019年12月には機能を確定させたバージョンが出る、というのが当初の予定(最終版は、2020年4月)だった(Windows Terminalの概要についてはWindows 10 The Latest「PowerShellとLinuxシェルをタブ切り替え可能になる「Windows Terminal」を試用する」参照のこと)。そのつもりで待っていたのだが、原稿執筆時点の2019年12月末時点、12月版のリリースは行われていない。
MicrosoftのBlogでは、クリスマス休暇おめでとう的な記事「Happy Holidays from the Windows Terminal Team!」がWindows Terminal開発チームからあり、クリスマス休暇に入ってしまった感じだ。
なお、GitHub上には、12月版(Terminal-1912)の進行具合を示すページがあり、これを見ると完成度(クローズしたIssueの数/このバージョンに割り当てられたIssueの総数)は56%(2020年1月5日現在)だが、更新は行われていて、開発作業は完全には止まってはいないようである。
そういうわけで、今回は、2019年12月11日に配布されたv0.7の3リリース目に当たるWindows Terminal v0.7.3451.0を基に現状をレポートする。v0.7では、タブ内を分割するペイン機能がついに搭載された。また、日本人的には、ついにIME入力対応が行われ日本語入力が可能になったという大きな変更もある。その他、付属のCascadiaフォントにも改良が行われた。また、ペイン機能の搭載などに対応してデフォルトのキー割り当てが変更になり、設定機能などにも変更があった。
大きな変更点としてペインの実装がある。ペインとは、タブウィンドウ内を縦横に分割してそれそれで別のセッションを起動する機能だ。
Linuxなどでは、もともとtmuxやGNU Screenなどの端末多重接続(Terminal Multiplexer)ソフトウェアがあり、端末や端末エミュレーターの画面をソフトウェア的に分割して利用することができた。ペインは、同様の機能を端末側で行うため、無関係のセッションをペイン内で実行できる。
ただし、v0.7の実装では、分割すると新しく起動されるセッションで常にデフォルトプロファイルが使われてしまう(標準設定ではWindows PowerShell)。
ペインの分割は、縦または横で行え、ペイン内をさらに分割することも可能である。分割する分、表示領域は小さくなってしまうが、タブを開くのとは違い、常に表示されているというメリットがある。例えば、タブ内を左右に分割して片方でマニュアルページなどを表示しなから使うといったことが可能だ。
UNIX/Linux系OSでは、GUI対応の端末エミュレーターウィンドウを使えば複数セッションを同時に表示できるようになってかなりの時間がたつ。だが、いまだに端末多重化ソフトウェアが使われているのは、複数の情報を同時に見ることができるという点と、全てキーボードから作業が可能というメリットが多くのユーザーに支持されているからである。複数のウィンドウをマウスで操作して左右に並べて使うよりも、大きな端末ウィンドウを2つに分割して使う方が便利なのである。
WSL/WSL 2を使えば、端末多重化ソフトウェアで端末画面を分割でき、それぞれの領域で、cmd.exeやpowershell.exeを起動するといった使い方も不可能ではないので、Windows Terminalのペインは、OSに依存しないというメリットはある。ただ、分割時にどのプロファイルを実行するかどうかの選択など、最終仕様ではないので、ここでは比較を避けたい。
ペイン内の分割などの操作は、キーで行う。こうした新機能の追加に伴い、このキー割り当てが追加になっている。このあたりをまとめたのが下表である。以前と変更があったキー割り当てを赤字で示した。
カテゴリー | キー割り当て | 機能 | command指定 | |
---|---|---|---|---|
操作 | [Ctrl]+[,] | 設定を開く | openSettings | |
[Alt]+[Ctrl]+[,] | デフォルト設定JSONを開く | − | ||
[Ctrl]+[Shift]+[Space] | メニューを開く | openNewTabDropdown | ||
[Alt]+[F4] | ウィンドウを閉じる | closeWindow | ||
[Alt]+[Enter]、[F11] | フルスクリーン表示オン/オフ | toggleFullscreen | ||
[Ctrl]+[Shift]+[C] | コピー | copy | ||
[Ctrl]+[Shift]+[V] | 貼り付け | paste | ||
[Ctrl]+[−] | フォントサイズ縮小 | decreaseFontSize | ||
[Ctrl]+[=] | フォントサイズ拡大 | increaseFontSize | ||
[Ctrl]+[0] | フォントサイズを戻す | resetFontSize | ||
[Ctrl]+[Shift]+[↓] | 下方向にスクロール(行) | scrollDown | ||
[Ctrl]+[Shift]+[PgDn] | 下方向にスクロール(ページ) | scrollDownPage | ||
[Ctrl]+[Shift]+[↑] | 上方向にスクロール(行) | scrollUp | ||
[Ctrl]+[Shift]+[PgUp] | 上方向にスクロール(ページ) | scrollUpPage | ||
タブ関連 | [Ctrl]+[Shift]+[D] | 同じプロファイルの新規タブ | duplicateTab | |
[Ctrl]+[Shift]+[T] | デフォルトプロファイルの新規タブ | newTab | ||
− | カレントタブを閉じる | closeTab | ||
[Ctrl]+[Shift]+[1] | プロファイル0でタブを新規作成 | { "action": "newTab" "index": 0 } | ||
[Ctrl]+[Shift]+[2] | プロファイル1でタブを新規作成 | { "action": "newTab" "index": 1 } | ||
[Ctrl]+[Shift]+[3] | プロファイル2でタブを新規作成 | { "action": "newTab" "index": 2 } | ||
[Ctrl]+[Shift]+[4] | プロファイル3でタブを新規作成 | { "action": "newTab" "index": 3 } | ||
[Ctrl]+[Shift]+[5] | プロファイル4でタブを新規作成 | { "action": "newTab" "index": 4 } | ||
[Ctrl]+[Shift]+[6] | プロファイル5でタブを新規作成 | { "action": "newTab" "index": 5 } | ||
[Ctrl]+[Shift]+[7] | プロファイル6でタブを新規作成 | { "action": "newTab" "index": 6 } | ||
[Ctrl]+[Shift]+[8] | プロファイル7でタブを新規作成 | { "action": "newTab" "index": 7 } | ||
[Ctrl]+[Shift]+[9] | プロファイル8でタブを新規作成 | { "action": "newTab" "index": 8 } | ||
[Ctrl]+[Tab] | 次のタブ | nextTab | ||
[Ctrl]+[Shift]+[Tab] | 前のタブ | prevTab | ||
[Ctrl]+[Alt]+[1] | 1番目のタブに切り替え | { "action": "switchToTab" "index": 0 } | ||
[Ctrl]+[Alt]+[2] | 2番目のタブに切り替え | { "action": "switchToTab" "index": 1 } | ||
[Ctrl]+[Alt]+[3] | 3番目のタブに切り替え | { "action": "switchToTab" "index": 2 } | ||
[Ctrl]+[Alt]+[4] | 4番目のタブに切り替え | { "action": "switchToTab" "index": 3 } | ||
[Ctrl]+[Alt]+[5] | 5番目のタブに切り替え | { "action": "switchToTab" "index": 4 } | ||
[Ctrl]+[Alt]+[6] | 6番目のタブに切り替え | { "action": "switchToTab" "index": 5 } | ||
[Ctrl]+[Alt]+[7] | 7番目のタブに切り替え | { "action": "switchToTab" "index": 6 } | ||
[Ctrl]+[Alt]+[8] | 8番目のタブに切り替え | { "action": "switchToTab" "index": 7 } | ||
[Ctrl]+[Alt]+[9] | 9番目のタブに切り替え | { "action": "switchToTab" "index": 8 } | ||
ペイン関連 | [Alt]+[Shift]+[−] | ペイン水平分割 | splitHorizontal | |
[Alt]+[Shift]+[+] | ペイン垂直分割 | splitVertical | ||
[Ctrl]+[Shift]+[W] | ペインを閉じる | closePane | ||
[Alt]+[↓] | 下のペインへ移動 | { "action": "moveFocus" "direction": "down" } | ||
[Alt]+[←] | 左のペインへ移動 | { "action": "moveFocus" "direction": "left" } | ||
[Alt]+[→] | 右のペインへ移動 | { "action": "moveFocus" "direction": "right" } | ||
[Alt]+[↑] | 上のペインへ移動 | { "action": "moveFocus" "direction": "up" } | ||
[Alt]+[Shift]+[↓] | ペインを下方向に拡大 | { "action": "resizePane" "direction": "down" } | ||
[Alt]+[Shift]+[←] | ペインを左方向に拡大 | { "action": "resizePane" "direction": "left" } | ||
[Alt]+[Shift]+[→] | ペインを右方向に拡大 | { "action": "resizePane" "direction": "right" } | ||
[Alt]+[Shift]+[↑] | ペインを上方向に拡大 | { "action": "resizePane" "direction": "up" } | ||
Windows Terminalのキー割り当て 赤字は、v0.7で変更があった部分。3つの欄が全て赤字になっているのが新規に割り当てられたキー。 |
Windows 10 The Latest「【Windows Terminal開発動向】Cascadia codeフォント搭載とJSONスキーマ対応の意味とメリット」で解説したようにキー割り当ては、settings.jsonファイルで行うが、キー割り当ての記述が強化され、一部のコマンドの記述方法が変わった。これまでは、単一キーには単一のコマンドを割り当てるしか記述方法がなかったが、コマンドとパラメーターを使ってキー割り当てを行う方法が追加されている。例えば、これまでタブを新規作成(「プロファイル0」を使う)するには、「newTabProfile0」というコマンドを使い、以下のように記述を行っていた。
{ "command": "newTabProfile0", "keys": [ "ctrl+shift+1" ] },
しかし、v0.7からは、パラメーターを使い、以下の記述が可能になった。
{ "command": { "action": "newTab", "index": 0 }, "keys": ["ctrl+shift+1"] },
この他、フルスクリーンモードが実装され、[F11]キーまたは[Alt]+[Enter]キーでオン/オフを切り替えることができるようになった。フォントサイズも[Ctrl]+[−]キーと[Ctrl]+[+]キーで縮小/拡大が可能で、[Ctrl]+[0]キーでフォントサイズをリセットしてデフォルト状態に戻せる。
v0.6から利用可能になったCascadiaフォントだが、ギリシャ文字やキリル文字などが追加され、さらにバリエーションが追加された(Cascadiaフォントの詳細は、Windows 10 The Latest「【Windows Terminal開発動向】Cascadia codeフォント搭載とJSONスキーマ対応の意味とメリット」参照のこと)。Cascadia Codeは合字付き、Cascadia Monoは合字なしのフォントファイルであり、それぞれPowerline記号が追加されたCascadia Code PL、Cascadia Mono PLという別ファイルとなっている。
フォント名 | Programming合字 | Powerline記号 | インストール元 |
---|---|---|---|
Cascadia Code | ○ | × | Microsoft Store |
Cascadia Code PL | ○ | ○ | GitHub |
Cascadia Mono | × | × | GitHub |
Cascadia Mono PL | × | ○ | GitHub |
Cascadiaフォントの入手先 Microsoft Store:Windows Terminalとともにインストールされる。 GitHub:https://github.com/microsoft/cascadia-code/releases |
ただし、Microsoft Storeで配布されているv0.7のWindows Terminalプレビュー版パッケージには、Cascadia Codeのみ付属する。他のフォントはGitHubから入手してインストールする必要がある。
Powerline文字は、Nard Fontからのものだ。行に付ける飾り文字が含まれている。
Windows Terminalでは、設定をProfiles.jsonファイルとして出力し、外部のJSONエディタでこれを編集することになっている。v0.7では、このファイルは、デフォルト設定値との差分のみを出力するようになった。このため、Keybindings(キー割り当て)やSchemes(配色設定)などのデフォルト値のままの部分が減り、ファイル自体が小さくなって扱いやすくなった。
なお、デフォルト値に関しては、[Alt]キーを押しながら、メニューの[Settings]を選択することでdefault.jsonファイルが出力される(または[Ctrl]+[Alt]+[,]キー)。ただしWindows Terminalは、default.jsonファイルを読み込むことがないので、これを書き換えても無視される。
また、新規の設定項目として「suppressApplicationTitle」が追加された。Windows Terminalでは、「name」や「tabTitle」でタブに付ける名前(ターミナルウィンドウのタイトル部に相当)を指定できる。
しかし、VTエスケープシーケンスには、タイトル部のテキストを書き換える機能がある。このため、プロファイル内で指定を行っても、起動したシェルがタブタイトルを書き換えてしまうことがあった。
例えば、WSL内で実行されるLinuxディストリビューションでは、.bashrc内でプロンプトの設定と同時にカレントディレクトリなどをタイトル部にセットしている。
しかし、タブの区別という点からいうと、ユーザーがプロファイルの「name」や「tabTitle」で指定した文字列を使いたい場合がある。そのために、VTエスケープシーケンス側からのタブタイトル書き換えを無視する「suppressApplicationTitle」が作られた。これを「true」にすると、VTエスケープシーケンス側からの書き換えを無視するようになる。
ついにIME入力に対応したため、Windows Terminal内での日本語入力が可能になった。ただし、Windows 10 The Latest「【Windows Terminal開発動向】Cascadia codeフォント搭載とJSONスキーマ対応の意味とメリット」でレポートしたように、フォントを1つしか指定できないため、日本語フォントの間が少々空いてしまう。これは製品版までに修正の予定であるものの、いまのところは手つかずの状態のようである。一般的には、複数のフォントを「フォントファミリー」として指定して、その中でフォントのフォールバックを行う必要があるため、テキストレンダリングなどを変更する必要がある。
さて当初の計画では、2019年12月版は、搭載機能が確定され、2020年早々にはβ版となり、2020年4月にはv1.0が登場する予定になっていた。しかし、Windows Terminal 1912版はいまのところ開発の途中であり、12月20日時点で対応していたIssueの半分程度しか消化できていない。Issueのうち幾つかは評価段階で見つかったバグの修正だが、それ以外に追加機能がある。そのうち目立つものとして、「検索機能」「マウス入力」「コマンドラインオプション」の3つがある。
「検索機能」は、タブ内でテキスト検索を行う機能で、現在のコンソールにある[Ctrl]+[F]キーと同じような機能だ。
「マウス入力」とは、Windows Terminal上でのマウス操作を受け付ける機能だ。VTエスケープシーケンスには、マウスのイベントを報告するモードがあり、これを使うことで、コンソールプログラムでもマウスイベントに応じて、カーソル移動などが行える。
例えば、Linuxの端末多重化プログラム(GNU Screenやtmuxなど)では、画面分割したときのペイン切り替えをマウスで行うことができる他、エディタなども分割ウィンドウの切り替えやカーソル移動をマウスで行うことができる。Windows Terminalの「マウス入力」とはこれに対応するものだ。現在のWindows Terminal v0.7では、マウスイベントがシェル側に伝わらないため、端末多重化プログラムなどでマウスによる領域の選択が行えない。これに対してconhost.exeでWSL/WSL 2を実行するとマウスイベントが利用できる。
「コマンドラインオプション」は起動時にコマンドラインからのオプション指定でプロファイルなどを指定するものだ。Windows TerminalはUWPアプリケーションだが、アプリ実行エリアスにより、wt.exeとして起動が可能になっている。現在のバージョンでは何もオプションを受け付けない状態だ。GitHub上では、その仕様が議論されていて、現時点では、以下のような仕様が想定されている。
これによれば、コマンドラインには「options」と「command」が指定でき、「options」には「--help」や「`--version`」などがある。commandには、「new-tab」「split-pane」など、タブやペインを開くもので、後続するオプションで、プロファイルやカレントディレクトリ、実行コマンドなどが指定できる。なお、これらは開発途上のドキュメントからの情報であり、実際に最終仕様がどうなるのかはまだ確定していないことに留意願いたい。
このコマンドラインの実装はかなり難しそうだ。というのも、Windows Terminal自体はGUIアプリケーションだが、コマンドラインでヘルプやバージョンを表示する場合、起動したコンソールの標準出力にテキストを出力するのが一般的な動作だが、Windows OSのGUIアプリケーションは起動するとウィンドウを開くようになっているからだ。
また、エクスプローラーなどGUI側からの起動では、コンソールコマンドは、Windows OSがconhoste.exeを自動起動してその中にテキストを表示する。しかし、Windows Terminal自体がコンソールプログラムであり、自身が起動してヘルプやバージョン表示を行うのが望ましい。
これまでWindows OSの機能の一部として裏に隠れていたconhost.exeをアプリケーションとして独立させたことで、コマンドライン機能の搭載は、かなり大掛かりな改良になりそうだ。この点を考えると、12月中にプレビュー版が完成しなかったことも無理はない。
このあたりが動くと、Windows Terminalは、現在の標準コンソール(conhost.exe)の機能を実現でき、ユーザーレベルでは、ほぼ完全な置き換えが可能になりそうだ(Windows OSがconhostexeの代用とするかどうかは別の問題)。取りあえず、日本語入力は可能になったので、cmd.exeやPowerShellならかなりまともに使える感じだ。ペインが利用可能で、オンラインヘルプなどのために別ウィンドウを開く必要がないため、従来のコンソールよりも便利だ。
Copyright© Digital Advantage Corp. All Rights Reserved.