このページの本文へ

前へ 1 2 次へ

Windows Info 第229回

Windows Terminalのカスタマイズを研究【キーボード編】

2020年06月21日 10時00分更新

文● 塩田紳二 編集● ASCII

  • この記事をはてなブックマークに追加
  • 本文印刷

Windows Terminalと同時に開発されたカラーパレット表示ツールを使って、カラースキーマを変更したところ

 正式版のv1.0が登場したWindows Terminalだが、19日にはPreview版でv1.1.1671.0が公開されたようである。このバージョンでは、キーボード関連の修正もあったようで、シェルのキーボードショートカットに問題を感じているようなら、プレビュー版をgithubからダウンロードしてインストールしてみるのもいいかもしれない。

 さて、今回は前回(「正式版が登場したWindows Terminalをカスタマイズする」)の続きで、Windows Terminalのキー割り当て、カラースキーマについて解説する。

 なお、ここでは、一連のキー入力を「キーストローク」と呼ぶ。キーストロークは、これを処理するプログラムが解釈してはじめて意味を持ち、文字入力となったり、機能の実行(たとえば、Backspaceキーで1文字削除)となる。ここでは、キー入力を解釈したプログラムがなんらかの機能を実行するキーストロークを「キーボードショートカット」と呼び、通常の文字入力とは区別する。ただし、何をキーボードショートカットとして処理するのかはプログラム次第である。

Windows Terminalとキー入力

 Windows Terminalでは、新規タブやペイン分割などの機能にキーボードを割り当て、これにより機能を実行させている。Windows Terminalのほとんどの機能にキーが割り当てられている。

 基本的な割り当ては、Windows Terminalのデフォルト値で割り当てがなされており、これをsettings.jsonで上書きすることが可能だ。逆に言えば、デフォルトの割り当てのままでよければ、settings.jsonには何も記述する必要がない。また、キー割り当てを含むデフォルト値は、defaults.jsonに記述がある。

 Windows Terminalが動作しているときのキーストロークの処理を大まかに図示すると、以下の図のようになる(WindowsTerminalを含むアプリケーションは、Windowsのキー処理を制御するAPIを利用できるため、本当はもっと複雑)。

ユーザーが入力したキーストロークは、Windows、Windows Terminalでの処理を経て、シェルに送られる。実際には、Windowsはキー入力制御のAPIがあり、アプリ側からの制御が可能であり、Windows TerminalもVTエスケープシーケンスでキー入力の制御をシェル側からできるため、このように単純ではない

 ユーザーのキー入力は、Windowsが受け、まずは、Windowsのキーボードショートカット(たとえば「Win+S」など)が処理される。また、一部の常駐プログラム(たとえばPowerToys)などは、Windowsのファンクションを使い、ユーザーからのキー入力を横取りし、必要なものだけを処理する。

 あるいは、日本語入力などのIMEは起動しているときにキーストロークを受け取って処理をすることがある。こうして処理されたキーストロークは、その時点で消えてしまい、Windows Terminalには渡らない(ただし、処理したプログラムが代わりのキーストロークを送ることがある)。

 Windows Terminalは、受け取ったキーストロークから自身のキーボードショートカットを処理する。たとえば、「Ctrl+Shift+1」は、デフォルトプロファイルで新規タブを作成する。Windows Terminalが処理しなかったキーストロークだけがタブやペイン内で実行されている「シェル」(コンソールプログラム)に渡される。

 シェルには、自身で処理するキーストロークがある。たとえば、cmd.exeは、左右のカーソルキーで入力行でカーソルを動かし、上下のカーソルキーでヒストリー(入力履歴)を表示する。F7キーを押すとヒストリーをポップアップウィンドウに表示する。

 注意してほしいのは、コマンドプロンプトウィンドウ(cmd.exeがconhost.exeの中で動作しているとき)のクリップボード操作(Ctrl+C、Ctrl+V、Ctrl+X)、検索機能(Ctrl+F)は、conhost.exeが処理しており、cmd.exeは関わっていない点だ。つまり、これらの機能を持つキーは、cmd.exeが実現している機能ではないのだ。cmd.exeはCtrl+Cをプログラム中断という意味でしか処理しない。

 同様にPowerShellやWSLのbashには、readlineと呼ばれるモジュールがシェルとともに動作しており、これが入力時の編集機能のキー割り当てなどを制御している。また、どのシェルでも、スクリーンエディタが動作すると、キーストロークはスクリーンエディタがすべて処理するようになる。たとえば、emacsを起動すれば、emacsのキー割り当てでキーストロークが処理される。

 この構造の中では、Windows Terminalとシェルのキー割り当てをお互いに一致させないようにすることが重要だ。しかし、どちらもユーザーが自分で割り当て可能であり、一致しないようにするのはユーザーの責任においてなされることになる。ただし、Windows Terminalでは、Ctrlキーを単独で併用するキー割り当てはごく少ないため、シェル側でその大部分が利用できる。

 Windows Terminalのキー割り当ては、以下の表のようになっている。これと利用するシェルで割り当てたキーボードショートカットを一致させないようにする。となると問題は、各シェルでのキーボードショートカットがどうなっているかである。

 まず、cmd.exeの場合には、コマンドとして表示させる機能がない。筆者が調べた範囲では、以下の表のようなキーボードショートカットが使われているようだ。前述のようにこの表には、Ctrl+Fのようなconhost.exeが処理するキーストロークは含まれていない。

 次にWSLのbashだが、こちらは、ユーザーがキーボードショートカットを自由に定義できるようになっている。自由とは言っても、文字入力などもあるので「不便にならない」割り当てというものがある。この処理をするモジュールはreadlineと呼ばれ、bindコマンドでキー割り当てを表示させることが可能だ。単に割り当てを表示させるなら

