PowerShellのtab補完の挙動を変更する

PowerShell使うと毎回気になるのがTabで補完すると

1PS > .\hoge.txt

先頭に「.\」が自動で付与される挙動が微妙に気になっていたので,手を入れてみました.

環境

  • Windows 10 Home Edition
  • PowerShell
 1PS > $PSVersionTable
 2
 3Name                           Value
 4----                           -----
 5PSVersion                      5.1.17134.407
 6PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
 7BuildVersion                   10.0.17134.407
 8CLRVersion                     4.0.30319.42000
 9WSManStackVersion              3.0
10PSRemotingProtocolVersion      2.3
11SerializationVersion           1.1.0.1

Tabに割り当てられているFunctionを探す

tabという名称の付いたFunctionを探します.

1PS > ls function:*tab*
2CommandType     Name                                               Version    Source
3-----------     ----                                               -------    ------
4Function        TabExpansion2

ソースコードの取得と書き出し

これのソースコードを取得します.

1PS > (Get-Command 'TabExpansion2').ScriptBlock
2もしくは
3PS > $function:tabexpansion2

で標準出力で確認出来るのでこれを適当なところにリダイレクトします.

1PS > $function:tabexpansion2 > /path/to/tab.ps1

あとはこれをISEなどで自分好みに加工します.
最後に任意のprofile.ps1に先程の関数名で作成したものを上書き定義して終わりです.

1Function TabExpansion2 {
2 ...
3}

実行時の問題

PowerShellはデフォルトだと同じ階層にあるプログラムを実行する際は

1PS > .\hoge.exe

のようにする必要がありますが,Pathに「.」を追加することで「.\」がなくとも実行可能になります.

1PS > $env:path ="$($env:path);."

追記:検索し過ぎて混乱してこれも入れてましたが,よく考えたらbashもこの挙動なのでこれに関しては要らないですね.

成果物

こんな感じになったのでユーザーディレクトリ/Document/WindowsPowerShell/profile.ps1として置いておけば当該ユーザーのデフォルトプロファイルとして利用できます.

参考記事