/ / Sekme tamamlandığında joker karakteri genişletme - zsh, joker karakterler, sekme tamamlama

Sekme tamamlandığında joker karakteri genişletme - zsh, joker karakterler, sekme tamamlama

zsh

Nasıl yapılandırabileceğimi merak ediyorum zsh için değil joker karakteri bir dosya adıyla genişletin. Örneğin ben aşağıdaki gibi birkaç yüz dosya bir dizin var:

a.foo-bar a.foo b.foo-bar b.foo c.foo-bar c.foo

Sekme tamamlama eşleşmesi yapabilmek istiyorum sonra joker karakter, yani

cat *.foo-< tab > => cat *.foo-bar

Bunun yerine ne olsun:

$ cat * .foo- => kedi a.foo-bar
dosya
a.foo-bar b.foo-bar c.foo-bar

Yanıtlar:

Cevap için 6 № 1

Bir seçenek, varsayılan anahtar bağlayıcısını TAB anahtar

bindkey "^I" expand-or-complete

ile

bindkey "^I" complete-word

hangi bir genişletmek olmaz * eşleşen tüm dosyalara, ancak yıldızı dokunmadan bırakır. Bu şekilde sonsuz listeden kurtulursunuz, ancak yine de globbing ifadesini tamamlamayacaktır.

Bunu çözmek çok daha zordur. Kendi yazman gerek tamamlama widget'ı (görmek man zshcompwid).

  1. "Tanımıyla başlayalım:

    zle -C complete-glob menu-complete compglob
    

    Bu, yeni widget'ı tanıtır tam-globgibi davranıyor Menü tamamlama ve kullanır kabuk işlevi compglob eşleşmeleri oluşturmak için.

    [Not: Menünün tamamlanmasını istemiyorsanız, çok daha temel seçenekleri kullanın tam kelime veya list-seçimler ]

  2. Bu yeni widget'ı aşağıdaki gibi uygun bir kısayola bağlayın CTRL+K:

    bindkey "^K" complete-glob
    

    Bunu buna bağlamayın TAB, mevcut haliyle widget sadece dosyaları tamamlar gibi!

  3. Kabuk işlevini tanımlama compglob asıl işi yapan aşağıdaki gibi:

    compglob () {
    setopt localoptions globsubst
    compset -P "*"
    files=(${IPREFIX}*)
    display=(${files/${IPREFIX}/${(q)IPREFIX}})
    glob=(${files/${IPREFIX}/})
    compadd -d display -- $glob
    }
    
  4. gösteri:

    $ touch a.foo-bar a.foo b.foo-bar b.foo c.foo-bar c.foo
    $ cat *.f<CTRL+K>
    $ cat *.foo
    *.foo      *.foo-bar
    

    Gördüğüm tek kusur sunulan listede yıldızın önünde. Ancak, tamamlama doğru olduğu için bu sadece optik bir kusurdur: *.foo veya *.foo-bar.


Cevap için 0 № 2

Bunun mümkün olduğunu düşünmüyorum. Kabuktan yalnızca hangi dosyaları yaptığınızı anlamanızın yanı sıra "joker karakter genişletmenize göre geçerli" olmak istemediğinizi, ancak kabuğun genişletilecek "en iyi" joker karakter ifadesini bulmasını istediğinizi bu yoldan. İkinci bölümün NP-tamamlanmış olmasını beklerdim.


Cevap için 0 № 3

Ben henüz sonra ne oldukça alabilirsiniz "bir yol görmüyorum", ama (bu sizin için yararlı olabilir veya olmayabilir) biraz değişiklik alabilirsiniz setopt GLOB_COMPLETE (bu size yalnızca bir genişletme sağlar ve ardından bunlar arasında geçiş yapabilirsiniz ... veya yalnızca * en azından küçük bir gelişme olabilir).

Ayrıca, man zshoptions, man zshcompctl, man zshcompwid ve / veya benzeri. Zsh için tamamlama şeyler oldukça karmaşık, bu yüzden bunu yapmak için bir yol olabilir tahmin ediyorum.

Ayrıca, biraz ilgili bir soruya dikkat edin:

Bash gibi joker karakterleri tamamlamak için zsh'nin otomatik tamamlamasını nasıl alabilirim?


İlgili sorular
Yorumlar
Yorum ekle