Поделиться через


Включение завершения вкладки для интерфейса командной строки .NET

Эта статья относится к: ✔️ пакету SDK для .NET 6 и более поздних версий

В этой статье описывается настройка завершения вкладки для пяти оболочк: PowerShell (pwsh), Bash, zsh, fish и nushell. Сведения о настройке завершения вкладки см. в документации по другим оболочкам.

Скрипты завершения встроенной оболочки (.NET 10+)

Начиная с .NET 10, интерфейс командной строки .NET включает собственные скрипты завершения оболочки, которые выполняются гораздо быстрее, чем динамические завершения, доступные в более ранних версиях. Собственные завершения создают сценарии, предназначенные для конкретного интерпретатора командной строки, которые обрабатывают статические части грамматики CLI непосредственно в этом интерпретаторе, обеспечивая значительное улучшение производительности.

Создание скриптов завершения

Используйте команду dotnet completions script, чтобы создать скрипт завершения для вашей оболочки.

dotnet completions script [SHELL]

Параметр [SHELL] принимает одно из следующих значений:

  • bash
  • fish
  • nushell
  • pwsh
  • zsh

Если вы не укажете оболочку, команда определяет правильную оболочку на основе вашей среды. В Windows по умолчанию используется PowerShell (pwsh). В других системах проверяет, соответствует ли имя файла переменной SHELL среды любым из поддерживаемых значений оболочки.

Возможности завершения

Собственные завершения обеспечивают различные уровни поддержки в зависимости от оболочки:

Оболочка Тип завершения Описания в завершениях вкладок
bash гибрид нет
рыба dynamic нет
nushell dynamic нет
PowerShell гибрид Да
zsh гибрид Да

Типы завершения:

  • Гибрид: создает код, специфичный для оболочки, который быстро обрабатывает статические части грамматики CLI, но использует команду dotnet complete для обработки динамического содержимого, например, идентификаторов пакетов NuGet.
  • Динамический: все завершения проходят команду dotnet complete, которая может быть медленнее, но обеспечивает комплексное покрытие.

Настройте оболочки для использования собственных завершений.

Добавьте соответствующую команду в профиль оболочки, чтобы включить встроенные завершения.

PowerShell

Добавьте следующую строку в профиль PowerShell ($PROFILE):

dotnet completions script pwsh | Out-String | Invoke-Expression

Bash

Добавьте в файл следующую строку .bashrc :

eval "$(dotnet completions script bash)"

Zsh

Добавьте в файл следующую строку .zshrc :

eval "$(dotnet completions script zsh)"

Fish

Добавьте в файл следующую строку config.fish :

dotnet completions script fish | source

Nushell

Добавьте следующее в начало config.nu файла:

dotnet completions script nushell | save -f ~/.local/share/nushell/completions/dotnet.nu
use ~/.local/share/nushell/completions/dotnet.nu *

Скрипты динамического завершения (все версии)

Для версий .NET до .NET 10 или, если вы предпочитаете использовать динамические завершения, можно настроить оболочку для использования dotnet complete команды. Динамические завершения работают, отправляя текущую командную строку dotnet complete в команду и обрабатывая результаты в оболочке.

После настройки завершение вкладки для интерфейса командной строки .NET активируется путем ввода dotnet команды в оболочке и нажатия клавиши TAB . Текущая командная строка отправляется команде dotnet complete, а результаты обрабатываются оболочкой. Вы можете протестировать результаты без включения завершения вкладки, отправив что-то непосредственно в dotnet complete команду. Рассмотрим пример.

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

Если эта команда не работает, убедитесь, что установлен пакет SDK для .NET Core 2.0 или более поздней версии. Если она установлена, но эта команда по-прежнему не работает, убедитесь, что команда dotnet соответствует версии SDK .NET Core 2.0 или более поздней. Используйте команду dotnet --version, чтобы узнать, к какой версии dotnet разрешается ваш текущий путь. Дополнительные сведения см. в разделе "Выбор используемой версии .NET".

Примеры

Ниже приведены некоторые примеры завершения вкладки:

Ввод превращается в Потому что
dotnet a⇥ dotnet add add — первая подкоманда в алфавитном порядке.
dotnet add p⇥ dotnet add --help Завершение табуляции соответствует подстрокам и --help выполняется в алфавитном порядке.
dotnet add p⇥⇥ dotnet add package При нажатии клавиши tab во второй раз выводится следующее предложение.
dotnet package add Microsoft⇥ dotnet package add Microsoft.ApplicationInsights.Web Результаты возвращаются в алфавитном порядке.
dotnet reference remove ⇥ dotnet reference remove ..\..\src\OmniSharp.DotNet\OmniSharp.DotNet.csproj Завершение вкладки — это файл проекта, который учитывается.

PowerShell

Чтобы добавить автозавершение в PowerShell для .NET CLI, создайте или измените профиль, хранящийся в переменной $PROFILE. Дополнительные сведения см. в разделах How to create your profile (Как создать свой профиль) и Profiles and execution policy (Профили и политика выполнения).

Добавьте следующий код в профиль:

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

bash

Чтобы добавить завершение вкладки в оболочку Bash для .NET CLI, добавьте в файл следующий код .bashrc :

# bash parameter completion for the dotnet CLI

function _dotnet_bash_complete()
{
  local cur="${COMP_WORDS[COMP_CWORD]}" IFS=$'\n' # On Windows you may need to use use IFS=$'\r\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

Чтобы добавить автодополнение для оболочки zsh в .NET CLI, добавьте следующий код в ваш файл .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 assignment, don't remove spaces!
  _values = "${(ps:\n:)completions}"
}

compdef _dotnet_zsh_complete dotnet

рыба

Чтобы добавить автодополнение в оболочку Fish для .NET CLI, добавьте следующий код в файл config.fish.

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

nushell

Чтобы добавить завершение вкладки в nushell для .NET CLI, добавьте следующее в начало config.nu файла:

let external_completer = { |spans|
    {
        dotnet: { ||
            dotnet complete (
                $spans | skip 1 | str join " "
            ) | lines
        }
    } | get $spans.0 | each { || do $in }
}

А затем в записи config найдите раздел completions и добавьте ранее заданный external_completer в external:

let-env config = {
    # your options here
    completions: {
        # your options here
        external: {
            # your options here
            completer: $external_completer # add it here
        }
    }
}