如何为 .NET CLI 启用 Tab 自动补全

本文适用于: ✔️ .NET Core 2.1 SDK 及更高版本

本文介绍如何为四个 shell 配置 Tab 自动补全:PowerShell、Bash、zsh 和 fish。 对于其他 shell,请参阅相关文档,了解如何配置 tab 自动补全。

设置后,通过在 shell 中输入 dotnet 命令,然后按 Tab 键,触发 .NET CLI 的 Tab 自动 补全。 当前命令行将发送到 dotnet complete 命令,结果由 shell 处理。 可以通过直接向 dotnet complete 命令发送内容来测试结果而无需启用 tab 自动补全。 例如:

> dotnet complete "dotnet a"
add
clean
--diagnostics
migrate
pack

如果该命令不起作用,请确保已安装 .NET Core 2.0 SDK 或更高版本。 如果已安装但该命令仍不起作用,请确保该 dotnet 命令解析为 .NET Core 2.0 SDK 及更高版本。 使用 dotnet --version 命令查看当前路径解析为的 dotnet 的版本。 有关详细信息,请参阅选择要使用的 .NET 版本

示例

下面是 tab 自动补全提供的一些示例:

输入 将变为 因为
dotnet a⇥ dotnet add add 是第一项子命令,按字母排序。
dotnet add p⇥ dotnet add --help Tab 自动补全匹配子字符串,--help 首先按字母顺序排列。
dotnet add p⇥⇥ dotnet add package 第二次按 Tab 将显示下一条建议。
dotnet add package Microsoft⇥ dotnet add package Microsoft.ApplicationInsights.Web 结果按字母顺序返回。
dotnet remove reference ⇥ dotnet remove reference ..\..\src\OmniSharp.DotNet\OmniSharp.DotNet.csproj Tab 自动补全是可识别的项目文件。

PowerShell

若要将 Tab 自动补全添加到适用于 .NET CLI 的 PowerShell,请创建或编辑存储在变量 $PROFILE 中的配置文件。 有关详细信息,请参阅如何创建配置文件配置文件和执行策略

将以下代码添加到配置文件中:

# PowerShell parameter completion shim for the dotnet CLI
Register-ArgumentCompleter -Native -CommandName dotnet -ScriptBlock {
     param($commandName, $wordToComplete, $cursorPosition)
         dotnet complete --position $cursorPosition "$wordToComplete" | ForEach-Object {
            [System.Management.Automation.CompletionResult]::new($_, $_, 'ParameterValue', $_)
         }
 }

bash

若要将 Tab 自动补全添加到适用于 .NET CLI 的 bash shell,请将以下代码添加到 .bashrc 文件:

# bash parameter completion for the dotnet CLI

function _dotnet_bash_complete()
{
  local cur="${COMP_WORDS[COMP_CWORD]}" IFS=$'\n'
  local candidates

  read -d '' -ra candidates < <(dotnet complete --position "${COMP_POINT}" "${COMP_LINE}" 2>/dev/null)

  read -d '' -ra COMPREPLY < <(compgen -W "${candidates[*]:-}" -- "$cur")
}

complete -f -F _dotnet_bash_complete dotnet

zsh

若要将 Tab 自动补全添加到适用于 .NET CLI 的 zsh shell,请将以下代码添加到 .zshrc 文件:

# zsh parameter completion for the dotnet CLI

_dotnet_zsh_complete() 
{
  local completions=("$(dotnet complete "$words")")

  # If the completion list is empty, just continue with filename selection
  if [ -z "$completions" ]
  then
    _arguments '*::arguments: _normal'
    return
  fi

  # This is not a variable assigment, don't remove spaces!
  _values = "${(ps:\n:)completions}"
}

compdef _dotnet_zsh_complete dotnet

fish

若要向 .NET CLI 的 fish shell 添加 Tab 自动补全,请将以下代码添加到 config.fish 文件中:

complete -f -c dotnet -a "(dotnet complete (commandline -cp))"