12 puan yazan GN⁺ 2025-08-13 | Henüz yorum yok. | WhatsApp'ta paylaş
  • Bash ve Zsh'de, zaten tamamlanmış sözcükler için bile açıklama gösteren bir sekme otomatik tamamlama özelliğinin nasıl uygulanacağı tanıtılıyor
  • Bash ve Zsh, farklı sekme otomatik tamamlama API'leri kullanır; varsayılan olarak yalnızca Zsh, otomatik tamamlamada açıklama gösterme özelliği sunar
  • Adaylar _generate_foo_completions ile üretilir; Bash'te COMPREPLY, Zsh'te ise compadd ile döndürülen bir yapı kurulur
  • Zsh'nin açıklama özelliğini Bash'te de uygulamak için, aday dizelerine açıklama eklenir ve yalnızca tek aday olduğunda açıklama kaldırılır
  • Tek aday durumunda bile, <TAB> basıldığında açıklamanın gösterilmesi için bilerek belirsizlik eklenerek iyileştirme yapılır
  • Nihai betik, iki kabukta da aynı kullanıcı deneyimini sunar ve kısmi tamamlama, tam tamamlama ve aday açıklamalarını gösterme özelliklerinin tümünü destekler

Sorunun arka planı

  • Sekme otomatik tamamlama (tab-completion), komutları veya bayrakları keşfederken kullanışlıdır; özellikle bir API ya da CLI aracını ilk kez kullanırken yardımcı olur
  • Zsh varsayılan olarak yalnızca birden fazla aday olduğunda açıklama gösterir; Bash'te ise bu ancak ek yapılandırmayla mümkündür
  • Ancak zaten tamamlanmış sözcükler için her iki kabuk da açıklama göstermez
  • Bu yüzden kullanıcıların açıklamayı görmek için şu zahmetli süreci izlemesi gerekir
    • Bazı karakterleri silerek birden fazla adayın eşleşmesini sağlamak
    • Aday listesini görmek için <TAB> tuşuna basmak
    • İstenen açıklamayı görsel olarak bulmak
    • Komutu çalıştırmak için silinen karakterleri yeniden girmek

Çözümün özeti

  • Tek aday olsa bile, bir sahte aday (dummy completion) eklenerek adaylar belirsiz hale getirilir
  • Böylece hem Bash hem de Zsh, açıklamalarla birlikte aday listesini gösterir
  • Ancak açıklama metninin gerçek komuta eklenmemesine dikkat etmek gerekir

Temel kavramlar

  • Sekme otomatik tamamlama, <TAB> girildiğinde mevcut sözcüğü ve imleç konumunu alıp olası adayların listesini döndüren bir yapı ile çalışır
  • Bash: adaylar COMPREPLY dizisine atanır
  • Zsh: adaylar compadd komutuyla kaydedilir
  • _generate_foo_completions işlevi aday dizelerini yazdırır; pratikte bunlar CLI'ın durumuna göre dinamik olarak üretilebilir

Bash ve Zsh'yi aynı anda desteklemek

  • _complete_foo_bash ve _complete_foo_zsh işlevleriyle, her kabuk için ayrı uygulama yapılır
  • Ayırım için if [ -n "${ZSH_VERSION:-}" ]; then ... elif [ -n "${BASH_VERSION:-}" ]; then ... fi kullanılır
  • Kullanıcı, betiği .bashrc ya da .zshrc dosyasına ekledikten sonra etkinleştirir

Zsh'de açıklama gösterme

  • Aday dizelerinde ad: açıklama biçimi kullanılır
  • Zsh: ad ve açıklamayı paralel diziler halinde iletmek için compadd -d raw -- $trimmed kullanılır
  • Bash: yalnızca açıklama kısmı kaldırılmış adaylar COMPREPLY'e verilir (varsayılan olarak açıklama desteği yoktur)

Bash'te açıklama uygulamak

  • Birden fazla aday varsa, açıklama içeren dizeler olduğu gibi gösterilir
  • Yalnızca tek aday varsa açıklama kaldırılır
  • Bash'in yalnızca ortak öneki ekleyen otomatik tamamlama davranışından yararlanılarak, açıklamanın gerçek girdiye eklenmemesi sağlanır

Tek adayda da açıklama göstermek

  • Tamamlanmış bir sözcükte <TAB> basıldığında da açıklamayı göstermek için sahte aday eklenerek bilerek belirsizlik oluşturulur
  • Zsh: hem raw hem de trimmed adlı iki paralel diziye sahte aday eklenir
  • Bash: tek aday durumunda trimmed içine yalnızca ad eklenir

Nihai sonuç

  • Birden fazla aday olduğunda hem ad hem açıklama gösterilir
  • Tek aday olduğunda bile <TAB> ile açıklama görülebilir
  • Hem Bash hem de Zsh aynı deneyimi sunar
  • Uygulama örneği:
    $ foo <TAB>  
    apple: a common fruit banana: starchy and high in potassium  
    apricot: sour fruit... cherry: small and sweet...  
    

Henüz yorum yok.

Henüz yorum yok.