Skip to content

Fix/improve argument completion for PowerShell 7.4+ #12440

Open
@BinToss

Description

@BinToss

What's the problem this feature will solve?

The current implementation hooks the legacy PowerShell function TabExpansion. This function does not exist in Powershell 7.4 and later.
image
The function was replaced by TabExpansion2. Completion/suggestion implementations are recommended to use the Register-ArgumentCompleter API which is in Windows PowerShell (5.1) and PowerShell Core (6.0 and later).

Describe the solution you'd like

The Register-ArgumentCompleter function can be leveraged like so:

Register-ArgumentCompleter -Native -CommandName 'pip' -ScriptBlock {
    param(
        [string]$wordToComplete,
        [System.Management.Automation.Language.CommandAst]$commandAst,
        $cursorPosition
    )
    $Env:COMP_WORDS = $commandAst.ToString()
    $Env:COMP_CWORD = $commandAst.ToString().Split().Length - 1
    $Env:PIP_AUTO_COMPLETE = 1
    (& pip).Split() | ForEach-Object {
        [System.Management.Automation.CompletionResult]::new($_, $_, 'ParameterValue', $_)
    }
    Remove-Item Env:COMP_WORDS
    Remove-Item Env:COMP_CWORD
    Remove-Item Env:PIP_AUTO_COMPLETE
}

This can be appended to the user's $PROFILE script as-is, as a string executed by Invoke-Expression, or as a dot-sourced command invoking a script file (e.g. . path/to/pip-completion.ps1).

Unlike the old implementation, this does not override any built-in functions. The currently-unused $cursorPosition parameter can be leveraged for completion/suggestion at the cursor's position instead of only the last word in the CommandAst.

Known Issues

Alternative Solutions

The provided solution works well enough for now. Additional functionality can be implemented later.

Additional context

Improves upon #9025

Code of Conduct

Metadata

Metadata

Assignees

No one assigned

    Labels

    C: autocompleteAutocompletion in shells (pip completion)good first issueA good item for first time contributors to work onstate: awaiting PRFeature discussed, PR is neededtype: enhancementImprovements to functionality

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions