• Windows Terminalのキーボードカスタマイズ ベスト設定編

    写真01: Windows 11では、Windows Terminalを標準コンソールに指定できるようになった。しかし、標準のキー割り当ては以前のまま。ここでは、Windows 11の環境に適応したキー割り当てを考える

Windows Terminalは、Microsoftがオープンソースで開発を進めるコンソールプログラムであり、端末エミュレーターでもある。柔軟なカスタマイズが可能で、端末の機能のほとんどをユーザーが自由にキー割り当てすることが可能だ。さらにWindows 11では、Windows Terminalを従来のコンソールウィンドウ(以下conhostウィンドウ)に置き換えることが可能になった。ここでは、こうした背景を踏まえ、Windows Terminalをさらに便利に使えるキー割り当てを提案する。

なお、Windows Terminalには、通常利用が可能な「安定版」と、開発途上の「プレビュー版」が存在する。ここでは、安定版V1.11.3471.0とプレビュー版V1.12.3472.0を対象とする。また、Windows Terminalに関して基本的なことがらや各種ドキュメントのURLなどについては、以下の記事を参考にされたい。

・Windows Terminalのキーボードカスタマイズ 導入編
https://news.mynavi.jp/article/20211025-2168960/

なぜキーボード割り当てを変更する必要があるのか?

Windows Terminalは、2019年7月にGitHubで最初のプレビュー版v0.2が公開された。その後、2020年5月に安定版v1.0.1401.0が公開された。少なくとも安定版に関しては、1年8カ月が経過し、バージョンも上がり、さまざまな機能が追加された。その間、デフォルトのキー割り当てに関しては、初期の頃からほとんど変化していない。簡単にいえば、Windows Terminalの標準キー割り当ては、その機能を最大限に発揮できるようには定義されていないのである。

Windows Terminalで、使い方を変えてしまう大きな変更の1つが、Windows 11での標準コンソールの置き換えだ。そのほかにも「コマンドパレット」、「ウィンドウ制御」、「検索機能」などさまざまな機能が追加されている。

標準コンソールとして設定できることにより、Windows Terminalの起動方法が大きくかわる。Windows 10までは、ショートカットなどで明示的にWindows Terminalを起動しなければならず、システム組み込みのcmd.exeやWindows PowerShellを直接起動すると、conhostウィンドウが開いていた。ユーザーは、こうした「コマンドラインインタープリタ」(シェル)を利用するとき、Windows Terminalを呼び出すショートカットを手作業でスタートメニューに登録しなければ、従来のconhostコンソールが起動していた。

しかし、Windows 11からは、今後登場するであろう未知のコマンドラインインタープリターなどをインストールして起動すれば、Windows Terminalが起動するようになる。WSLに関しても同じで、Windows 10までは、MicrosoftストアからインストールしたWSLディストリビューションのタイルをクリックすると、conhostウィンドウが開いていた。

conhostウィンドウは、起動するたびに単独のウィンドウを開く。これに対して、Windows Terminalは、タブ機能があり、複数の端末セッションを1つのウィンドウに表示することができる。このため、複数のセッションを開いてもウィンドウが迷子になるようなことがない。

さらに、1つのタブを複数のペインに分割して、それぞれで独立したシェルを起動できる。このようになっているため、多数のコンソールを1つのウィンドウに集約することが可能になっている。初期のWebブラウザは、URLごとに独立したウィンドウを開いていたが、「タブ」機能の搭載により、1つのウィンドウでタブを切り替えて複数のセッションを開くことが可能になり、デスクトップ上で多数のウィンドウを管理しないで済むようになった。

実際利用してみると、多数のconhostウィンドウを管理するのは難しいことがある。それぞれのウィンドウが同じように見え、その表示内容でしかユーザーはセッションを区別できない。このため、間違ったウィンドウで作業をしてしまうといった事故が起きることがある。これに対して、Windows Terminalでは、1つのウィンドウにタブを並べて配置するため、タブの位置でセッションを区別しやすく、さらにタブの区別を付けやすくするため、タブに色を付ける、あるいは名前を変更することが可能になっている。

