TabExpansion.ps1

# Copyright (c) Microsoft Corporation.
# Licensed under the MIT License.

[Diagnostics.CodeAnalysis.SuppressMessageAttribute(
    "PSAvoidGlobalVars", "",
    Justification = "We need global PSToolsetAutoCompleteOptions here")]
param()

# Test if we did that override already, PSToolset can be
# loaded multiple times to one Powershell session
if( $GLOBAL:PSToolsetAutoCompleteOptions )
{
    return
}

# Hook into the tab complete function
$function:TabExpansion2 = $Function:TabExpansion2 -replace 'End\r\n{', (@'
End
{
    if ($options -ne $null)
    {
        $options += $GLOBAL:PSToolsetAutoCompleteOptions
    }
    else
    {
        $options = $GLOBAL:PSToolsetAutoCompleteOptions
    }
'@
)

# Overrides
$GLOBAL:PSToolsetAutoCompleteOptions = @{ CustomArgumentCompleters = @{}; NativeArgumentCompleters = @{} }

$GLOBAL:PSToolsetAutoCompleteOptions['NativeArgumentCompleters']['git'] =
{
    param( $completed, $ast )

    if( -not $completed )
    {
        $completed = "."
    }

    $gitCommand = $ast.CommandElements[1].Value
    switch -regex ($gitCommand)
    {
        "^(co|checkout|br|branch|rebase|merge)$"
        {
            git branch | parse "^\*?\s+(.+)" | where{ $psitem -match $completed }
        }
        "^(fetch|pull)$"
        {
            git remote | where{ $psitem -match $completed }
        }
    }
}

<# Sample how to make similar tab expansion for Powershell commands
 
$GLOBAL:PSToolsetAutoCompleteOptions['CustomArgumentCompleters']['Remove-Outgoing:Branch'] =
{
    param($commandName, $parameterName, $completed, $commandAst, $fakeBoundParameter)
 
    if( -not $completed )
    {
        $completed = "."
    }
 
    git branch | parse "^\*?\s+(.+)" | where{ $psitem -match $completed }
}
 
#>