Condividi tramite


Completamento tramite tabulazione per System.CommandLine

Le app che usano System.CommandLine hanno il supporto predefinito per il completamento delle schede in determinate shell. Per abilitarla, l'utente finale deve eseguire alcuni passaggi una volta per ogni shell. Al termine, il completamento della scheda è automatico per i valori statici nell'app, ad esempio valori di enumerazione o valori definiti chiamando AcceptOnlyFromAmong(String[]). È anche possibile personalizzare il completamento delle schede fornendo valori in modo dinamico in fase di esecuzione.

Abilitare il completamento automatizzato tramite tabulazione

Nel computer in cui si vuole abilitare il completamento della scheda seguire questa procedura.

Per il .NET CLI:

Per altre applicazioni a riga di comando basate su System.CommandLine:

  • Installa lo dotnet-suggest strumento globale.

  • Aggiungere lo script shim appropriato al profilo della shell. Potrebbe essere necessario creare un file di profilo della shell. Lo script shim inoltra le richieste di completamento dalla shell allo strumento dotnet-suggest, che le delega all'app appropriata basata su System.CommandLine.

    • Per bash aggiungere il contenuto di dotnet-suggest-shim.bash a ~/.bash_profile.

    • Per zshaggiungere il contenuto di dotnet-suggest-shim.zsh a ~/.zshrc.

    • Per PowerShell, aggiungere il contenuto di dotnet-suggest-shim.ps1 al profilo di PowerShell. È possibile trovare il percorso previsto per il profilo di PowerShell eseguendo il comando seguente nella console:

      echo $profile
      
  • Registrare l'app chiamando dotnet-suggest register --command-path $executableFilePath, dove $executableFilePath è il percorso del file eseguibile dell'app.

Dopo aver configurato la shell dell'utente e aver registrato il file eseguibile, i completamenti funzioneranno per tutte le app compilate usando System.CommandLine.

Per cmd.exe in Windows (Prompt dei comandi di Windows) non esiste un meccanismo modulare per il completamento tramite tabulazione, quindi non è disponibile alcun script di interfaccia. Per altre shell, cerca un problema su GitHub etichettato come Area-Completions. Se non si trova un problema, è possibile aprirlo uno nuovo.

Ottenere i valori di completamento tramite tabulazione in fase di esecuzione

Il codice seguente mostra un'app che recupera i valori per il completamento tramite tabulazione in modo dinamico in fase di esecuzione. Il codice ottiene un elenco delle due settimane di date successive alla data corrente. L'elenco viene fornito all'opzione --date chiamando 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)}");
        });
    }
}

I valori mostrati quando viene premuto il tasto Tab sono forniti come istanze CompletionItem.

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

Vengono impostate le proprietà seguenti CompletionItem :

  • Label è il valore di completamento da visualizzare.
  • SortText assicura che i valori nell'elenco vengano presentati nell'ordine corretto. Viene impostato convertendo i in una stringa a due cifre, in modo che l'ordinamento sia basato su 01, 02, 03 e così via, fino a 14. Se non si imposta questo parametro, l'ordinamento Labelè basato su , che in questo esempio è in formato di data breve e non verrà ordinato correttamente.

Esistono altre CompletionItem proprietà, ad esempio Documentation e Detail, ma non sono ancora usate in System.CommandLine.

L'elenco di completamento dinamico delle schede creato da questo codice compare anche nel risultato della Guida.

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

Vedere anche

System.CommandLine panoramica