Como ocultar as extensões de arquivo na conclusão da guia do PowerShell?

2

Como eu altero o comportamento padrão da CLI do Powershell para ignorar extensões de arquivo para tipos de arquivos que vivem na minha variável de ambiente $Env:Path ?

Se eu apenas digitar python , ele funcionará corretamente e me colocará no interpretador Python, como esperado, já que a extensão faz parte da variável de ambiente.

O problema é que quando eu digito pyth e tab-complete no PowerShell, ele sempre anexa .exe . Eu só quero terminar a primeira parte do comando sem a extensão.

Isso é possível? Talvez um roteiro?

    
por jmreicha 30.12.2016 / 20:44

1 resposta

5

Você pode substituir a função de conclusão de tabulação padrão por conta própria. Na versão mais recente do PowerShell, essa função é TabExpansion2 . Esta modificação parece fazer o que você quer:

Function TabExpansion2 {
    [CmdletBinding(DefaultParameterSetName = 'ScriptInputSet')]
    Param(
        [Parameter(ParameterSetName = 'ScriptInputSet', Mandatory = $true, Position = 0)]
        [string] $inputScript,

        [Parameter(ParameterSetName = 'ScriptInputSet', Mandatory = $true, Position = 1)]
        [int] $cursorColumn,

        [Parameter(ParameterSetName = 'AstInputSet', Mandatory = $true, Position = 0)]
        [System.Management.Automation.Language.Ast] $ast,

        [Parameter(ParameterSetName = 'AstInputSet', Mandatory = $true, Position = 1)]
        [System.Management.Automation.Language.Token[]] $tokens,

        [Parameter(ParameterSetName = 'AstInputSet', Mandatory = $true, Position = 2)]
        [System.Management.Automation.Language.IScriptPosition] $positionOfCursor,

        [Parameter(ParameterSetName = 'ScriptInputSet', Position = 2)]
        [Parameter(ParameterSetName = 'AstInputSet', Position = 3)]
        [Hashtable] $options = $null
    )

    End
    {
        $source = $null
        if ($psCmdlet.ParameterSetName -eq 'ScriptInputSet')
        {
            $source = [System.Management.Automation.CommandCompletion]::CompleteInput(
                <#inputScript#>  $inputScript,
                <#cursorColumn#> $cursorColumn,
                <#options#>      $options)
        }
        else
        {
            $source = [System.Management.Automation.CommandCompletion]::CompleteInput(
                <#ast#>              $ast,
                <#tokens#>           $tokens,
                <#positionOfCursor#> $positionOfCursor,
                <#options#>          $options)
        }
        $field = [System.Management.Automation.CompletionResult].GetField('completionText', 'Instance, NonPublic')
        $source.CompletionMatches | % {
            If ($_.ResultType -eq 'Command' -and [io.file]::Exists($_.ToolTip)) {
                $field.SetValue($_, [io.path]::GetFileNameWithoutExtension($_.CompletionText))
            }
        }
        Return $source
    }    
}

Eu adicionei as linhas depois da que começa com $field ; ele percorre as opções de conclusão da guia padrão e remove a extensão daquelas que parecem ser do seu PATH . Eu tenho a fonte original com este comando:

(Get-Command 'TabExpansion2').ScriptBlock

Se você colocar a nova função em um arquivo .ps1 e executar um ponto com esse script (por exemplo, . .\tabnoext.ps1 ), ele se tornará o manipulador de conclusão da guia para a sessão atual. Para carregá-lo sempre que você abrir uma janela do PowerShell, cole todo esse código em um script de perfil do PowerShell .

Se você estiver em uma versão antiga do PowerShell, será necessário substituir as TabExpansion function, que apenas retorna um array de strings.

    
por 30.12.2016 / 21:53