使い方を大きく変えるもう1つの要素は、コマンドパレットだ。コマンドパレットは、Windows Terminalのさまざまな「Action」を直接実行するためのユーザーインターフェースだ。コマンドパレット登場以前、Actionはキー割り当てを行わなければユーザーが利用することはできなかった。コマンドパレットの登場により、利用頻度の高くないActionは、キー割り当てを行うことなく、コマンドパレットから実行することが可能になった。また、コマンドパレットでは、ユーザーが動作を指定するようなメニュー構造を持ったActionを定義して利用することも可能になった。さらに、Windows Terminalでは、シェルとの対話履歴となる「バッファ」を制御するActionやバッファ内の検索をおこなうActionなども追加されている。

こうした新機能のいくつかは、標準のキー割り当てには、含まれておらず、コマンドパレットなどから機能を実行する必要があるが、利用方法によっては、キー割り当てしたほうが作業が効率的になる。

新キー割り当ての考え方

Windows Terminalのキー割り当ての基本にあるのは、Windows Terminalをユーザーが起動し、シェルに対応したプロファイルを選択して新規タブを作成して利用するという考え方だ。

しかし、標準コンソールにすることができるWindows Terminalでは、ショートカットやスタートメニューなどから直接シェルを起動し、これに応じてWindows Terminalが起動するようになる。

標準のキー割り当てでは、Windows Terminal内でシェルを起動するときには、メインメニューのプロファイルの並びが基準になっていて、「メインメニューの1番目のプロファイルを使ってシェルを起動する」という考え方だった。

この記事で提案するキー割り当てでは、「cmd.exeを新規タブで開く」、「Windows PowerShellを新規ウィンドウで開く」というように、シェルを直接指定して新規タブ、新規ウィンドウを開くという考え方に切り替える。このときのキー割り当ては、起動するシェルから想像しやすいキーを選ぶことにする。たとえば、cmd.exeならば、「ctrl+shift+C」で新規タブ、WSLのUbuntuなら「ctrl+shift+U」で新規タブという具合だ。このため、「ctrl+shift」、「alt+ctrl+shift」というキー割り当てのうち、利用頻度が高いもの(コマンドパレットなど)を除き、オリジナルのキー割り当てを変更している。

表01が、新しいキー割り当てだ。具体的な設定方法については後で解説する。表02は、同じ表をキー割り当てで並べ替えたものだ。こちらは、新規にキー割り当てを行う場合などに使うことができる。キー割り当てのうち、シェル(プロファイル)に対応した新規タブ、新規ウィンドウのキー割り当てを表03に示す。Windows Terminal標準のキー割り当てを表04に示す。色をつけたものがこの記事で提案するキー割り当てで変更された部分だ。

  • 表01

  • 表02

  • 表03

  • 表04

なお、従来のWindows Terminalでは、Windows Terminalを単純起動したときに使われるプロファイルを「デフォルトプロファイル」として、起動時や、タブ、ペイン分割で優先して扱っていたが、この割り当てでは、デフォルトプロファイルを優先することをやめた。これにより、デフォルトプロファイルで新規タブを開くctrl+shift+tや、新規ウィンドウをデフォルトプロファイルで開くctrl+shift+nの割り当てを解除した。

ペイン分割のキー割り当ては同じだが、必ず、現在のプロファイル(シェル)と同じものになるように変更した。1つのタブを複数のペインに分割する場合、もっとも利用頻度が高いのは、同じシェルを使う場合だからだ。1つのタブの中でペインごとに異なるシェルを起動するのは、それほど多くない。こちらは、コマンドパレットや、コマンドラインで対応することを想定した。たとえば、cmd.exeが起動しているペインであっても、wsl.exeを使うことでbash(WSLディストリビューション)を起動することができる。

さらにこのキー割り当てには、コマンドパレットから呼び出す、「New Window ...」というアクションを追加してある(写真02)。標準で組み込まれているペイン分割アクションである「Split Pane...」(ウィンドウを分割します...)と同じようにプロファイルを指定するが、新規ウィンドウの表示を行うものだ。settings.jsonで直接指定しているため、日本語環境でも英語表記になる。

  • 写真02: このキー割り当てでは、プロファイルを選択して新規ウィンドウを開くアクション「New Window...」を追加してある。コマンドパレット(ctrl+shift+p)から起動することが可能

Windows 11で標準コンソールに設定する

