-
Notifications
You must be signed in to change notification settings - Fork 3.2k
Description
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.

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
- PowerShell assumes the returned completion(s) should replace the word at the cursor instead of the last word in the command. I'm not sure how to fix that without adding a
positionenvironment variable to the implementation in https://github.com/pypa/pip/blob/main/src/pip/_internal/cli/autocompletion.py
Alternative Solutions
The provided solution works well enough for now. Additional functionality can be implemented later.
Additional context
Improves upon #9025
Code of Conduct
- I agree to follow the PSF Code of Conduct.