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


Завершение вкладки для System.CommandLine

Приложения, использующие System.CommandLine, имеют встроенную поддержку автозаполнения вкладок в определенных оболочках. Чтобы включить его, конечный пользователь должен выполнить несколько шагов для каждой оболочки. После этого завершение вкладки автоматически выполняется для статических значений в приложении, таких как значения перечисления или значения, определенные вызовом AcceptOnlyFromAmong(String[]). Кроме того, можно настроить завершение вкладки, указав значения динамически во время выполнения.

Включение завершения вкладки

На компьютере, на котором вы (конечный пользователь) хотите включить завершение вкладки, выполните следующие действия.

Для .NET CLI:

Для других приложений командной строки, созданных на System.CommandLineоснове:

  • Установите инструмент dotnet-suggest глобально:

    dotnet tool install -g dotnet-suggest
    
  • Добавьте соответствующий шим-скрипт в профиль вашей оболочки. Возможно, потребуется создать файл профиля оболочки. Скрипт shim перенаправляет запросы на завершение из вашей оболочки в инструмент dotnet-suggest, который делегирует их соответствующему приложению на основе System.CommandLine.

    • При bash добавьте содержимое dotnet-suggest-shim.bash в ~/.bash_profile.

    • Для zsh добавьте содержимое dotnet-suggest-shim.zsh в ~/.zshrc.

    • Для PowerShell добавьте содержимое dotnet-suggest-shim.ps1 в профиль PowerShell, а затем перезапустите PowerShell. Ожидаемый путь к профилю PowerShell можно найти с помощью следующей команды:

      echo $profile
      
  • Зарегистрируйте приложение путем вызова dotnet-suggest register --command-path $executableFilePath, где $executableFilePath находится путь к исполняемому файлу приложения.

После настройки оболочки пользователя и регистрации исполняемого файла завершения будут работать для любых приложений, созданных с помощью System.CommandLine.

Для cmd.exe в Windows (командной строке Windows) нет механизма завершения подключаемой вкладки, поэтому скрипт shim недоступен. Для других оболочек найдите задачу на GitHub с меткой Area-Completions. Если вы не найдете проблему, вы можете открыть новую.

Получение значений завершения вкладки во время выполнения

В следующем коде показано приложение, которое извлекает значения для завершения вкладки динамически во время выполнения. Код получает список дат следующей недели после текущей даты. Список предоставляется параметру --date путем вызова CompletionSources.Add:

using System.CommandLine;
using System.CommandLine.Completions;
using System.CommandLine.Parsing;

new DateCommand().Parse(args).Invoke();

class DateCommand : Command
{
    private Argument<string> subjectArgument = new("subject")
    {
        Description = "The subject of the appointment."
    };
    private Option<DateTime> dateOption = new("--date")
    {
        Description = "The day of week to schedule. Should be within one week."
    };

    public DateCommand() : base("schedule", "Makes an appointment for sometime in the next week.")
    {
        this.Arguments.Add(subjectArgument);
        this.Options.Add(dateOption);

        dateOption.CompletionSources.Add(ctx => {
            var today = System.DateTime.Today;
            List<CompletionItem> dates = new();
            foreach (var i in Enumerable.Range(1, 7))
            {
                var date = today.AddDays(i);
                dates.Add(new CompletionItem(
                    label: date.ToShortDateString(),
                    sortText: $"{i:2}"));
            }
            return dates;
        });

        this.SetAction(parseResult =>
        {
            Console.WriteLine($"Scheduled \"{parseResult.GetValue(subjectArgument)}\" for {parseResult.GetValue(dateOption)}");
        });
    }
}

Значения, отображаемые при нажатии клавиши TAB , предоставляются в виде CompletionItem экземпляров:

dates.Add(new CompletionItem(
    label: date.ToShortDateString(),
    sortText: $"{i:2}"));

Задаются следующие CompletionItem свойства:

  • Label — это значение завершения, которое будет отображаться.
  • SortText гарантирует, что значения в списке представлены в правильном порядке. Он задается путем того, что i преобразуется в двухзначную строку, чтобы сортировка была основана на 01, 02, 03 и т. д. до 14 включительно. Если этот параметр не задан, сортировка основана на Label, который в этом примере имеет краткий формат даты и не будет корректно сортироваться.

Существуют другие CompletionItem свойства, такие как Documentation и Detail, но они еще не используются System.CommandLine.

Список завершения динамической вкладки, созданный этим кодом, также отображается в выходных данных справки:

Description:
  Makes an appointment for sometime in the next week.

Usage:
  schedule <subject> [options]

Arguments:
  <subject>  The subject of the appointment.

Options:
  --date                                                                          The day of week to schedule. Should be within one week.
  <12/4/2025|12/5/2025|12/6/2025|12/7/2025|12/8/2025|12/9/2025|12/10/2025>
  --version                                                                       Show version information
  -?, -h, --help

См. также