Windows 11でWindows Terminalを起動し、GUI設定をctrl+,で開く。「既定のターミナルアプリケーション」にあるドロップダウンリストをクリックして、「Windows Terminal」を選択する(写真03)。なお、安定版を起動していても、プレビュー版を既定のターミナルに指定することは可能なので、どちらを選ぶのかに注意する。これで、Windows 11でコマンドプロンプト(コントロールパネルのWindowsツールにある)を起動しても、Windows Terminalが起動するようになる。

  • 写真03: Windows TerminalのGUI設定でWindows 11の標準コンソールを指定できる。ただし、安定版からでもプレビュー版(インストールしている場合)を標準コンソールに指定することができることに注意

Windows Terminalのタブ機能を有効に使うには、同じくGUI設定のスタートアップで下のほうにある「新しいインスタンスの動作」で、「このデスクトップで最近利用したウィンドウに接続する」を選択する(写真04)。これで、スタートメニューやショートカットから起動したコマンドプロンプトや、Windows PowerShellでも新規タブで起動するようになる。最後に「保存」ボタンを押せば、基本設定は終了である。

  • 写真04: ショートカットやスタートメニューからのコンソールの起動を1つのウィンドウにタブとしてまとめるため、スタートアップの「新しいインスタンスの動作」を「このデスクトップで最近使用したウィンドウに接続する」を選択しておく

キー割り当てを反映させる

ここでは、リスト01をWindows Terminalに実際に反映させる方法を解説する。基本的な手順としては、settings.jsonをエディタで開き、リスト01の内容を貼り付ける。settings.jsonの構造や編集などに関しては、記事冒頭に示したURLを参考にされたい。また、settings.jsonの編集は、メモ帳でも問題ないが、JSONスキーマに対応したエディタアプリ(MicrosoftのVisual Studio Codeなど)があると、修正などが便利になる。ここでは、Windows付属のメモ帳を使うが、各自の使い慣れた環境で作業してかまわない。

