前回、Windowsのコマンドラインにおけるヒストリやエイリアスを扱ったので(「Windowsでのコマンドラインのヒストリ機能」)、今回はコマンドラインの補完機能について解説する。
「補完」とは、ユーザーがコマンドラインを入力するとき、入力した文字から対象のコマンドやパラメーター、オプションなどを推測して入力を手助けする機能だ。コマンドライン補完を使うことで、入力が効率化(打鍵数の削減)、タイプミスの防止、コマンドの習得支援(コマンドに対して利用可能なオプションやパラメーターのみが補完される)などのメリットがある。
テレビや映画で“ハッカー”とされる役割の人は、キーボードをやたらとガチャガチャ打っているが、一般にコマンドラインを使う人は補完機能を多用することが多いため、数文字打ってはタブキーで補完を繰り返してEnterキーの繰り返しで、結果として打鍵音はもっとリズミカルになる。
補完機能は、BSD Unix(2BSD)に搭載されたcsh(C shell、1978年)に最初に搭載されたという。cshでは、コマンドのパラメータとなるパスの末尾部分の候補を補完機能で提示することができた。
その後、Windowsに搭載されたcmd.exeにもパスの補完機能が搭載された。UNIXのシェルの流れを汲むWSLのbashは、補完機能をもちろん持っており、PowerShellにも補完機能がある。なお、bashの補完機能に関してはあらためて解説することにして、今回は、cmd.exeとPowerShell、Windows PowerShellの補完機能に関して解説する。
また、履歴や補完の機能でもエスケープシーケンスを利用するため、PowerShellはWindowsターミナル内で実行していただきたい。
cmd.exeの補完機能
cmd.exeの補完機能は、パスのファイルまたはディレクトリ(フォルダ)の補完をする。標準では、どちらにもタブキー(0x09)が割り当てられているが、レジストリ設定で、ファイル/ディレクトリの補完とディレクトリのみの補完に別のキーを割り当てられり。
どちらも、パスが未入力の場合には、カレントディレクトリのファイル、ディレクトリをアルファベット順に提示する。このときシフトキーを併用すると逆順に表示する。
パスの一部が入力されている状態では、先頭部分がその入力に一致するファイルパス、ディレクトリパスの補完がなされる。たとえば、「C:\Win」と入力したとき、タブキーで「C:\Windows」が補完される(ただし、Cドライブの状態に依存)。
補完機能は、cmd.exeの起動オプション「/F:ON」「/F:OFF」で有効・無効を切り替え可能。標準でONなので、通常は設定する必要はない。
また、補完に利用するキーは、以下のレジストリ値で変更できる。
キー:HKEY_CURRENT_USER\Software\Microsoft\Command Processor
機能:ファイルとディレクトリの補完
名前:CompletionChar
値:割り当てるキーの制御コード(Ctrl+Fなら0x06)
既定値:0x09(Tabキー)
機能:ディレクトリのみの補完
名前:PathCompletionChar
値:割り当てるキーの制御コード(Ctrl+Dなら0x04)
既定値:0x09(Tabキー)
PowerShellの補完機能
PowerShellの補完機能は、標準搭載のPSReadLineモジュールが担当している。補完機能に関しては、PSReadLineのバージョンにより違いがある。現状、Windows PowerShell Ver.5.1には、PSReadLine Ver.2.0.0、PowerShell Ver.7.5.0は、PSReadLine Ver.2.3.6である。
まず、Windows PowerShellやPowerShellの標準状態では、ユーザーが入力した文字列をコマンド先頭文字列として、候補を表示するだけだ。
Ver.2.2.0では、履歴から過去に入力したコマンドラインのうち、先頭部分が一致するものが、引数とともに表示されるようになる。このときに、右矢印キーで提案されたコマンドラインを選択し、タブキーではコマンド部分を選択する。
さらにVer.2.2.0では、ユーザーが補完候補を提案するプログラムを組み込めるようになった。この機能をPSReadLineでは、「CommandPrediction PlugIn」と呼ぶ。ただし、1つしかないのでMicrosoftのドキュメントではPlugInと表記する場合がある。
このため、PowerShell 7.5では、Set-PSReadLineOptionでの2つの設定ができる。
1つは、補完候補選択の判断に使うソース(ヒストリまたはプラグインあるいは両方、あるいはなし)を指定するもの。もう1つは、候補の表示方法(入力行か、入力行下にメニューを表示するか)である。「-PredictionViewStyle」による表示方法は、「PredictionSource」の指定によっても異なる。
PowerShellの補完関数は複数あり、EditModeの設定などで割り当てが異なる。
「TabCompleteNext」「TabCompletePrevious」は、候補を表示し、キーの連打で候補を切り替えていく。これに対して「Complete」は、複数の候補の最も長い共通部分までを表示して補完を止める(bashの補完に似た動作)。また、「PossibleCompletions」は、補完候補を列挙し、入力中のコマンドラインに戻る。
EditModeにより、これらのキーの割り当てが異なり、すべての補完関数にキーが割り当てられてはいない。必要に応じてキーを割り当て直すといいだろう。割り当てで使うSet-PSReadLineKeyHandlerの具体的な使い方については、前回の記事を参照してほしい。
補完候補をリスト表示する場合、3つの方法がある。1つは、Set-PSReadLineOptionの「-PredictionViewStyle」で、「ListView」を選択した場合だ。ここで「InlineView」を選択しても、「F2」キー(SwitchPredictionView、すべてのEditModeに割り当て済み)でListViewに切り替えることができる。もう1つは、「MenuComplete」をキーに割り当てて実行した場合だ。
ListViewとMenuCompleteは、どちらもリスト表示で、矢印キーで候補を選択できるが、表示方法が異なる。
ListView表示とMenuComplete表示。ListView表示は、補完候補を行単位で表示する。これに対して、MenuCompleteは、補完候補を横・縦に並べる。どちらも矢印キーで候補を選択できる
ListViewは、1行1件で、右端にソースを表示する。これに対して、MenuCompleteは、候補を縦横に並べ、選択すると、コマンドのオプションやパラメータ、.NETクラスのメソッドの引数など(ToolTipsと呼ばれる)を表示する。
たとえば、「[convert]::」と入力してMenuComplete(Windows、EmacsモードではCtrl+Space、IMEのキー割り当てなどとの衝突に注意)を実行すると、.NETの「System.Convert」クラスの静的メソッドの一覧が表示され、カーソルキーで選択すると、呼び出しパラメータの概要がToolTipsとして表示される。
これを使えば、.NETクラスのドキュメントを開かなくとも使い方の概要を知ることが可能だ。ただし、ToolTipsが複数行にまたがる場合、入力ラインの下の空きが小さいとToolTipsが表示されないことがある。
こうした問題を解決する方法としてPowerShell Galleryからプラグインである「CompletionPredictor」(https://www.powershellgallery.com/packages/CompletionPredictor/0.1.1)をインストールし、ListViewに補完候補を表示させる方法がある。
CompletionPredictorモジュールを入れないと、ListViewでは、ヒストリからの候補しか表示されない(ただし文字が一致すれば、プロパティなどの補完は可能)。CompletionPredictorを導入すると、対象オブジェクトのプロパティなども補完候補としてリストに表示される
具体的には、
Install-Module -Name CompletionPredictor -Repository PSGallery -force
としてモジュールをインストールし、PowerShellの起動ごとに
Import-Module -Name CompletionPredictor
を実行する(プロファイルで実行する)。
ListViewでは、ToolTipsの表示行数が限られている。F4キー(すべてのEditModeで共通)を押すことで、VTエスケープシーケンスのAlternate Screen Bufferを使って、ToolTipsを完全に表示させることができる。
補完は、動作を理解すれば、入力を効率的にできる。また、ユーザー定義の関数やコマンドの引数に関しては、ユーザーがカスタム補完方法を定義することも可能だ。こちらについては別途解説したい。
この連載の記事
-
第481回
PC
Windows 11にそろそろ聞こえる25H2の声 -
第480回
PC
PowerShellが使う色を変更する -
第479回
PC
Copilot+ PCで利用できる「Windows Copilot Runtime」を試す ローカル推論用モデル「Phi Silica」とは? -
第478回
PC
Copilot+ PCでNPUを使ってローカル推論 「Windows Copilot Runtime」を試す -
第477回
PC
Windowsで2つの文字列を同時に含むテキストファイルを探す方法を考える -
第476回
PC
さらばSkype! Windows&MSのコミュニケーションアプリの30年 -
第474回
PC
Windowsでのコマンドラインのヒストリ機能 -
第473回
PC
Windowsは内部的にどうやってインターネットへの接続状態を確認している? -
第472回
PC
WindowsのエラーをMicrosoftに送信するテレメトリ機能を理解する -
第471回
PC
Windowsのコマンドラインでエイリアスを使う - この連載の一覧へ