Aracılığıyla paylaş


Sekme tamamlama için System.CommandLine

kullanan System.CommandLine uygulamalar, belirli kabuklarda sekme tamamlama için yerleşik desteğe sahiptir. Bunu etkinleştirmek için son kullanıcının her kabuk için birkaç adım atması gerekir. Bu işlem tamamlandıktan sonra, uygulamanızdaki sabit listesi değerleri veya AcceptOnlyFromAmong(String[]) çağrılarak tanımlanan değerler gibi statik değerler için sekme tamamlama otomatik olarak gerçekleştirilir. Çalışma zamanında dinamik olarak değerler sağlayarak sekme tamamlamayı da özelleştirebilirsiniz.

Sekme tamamlamayı etkinleştir

Sekme tamamlama özelliğini etkinleştirmek istediğiniz makinede şu adımları izleyin.

.NET CLI için:

üzerinde System.CommandLineoluşturulan diğer komut satırı uygulamaları için:

  • dotnet-suggest Genel aracı yükleyin:

    dotnet tool install -g dotnet-suggest
    
  • Kabuk profilinize uygun dolgu betiğini ekleyin. Bir kabuk profili dosyası oluşturmanız gerekebilir. Köprü betiği, kabuğunuzdan tamamlama isteklerini dotnet-suggest aracına iletir ve bunları uygun System.CommandLine tabanlı uygulamaya devreder.

    • bash için dotnet-suggest-shim.bash dosyasının içeriğini ~/.bash_profile öğesine ekleyin.

    • zsh için dotnet-suggest-shim.zsh içeriğini ~/.zshrc'ye ekleyin.

    • PowerShell için ,dotnet-suggest-shim.ps1 içeriğini PowerShell profilinize ekleyin ve PowerShell'i yeniden başlatın. Aşağıdaki komutla PowerShell profilinizin beklenen yolunu bulabilirsiniz:

      echo $profile
      
  • çağırarak dotnet-suggest register --command-path $executableFilePathuygulamayı kaydedin; burada $executableFilePath uygulamanın yürütülebilir dosyasının yoludur.

Kullanıcının kabuğu ayarlandıktan ve yürütülebilir dosya kaydettikten sonra, kullanılarak System.CommandLine oluşturulan tüm uygulamalar için tamamlamalar çalışır.

Windows'da (Windows Komut İstemi) cmd.exe için takılabilir sekme tamamlama mekanizması yoktur, bu nedenle ara betik kullanılamaz. Diğer kabuklar için, etiketli bir GitHub sorununu arayınArea-Completions. Bir sorun bulamazsanız yeni bir sorun açabilirsiniz.

Çalışma zamanında sekme tamamlama değerlerini alma

Aşağıdaki kod, çalışma zamanında sekme tamamlama değerlerini dinamik olarak alan bir uygulamayı gösterir. Kod, bugünkü tarihten sonra gelen bir haftalık tarih listesini alır. Liste, --date çağrısı yapılarak CompletionSources.Add seçeneğine sağlanır.

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)}");
        });
    }
}

Sekme tuşuna basıldığında gösterilen değerler CompletionItem örnekler olarak sağlanır:

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

Aşağıdaki CompletionItem özellikler ayarlanır:

  • Label gösterilecek tamamlanma değeridir.
  • SortText listedeki değerlerin doğru sırada sunulmasını sağlar. İki basamaklı bir dizeye dönüştürülerek i ayarlanır, böylece sıralama 01, 02, 03 vb. ile 14 arasında olur. Bu parametreyi ayarlamazsanız, sıralama, bu örnekte kısa tarih biçiminde olan Label öğesine göre yapılır ve bu da doğru sıralanmaz.

Başka CompletionItem, Documentation, ve Detail gibi özellikler de vardır, ancak henüz System.CommandLine içinde kullanılmazlar.

Bu kod tarafından oluşturulan dinamik sekme tamamlama listesi, yardım çıkışında da görünür:

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

Ayrıca bakınız