コマンドラインによるユーザーインターフェースのいいところは、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
  • 写真01: bashのキー割り当ては、bindで表示できる。ただし、表記が少しわかりずらいので、コマンドで整形したものが右側のもの

なお、Readlineは、あらかじめ定義されたキーバインディングとして「emacs風」や「vi風」などが用意されていて、ユーザーがこれを切り替えることが可能であるため、設定などにより結果に違いがあるが、ここではデフォルトのemacsバインディングを調べた。

もう1つのsttyだが、こちら“stty -a”で現在の設定値を出力する。ここで「intr = ^C」などとなっている部分が端末側で処理されるキーだ。こちらも、ちょっと見にくいので、以下のコマンドを使った(写真02)。

stty -a | tr ';' '\n' | grep '= [^0-9]'  |awk '{gsub(/\^/,"[Ctrl]-");print }'| tr -d ' '
  • 写真02: 端末側で処理される文字コードはsttyで表示できる。こちらもちょっと加工してみやすくした

結論として、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 }'
  • 写真03: Androidが内蔵するシェルは、mkshでbindコマンドで表示が可能。bashとはまた表現形式が違う

同様に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キーの組み合わせに限られる。

  • 写真04: PowerShell、Windows PowerShellでは、“Get-PSReadLineKeyHandler”で編集キーなどを表示できる。写真にあるようにコマンド出力をOut-GridViewにするとGUIウィンドウに表示が出る(コマンドはタイトルバーに表示されている)

さて、残ったのは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+/」である
※キーの組み合わせのみの欄は該当キーのみが利用されている。それ以外の記述がある欄では複数キーが利用されている
×:大部分を利用
△:一部を利用
○:未使用