■リスト01

 // find
    {"command":"find","keys":"alt+shift+f"},
    {"command":{"action":"findMatch","direction":"next"},"keys":"alt+shift+n"},
    {"command":{"action":"findMatch","direction":"prev"},"keys":"alt+shift+p"},
    // reserve ctrl+shift / alt+crtl+shift   0/1/5/9
    {"command":"unbound","keys":"ctrl+alt+shift+0"},
    {"command":"unbound","keys":"ctrl+alt+shift+1"},
    {"command":"unbound","keys":"ctrl+alt+shift+5"},
    {"command":"unbound","keys":"ctrl+alt+shift+9"},
    {"command":"unbound","keys":"ctrl+shift+0"},
    {"command":"unbound","keys":"ctrl+shift+1"},
    {"command":"unbound","keys":"ctrl+shift+5"},
    {"command":"unbound","keys":"ctrl+shift+9"},
    // reserve for ctrl+shift+a-z
    {"command":"unbound","keys":"ctrl+shift+w"},
    // openSUSE-Leap-15.[2]   914a0d3c-9db4-56f8-a8ac-65f4b7ea8b09
    {"command":{"action":"newTab","profile":"{914a0d3c-9db4-56f8-a8ac-65f4b7ea8b09}"},"keys":"ctrl+shift+2"},
    {"command":{"action":"newWindow","profile":"{914a0d3c-9db4-56f8-a8ac-65f4b7ea8b09}"},"keys":"ctrl+alt+shift+2"},
    // openSUSE-Leap-15.[3]   68977c03-3495-5837-90fe-335df5b0e063
    {"command":{"action":"newTab","profile":"{68977c03-3495-5837-90fe-335df5b0e063}"},"keys":"ctrl+shift+3"},
    {"command":{"action":"newWindow","profile":"{68977c03-3495-5837-90fe-335df5b0e063}"},"keys":"ctrl+alt+shift+3"},
    // openSUSE-[4]2  b2d6503a-d0e6-5c93-b063-25b165a68977
    {"command":{"action":"newTab","profile":"{b2d6503a-d0e6-5c93-b063-25b165a68977}"},"keys":"ctrl+shift+4"},
    {"command":{"action":"newWindow","profile":"{b2d6503a-d0e6-5c93-b063-25b165a68977}"},"keys":"ctrl+alt+shift+4"},
    // Ubuntu 1[6].04 LTS 6f9994f0-4403-5e85-9cce-98e5da3839bb
    {"command":{"action":"newTab","profile":"{6f9994f0-4403-5e85-9cce-98e5da3839bb}"},"keys":"ctrl+shift+6"},
    {"command":{"action":"newWindow","profile":"{6f9994f0-4403-5e85-9cce-98e5da3839bb}"},"keys":"ctrl+alt+shift+6"},
    // PowerShell [7] 574e775e-4f2a-5b96-ac1e-a2962a402336
    {"command":{"action":"newTab","profile":"{574e775e-4f2a-5b96-ac1e-a2962a402336}"},"keys":"ctrl+shift+7"},
    {"command":{"action":"newWindow","profile":"{574e775e-4f2a-5b96-ac1e-a2962a402336}"},"keys":"ctrl+alt+shift+7"},
    // Ubuntu 1[8].04 LTS c6eaf9f4-32a7-5fdc-b5cf-066e8a4b1e40
    {"command":{"action":"newTab","profile":"{c6eaf9f4-32a7-5fdc-b5cf-066e8a4b1e40}"},"keys":"ctrl+shift+8"},
    {"command":{"action":"newWindow","profile":"{c6eaf9f4-32a7-5fdc-b5cf-066e8a4b1e40}"},"keys":"ctrl+alt+shift+8"},
    // [A]lpine Linux 1777cdf0-b2c4-5a63-a204-eb60f349ea7c
    {"command":{"action":"newTab","profile":"{1777cdf0-b2c4-5a63-a204-eb60f349ea7c}"},"keys":"ctrl+shift+a"},
    {"command":{"action":"newWindow","profile":"{1777cdf0-b2c4-5a63-a204-eb60f349ea7c}"},"keys":"ctrl+alt+shift+a"},
    //[D]ebian    58ad8b0c-3ef8-5f4d-bc6f-13e4c00f2530
    {"command":{"action":"newTab","profile":"{58ad8b0c-3ef8-5f4d-bc6f-13e4c00f2530}"},"keys":"ctrl+shift+d"},
    {"command":{"action":"newWindow","profile":"{58ad8b0c-3ef8-5f4d-bc6f-13e4c00f2530}"},"keys":"ctrl+alt+shift+d"},
    // [k]ali-linux   46ca431a-3a87-5fb3-83cd-11ececc031d2
    {"command":{"action":"newTab","profile":"{46ca431a-3a87-5fb3-83cd-11ececc031d2}"},"keys":"ctrl+shift+k"},
    {"command":{"action":"newWindow","profile":"{46ca431a-3a87-5fb3-83cd-11ececc031d2}"},"keys":"ctrl+alt+shift+k"},
    // [c]md.exe "0caa0dad-35be-5f56-a8ff-afceeeaa6101
    {"command":{"action":"newTab","profile":"{0caa0dad-35be-5f56-a8ff-afceeeaa6101}"},"keys":"ctrl+shift+c"},
    {"command":{"action":"newWindow","profile":"{0caa0dad-35be-5f56-a8ff-afceeeaa6101}"},"keys":"ctrl+alt+shift+c"},
    // Windows Power[S]hell   61c54bbd-c2c6-5271-96e7-009a87ff44bf
    {"command":{"action":"newTab","profile":"{61c54bbd-c2c6-5271-96e7-009a87ff44bf}"},"keys":"ctrl+shift+s"},
    {"command":{"action":"newWindow","profile":"{61c54bbd-c2c6-5271-96e7-009a87ff44bf}"},"keys":"ctrl+alt+shift+s"},
    // [U]buntu   2c4de342-38b7-51cf-b940-2309a097f518
    {"command":{"action":"newTab","profile":"{2c4de342-38b7-51cf-b940-2309a097f518}"},"keys":"ctrl+shift+u"},
    {"command":{"action":"newWindow","profile":"{2c4de342-38b7-51cf-b940-2309a097f518}"},"keys":"ctrl+alt+shift+u"},
    // split pane
    {"command":{"action":"splitPane","split":"auto","splitMode":"duplicate"},"keys":"alt+shift+d"},
    {"command":{"action":"splitPane","split":"horizontal","splitMode":"duplicate"},"keys":"alt+shift+-"},
    {"command":{"action":"splitPane","split":"vertical","splitMode":"duplicate"},"keys":"alt+shift+plus"},
    // moveTab
    {"command":{"action":"moveTab","direction":"forward"},"keys":"ctrl+alt+shift+right"},
    {"command":{"action":"moveTab","direction":"backward"},"keys":"ctrl+alt+shift+left"},
    // switchToTab
    {"command":{"action":"switchToTab","index":9},"keys":"ctrl+alt+9"},
    {"command":{"action":"switchToTab","index":4294967295},"keys":"ctrl+alt+0"},
    // etc
    {"command":"openTabColorPicker","keys":"alt+shift+o"},
    {"command":"toggleReadOnlyMode","keys":"alt+shift+r"},
    {"command":"identifyWindows","keys":"alt+shift+w"},
    // PaneZoom
    {"command":"togglePaneZoom","keys":"alt+shift+z"},
    // Font
    {"command":{"action":"adjustFontSize","delta":5},"keys":"ctrl+shift+plus"},
    {"command":{"action":"adjustFontSize","delta":-5},"keys":"ctrl+shift+minus"},
    // copy
    {"command": {"action":"copy","singleLine":false},"keys":"alt+shift+c"},
    {"command": "paste","keys":"alt+shift+v"},
    {"command":"unbound","keys":"ctrl+shift+v"},
    // Reserve 
    {"command":"unbound","keys":"ctrl+shift+t"},
    {"command":"unbound","keys":"ctrl+shift+f"},
    //new window newWindow
    {"command":"unbound","keys":"ctrl+shift+n"},
    // for V1.12
    {"command":"openSystemMenu","keys":"alt+shift+ "},
    // New Window...
    {"name":"New Window...","commands":
        [ 
            {
             "iterateOn":"profiles",
            "icon":"${profile.icon}",
            "name":"${profile.name}",
            "command":{
                "action":"newWindow",
                "profile":"${profile.name}" 
                }
            }
        ] 
    },
    // This is Last action. No comma at end of line.
    {"command":null}

