Bash sekmesi tamamlama komut dosyası zsh'da kullanılabilir mi?


87

Apache'nin Hadoop'u için bir Bash sekme tamamlama komut dosyam var. Normalde, zsh'ı günlük kabuğum olarak kullanırım. İhtiyaç duyduğumda oldukça bash gibi olma eğilimindedir, ancak sekme tamamlama sistemleri aralarında kökten farklı gibi görünüyor. Mevcut bash-tab tamamlama tanımlarını zsh'da çalışmak üzere "dönüştürmenin" basit bir yolu var mı? Buna çok fazla zaman ayırmak istemiyorum, ancak kolaysa, makul bir çaba harcamak isterim.

Yanıtlar:


39

Gönderen bu sayfayı (2010/01/05 tarihli):

Zsh, bash tamamlama işlevlerini işleyebilir. Zsh'ın en son geliştirme sürümü, çalıştırıldığında zsh'nin bash tamamlama özelliklerini ve işlevlerini okumasına izin veren bir bashcompinit işlevine sahiptir. Bu, zshcompsys kılavuz sayfasında belgelenmiştir. Bunu kullanmak için yapmanız gereken tek şey compinit'ten sonra herhangi bir zamanda bashcompinit'i çalıştırmaktır. Bash yerleşiklerine karşılık gelen tam ve compgen işlevleri tanımlayacaktır.


İyi haber: Bunun işe yarayacağını düşünüyorum, bu yüzden çok teşekkürler. Kötü haber: bazı nedenlerden dolayı, bunu yapmaya çalıştığım sistem SSH ile oturum açtığımda / etc / zshrc yüklemiyor gibi görünüyor. Giriş süreci hakkında durumun neden böyle olduğunu anlatacak kadar bilgim yok. Belki başka bir soru sorma zamanı ...
Coderer

1
@Coderer: Öncelikle "/ etc / zshrc" diyorsunuz. Sistemimde öyle /etc/zsh/zshrc. Ayrıca, (onlar zsh başlatma sırasında kaynaklı sırayla listelenmiştir) ters sırada aşağıdaki dosyaları kontrol edin: /etc/zsh/zshenv, $ZDOTDIR/.zshenv, /etc/zsh/zprofileve $ZDOTDIR/.zprofile(muhtemelen ~/.zprofilevarsa) görmek için RCSdeğişkeni kaldırılır. Öyleyse, ayarlanmadığı dosyadan sonraki sonraki dosyaların kaynaklanmasını engeller. Son olarak, kullanıcının kabuğunu kontrol edin /etc/passwdve olduğundan emin olun zshve bir -fargümanı olmadığından emin olun .
Dennis Williamson

Tüm geri bildirimler için teşekkürler - 1 numaralı klasik programcı hack'ine, "standart hata ayıklamaya" (her başlangıç ​​komut dosyasındaki yankı ifadeleri) başvurdum ve sorunu buldum. Bazı nedenlerden dolayı, / etc / zprofile dosyamız çeşitli /etc/profile.d betiklerinden kaynaklanıyordu ve bunlar daha sonra / etc / zshrc içinde yeniden kaynaklanıyordu . Otomatik yükleme deyimlerini / etc / zprofile'ın üstüne taşımak sorunu çözdü.
Coderer

158
autoload bashcompinit
bashcompinit
source /path/to/your/bash_completion_file

10
Size bashcompinit'i nasıl kullanacağınızı söylediği için bu daha iyi bir cevap . İyi iş.
pyrospade

5
Teşekkürler, harika cevap, maalesef betik _init_completion bash komutunu kullanıyorsa bu işe yaramaz.
0fnt

6
Bu benim için işe yaramadı. Hâlâ complete:13: command not found: compdefhata alıyordum .
Jatin Kumar

Çalışmazsa, komut dosyasını kontrol edin (doh :)) - if is-bashüstte bir kontrol olabilir .
olejorgenb

Bu, _get_comp_words_by_reftarafından tanımlanmayan bazı betiklerde çalışmaz bashcompinit. Ancak çoğu tamamlama bu işlevi kullanmaz.
Franklin Yu

