2019-02-04

Register-ArgumentCompleter

まだoutputが習慣化してなくて随分空いてしまった🤔

Register-ArgumentCompleter

PowerShell5から、従来のTabExpansionに代わるRegister-ArgumentCompleterなるモノが現れたのは、PowerShellerなら知っているだろう(わたしは去年まで知らんかったのでPowerShellerではないのだ)。

サンプル書いてみた

Mavenのよく使うコマンドでお試し。

Register-ArgumentCompleter -Native -CommandName mvn -ScriptBlock {
param($wordToComplete, $commandAst, $cursorPosition)

echo -- clean install eclipse:eclipse |
Where-Object { $_ -like "$wordToComplete*" } |
Sort-Object |
ForEach-Object {
[System.Management.Automation.CompletionResult]::new($_, $_, 'ParameterValue', $_)
}
}

めちゃんこ簡単。

作ったもの

当時仕事で巨大なMavenプロジェクトを使っていて、コマンド打つのも億劫だったのでPowerShellで自動補完がほしいなと思っていたのだが、TabExpantionはちょっと自分には使いこなせなかった。関数のオーバーライドをしたりのおまじないが必要だし。

Register-ArgumentCompleterなら簡単に作れたので、APIが進化してる感をひしと感じたのであった。以下成果物↓

krymtkts/MavenAutoCompletion: MavenAutoCompletion provides a simple auto completion of Maven 3 to PowerShell.

既知のバグ

PowerShell5だと-Nativeオプションありの場合に-を利用した補完ができないバグがあって、前述の自動補完がうまく使えなくて辛い...

Native ArgumentCompleter not invoked for inputs that begin with hyphen (-) · Issue #2912 · PowerShell/PowerShell

PowerShell5.xでも使えないものかと試してみたところ、Trickyな回避策として`-をエスケープしたらイケるというのを見つけたが...posh-gitもchocolateyもそれで従来からのTabExpantionを使ってたのかーという気付きは得られた。

ちなみにわたしはPowerShell6を使ってるのでかんけーないのだ😜

Register-ArgumentCompleterのScriptBlockの引数をちまちま調べたのがあるけど、長いから別に書こう。