Mam skrypt uzupełniania kart Bash dla Hadoop Apache. Zwykle używam zsh jako mojej powłoki na co dzień. Wydaje się, że jest całkiem podobny do basha, kiedy tego potrzebuję, ale wygląda na to, że systemy uzupełniania zakładek są między nimi radykalnie różne. Czy istnieje prosty sposób na „konwersję” istniejących definicji uzupełniania bash-tab do pracy w zsh? Nie chcę inwestować w to mnóstwa czasu, ale gdyby było to łatwe, zaoszczędziłbym trochę wysiłku.
źródło
/etc/zsh/zshrc
. Należy także sprawdzić następujące pliki w odwrotnej kolejności (wymienione w kolejności, w jakiej są pozyskiwane podczas uruchamiania zsh)/etc/zsh/zshenv
,$ZDOTDIR/.zshenv
,/etc/zsh/zprofile
oraz$ZDOTDIR/.zprofile
(prawdopodobnie~/.zprofile
), aby sprawdzić, czyRCS
zmienna jest ustawiona. Jeśli tak, uniemożliwiłoby to pobieranie kolejnych plików po pliku, w którym nie jest ustawiony. Na koniec sprawdź, czy w powłoce znajduje się użytkownik,/etc/passwd
i upewnijzsh
się, że nie ma-f
argumentu.autoload bashcompinit bashcompinit source /path/to/your/bash_completion_file
źródło
complete:13: command not found: compdef
błąd.if is-bash
check na górze._get_comp_words_by_ref
które nie są zdefiniowane przezbashcompinit
. Większość uzupełnień nie używa jednak tej funkcji.autoload -U +X compinit && compinit autoload -U +X bashcompinit && bashcompinit source /path/to/your/bash_completion_script
Uruchamiam zsh
zsh 5.0.2 (x86_64-apple-darwin13.0)
bez ~ / .zshrc i powyższa sekwencja działała w świeżo utworzonej powłoce zsh.Dzięki skryptowi git-complete.bash za podpowiedź: D
Czytaj dalej, aby uzyskać więcej informacji na temat powyższych 3 wierszy:
Bash ma niesamowite wsparcie w wybudowanym zakończenia auto ale skrypty bash autouzupełniania nie działają bezpośrednio zsh zsh jako środowisko nie mają istotnego bash autouzupełniania funkcje pomocnicze podoba
compgen
,complete
. Robi to, aby sesja zsh była szybka.Obecnie zsh jest dostarczany z odpowiednimi skryptami ukończenia, takimi jak
compinit
i,bashcompinit
które mają wymagane funkcje do obsługi skryptów autouzupełniania bash.autoload <func_name>
: Zauważ, że automatyczne ładowanie jest zdefiniowane w zsh, a nie w bash.autoload
szuka pliku o nazwie w ścieżkach katalogów zwróconych przezfpath
polecenie i zaznacza funkcję, która ma załadować to samo, gdy jest po raz pierwszy wywoływana.Na przykład w moim systemie
echo $fpath
zwraca/usr/share/zsh/site-functions
i/usr/share/zsh/5.0.5/functions
i obacompinit
ibashcompinit
są dostępne/usr/share/zsh/5.0.5/functions
.Również dla większości ludzi może to być
autoload -U +X bashcompinit && bashcompinit
wymagane tylko dlatego, że jakiś inny skrypt, taki jak autouzupełnianie git lub ich własny,~/.zshrc
może działaćautoload -U +X compinit && compinit
, ale można bezpiecznie po prostu uruchomić oba z nich.źródło
-U
i+X
do czego?+X foo
jakim robi to samo automatyczne ładowanie, co tylko wywołaniefoo
, ale bez natychmiastowego wykonania tego…autoload +X foo && foo
wydaje się więc całkowicie zbędne. Czy możesz wyjaśnić, dlaczego wybrałeś ten wzór?autoload -U +X bashcompinit && bashcompinit
to, że (ze względu na&&
) wykonabashcompinit
IFF faktycznie znaleziony moduł. Normalnyautoload foo
zawsze zwraca prawdę. Później, gdy próbujesz uruchomićfoo
, a następnie zsh wreszcie powie „funkcja plik definicji nie znaleziono”. Dziękiautoload +X
temu natychmiast otrzymasz błąd.autoload +X
podręcznika jest nadal nieco niejasna w tej kwestii: ładuje funkcję bez jej wykonywania - co jest więcej niżautoload
bez niej+X
. Bez+X
autoloada nawet nie wczytuje funkcji; Po prostu oznacza nazwę jako odwołującą się do funkcji, która ma zostać załadowana później. Rzeczywiste ładowanie nie jest podejmowane, dopóki funkcja nie zostanie po raz pierwszy wywołana. Jeśli chcesz ustalić, czy nazwana funkcja została pomyślnie załadowana, musisz użyć jej+X
do natychmiastowego wykonania kroku ładowania.Do
zsh
użycia:compdef
compadd
Mój przykład:
# 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
Źródło: Mój kod https://github.com/reduardo7/bashx
źródło
Używam programu Antigen jako menedżera wtyczek Oh-My-Zsh. Miałem kilka skryptów ukończenia basha napisanych przez współpracowników, które chciałem załadować do Zsh za pomocą prostego
source /path/to/completion
.Miałem pewne problemy, ponieważ wydaje się, że albo Antigen, albo OMZ (trudno powiedzieć) zajmują się tylko ładowaniem skryptów uzupełniania z ich wtyczek. W końcu udało mi się to obejść przez automatyczne ładowanie
bashcompinit
icompinit
późniejantigen apply
. Samo automatyczne ładowaniebashcompinit
nie wystarczyło.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
Antygen tworzy swój
.zcompdump
plik w$ANTIGEN_COMPDUMP
którym był dla mnie~/.antigen/.zcompdump
Ponowne wywołanie compinit i bashcompinit powoduje utworzenie drugiego pliku .zcompdump w
$HOME/.zcompdump
Że wydaje się , aby wszystko się uda, bo jestem w stanie wykorzystać uzupełnień utworzonych przez
/path/to/bash_completion
. Kilka razy usunąłem oba pliki .zcompdump, aby upewnić się, że zostały ponownie wygenerowane i wydają się działać.Musiałem kilka razy rmować pliki .zcompdump po ponownym uruchomieniu komputera z powodu błędów wyświetlanych podczas próby zakończenia zakładki, ale nie jestem pewien, czy to z powodu tej konfiguracji, czy czegoś innego.
rm ~/.zcompdump && rm $ANTIGEN_COMPDUMP
a nowa powłoka naprawia to za mnie.Wersje używane w czasie pisania:
źródło
Odpowiedź @ JatinKumar zaprowadziła mnie na właściwą ścieżkę, ale
complete
zamiast tego musiałem użyćsource
. Więc wszyscy razem: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
źródło