【Windows Terminal完全マスター】プロファイルにキーボードショートカットを設定する:Windows 10 The Latest
Windows Terminalの正式版がリリースされたが、各種設定を行うプロファイルを編集する必要がある。今回は、キーボードショートカットと配色(カラースキーム)、起動オプションについて解説する。よく利用する操作を設定することで、Windows Terminalがより使いやすくなるはずだ。
Windows Terminalの設定ファイル「settings.json」
今回は、キーボードショートカットを設定する方法を紹介する。このファイルの「keybindings」部分を編集することになる。
前回のWindows 10 The Latest「【Windows Terminal完全マスター】プロファイルをカスタマイズして使いやすくしよう」に続き、Windows Terminalのプロファイル設定について解説する。基本的なプロファイルの設定については、前回の記事を参照してほしい。今回は、キーボードショートカットの設定方法を中心に解説していく。
Windows Terminalはプレビュー版も提供されている
Windows Terminalは、執筆時点で通常版の「Windows Terminal バージョン1.0.1811.0」とプレビュー版の「Windows Terminal Preview バージョン1.1.1812.0」(以下、特に区別する場合には、Windows Terminalプレビュー版と表記)の2種類がある。簡単に言うと、通常版が正式にリリースされたバージョン、後者が次期バージョンのプレビュー版である。プレビュー版はバージョンが大きく、実際、機能の追加や改良点もある。しかし、それらが次の通常版で実装される保証もないため、ここでは通常版(バージョン1.0. 1811.0)をベースに話を進めることにする。
Windows Terminalは正式版とプレビュー版の両方のインストールが可能
Windows Terminalは、正式版に加え、開発中の次期バージョンのプレビュー版の配布が開始された。プレビュー版と正式版は共存が可能で同時にインストールすることができる。Windows Terminalのプレビューに参加していれば、Microsoft Storeからインストールできるが、GitHubからダウンロードしてインストールすることも可能だ。
ただし、プレビュー版では、今回解説するキーボード回りが改良されており、特定のコンソールアプリケーション/シェルで正しくキーボードが扱えなかった問題を一部解決している。通常版の利用で、キー操作に疑問がある場合には試してみるのもいいだろう。
プレビュー版は、Microsoft Storeの検索ボックスに「Windows Terminal」と入力すると、候補として「Windows Terminal」と「Windows Terminal Preview」が表示されるので、「Windows Terminal Preview」を選択し、[入手]ボタンをクリックするとインストールできる(プレビュー版のアイコンには、「PRE」の表記がある)。また、GitHubの「Windows Terminalページ」で、MSIXパッケージとして公開されているので、これをダウンロードしてインストールすることも可能だ。
Windows Terminalのプレビュー版のインストール方法
Windows Terminalのプレビュー版は、Microsoft Storeからもインストールが行える。検索ボックスに「windows terminal」と入力すると、候補として「Windows Terminal Preview」が表示されるので、これをクリックする。後は、通常のMicrosoft Storeアプリと同様、[入手]ボタンをクリックして、インストールを行う。
両方を同時にインストールすることも可能だが、設定は別々になること、プログラム実行エイリアスとして共に「wt.exe」を使うため、どちらを起動するかを[Windowsの設定]アプリの[アプリ]画面−[アプリ実行エイリアス]で指定する必要がある(起動オプションについて以下の画面を参照)。アイコンは違っているが、基本的に同じプログラムなので、設定などで意図的に概観を変えないと区別しにくいので注意されたい。
アプリ実行エイリアスを設定する(1)
Windows Terminalの正式版とプレビュー版は同じ「アプリ実行エイリアス」を持つため、「wt」コマンドでどちらを実行するか設定する必要がある。[Windowsの設定]アプリの[アプリ]画面を開き、[アプリと機能]画面の[アプリ実行エイリアス]をクリックする。
Windows Terminalの基本的な情報については、Windows 10 The Latest「ついに完成『Windows Terminal』の機能と使い方まとめ」を参考にしていただきたい。また、Windows Terminalの公式の説明は、Microsoftの「Windows ターミナルとは」ページを参照してほしい。
Windows 10のキーボード入力処理の流れを整理
Windows Terminalのキー割り当てを解説する前に、簡単にWindowsのキーボード入力処理についておさらいしておく。というのも、Windows Terminalは、Windowsとコンソールアプリケーションの間に入り、GUI側のキーボード処理(キーボード入力をイベントとして処理する)を行い、コンソールアプリケーションにキーストロークを送る。このため、Windows Terminalのキー割り当てを注意しないと、コンソールアプリケーションやシェルのキーボード処理に影響を与えてしまうからだ。
Windows 10のキーボードの処理はかなり複雑なのだが、大まかには、下図のようにユーザーの入力したキーストロークは、Windows 10で処理され、次にWindows Terminalがこれを処理した後、コンソールアプリケーションやシェルに送られる。この中で、Windows Terminalの「キー割り当て」は、シェル側に「渡さないキー」を定義することと同義となる。
Windows 10のキーボード処理
非常に簡易にWindows 10でのキーストロークの処理の流れを示すと、ユーザーが入力したキーストロークは、Windows 10で処理された後、GUIアプリであるWindows Terminalに渡る。ここでWindows Terminalのキー割り当てが処理されたのち、何も処理されなかったキーストロークがWindows Terminal内で実行されているシェルやコンソールアプリケーションに渡される。
また、Windows 10が処理してしまうキー(例えば、[Windows]キーの単独押し)は、Windows Terminalでは捉えることができないため、キー割り当てには利用できない。さらにコンソールアプリケーションやシェルは、独自のキーボードショートカットを持っているため、それらのキーボードショートカットをWindows Terminalで処理してしまうとコンソールアプリケーションやシェルで利用できなくなってしまう。そのためWindows Terminalは、コンソールアプリケーションやシェルが使わないキーボードの組み合わせを利用すべきである。
settings.jsonにキーボードショートカットを設定する方法
Windows 10 The Latest「【Windows Terminal完全マスター】プロファイルをカスタマイズして使いやすくしよう」では、Windows Terminalの設定ファイルであるsettings.jsonを以下のような部分に分けて解説した。今回は、このうち、後半の「キーボード設定」と「カラースキーム設定」を扱う。前半の「グローバル設定」および「プロファイル設定」に関しては、前記記事を参照いただきたい。
settings.jsonの構造
settings.jsonは、「グローバル設定」「プロファイル設定」「カラースキーム(配色)設定」「キー割り当て設定」の大きく4つの部分に分かれている。また「プロファイル設定」は、「プロファイル共通デフォルト値」設定と「個別プロファイル設定」に分かれている。
グローバル設定(先頭の「{」直後の部分)
プロファイル設定(「profiles」以降)
プロファイル共通デフォルト値(「defaults」以降)
プロファイル(「list」:以降)
個別プロファイル設定(「{」「}」でくくられている)
カラースキーム設定(「schemes」以降。初期状態では空)
キーボード設定(「keybindings」以降)
キーボード割り当てを行う
Windows Terminalは、下表のようなキーボードショートカットをデフォルトで定義しており、このまま利用するならば、特に設定を変更する必要はない。
キー | 動作 |
---|---|
[Alt]+[Ctrl]+[1] | 先頭のタブに移動 |
[Alt]+[Ctrl]+[2] | 2番目のタブに移動 |
[Alt]+[Ctrl]+[3] | 3番目のタブに移動 |
[Alt]+[Ctrl]+[4] | 4番目のタブに移動 |
[Alt]+[Ctrl]+[5] | 5番目のタブに移動 |
[Alt]+[Ctrl]+[6] | 6番目のタブに移動 |
[Alt]+[Ctrl]+[7] | 7番目のタブに移動 |
[Alt]+[Ctrl]+[8] | 8番目のタブに移動 |
[Alt]+[Ctrl]+[9] | 9番目のタブに移動 |
[Alt]+[Ctrl]+[,(カンマ)] | defaults.jsonの表示 |
[Alt]+[↓] | 下のペインに移動 |
[Alt]+[Enter] | フルスクリーンモードのオンオフ |
[Alt]+[F4] | Windows Terminalウィンドウを閉じる(Windows標準) |
[Alt]+[←] | 左のペインに移動 |
[Alt]+[→] | 右のペインに移動 |
[Alt]+[Shift]+[-(マイナス)] | 水平ペイン分割してデフォルトプロファイルを開く |
[Alt]+[Shift]+[D] | ペインを自動分割で開く(settings.jsonで定義) |
[Alt]+[Shift]+[↓] | カーソルのあるペインを下に拡大 |
[Alt]+[Shift]+[←] | カーソルのあるペインを左に拡大 |
[Alt]+[Shift]+[+(プラス)] | 垂直ペイン分割してデフォルトプロファイルを開く |
[Alt]+[Shift]+[→] | カーソルのあるペインを右に拡大 |
[Alt]+[Shift]+[↑] | カーソルのあるペインを上に拡大 |
[Alt]+[↑] | 上のペインに移動 |
[Ctrl]+[-(マイナス)] | フォントサイズを拡大縮小 |
[Ctrl]+[,(カンマ)] | 設定を開く |
[Ctrl]+[=(イコール)] | フォントサイズを拡大 |
[Ctrl]+[0] | フォントサイズをデフォルトに戻す |
[Ctrl]+[C] | コピー(settings.jsonで定義) |
[Ctrl]+[V] | 貼り付け(settings.jsonで定義) |
[Ctrl]+[Insert] | 単一行のコピー |
[Ctrl]+[Shift]+[1] | プロファイル1で新規タブ |
[Ctrl]+[Shift]+[2] | プロファイル2で新規タブ |
[Ctrl]+[Shift]+[3] | プロファイル3で新規タブ |
[Ctrl]+[Shift]+[4] | プロファイル4で新規タブ |
[Ctrl]+[Shift]+[5] | プロファイル5で新規タブ |
[Ctrl]+[Shift]+[6] | プロファイル6で新規タブ |
[Ctrl]+[Shift]+[7] | プロファイル7で新規タブ |
[Ctrl]+[Shift]+[8] | プロファイル8で新規タブ |
[Ctrl]+[Shift]+[9] | プロファイル9で新規タブ |
[Ctrl]+[Shift]+[C] | 単一行のコピー |
[Ctrl]+[Shift]+[D] | 現在と同じプロファイルで新規タブを開く |
[Ctrl]+[Shift]+[↓] | 1行スクロールダウン |
[Ctrl]+[Shift]+[F] | 端末バッファー内の検索 |
[Ctrl]+[Shift]+[PgDn] | 1ページスクロールダウン |
[Ctrl]+[Shift]+[PgUp] | 1ページスクロールアップ |
[Ctrl]+[Shift]+[Space] | メニューを開く |
[Ctrl]+[Shift]+[T] | デフォルトプロファイルで新規タブを開く |
[Ctrl]+[Shift]+[Tab] | 前のタブに移動 |
[Ctrl]+[Shift]+[↑] | 1行スクロールアップ |
[Ctrl]+[Shift]+[V] | 貼り付け |
[Ctrl]+[Shift]+[W] | ペインを閉じる |
[Ctrl]+[Tab] | 次のタブに移動 |
[F11] | フルスクリーンモードのオンオフ |
[Shift]+[Insert] | 貼り付け |
割り当て済みのキーボードショートカット |
なお、後述するキーボードコマンドの割り当ては、下表のようになっている。
キー | 動作 |
---|---|
[Alt]+[Ctrl]+[1] | { "action": "switchToTab", "index": 0 } |
[Alt]+[Ctrl]+[2] | { "action": "switchToTab", "index": 1 } |
[Alt]+[Ctrl]+[3] | { "action": "switchToTab", "index": 2 } |
[Alt]+[Ctrl]+[4] | { "action": "switchToTab", "index": 3 } |
[Alt]+[Ctrl]+[5] | { "action": "switchToTab", "index": 4 } |
[Alt]+[Ctrl]+[6] | { "action": "switchToTab", "index": 5 } |
[Alt]+[Ctrl]+[7] | { "action": "switchToTab", "index": 6 } |
[Alt]+[Ctrl]+[8] | { "action": "switchToTab", "index": 7 } |
[Alt]+[Ctrl]+[9] | { "action": "switchToTab", "index": 8 } |
[Alt]+[↓] | { "action": "moveFocus", "direction": "down" } |
[Alt]+[Enter] | toggleFullscreen |
[Alt]+[F4] | closeWindow |
[Alt]+[←] | { "action": "moveFocus", "direction": "left" } |
[Alt]+[→] | { "action": "moveFocus", "direction": "right" } |
[Alt]+[Shift]+[-] | { "action": "splitPane", "split": "horizontal" } |
[Alt]+[Shift]+[D] | { "action": "splitPane", "split": "auto", "splitMode": "duplicate" }(settings.jsonで定義) |
[Alt]+[Shift]+[↓] | { "action": "resizePane", "direction": "down" } |
[Alt]+[Shift]+[←] | { "action": "resizePane", "direction": "left" } |
[Alt]+[Shift]+[+] | { "action": "splitPane", "split": "vertical" } |
[Alt]+[Shift]+[→] | { "action": "resizePane", "direction": "right" } |
[Alt]+[Shift]+[↑] | { "action": "resizePane", "direction": "up" } |
[Alt]+[↑] | { "action": "moveFocus", "direction": "up" } |
[Ctrl]+[-] | { "action": "adjustFontSize", "delta": -1 } |
[Ctrl]+[,] | openSettings |
[Ctrl]+[=] | { "action": "adjustFontSize", "delta": 1 } |
[Ctrl]+[0] | resetFontSize |
[Ctrl]+[C] | {"action": "copy", "singleLine": false }(settings.jsonで定義) |
[Ctrl]+[Insert] | { "action": "copy", "singleLine": false } |
[Ctrl]+[Shift]+[1] | { "action": "newTab", "index": 0 } |
[Ctrl]+[Shift]+[2] | { "action": "newTab", "index": 1 } |
[Ctrl]+[Shift]+[3] | { "action": "newTab", "index": 2 } |
[Ctrl]+[Shift]+[4] | { "action": "newTab", "index": 3 } |
[Ctrl]+[Shift]+[5] | { "action": "newTab", "index": 4 } |
[Ctrl]+[Shift]+[6] | { "action": "newTab", "index": 5 } |
[Ctrl]+[Shift]+[7] | { "action": "newTab", "index": 6 } |
[Ctrl]+[Shift]+[8] | { "action": "newTab", "index": 7 } |
[Ctrl]+[Shift]+[9] | { "action": "newTab", "index": 8 } |
[Ctrl]+[Shift]+[C] | { "action": "copy", "singleLine": false } |
[Ctrl]+[Shift]+[D] | duplicateTab |
[Ctrl]+[Shift]+[↓] | scrollDown |
[Ctrl]+[Shift]+[F] | find(settings.jsonで定義) |
[Ctrl]+[Shift]+[PgDn] | scrollDownPage |
[Ctrl]+[Shift]+[PgUp] | scrollUpPage |
[Ctrl]+[Shift]+[Space] | openNewTabDropdown |
[Ctrl]+[Shift]+[T] | newTab |
[Ctrl]+[Shift]+[Tab] | prevTab |
[Ctrl]+[Shift]+[↑] | scrollUp |
[Ctrl]+[Shift]+[V] | paste |
[Ctrl]+[Shift]+[W] | closePane |
[Ctrl]+[Tab] | nextTab |
[Ctrl]+[V] | paste(settings.jsonで定義) |
[F11] | toggleFullscreen |
[Shift]+[Insert] | paste |
キーボードコマンドの割り当て |
キーボード割り当ては、settings.jsonのキーボード設定(keybindings)で行う。この部分は、具体的には、下リストのような構造になっている。簡単に言えば、キーボードコマンドとそれを実行するためのキーストロークを定義したものを並べていく。
"keybindings":[
//引数のないキーボードコマンド
{ "command": "paste", "keys": "ctrl+v" },
//引数のあるキーボードコマンド
{ "command": {"action": "copy", "singleLine": false }, "keys": "ctrl+c" },
:
以下省略
]
キーボードコマンドには、「引数のある」ものと「引数がない」ものがある。引数がないキーボードコマンドにキーボードショートカットを割り当てるには、以下の形式を使う。説明の都合、これを「単純なキーボード定義」と呼ぶ。
{ "command": "キーボードコマンド名", "keys": "キーボードショートカット" },
これに対して、引数を指定するキーボードコマンドを利用する場合には、以下の行を作ってキーボード設定に並べていく(これを「複雑なキーボード定義」とする)。
{ "command": {"action": "キーボードコマンド名", "引数名": 値 }, "keys": "キーボードショートカット" },
キーボードコマンドには、例えば「新規タブ作成(newTab)」「設定ページを開く(openSettings)」などがある。
コマンド名 | コマンド動作 | 引数名 | 値の形式 | 引数の説明 | |
---|---|---|---|---|---|
closeWindow | ウィンドウを閉じる | なし | − | − | |
find | 検索(ダイアログを表示) | なし | − | − | |
openNewTabDropdown | 新規タブポップアップを開く | なし | − | − | |
openSettings | 設定ファイルを開く | なし | − | − | |
toggleFullscreen | フルスクリーンモードトグル切替 | なし | − | − | |
closeTab | 現在のタブを閉じる | なし | − | − | |
duplicateTab | 同じプロファイルで新規タブ | なし | − | − | |
newTab | 新しいタブを開く | commandLine | 文字列値 | 起動するコマンド | |
index | 整数値 | プロファイルインデックス | |||
profile | 文字列値 | プロファイルGUID/名称 | |||
startingDirectory | 文字列値 | 起動ディレクトリ | |||
tabTitle | 文字列値 | タイトル文字列 | |||
nextTab | 現在のタブの右隣のタブを開く | なし | − | − | |
prevTab | 現在のタブの左隣のタブを開く | なし | − | − | |
switchToTab | 0〜8のタブに切り替える | index(必須) | 整数値(0から) | 指定されたタブへ移動 | |
closePane | アクティブペインを閉じる | なし | − | − | |
moveFocus | 指定した方向のペインに移動 | direction(必須) | left/right/up/down | 選択するペインの方向 | |
resizePane | 現在のペインのサイズ変更 | direction(必須) | left/right/up/down | サイズ変更の方向 | |
splitPane | ペイン分割 無指定はデフォルトプロファイル |
commandLine | 文字列値 | 起動するコマンド | |
index | 整数値(0から) | プロファイルインデックス | |||
Profile | 文字列値 | プロファイルのGUID/名前 | |||
split(必須) | vertical/horizontal/auto | ペインの分割方法 | |||
splitMode | duplicate | 現在と同じプロファイル | |||
startingDirectory | 文字列値 | 起動ディレクトリ | |||
tabTitle | 文字列値 | タイトル文字列 | |||
copy | ターミナル内のテキストをコピー | singleLine | 真偽値 | 改行コードを含めるか否か | |
paste | クリップボードから貼り付け | なし | − | − | |
scrollDown | 下スクロール | なし | − | − | |
scrollDownPage | 1ページ下スクロール | なし | − | − | |
scrollUp | 上スクロール | なし | − | − | |
scrollUpPage | 1ページ上スクロール | なし | − | − | |
adjustFontSize | フォントサイズの変更 | delta | 正負の整数値 | フォントサイズの増減 | |
resetFontSize | フォントサイズ変更をリセット | なし | − | − | |
unbound | キー割り当てを解除 | なし | − | − | |
キーボードコマンド一覧 |
引数を持つキーボードコマンドの場合、必須となる引数は必ず記述する必要がある。一方、全ての引数が必須ではないキーボードコマンドの場合で、引数を全て指定しない場合には、単純なキーボード定義を使っても構わない。この場合、該当キーボードコマンドの動作には、プロファイルやデフォルト値などから推測される現在値が使われる。というのは、キー割り当ては、settings.jsonで指定されるが、キーボードコマンドを実行するのは、起動後(settings.jsonによる設定が確定した後)かつ、該当のキーボードが押された段階になるからだ。
キーボードショートカットは、下表の表記を使って記述する。基本的には「修飾キー」(Microsoftの英文ドキュメントでは「Modifiers」)である「Ctrl」「Alt(前面)」「Shift」キーの3つと被修飾キー(同「Modifier Keys」になっており、日本語ドキュメントでは「修飾キー」となっている)の組み合わせを使う。ただし、[Shift]キー単独では、通常の文字入力キーストロークとなり文字入力に差し支えるため、実際には、[Ctrl]+[Shift]キー、[Alt]+[Shift]キー、[Alt]+[Ctrl]+[Shift]キーといったように他の2つの修飾キーと併用することになる。
分類 | キー表記 | 備考 |
---|---|---|
修飾キー | ctrl+、Shift+、alt+ | 以下のキーとの組み合わせ |
ファンクションキー | f1-f24 | "f"+数字で表記 |
英数キー | a-z、0-9 | そのまま表記 |
記号キー | `、-、=、[、]、\、;、'、,、.、/、+ | そのまま表記 |
カーソルキー | down、left、right、up、pagedown、pageup、pgdn、pgup、end、home | キー名称(英文)で表記 |
機能キー | tab、enter、esc/escape、space、backspace、delete、insert | キー名称(英文)で表記 |
テンキー | numpad_0/numpad0 〜 numpad_9/numpad9 numpad_add/numpad_plus (+) numpad_decimal/numpad_period (.) numpad_divide (/) numpad_minus/numpad_subtract (-) numpad_multiply (*) |
"numpad_"または"numpad"とキー名の組み合わせで表記 |
キーボードショートカットの表記 |
シェルとのキーボードショートカットの重複を回避するには
シェルでもさまざまなキーボードショートカットが使われており、これを調べるには、それぞれのシェルのドキュメントやコマンドを使うしかない。残念なことにcmd.exeに関しては、自身が使うキーボードショートカットを調べるコマンドがない。
下表は、筆者が調べたcmd.exeのキー割り当てである。なお、現在のcmd.exeをconhost.exeで動作させる[コマンドプロンプト]ウィンドウでは、conhost.exeが提供するクリップボード機能が動作しており、[Ctrl]+[C]キー、[Ctrl]+[X]キー、[Ctrl]+[V]キーが動作する。これは、cmd.exeのキーボードショートカットではない点には注意しよう。
キー | 機能 |
---|---|
[↑] | コマンド履歴を逆順に(先頭に到達するまで)表示 |
[→] | カーソルを1つ右へ移動。空行の時は、直前の行のカーソル位置から1文字コピー |
[↓] | コマンド履歴を順番に(最後に到達するまで)表示 |
[←] | カーソルを1つ左へ移動 |
[Backspace] | カーソル左側の文字を1文字だけ削除して、カーソルを1つ左へ移動 |
[Ctrl]+[→] | 語単位でカーソルを左へ移動 |
[Ctrl]+[←] | 語単位でカーソルを右へ移動 |
[Ctrl]+[C] | スクリプト停止 |
[Ctrl]+[D] | ディレクトリ補完文字のデフォルト値*1 |
[Ctrl]+[End] | カーソル位置から行末までを削除 |
[Ctrl]+[F] | ファイル補完文字のデフォルト値*1 |
([Ctrl]+[Z]) | ファイル終端文字(キーボードショートカットではなく文字扱い) |
[Ctrl]+[Home] | 行の先頭からカーソル位置までを削除 |
[Delete] | カーソル位置の文字を1文字だけ削除 |
[End] | カーソルを行末へ移動 |
[Esc] | 入力を全てキャンセルしてカーソルを先頭へ移動 |
[F1] | [→]キーと同じ |
[F2] | 指定した文字([F2]キーに続いて入力する)の直前までコピー |
[F3] | 直前の行を全てコピーして、カーソルを行末へ移動 |
[F4] | カーソル位置から指定した文字の直前までを削除 |
[F5] | [↑]キーと同じ |
[F6] | EOF([Ctrl]+[Z])を入力 |
[F7] | コマンド履歴ウィンドウをポップアップ表示 |
[F8] | コマンド履歴からカーソルの左側部分に一致するものを選び、順番に表示 |
[F9] | 指定した履歴番号のコマンドを入力 |
[Home] | カーソルを行の先頭へ移動 |
[Insert] | 上書きモードと挿入モードの切り替え |
[PgDn] | コマンド履歴の最後のものを表示 |
[PgUp] | コマンド履歴の先頭のものを表示 |
cmd.exeのキー割り当て *1:レジストリで変更可能 |
WSLなどで利用するLinuxディストリビューションでは、現状bashがシェルとして採用されていることが多い。bashは、readlineという機能により、入力時に簡易なテキスト編集機能を持つ。このため、readlineがカスタマイズされていると、bashが使うキーボードショートカットは、それに応じて変化する。これを調べるには、bash上で「bind」コマンド(bashの内部コマンド)を利用する。具体的には、「bind -p」としてキーボードショートカットを表示させる。このbindコマンドに関しては、bashのman内に説明がある。
PowerShellにもこのreadlineを基に作られたPowerShell用のreadlineモジュールがあり、現状、これが標準で組み込まれている。こちらは、「Get-PSReadLineKeyHandler」でキーボードショートカットを表示することが可能だ。
「Get-PSReadLineKeyHandler」コマンドレットでキー割り当てを調べる
PowerShellにもreadlineモジュールがあり、「Get-PSReadLineKeyHandler」コマンドレットでキー割り当てを表示させることができる。
ざっと調べた限りでは、クリップボード貼り付けの[Ctrl]+[C]キー、[Ctrl]+[V]キー、[Shift]+[Insert]キーでPowerShellのReadlineとWindows Terminalのキーボード割り当てが衝突している。しかし、どちらも同じクリップボードを相手に、同じ動作をしているため、実質的な問題はないと思われる。どうしてもPowerShell側の機能を使いたい場合には、settings.jsonを書き換える必要がある。
以前のWindows Terminal Preview版からインストールしている場合、古いsettings.jsonが残っており、このkeybindingsに関する設定変更が反映されておらず、このエントリーがない可能性がある。このような場合は、一度、Windows Terminalをアンインストールしてから、再インストールしてほしい。
keybindingsの編集例
PowerShellとWindows Terminalは、クリップボードコピーと貼り付けのキーストロークが衝突している。事実上問題ないが、PowerShell側のキーボードショートカットで処理させたい場合には、settings.jsonを書き換える必要がある。具体的には、元からある[Ctrl]+[C]キーと[Ctrl]+[V]キー、デフォルトで定義されている[Shift]+[Insert]キーの割り当てを解除する。
キー割り当てのサンプル
実際にキー割り当てを行ってみよう。デフォルトでは、タブをペインに水平、垂直に分割するキー割り当て([Alt]+[Shift]+[-]キーと[Alt]+[Shift]+[+]キー)は、デフォルトプロファイルで指定されていて、どのタブで使ってもデフォルトプロファイル(初期状態ではPowerShell)を開くようになっている。これを、現在のタブ/ペインと同じプロファイルを使うように書き換えよう。具体的には、settings.jsonのキー割り当て部に以下の記述を行う。
{ "command": { "action": "splitPane", "split": "horizontal", "splitMode": "duplicate"}, "keys": "alt+shift+-" },
{ "command": { "action": "splitPane", "split": "vertical","splitMode": "duplicate"}, "keys": "alt+shift+plus" },
カラースキームを設定する
カラースキーム(配色)は、Windows Terminal内で標示させる文字や背景の色をまとめて変更するためのものだ。Windows Terminal内では、VTエスケープシーケンスにより文字色が16(8つの色の通常輝度と高輝度)+1(foreground)の17色、背景が8(背景色には高輝度を設定できない)+1(background)の合計9色が利用できる。
カラースキームでは、この他にカーソル色(cursorColor)、マウスでテキストを選択したときの色(selectionBackground)を文字色や背景色とは独立して指定できる。ただし、文字色、背景色、カーソル色、選択色に関しては、プロファイル部でも定義でき、選択されているカラースキームの設定を上書きする。色の指定は、RGB各色8bitの3バイトを6桁の16進数で表現し、その先頭に「#」を付加する。WebページのCSS(Cascading Style Sheet)などに使われている記法と同じものを使う。
カラースキームの設定例
カラースキームは、名前(name)と色の定義からなる。色は、WebページのCSSなどと同じく、RGB値を16進数で表現したものを使う。色名は、あらかじめ決められており、これに対応する色をRBG値で定義する。また、文字色(foreground)などは、プロファイル側の設定で上書きが可能だ。
設定したカラースキームは、プロファイル部で参照され、プロファイルのデフォルト値および個別プロファイルで指定されることで、該当プロファイル内で使われる色を決定する。デフォルトのカラースキームは、全てdefaults.jsonで指定されており、標準状態では、settings.jsonはカラースキーム定義を持たない。カラースキームは、色のセットを定義するものであり、全部の色をまとめて定義する必要がある。このため、既存のカラースキームを一部使いたい場合には、defaults.jsonからカラースキームをsettings.jsonにコピーしつつ、一部を書き換える必要がある。
Windows Terminal内でカラースキームによる表示を確認するには、Windows Terminalと同時に開発されている「colortool.exe」を利用するとよい。これは、VTエスケープシーケンスによる色指定の組合せ(文字色17、背景色9)の組み合わせを表示するものだ。
「colortool」コマンドによりカラースキームで定義した色の確認が可能
Windows Terminalのプロジェクトで開発された「colortool」を使うことで、カラースキームで定義した色を一覧することができる。縦が文字色の並び、横が背景色の並びになる。
Windows Terminalのパッケージには含まれないが、GitHubからダウンロードすることができる。下記のページに「Color Tool April 2019」などマイルストーンが付いた項目があり、その中の最新のものを選択してAssetからzipファイルのダウンロードが行える。
- Color Tool(GitHub)
zipファイルを適当なフォルダに解凍すれば、インストールすることなく実行が可能だ。Windows Terminalの設定によるカラースキームを確認するだけなら、「-c」オプションを使い、「colrotool.exe -c」を実行すればよい。なお、カラースキーム自体は、シェルには影響されないので、必ずしも実環境で行う必要はない。とはいえ、「colortool」コマンドは、cmd.exe、PowerShell、WSL(win32相互運用性)で動作するので、実環境で実行してもよいだろう。
Windows Terminalの起動オプションとは
Windows Terminalは、実はMicrosoft Storeアプリ(UWPアプリ)であるため、Win32アプリケーションと違って、直接実行ファイルにアクセスすることができない。しかし、Windowsが提供する「アプリ実行エイリアス」という機能を使って「wt.exe」という実行ファイル名から起動することができる。
アプリ実行エイリアスは仮想的なプログラム実行ファイルで、パスなどを指定することなく、コマンドラインからwt.exeを起動することで実行が行える。このwt.exeに対して、下表のような起動オプションを付けることが可能だ。
意味 | サブコマンド | 引数 | 引数の解説 | |
---|---|---|---|---|
オンラインヘルプをGUIで表示 | --help、-h、-?、/? [サブコマンド] | [サブコマンド]で該当のヘルプを表示 | ||
新規タブ | new-tab | --profile、-p プロファイル名 | プロファイルを名前、GUIDで指定 | |
--startingDirectory,-d 開始フォルダ | 開始フォルダを指定 | |||
コマンドライン | 起動コマンド(シェル)を指定 | |||
既存のタブを選択 | focus-tab | --target、-t タブ番号 | 番号で指定したタブを選択(排他) | |
--next、-n | 次(右側)のタブを選択(排他) | |||
--previous、-p | 前(左側)のタブを選択(排他) | |||
新規ペイン(ペイン分割) | split-pane | -H または -V | 水平(-H)、垂直(-V)分割。指定なしはauto | |
--profile、-p プロファイル名 | プロファイルを名前、GUIDで指定 | |||
--startingDirectory,-d 開始フォルダ | 開始フォルダを指定 | |||
コマンドライン | 起動コマンド(シェル)を指定 | |||
wt.exeの起動オプション |
起動オプションで実現できるのは、プロファイルや実行ファイルを指定してタブやペインを開くことだ。settings.jsonで定義するプロファイルは、タブやペインを起動する場合の対象とすることはできるが、プロファイルにタブやペインの開き方を指定することはできない。例えば、タブ内が縦に2つのペインに分割されていて、右側のペインは上下分割され、それぞれでPowerShell、cmd.exe、bashが動作するような実行環境は手動では指定できるが、settings.jsonのプロファイルなどでは指定することができない。しかし、起動オプションならば、指定が可能だ。あるいは、複数のマシンにSSHなどで同時に接続するといった指定もコマンドラインなら行うことができる。
ちなみに、公開中のプレビュー版では、エクスプローラーでフォルダのコンテキストメニューに「open in Windows Terminal」が表示されるようになった。デフォルトプロファイルで指定したフォルダを起動フォルダとして開くものだが、これもコマンドラインオプションを利用したものだ。
ただし、現在のコマンドラインオプションでは、Windows Terminal内からWindows Terminalに新規タブを開くことを指定しても、必ず別ウィンドウになってしまい、現在のWindows Terminalウィンドウにタブを追加することはできないので注意が必要だ。
コマンドラインオプションには、大きく、ヘルプ表示とサブコマンドによる新規タブ(new-tab)、ペイン分割(split-pane)、タブ選択(focus-tab)がある。また、公開中のプレビュー版では、コマンドラインオプションが追加されているが、最終仕様ではないため、ここでは紹介しない。詳細はGitHub内のプレビュー版のドキュメントなどを参照されたい。
オプションの基本は「new-tab」サブコマンドで、これを使い、タブを追加していく。タブ内を複数のペインに分割する場合は、split-paneを使う。タブやペインは最後に作られたものが選択状態にあるため、それ以前に作成したタブを選択したい場合には、focus-tabで表示させたいタブを指定する。現在のバージョンでは、タブを選択することはできるが、タブ内のペインは、最後に作成したものが有効となり、他のペインをコマンドラインから選択することはできない。
なおコマンドラインでは、タブやペイン分割で、settings.jsonのプロファイルを指定するだけでなく、無関係に起動コマンドや起動フォルダを指定することも可能だ。これにより、複数のSSHやtelnetなどのリモート接続のコマンドをタブやペインとして開くことができる。
これらの指定は、プロファイル指定と併用できるため、プロファイル指定にある他の設定項目(色指定や背景画像指定など)に、起動コマンド、起動ディレクトリだけを差し替えてタブを開くことができる。コマンドプロンプトという名前を持つプロファイルで背景画像などを設定している場合、以下のコマンドを実行すると、左側には「コマンド プロンプト」プロファイルで設定されているがPowerShellが起動し、右側のペインには、プロファイル指定通りcmd.exeが起動する。
wt.exe new-tab -p "コマンド プロンプト" -d "c:\\temp" powershell.exe ; split-pane -p "コマンド プロンプト"
コマンドプロンプトというプロファイルによるWindows Terminalの起動例
コマンドライン指定を使うと、最初からペイン分割されたタブを開くこともできる。また、コマンドラインオプションでプロファイル定義の一部(起動プログラムや起動ディレクトリなど)を上書き指定することも可能だ。
起動コマンドを指定する場合、サブコマンドの他の引数を先に指定し、最後に起動コマンドを指定する。また、他のサブコマンドを続ける場合には、「;」でサブコマンド間を区切る必要がある(上記コマンドライン例のpowershell.exeの直後)。
こうしたWindows Terminalのコマンドラインは、ショートカットを作成し、[スタート]メニューにタイルとして登録することも可能だ。
長らくPCを使っているユーザーなら、2001年頃のInternet Explorer(IE) 6までは、タブ表示が行えずURLごとに複数のウィンドウを表示させていたのを覚えているかもしれない。しかし、今ではWebブラウザはタブ表示が普通であり、デフォルトでは新規ウィンドウではなく、新しいタブが開く。そういう意味ではこれまでのコンソール(conhost.exe)は、20年前のIE6と同じレベルにあった。
Windows Terminalを使うことで、コマンドラインを使う作業環境を強化できる。cmd.exeやPowerShellでの作業することが多い、あるいは、WSLで複数のウィンドウを開いて使っていたという場合には、Windows Terminalを入れることで作業効率を改善できる。
タブを縦にペインで分割して、WSLのmanページ、PowerShellのGet-Helpなどのオンラインヘルプを表示させると、ウィンドウを別に開くことなく、ヘルプを見ながら一方のペインでコマンドラインの入力が可能になる。あるいは、他のマシンへのSSH接続やPSRemoting接続などを多用する場合、Windows Terminalのコマンドラインオプションを使い、複数のセッションをタブやペインとして一気に開くことも可能だ。従来のconhost.exeと違い、タブやペインとしてセッションを開くことができるため、ウィンドウが行方不明になったり、ウィンドウの配置を考えたりする必要もない。
Windows Terminalも、取りあえず正式版が登場したことであるし、そろそろ標準コンソール(conhost.exe)の利用は終わりにした方がいいかもしれない。
Copyright© Digital Advantage Corp. All Rights Reserved.