41
autoload -U +X compinit && compinit
autoload -U +X bashcompinit && bashcompinit
source /path/to/your/bash_completion_script

~ / .Zshrc olmadan zsh çalıştırıyorumzsh 5.0.2 (x86_64-apple-darwin13.0) ve yukarıdaki sıra yeni üretilmiş bir zsh kabuğunda çalıştı.

İpucu için git-complete.bash betiğine teşekkürler: D


Yukarıdaki 3 satırla ilgili daha fazla ayrıntı için okumaya devam edin:

Bash inşa oto tamamlama desteğinde müthiş var ama Zsh ortamı yardımcı fonksiyonları gibi temel bash otomatik tamamlama sahip olmadığından bash otomatik tamamlama komut doğrudan çalışma zsh yok compgen,complete . Bunu zsh oturumunu hızlı tutmak için yapar.

Bu günlerde zsh, compinitve gibi uygun tamamlama komut dosyalarıyla birlikte gönderilir.bashcompinit destek bash otomatik tamamlama komut için gerekli işlevlere sahiptir.

autoload <func_name>: Otomatik yüklemenin bash değil zsh içinde tanımlandığını unutmayın. komut autoloadtarafından döndürülen dizin yollarında adlandırılmış bir dosya arar fpathve ilk çağrıldığında aynı şeyi yüklemek için bir işlevi işaretler.

  • -U: compinit veya bashcompinit gibi bir işlevi yüklerken tüm takma adları yok sayın
  • + X: Sadece adlandırılmış işlevi şimdi yükleyin ve çalıştırmayın

Benim sistem üzerinde Örneğin echo $fpathdönüşleri /usr/share/zsh/site-functionsve /usr/share/zsh/5.0.5/functionshem compinitve bashcompinitmevcuttur /usr/share/zsh/5.0.5/functions.

Ayrıca çoğu insan için yalnızca autoload -U +X bashcompinit && bashcompinitgerekli olabilir çünkü git autocomplete veya kendi komutları gibi bazı komut dosyası çalışıyor ~/.zshrcolabilir autoload -U +X compinit && compinit, ancak ikisini birden çalıştırmak güvenlidir.


Ne var -Uve ne +Xiçin?
jmk

Daha fazla ayrıntıyla güncellenmiş yanıt.
Jatin Kumar

6
Bu hala biraz mantıklı; manpage +X foo, aynı otomatik yüklemeyi yalnızca çağırmanın fooyaptığı, ancak hemen çalıştırmadan yapmanın noktasını açıklar … bu yüzden autoload +X foo && footamamen gereksiz görünüyor. Bu kalıbı neden seçtiğinizi açıklayabilir misiniz?
ELLIOTTCABLE

2
@ELLIOTTCABLE Yapmanın autoload -U +X bashcompinit && bashcompinitamacı, (nedeniyle &&) IFF'yi yürütecek bashcompinitolan modül fiilen bulunur. Normal autoload fooher zaman doğru döndürür. Daha sonra koşmaya çalıştığınızdafoo , o zaman zsh nihayet bulunamadı "fonksiyonu tanım dosyası" söyler. İle autoload +Xsize hemen hatası alıyorum.
FeRD

1
Man sayfası bu noktada hala biraz belirsiz, bana öyle geliyor: autoload +Xişlevi çalıştırmadan yüklüyor - ki bu, yapmadan daha fazlasını autoloadyapıyor +X. Olmadan +X, özdevinimli_yükle bile gelmez işlevi yüklemek; Yalnızca adı daha sonra yüklenecek bir işleve atıfta bulunuyor olarak işaretler. Gerçek yükleme, işlev ilk kez çağrılana kadar denenmez. Adlandırılmış işlevin başarıyla yüklenip yüklenmediğini belirlemek istiyorsanız +X, yükleme adımını hemen gerçekleştirmeniz gerekir .
FeRD

4

İçin zshKullanım:

  • compdef
  • compadd

Örneğim:

