Tab 自动补全 (winget)

winget 命令行工具提供了 complete 命令来提供区分上下文的 Tab 自动补全。 它支持根据当前命令行状态完成命令名称、参数名称和参数值。

启用 tab 自动补全

若要使用 winget 启用 Tab 自动补全,必须将以下脚本添加到 PowerShell 中的 $PROFILE。

  1. 打开 PowerShell 并输入以下命令,在记事本中打开 $PROFILE:notepad.exe $PROFILE

  2. 将以下脚本复制并粘贴到记事本中打开的 $PROFILE 文件中:

    Register-ArgumentCompleter -Native -CommandName winget -ScriptBlock {
        param($wordToComplete, $commandAst, $cursorPosition)
            [Console]::InputEncoding = [Console]::OutputEncoding = $OutputEncoding = [System.Text.Utf8Encoding]::new()
            $Local:word = $wordToComplete.Replace('"', '""')
            $Local:ast = $commandAst.ToString().Replace('"', '""')
            winget complete --word="$Local:word" --commandline "$Local:ast" --position $cursorPosition | ForEach-Object {
                [System.Management.Automation.CompletionResult]::new($_, $_, 'ParameterValue', $_)
            }
    }
    
  3. 将 $PROFILE 保存到您的脚本中。 然后关闭并重新打开 PowerShell。 重新打开 PowerShell 后,将启用 winget Tab 自动补全。

tab 自动补全示例

重复按 tab (⇥) 将循环可能的值。

输入 结果 原因
winget ⇥ winget install install 是根目录下的第一个命令
winget sh⇥ winget show show 是第一个以 sh 开头的命令
winget source l⇥ winget source list list 是 source 中第一个以 l 开头的子命令
winget -⇥ winget --version --version 是为根定义的第一个参数
winget install power⇥ winget install "Power Toys" "Power Toys" 是第一个 ID、名称或名字对象以 power 开头的包
winget install "Power Toys" --version ⇥ winget install "Power Toys" --version 0.19.2 0.19.2 是截至撰写本文时 Power Toys 的最高版本

命令参考

该 complete 命令采用 3 个必需参数:

论点 DESCRIPTION
--word 当前正在补全的字词;光标所在的标记。 可以为空,表示游标上没有当前值,但如果提供,它必须显示为命令行中的子字符串。
--commandline 整个当前命令行,包括 winget。 请参阅上面的示例;除了制表符(⇥),其他所有内容都应提供给此参数。
--position 光标在命令行中的当前位置。 可以大于命令行字符串的长度,以表示位于末尾。

输入字词值时,补全在替换模式下进行。 它将建议准确适合此位置的补全,这些补全也以给定的字词值开头。

未输入字词值(为字词输入空值,例如 --word=)时,补全在插入模式下进行。 它将建议适合作为光标位置处新值的补全。

根据参数,建议的补全可以是以下之一:

  1. 子命令 ::光标位于命令之后,并且有可用的子命令。
  2. 参数说明符 :: 光标不位于需要值的参数说明符之后,并且提供了可用的参数。
  3. 参数值 :: 光标位于需要值的参数说明符之后,或者需要位置参数。

评估所有情况后,输出可行的补全,且每行一个。 如果完成字符串包含空格,则用引号括起来。