コマンドラインによるユーザーインターフェースのいいところは、SSHなどで簡単にリモート接続してコンピューターの操作ができるところにある。そのためには、「良い」端末エミュレーターが必要なのだが、Windowsには長らくこれが欠けていた。しかし、オープンソースとして昨年から安定版の配布が開始されたWindows Terminalは比較的できがよく筆者も愛用している。
Windows Terminalに限らず、こうした端末エミュレーターの多くは、さまざまな機能を搭載しており、その機能をキーボードから実行できるようにキー割り当てが可能になっているものが多い。しかし、そのためには、Windows Terminalなどの端末エミュレーターが接続する「シェル」のキー割り当てを知らなければならない。本記事では、そのための方法を解説したい。
シェルごとの調査方法
ここでは、WindowsとLinux、そしてAndroidの3プラットフォームの4つのシェルを対象とした。まずは、Linux(WSLやChromebookのcrostiniを含む)だが、基本的にはシェルとしてのbashと端末デバイスの制御について調べる必要がある。前者は、bashの組み込みコマンドbindを使い、後者にはsttyを使う。
まずシェルの確認方法だが、Linux上ではコマンドラインで「echo $0」を実行することで、実行ファイル名が得られる。これを元に「--version」などのオプションを使う。
bashなど多くのシェルでは、Readlineと呼ばれるモジュールを使って、入力行の編集を行う。bashが使うキー割り当てとはほぼReadlineのキー割り当てである。Readlineの割り当ては、bashの組み込みコマンドであるbindを使う(詳細はbashのmanを参照してほしい)。“bind -p”で割り当てを出力するが、そのままでは、少しわかりにくい。このため、不要行を削り、キーの表記を見やすくするために以下のようなコマンドを使った(写真01)。
bind -p | grep -v ': self-insert' | grep -v '(not bound)' | awk '{ gsub(/\\C/,"[Ctrl]"); gsub(/\\e/,"[Esc]"); print }' | sort
なお、Readlineは、あらかじめ定義されたキーバインディングとして「emacs風」や「vi風」などが用意されていて、ユーザーがこれを切り替えることが可能であるため、設定などにより結果に違いがあるが、ここではデフォルトのemacsバインディングを調べた。
もう1つのsttyだが、こちら“stty -a”で現在の設定値を出力する。ここで「intr = ^C」などとなっている部分が端末側で処理されるキーだ。こちらも、ちょっと見にくいので、以下のコマンドを使った(写真02)。
stty -a | tr ';' '\n' | grep '= [^0-9]' |awk '{gsub(/\^/,"[Ctrl]-");print }'| tr -d ' '
結論として、bashは、Altキーの組み合わせを利用していない。基本的にはCtrlキー単独と文字キーの組み合わせだが、Ctrl+Shiftの組み合わせは、Ctrl+Shift+/(Ctrl+?)のみ利用する。
Androidのシェル
さて、AndroidはLinuxカーネルを使って作られていて、内部に専用のシェルを持っている(俗にADB Shellなどと呼ばれる)。Android(Ver.10)のシェルは、mksh(MirBSD Korn Shell)である。ただしmkshは、「--version」オプションがない。コマンドラインから「echo $KSH_VERSION」を実行すればバージョンを見ることができる。
mkshは、オプションなどは違うもののbindコマンドを持つ。bash同様にemacs、viバインディングなどが用意されていて、set -oで設定状態を見ることができる。mkshでは、bindの出力形式がbashとは違う。以下のコマンドを使った(写真03)。
bind | awk '{gsub(/\^\[/,"[ESC]"); sub(/\^/,"[Ctrl]-"); print }'
同様にsttyコマンドもある。キー割り当ての表示には、Linux環境と同じものが利用できる。
結論としては、bashと同じで修飾キーとして使われているのはCtrlのみだが、Ctrl+?のみ実際には、Ctrl+Shift+/を使う。
Windowsのシェル
Windowsのコマンドラインでは、cmd.exeとPowerShellが利用できる。PowerShellには、Windowsにバンドルされている「Windows PowerShell」と、過去にPowerShell Coreと呼ばれていた「PowerShell」の2つがある。どちらもPSReadlineというモジュールが入力編集などを行う。そのキー割り当ては、「Get-PSReadLineKeyHandler」で見ることができる(写真04)。割り当てだけを調べるのであれば、
Get-PSReadLineKeyHandler | Select-Object key,function
とする。結論としては、PowerShellは、Ctrlキー以外にAltキーの組み合わせを利用している。ただし、Altキーは、数字キーと「?.-」、F7キーのみ、Ctrl+Shiftは、カーソルキーとEnterキーの組み合わせに限られる。
さて、残ったのはcmd.exeだが、cmd.exeには、編集などに使うキーを表示、変更する機能はない。(表01)が筆者が調べた範囲での特殊キー割り当てである。ただし、ここにはファンクションキー単独打鍵による機能などは、端末エミュレーターのキー割り当てにはそもそも使わないため省いてある。結論としては、Ctrl、Ctrl+Shiftを修飾キーとする一部のキーが使われているのみで、Altキーを修飾キーとする組み合わせは使われていない。
■表01 | |
編集キー | 機能 |
---|---|
Ctrl+A | すべて選択(Ctrl+M範囲選択時) |
Ctrl+C | ブレーク(通常時)、コピー(Ctrl+M範囲選択時) |
Ctrl+F | 検索 |
Ctrl+I、[TAB] | 標準のパス、ファイル名の補完文字(レジストリ設定) |
Ctrl+M | マーク(選択) |
Ctrl+V | 貼り付け |
Ctrl-End | カーソル位置から行末までを削除 |
Ctrl-Home | 行の先頭からカーソル位置までを削除 |
Ctrl-← | 語単位でカーソルを右へ移動 |
Ctrl-→ | 語単位でカーソルを左へ移動 |
Ctrl+Shift+C | コピー(プロパティ設定) |
Ctrl+Shift+V | 貼り付け(プロパティ設定) |
今回の結論から、端末エミュレータでは、Alt+文字、Alt+Shift+文字、Ctrl+Alt+文字、およびAlt+Ctrlを修飾キーとする組み合わせが利用できそうだ(表02)。ただ、日本語環境の場合、環境やIME設定に依存する日本語入力IMEのオンオフコマンドや、IMEが起動中に使うキー割り当てもあることに注意されたい。
■表02 | ||||||
プラットフォーム | Ctrl | Ctrl+Shift | Ctrl+Alt | Ctrl+Alt+Shift | Alt | Alt+Shift |
---|---|---|---|---|---|---|
Linux/ bash/ Emacsバインディング |
× | Ctrl+Shift+/ | ○ | ○ | ○ | ○ |
Android/ mksh/ Emacsバインディング |
× | Ctrl+Shift+/ | ○ | ○ | ○ | ○ |
Windows/ PowerShell/ PSReadline |
× | △ | *1 |
Ctrl+Alt+Shift+/ | △ | Alt+Shift+/ |
Windows/ cmd.exe |
△ | C,V | ○ | ○ | ○ | ○ |
*1:コマンドの出力は「Ctrl+Alt+?」だが、押すキーは「Ctrl+Alt+Shift+/」である |