Saya memiliki skrip penyelesaian tab Bash untuk Apache's Hadoop. Biasanya, saya menggunakan zsh sebagai shell sehari-hari. Ini cenderung seperti pesta ketika saya membutuhkannya, tetapi sepertinya sistem penyelesaian tab sangat berbeda di antara mereka. Apakah ada cara sederhana untuk "mengubah" definisi penyelesaian-tab-bash yang ada agar berfungsi di zsh? Saya tidak ingin menginvestasikan banyak waktu dalam hal ini, tetapi jika itu mudah, saya akan menghemat sedikit usaha.
sumber
/etc/zsh/zshrc
. Juga, periksa file-file berikut dalam urutan terbalik (tercantum dalam urutan mereka bersumber pada startup zsh):/etc/zsh/zshenv
,$ZDOTDIR/.zshenv
,/etc/zsh/zprofile
dan$ZDOTDIR/.zprofile
(mungkin~/.zprofile
) untuk melihat apakahRCS
variabel diset. Jika ya, itu akan mencegah file berikutnya setelah file yang tidak disetel untuk bersumber. Terakhir, periksa shell untuk pengguna masuk/etc/passwd
dan pastikan ituzsh
dan pastikan tidak ada-f
argumen.autoload bashcompinit bashcompinit source /path/to/your/bash_completion_file
sumber
complete:13: command not found: compdef
kesalahan.if is-bash
centang di bagian atas._get_comp_words_by_ref
yang tidak ditentukan olehbashcompinit
. Kebanyakan penyelesaian tidak menggunakan fungsi ini.autoload -U +X compinit && compinit autoload -U +X bashcompinit && bashcompinit source /path/to/your/bash_completion_script
Saya menjalankan zsh
zsh 5.0.2 (x86_64-apple-darwin13.0)
tanpa ~ / .zshrc dan urutan di atas bekerja di shell zsh yang baru saja muncul.Terima kasih kepada skrip git-complete.bash untuk petunjuknya: D
Baca terus untuk detail lebih lanjut tentang 3 baris di atas:
Bash memiliki mengagumkan di dibangun dukungan penyelesaian otomatis tetapi script bash autocomplete tidak bekerja secara langsung zsh sebagai lingkungan zsh tidak memiliki autocomplete pesta penting fungsi pembantu suka
compgen
,complete
. Itu dilakukan dalam upaya untuk menjaga sesi zsh cepat.Saat ini zsh dikirimkan dengan skrip penyelesaian yang sesuai seperti
compinit
danbashcompinit
yang memiliki fungsi yang diperlukan untuk mendukung skrip pelengkapan otomatis bash.autoload <func_name>
: Perhatikan bahwa muat otomatis didefinisikan dalam zsh dan bukan bash.autoload
mencari file bernama di jalur direktori yang dikembalikan olehfpath
perintah dan menandai fungsi untuk memuat yang sama saat pertama kali dipanggil.Misalnya pada
echo $fpath
pengembalian sistem saya/usr/share/zsh/site-functions
dan/usr/share/zsh/5.0.5/functions
dan keduanyacompinit
danbashcompinit
tersedia di/usr/share/zsh/5.0.5/functions
.Juga bagi kebanyakan orang mungkin hanya
autoload -U +X bashcompinit && bashcompinit
diperlukan karena beberapa skrip lain seperti git autocomplete atau milik mereka sendiri~/.zshrc
mungkin dilakukanautoload -U +X compinit && compinit
, tetapi aman untuk menjalankan keduanya saja.sumber
-U
dan+X
untuk apa?+X foo
melakukan pemuatan otomatis yang sama seperti pemanggilanfoo
, tetapi tanpa segera mengeksekusinya… jadiautoload +X foo && foo
tampaknya sangat berlebihan. Bisakah Anda menjelaskan mengapa Anda memilih pola ini?autoload -U +X bashcompinit && bashcompinit
adalah (karena&&
) itu akan mengeksekusibashcompinit
IFF modul benar-benar ditemukan. Normalautoload foo
selalu mengembalikan nilai true. Nanti, ketika Anda mencoba untuk menjalankanfoo
, maka zsh akhirnya memberitahu Anda "file definisi fungsi tidak ditemukan". Denganautoload +X
Anda segera dapatkan kesalahan.autoload +X
memuat fungsi tanpa menjalankannya - yang lebih dari yangautoload
dilakukan, tanpa+X
. Tanpa+X
, muat otomatis bahkan tidak memuat fungsi; Ini hanya menandai nama sebagai referensi fungsi yang akan dimuat nanti. Pemuatan sebenarnya tidak dilakukan hingga fungsi tersebut dipanggil pertama kali. Jika Anda ingin menentukan apakah fungsi bernama berhasil dimuat, Anda perlu menggunakan+X
untuk melakukan langkah pemuatan segera.Untuk
zsh
digunakan:compdef
compadd
Contoh saya:
# 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
Sumber: Kode saya https://github.com/reduardo7/bashx
sumber
Saya menjalankan Antigen sebagai pengelola plugin Oh-My-Zsh. Saya memiliki beberapa skrip penyelesaian bash yang ditulis oleh rekan kerja yang ingin saya muat ke Zsh dengan sederhana
source /path/to/completion
.Saya mengalami beberapa masalah, karena sepertinya Antigen atau OMZ (sulit untuk dikatakan) menyangkut diri mereka sendiri dengan hanya memuat skrip penyelesaian dari plugin mereka. Saya akhirnya menyiasati ini dengan pemuatan otomatis
bashcompinit
dancompinit
setelahnyaantigen apply
. Pemuatan otomatisbashcompinit
saja tidak cukup.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
Antigen membuat
.zcompdump
file$ANTIGEN_COMPDUMP
yang bagi saya adalah~/.antigen/.zcompdump
Memanggil ulang compinit dan bashcompinit membuat .zcompdump kedua di
$HOME/.zcompdump
Yang tampaknya untuk semua pekerjaan keluar, karena saya dapat menggunakan penyelesaian yang didirikan oleh
/path/to/bash_completion
. Saya telah menghapus kedua file .zcompdump beberapa kali untuk memastikan mereka dibuat ulang dan tampaknya berfungsi.Saya harus meng-rm file .zcompdump beberapa kali setelah reboot mesin karena kesalahan terjadi saat mencoba menyelesaikan tab, tetapi saya tidak yakin apakah itu karena pengaturan ini atau sesuatu yang lain.
rm ~/.zcompdump && rm $ANTIGEN_COMPDUMP
dan shell baru memperbaikinya untuk saya.Versi yang digunakan pada saat penulisan:
sumber
Jawaban @ JatinKumar membuat saya di jalur yang benar, tetapi saya harus menggunakan
complete
sebagai gantinyasource
. Jadi semuanya: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
sumber