- 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ç
Henüz yorum yok.