settings.jsonは、(図01)のような構造になっている。図は、注釈行を省き、意味を変えない範囲で修正してある。なお、Windows Terminal V1.11以前から利用していると、過去に使われていた設定が残っていることがある。

  • 図01: settings.jsonファイルは、以下のような構造になっていて、"actions"でキー割り当てを行う

まずは、Windows Terminalを起動し、ctrl+shift+,でsettings.jsonを編集状態にしよう。JSONに対応したエディタなどがインストールされていなければ、メモ帳が開くはずだ。

作業しては、"actions"に続く角括弧("["と"]")で囲まれた部分をリスト01に差し替える。もし、キー割り当てを自分で行っていないなら、入っているキー割り当て定義は削除してかまわない。もし、すでにキー割り当てを行っているなら割り当てが衝突しないようにリストを修正する。

メモ帳の検索機能などを使い、"actions"を探し、角括弧で囲まれた部分を探す(写真05)。すぐ下に開き角括弧があるはずだ。開き角括弧と閉じ角括弧の間のテキストを選択(写真06)し、これを削除する(写真07)。この角括弧の間にリスト01を貼り付け(写真08)、最後にCtrl+Sで上書き保存すれば、作業は終了である。キー割り当ては、すぐに反映される。

  • 写真05: JSONファイルを編集するプログラムが何も指定されていない場合、Windows Terminalのctrl+shift+,(あるいはGUI設定の「JSONファイルを開く」では、メモ帳が起動する。まずは、検索機能で"actions"というキーワードを探す

  • 写真06: "actions"に続く開き角括弧"["と閉じ角括弧"]"の間が標準のキー定義になっている。ここを選択して削除する

  • 写真07: 標準のキー定義を削除したら、開き角括弧"["と閉じ角括弧"]"の間にカーソルを置き、リスト01を貼り付ける

  • 写真08: リスト01を貼り付けたら、ctrl+sまたはファイルメニューの「上書き保存」でsettings.jsonファイルを保存する

なお、settings.jsonは、一回Windows TerminalのGUI設定で保存を行うと、その時点で内部に記録された設定データから再構築されたJSONになり、編集したものと改行位置や注釈などが変更され、エラーにならない無効項目などは消えてしまう(リスト01末尾の“{"command":null}”など)。もし、自分である程度のカスタマイズがしたいなら、settings.jsonを修正したあと保存してWindows Terminalに反映させたあと、別ファイルとして保存しておくといいだろう。

Windows Terminalを標準コンソールとして設定し、キー割り当てを変更しておくと、コンソールでの作業が格段にラクになる。日常的に管理業務などでコンソールの利用が多いのなら、設定しておいてソンはないはずだ。