bind -p

だけでいいが、見やすい形式に変換するなら、

bind -p | grep -v -P '(not bound)|(self-insert)|(do-lowercase-version)' | sed -e 's/¥¥C-/[Ctrl]-/g' | sed -e 's/¥¥e/[ESC]-/g' | sort -f

などとして、見やすい形式に変換するといいだろう。Ubuntu-18.04でのデフォルト割り当ては、Ctrl+文字であり、Windows Terminalとの基本的な衝突はなさそうである。

 PowerShell(Windows組み込み版とCoreのどちらも)にも、readlineが組み込まれており、Get-PSReadLineKeyHandlerでキー割り当てを表示させることが可能だ。こちらも単独のコマンドで

Get-PSReadLineKeyHandler

とすれば、割り当てを見ることができるが、割り当てのあるキーのみを表示したいなら

Get-PSReadLineKeyHandler -Bound | Sort-Object key | Format-Table key,function

とするのがいいだろう。PowerShell Ver.7.1.0-preview.3での割り当ては、Alt+文字、またはCtrl+文字/機能キー、Ctrl+Shift+機能キーなどだ。こちらも標準では、Windows Terminalとの衝突はなさそうだ。

 こうして、シェル側のキーボードショートカットを調べ、もし衝突していることが判明したら、Windows Terminalかシェル側のキーボードショートカットのどちらかの割り当てを変える。

 一般的には、シェル側のキーボードショートカットは、長い時間をかけて環境に適合してきたのものなので、システムに熟知してないと、簡単に変えにくい。なので、原則的には新参者となるWindows Terminalの設定を変更したほうがいいだろう。

 変更は、defaults.jsonから該当するキー割り当ての行をコピーしてきて、settings.jsonで再度定義する。キー割り当てを解除して、Windows Terminalで処理を行わない場合には、unbindコマンドを使い

{ "command": "unbind", "keys": キーコンビネーション },
※キーコンビネーションは、キー割り当てを示す。例:"ctrl+shift+0"など

とする。あるいは、キーコンビネーションを書き換えて別の割り当てをしてもいい。

前へ 1 2 次へ

カテゴリートップへ

この連載の記事

注目ニュース

ASCII倶楽部

プレミアムPC試用レポート

ピックアップ

ASCII.jp RSS2.0 配信中

ASCII.jpメール デジタルMac/iPodマガジン