# bash completion for bxrun (/home/ecuomo/projects/bashx/bxrun)
_bxrun_methods() {
    grep "^\s*\(function\s\+\)\?__.\+()\s*{.*$" "${1}" | while read line ; do
        echo "$line" | sed "s/()\s*{.*//g" | sed "s/\s*\(function\s\+\)\?__//g"
    done
}
_bxrun_lst() {
    if [ -d "/home/ecuomo/projects/bashx/src/actions" ]; then
        for f in /home/ecuomo/projects/bashx/src/actions/* ; do
            if [ -f "${f}" ]; then
                basename "${f}" | sed 's/\..*$//g'
            fi
        done
    fi
    _bxrun_methods "/home/ecuomo/projects/bashx/bxrun"
    _bxrun_methods "/home/ecuomo/projects/bashx/src/bashx.sh"
}
_bxrun() {
    local cur
    COMPREPLY=()
    cur=${COMP_WORDS[COMP_CWORD]}
    COMPREPLY=( $( compgen -W '$( _bxrun_lst )' -- $cur  ) )
}
_bxrun_zsh() {
    compadd `_bxrun_lst`
}
if type complete >/dev/null 2>/dev/null; then
    # bash
    complete -F _bxrun bxrun
else if type compdef >/dev/null 2>/dev/null; then
    # zsh
    compdef _bxrun_zsh bxrun
fi; fi

Kaynak: Kodum https://github.com/reduardo7/bashx


1
Bağlantılı bashx çerçevesinin yazarı olduğunuzu açıklamalısınız.
Ben

4

Ben çalıştırıyorum Antigen bir Oh-My-Zsh eklenti yöneticisi olarak. İş arkadaşlarım tarafından yazılan ve Zsh'a basit bir şekilde yüklemek istediğim birkaç bash tamamlama komut dosyam vardı.source /path/to/completion .

Biraz sorun yaşadım, çünkü Antigen ya da OMZ (söylemesi zor) kendi eklentilerinden yalnızca tamamlama komut dosyalarını yüklemekle ilgileniyor gibi görünüyor. Sonunda bunu otomatik olarak yükleyerek bashcompinit ve compinit sonrasındaantigen apply . Basitçe otomatik yükleme bashcompinityeterli değildi.

source ~/.antigen/antigen.zsh
antigen use oh-my-zsh
antigen apply

autoload -U +X compinit && compinit
autoload -U +X bashcompinit && bashcompinit

source /path/to/bash_completion

Antijen, kendi .zcompdump dosyayı $ANTIGEN_COMPDUMPbenim için hangi~/.antigen/.zcompdump

Compinit ve bashcompinit öğelerinin yeniden çağrılması, adresinde ikinci bir .zcompdump oluşturur. $HOME/.zcompdump

Öyle görünüyor , çünkü ben tarafından kurulan tamamlamaları kullanabiliyorum /path/to/bash_completion. Yeniden oluşturulduklarından ve çalıştıklarından emin olmak için her iki .zcompdump dosyasını birkaç kez sildim.

Sekme tamamlamaya çalışırken atılan hatalar nedeniyle bir makine yeniden başlatıldıktan sonra .zcompdump dosyalarını birkaç kez incelemek zorunda kaldım, ancak bunun bu kurulumdan mı yoksa başka bir şeyden mi kaynaklandığından emin değilim. rm ~/.zcompdump && rm $ANTIGEN_COMPDUMPve benim için yeni bir kabuk düzeltiyor.

Yazma sırasında kullanılan sürümler:

Antigen = v2.2.3 = d3d4ee0
Oh-my-zsh = c3b072e
Zsh = 5.3

0

@ JatinKumar'ın cevabı beni doğru yolda tuttu, ancak completebunun yerine kullanmak zorunda kaldım source. Yani hep birlikte:

autoload -Uz compinit && compinit
autoload -U +X bashcompinit && bashcompinit

complete -C /usr/local/bin/terraform terraform
complete -C /usr/local/aws/bin/aws_completer aws
complete -C /usr/local/bin/az az
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.