Bash ve Zsh'de basit sekme otomatik tamamlama yazmak
(mill-build.org)- 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_completionsile üretilir; Bash'teCOMPREPLY, Zsh'te isecompaddile 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
COMPREPLYdizisine atanır - Zsh: adaylar
compaddkomutuyla kaydedilir _generate_foo_completionsiş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_bashve_complete_foo_zshiş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 ... fikullanılır - Kullanıcı, betiği
.bashrcya da.zshrcdosyasına ekledikten sonra etkinleştirir
Zsh'de açıklama gösterme
- Aday dizelerinde
ad: açıklamabiçimi kullanılır - Zsh: ad ve açıklamayı paralel diziler halinde iletmek için
compadd -d raw -- $trimmedkullanı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
rawhem detrimmedadlı iki paralel diziye sahte aday eklenir - Bash: tek aday durumunda
trimmediç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...
1 yorum
Hacker News görüşü
fish_update_completionsçalıştırmanız yeterli~/.cache/fish/generated_completions/içine oluştururcurliçin-L→ 'Follow redirects',-O→ 'Write output to file named as remote file'car TABifadesininblkdiscardolarak genişlemesine yol açan önek dışı otomatik tamamlama yüzünden, cargo PATH'te olmasa bile yanlış çalışabilmesi keşke iyileştirilse--helpsunan programlarda, fish'te zsh'deki_gnu_genericya da bash'tekicomplete -F _longoptbenzeri bir özellik olup olmadığını merak ediyorumzypper search fish-completionyazınca 200'den fazla paket çıkması bana biraz şüpheli gelmişticomplete-filenamegibi, bağlamı yok sayıp yalnızca dosya adını tamamlayan işlevler varlsile tamamlayıp sonra komutu değiştirerek bunu aşıyorumcomplete -rçalıştırdıktan sonra her şeyin istediğim gibi davrandığını görünce, sorunun bash-completion betiklerinde olduğunu düşünüyorum$fpathiçine kurarsanız önbelleğe alınır ve başlangıç hızı artar_gnu_genericile--helptabanlı basit tamamlama yapılabiliyor--generateseçeneği, PHP Symfony'de çalışma anında tamamlama üretimi gibi örnekler var--completionstandardı olsa güzel olurducomplete_kill_1dizisine sinyal adlarını koyarsanızkillkomutunun ilk argümanı için tamamlama sağlanırset-java-homeişlevinde~/apps/java/*listesini sürüm olarak tamamlamak için_describekullanılıyor