Powershell动态<tab>完成</tab>

时间:2014-12-23 20:32:45

标签: git powershell

  投票结束前,了解&#34;回答&#34;上面的问题是使用另一个模块,而不是自己如何实现它。

我有一组powershell模块,用于帮助我完成我的git工作流程(想想gitflow)。

以下是一个例子。

Function Merge-FromBranch([string] $branch){
    # ...
}

Set-Alias mfb Merge-FromBranch

我希望能够使用回购中存在的分支对分支名称进行制表完成。

现在获取本地分支名称很简单

> git branch

但我需要做的是

> mfb fea<tab>

以便通过功能分支进行制表。

如何连接它以便我可以在我的模块上填写$branch参数?

我知道我可以将git branch输出传递给另一个方法(git branch | do-stuff),但我不知道如何将其集成到模块的制表符完成中。

2 个答案:

答案 0 :(得分:3)

为了与posh-git的完成方式保持一致,并制作我自己的TabExpansion方法,我现在可以为我的自定义命令完成正确的标签。

# Backup the existing TabExpansion, this will allow us to extend it rather than replace it.
Copy Function:\TabExpansion Function:\OriginalTabExpansion

# Create our own custom TabExpansion method
function TabExpansion($line, $lastWord) {
  $LineBlocks = [regex]::Split($line, '[|;]')
  $lastBlock = $LineBlocks[-1] 

  switch -regex ($lastBlock) {
    #Depends on Posh-Git
    "^$(Get-AliasPattern "mfb|mtb|rb|db|ub|urb|co|pull") (.*)" { gitTabExpansion $lastBlock }
    default { if (Test-Path Function:\OriginalTabExpansion) { OriginalTabExpansion $line $lastWord } }
  }
}

function gitTabExpansion($lastBlock) {
     switch -regex ($lastBlock) {
        "(?<cmd>\S*)$" { gitBranches $matches['cmd'] $true }
    }   
}

function script:gitBranches($filter, $includeHEAD = $false) {
    $prefix = $null
    if ($filter -match "^(?<from>\S*\.{2,3})(?<to>.*)") {
        $prefix = $matches['from']
        $filter = $matches['to']
    }
    $branches = @(git branch --no-color | foreach { if($_ -match "^\*?\s*(?<ref>.*)") { $matches['ref'] } }) +
                @(git branch --no-color -r | foreach { if($_ -match "^  (?<ref>\S+)(?: -> .+)?") { $matches['ref'] } }) +
                @(if ($includeHEAD) { 'HEAD','FETCH_HEAD','ORIG_HEAD','MERGE_HEAD' })
    $branches |
        where { $_ -ne '(no branch)' -and $_ -like "$filter*" } |
        foreach { $prefix + $_ }
}

答案 1 :(得分:0)

我不熟悉git branch及其输出的内容。我希望它只是分支名称,每行一个没有任何标题的值等。如果没有,那么你需要修改样本以便先清理它。

如果我相信,这应该适用于PS3 +:

function Merge-FromBranch {

[CmdletBinding()]
Param() 

    DynamicParam {
            # Set the dynamic parameters' name
            $ParameterName = 'Branch'

            # Create the dictionary 
            $RuntimeParameterDictionary = New-Object System.Management.Automation.RuntimeDefinedParameterDictionary

            # Create the collection of attributes
            $AttributeCollection = New-Object System.Collections.ObjectModel.Collection[System.Attribute]

            # Create and set the parameters' attributes
            $ParameterAttribute = New-Object System.Management.Automation.ParameterAttribute
            $ParameterAttribute.Mandatory = $true
            $ParameterAttribute.Position = 1

            # Add the attributes to the attributes collection
            $AttributeCollection.Add($ParameterAttribute)

            # Generate and set the ValidateSet 
            $arrSet = & git branch
            $ValidateSetAttribute = New-Object System.Management.Automation.ValidateSetAttribute($arrSet)

            # Add the ValidateSet to the attributes collection
            $AttributeCollection.Add($ValidateSetAttribute)

            # Create and return the dynamic parameter
            $RuntimeParameter = New-Object System.Management.Automation.RuntimeDefinedParameter($ParameterName, [string], $AttributeCollection)
            $RuntimeParameterDictionary.Add($ParameterName, $RuntimeParameter)
            return $RuntimeParameterDictionary
    }

    begin {
        # Bind the parameter to a friendly variable
        $Branch = $PsBoundParameters[$ParameterName]
    }

    process { Write-Host "Chosen Branch is: $Branch" }

}

示例修改自:Dynamic ValidateSet in a Dynamic Parameter @ blogs.technet.com