다음을 통해 공유


System.CommandLine에 대한 탭 완성 기능

Important

System.CommandLine은 현재 미리 보기로 제공되며 이 설명서는 버전 2.0 베타 4용입니다. 일부 정보는 릴리스되기 전에 상당 부분 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적이거나 묵시적인 보증도 하지 않습니다.

System.CommandLine을 사용하는 앱에는 특정 셸의 탭 완성 기능이 기본 제공되어 있습니다. 이를 사용하도록 설정하려면 최종 사용자가 셸당 한 번씩 몇 가지 단계를 수행해야 합니다. 사용자가 이 작업을 수행하면 열거형 값이나 FromAmong을 호출하여 정의한 값과 같은 앱의 정적 값에 대한 탭 완성 기능이 자동으로 수행됩니다. 런타임 시 동적으로 값을 가져와서 탭 완성 기능을 사용자 지정할 수도 있습니다.

탭 완성 기능 사용

탭 완성 기능을 사용하도록 설정하려는 컴퓨터에서 다음 단계를 수행합니다.

.NET CLI의 경우:

System.CommandLine에 빌드된 다른 명령줄 앱의 경우:

  • dotnet-suggest 글로벌 도구를 설치합니다.

  • 셸 프로필에 적합한 Shim 스크립트를 추가합니다. 셸 프로필 파일을 만들어야 할 수 있습니다. shim 스크립트는 셸의 완료 요청을 적절한 System.CommandLine 기반 앱에 위임하는 dotnet-suggest 도구로 전달합니다.

    • bash의 경우 dotnet-suggest-shim.bash의 콘텐츠를 ~/.bash_profile에 추가합니다.

    • zsh의 경우 dotnet-suggest-shim.zsh의 콘텐츠를 ~/.zshrc에 추가합니다.

    • PowerShell의 경우 dotnet-suggest-shim.ps1의 콘텐츠를 PowerShell 프로필에 추가합니다. 콘솔에서 다음 명령을 실행하여 PowerShell 프로필의 예상 경로를 찾을 수 있습니다.

      echo $profile
      

사용자의 셸이 설정되면 System.CommandLine을 사용하여 빌드된 모든 앱에 대해 완료 기능이 작동합니다.

Windows의 cmd.exe(Windows 명령 프롬프트)에는 플러그형 탭 완성 기능 메커니즘이 없으므로 shim 스크립트를 사용할 수 없습니다. 다른 셸의 경우 Area-Completions 레이블이 붙은 GitHub 문제를 찾습니다. 문제를 찾지 못한 경우 새 문제를 열 수 있습니다.

런타임 시 탭 완성 기능 값 가져오기

다음 코드는 런타임 시 동적으로 탭 완성 기능 값을 가져오는 앱을 보여 줍니다. 코드는 현재 날짜 이후의 다음 2주 날짜 목록을 가져옵니다. 목록은 AddCompletions를 호출하여 --date 옵션에 제공됩니다.

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

await new DateCommand().InvokeAsync(args);

class DateCommand : Command
{
    private Argument<string> subjectArgument = 
        new ("subject", "The subject of the appointment.");
    private Option<DateTime> dateOption = 
        new ("--date", "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.AddArgument(subjectArgument);
        this.AddOption(dateOption);

        dateOption.AddCompletions((ctx) => {
            var today = System.DateTime.Today;
            var dates = new List<CompletionItem>();
            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.SetHandler((subject, date) =>
            {
                Console.WriteLine($"Scheduled \"{subject}\" for {date}");
            },
            subjectArgument, dateOption);
    }
}

Tab 키를 눌렀을 때 표시되는 값은 CompletionItem 인스턴스로 제공됩니다.

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

다음 CompletionItem 속성이 설정됩니다.

  • Label은 표시할 완료 값입니다.
  • SortText는 목록의 값이 올바른 순서로 표시되는지 확인합니다. 정렬은 01, 02, 03 등을 기준으로 14까지 수행되도록 i를 두 자리 문자열로 변환하여 설정됩니다. 이 매개 변수를 설정하지 않으면 정렬은 Label을 기준으로 이루어집니다. 이 예에서는 간단한 날짜 표기 형식이므로 올바르게 정렬되지 않습니다.

DocumentationDetail과 같은 다른 CompletionItem 속성이 있지만 아직 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.
  <2/4/2022|2/5/2022|2/6/2022|2/7/2022|2/8/2022|2/9/2022|2/10/2022>
  --version                                                                       Show version information
  -?, -h, --help

참고 항목

System.CommandLine 개요