PowerShellのTab補完をbashのようにする


このエントリーをはてなブックマークに追加

Windows PowerShell (この記事の執筆時点でバージョンは5.1) でTabキーを押したときの補完方法をbashのようにする方法について調べました。

デフォルトでの補完方法

まず、デフォルトでのWindows PowerShellの補完方法について説明します。例として、20210101.txt, 20210103.txtという2つのファイルがあるディレクトリでWindows PowerShellのシェルを開いている場合を考えます。

Tabによる補完

1つ目の補完はTabを使う方法です。Windows PowerShell2を押したあとにTabを押すと

> .\20210101.txt

と表示され、さらにもう一度Tabを押すと

> .\20210103.txt

が表示されます。これは伝統的なコマンドプロンプトの補完方法と同じです。

Ctrl + Spaceによる補完

2つ目の補完方法はCtrl + Spaceを使う方法です。Windows PowerShell2を押したあとにCtrl + Spaceを押すと、2つのファイル名の共通prefixである2021010の部分までが確定して、かつ、1個目の候補である20210101.txtの残り部分 (1.txt) が選択済である状態になります(言葉で説明しづらいので実際に試してみてください)。

Windows PowerShellの補完方法がどうなっているかを調べるにはGet-PSReadLineKeyHandlerというコマンドレットを使います。デフォルト設定では以下でした。

コンプリート機能
========

Key        Function            Description
---        --------            -----------
Ctrl+Space MenuComplete        入力候補が 1 つだけ存在する場合は、その候補で入力を補完します。それ以外の場合は、入力候
                               補のメニューから項目を選択して入力を補完します。
Tab        TabCompleteNext     次の入力候補を使用して入力を補完します
Shift+Tab  TabCompletePrevious 前の入力候補を使用して入力を補完します

Tabによる補完方法を変える

デフォルトのTabの補完方法は耐え難いものがあるので、Tabbashzshのような補完ができるように変更します。その方法が PowerShellでbash-like, zsh-likeなタブ補完 - Qiita に書いてありました。

bash風の補完

> Set-PSReadLineKeyHandler -Key Tab -Function Complete

zsh風の補完(デフォルトでCtrl+Spaceによりなされる補完と同じ)

> Set-PSReadLineKeyHandler -Key Tab -Function MenuComplete

ただし、この設定はWindows Powershellのウィンドウを閉じると消えてしまいます。恒久的にこの設定を有効にしたければ、プロファイル(.bash_profile的な設定ファイル)を編集する必要があります。プロファイルは何個も種類があって正直よくわかってないですが、私は$PROFILE.CurrentUserAllHosts

Set-PSReadLineKeyHandler -Key Tab -Function Complete

を設定しておきました。