tab 自动补全 (winget)

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

启用 tab 自动补全

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

  1. 打开 PowerShell 并输入以下命令,在记事本中打开 $PROFILEnotepad.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 () 将循环可能的值。

输入 结果 Reason
winget ⇥ winget install install 是根目录下的第一个命令
winget sh⇥ winget show show 是第一个以 sh 开头的命令
winget source l⇥ winget source list list 是源的第一个以 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 的最高版本

命令参考

完整的命令需要 3 个必需的参数:

参数 说明
--word 当前正在补全的字词;光标所在的标记。 可以为空,以表示光标处当前没有值。但如果不为空,则必须在命令行中显示为子字符串。
--commandline 整个当前命令行,包括 winget。 见上例;除 tab 字符 () 以外的所有内容都应提供给该参数。
--position 光标在命令行中的当前位置。 可以大于命令行字符串的长度,以表示位于末尾。

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

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

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

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

评估所有情况后,输出可行的补全,且每行一个。 如果补全字符串包含空格,则将其括在引号中。