Tabbavslut för System.CommandLine

Appar som använder System.CommandLine har inbyggt stöd för att slutföra flikar i vissa gränssnitt. För att aktivera den måste slutanvändaren vidta några steg en gång per kommandotolk. När detta är klart är flikslutningen automatisk för statiska värden i din app, till exempel uppräkningsvärden eller värden som definieras genom att anropa AcceptOnlyFromAmong(String[]). Du kan även anpassa tab-komplettering genom att tillhandahålla värden dynamiskt under körning.

Aktivera flikavslut

Följ dessa steg på den dator där du vill aktivera flikavslut.

För .NET CLI:

För andra kommandoradsappar som bygger på System.CommandLine:

  • Installera det dotnet-suggest globala verktyget.

  • Lägg till lämpligt shim-skript i din shell-profil. Du kan behöva skapa en shell-profilfil. Shim-skriptet vidarebefordrar slutförandebegäranden från gränssnittet till dotnet-suggest verktyget, vilket delegerar dem till lämplig System.CommandLine-baserad app.

    • För bashlägger du till innehållet i dotnet-suggest-shim.bash i ~/.bash_profile.

    • För zshlägger du till innehållet i dotnet-suggest-shim.zsh i ~/.zshrc.

    • För PowerShell lägger du till innehållet i dotnet-suggest-shim.ps1 i din PowerShell-profil. Du hittar den förväntade sökvägen till PowerShell-profilen genom att köra följande kommando i konsolen:

      echo $profile
      
  • Registrera appen genom att anropa dotnet-suggest register --command-path $executableFilePath, där $executableFilePath är sökvägen till appens körbara fil.

När användarens gränssnitt har konfigurerats och den körbara filen har registrerats fungerar slutföranden för alla appar som skapas med hjälp System.CommandLineav .

För cmd.exe i Windows (Kommandotolken för Windows) finns det ingen pluggbar mekanism för komplettering av flikar, så inget s.k. shim-skript är tillgängligt. För andra skal leta efter ett GitHub-problem som är märkt Area-Completions. Om du inte hittar något problem kan du öppna ett nytt.

Hämta flikslutvärden vid körning

Följande kod visar en app som hämtar värden för flikavslut dynamiskt vid körning. Koden hämtar en lista över de kommande två veckornas datum efter det aktuella datumet. Listan tillhandahålls till alternativet --date genom att anropa 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)}");
        });
    }
}

De värden som visas när tabbtangenten trycks in anges som CompletionItem instanser:

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

Följande CompletionItem egenskaper anges:

  • Label är det slutförandevärde som ska visas.
  • SortText ser till att värdena i listan visas i rätt ordning. Den anges genom att i konvertera till en tvåsiffrig sträng, så att sortering baseras på 01, 02, 03 och så vidare, till och med 14. Om du inte anger den här parametern baseras sortering på Label, som i det här exemplet är i kort datumformat och inte sorteras korrekt.

Det finns andra CompletionItem egenskaper, till exempel Documentation och Detail, men de används ännu inte i System.CommandLine.

Den dynamiska flikslutlistan som skapas av den här koden visas också i hjälputdata:

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

Se även

System.CommandLine överblick