Apache의 Hadoop에 대한 Bash 탭 완성 스크립트가 있습니다. 일반적으로 zsh를 일상적인 셸로 사용합니다. 내가 필요로 할 때 꽤 bash 같은 경향이 있지만 탭 완성 시스템이 근본적으로 다른 것처럼 보입니다. zsh에서 작동하도록 기존 bash-tab-completion 정의를 "변환"하는 간단한 방법이 있습니까? 나는 이것에 많은 시간을 투자하고 싶지 않지만 그것이 쉽다면 적당량의 노력을 절약 할 것입니다.
답변:
에서 이 페이지 (2010/01/05 일자) :
Zsh는 bash 완료 기능을 처리 할 수 있습니다. zsh의 최신 개발 버전에는 bashcompinit 함수가 있으며 실행시 zsh가 bash 완료 사양 및 함수를 읽을 수 있습니다. 이것은 zshcompsys 매뉴얼 페이지에 설명되어 있습니다. 이를 사용하려면 compinit 후 언제든지 bashcompinit를 실행하면됩니다. bash 내장에 해당하는 complete 및 compgen 함수를 정의합니다.
/etc/zsh/zshrc
. 또한, (그들은 zsh을 시작하는 동안 공급되는 순서대로 나열) 역순으로 다음 파일을 확인하십시오 /etc/zsh/zshenv
, $ZDOTDIR/.zshenv
, /etc/zsh/zprofile
그리고 $ZDOTDIR/.zprofile
(아마도이 ~/.zprofile
경우 생성)를 참조하는 RCS
변수가 설정이다. 그럴 경우 설정되지 않은 파일 이후의 후속 파일이 소싱되지 않습니다. 마지막으로 사용자의 쉘을 확인 /etc/passwd
하고 확실히 그것의 확인 zsh
있는지 그것이없는하게 -f
인수를.
autoload bashcompinit
bashcompinit
source /path/to/your/bash_completion_file
complete:13: command not found: compdef
오류 가 발생했습니다.
if is-bash
상단에 확인 표시 가있을 수 있습니다 .
_get_comp_words_by_ref
의해 정의되지 않은 일부 스크립트에서는 작동하지 않습니다 bashcompinit
. 대부분의 완성은이 기능을 사용하지 않습니다.
autoload -U +X compinit && compinit
autoload -U +X bashcompinit && bashcompinit
source /path/to/your/bash_completion_script
zsh 5.0.2 (x86_64-apple-darwin13.0)
~ / .zshrc없이 zsh 를 실행 하고 있으며 위의 시퀀스는 새로 생성 된 zsh 셸에서 작동했습니다.
힌트에 대한 git-completion.bash 스크립트 덕분에 : D
Bash는 내장 된 자동 완성 지원 기능이 훌륭하지만 bash 자동 완성 스크립트는 zsh 환경에 compgen
, 같은 필수 bash 자동 완성 도우미 기능이 없기 때문에 zsh에서 직접 작동하지 않습니다 complete
. zsh 세션을 빠르게 유지하기 위해 그렇게합니다.
요즘 zsh에는 bash 자동 완성 스크립트를 지원하는 데 필요한 기능이있는 compinit
및 같은 적절한 완료 스크립트가 함께 제공됩니다 bashcompinit
.
autoload <func_name>
: 자동로드는 bash가 아닌 zsh에 정의되어 있습니다. 명령에 autoload
의해 반환 된 디렉토리 경로에서 이름이 지정된 파일을 찾고 fpath
처음 호출 될 때 동일하게로드 할 함수를 표시합니다.
내 시스템에 예를 들어 echo $fpath
수익률 /usr/share/zsh/site-functions
과 /usr/share/zsh/5.0.5/functions
모두 compinit
와 bashcompinit
에서 확인할 수 있습니다/usr/share/zsh/5.0.5/functions
.
또한 대부분의 사람들은 autoload -U +X bashcompinit && bashcompinit
git autocomplete와 같은 다른 스크립트 또는 자신의 스크립트 ~/.zshrc
가 수행 할 수 있기 때문에 필요할 수 autoload -U +X compinit && compinit
있지만 둘 다 실행하는 것이 안전합니다.
-U
과 +X
하시나요?
+X foo
단지 호출하는 것과 동일한 자동 로딩을 수행 하는 요점을 설명 foo
하지만 즉시 실행하지 않고… autoload +X foo && foo
완전히 중복 된 것처럼 보입니다. 이 패턴을 선택한 이유를 설명해 주시겠습니까?
autoload -U +X bashcompinit && bashcompinit
(때문에 &&
) bashcompinit
모듈이 실제로 발견되는 IFF 를 실행한다는 것 입니다. Normal은 autoload foo
항상 true를 반환합니다. 당신이 실행하려고하면 나중에 foo
, 다음 zsh을 마침내 "을 (를) 찾을 수 없습니다 함수 정의 파일"을 알려줍니다. 함께 autoload +X
하면 즉시 오류가 발생합니다.
autoload +X
부하를 실행하지 않고 기능 -이다 더 이상 autoload
하지 않고, 수행을 +X
. 없이는 +X
자동 로드가 함수를로드 하지도 않습니다 . 나중에로드 할 함수를 참조하는 것으로 이름을 표시 할뿐입니다. 실제 로딩은 함수가 처음 호출 될 때까지 시도되지 않습니다. 명명 된 함수가 성공적으로 로드 되었는지 확인 하려면를 사용 +X
하여 즉시로드 단계를 수행 해야 합니다.
에 대한 zsh
사용 :
compdef
compadd
내 예 :
# 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
출처 : 내 코드 https://github.com/reduardo7/bashx
저는 Antigen 을 Oh-My-Zsh 플러그인 관리자로 실행하고 있습니다. 동료가 작성한 몇 가지 bash 완료 스크립트가있어서 간단한 source /path/to/completion
.
나는 Antigen 또는 OMZ (말하기 어려운)가 플러그인에서 완료 스크립트 만로드하는 것에 관심이있는 것처럼 보이기 때문에 약간의 문제가있었습니다. 나는 마지막으로 자동 로딩에 의해이 문제를 가지고 bashcompinit
와 compinit
후 antigen apply
. 단순히 자동 로딩 bashcompinit
만으로는 충분하지 않았습니다.
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은 다음 위치에 .zcompdump
파일을 생성 합니다.$ANTIGEN_COMPDUMP
나를 위해~/.antigen/.zcompdump
compinit 및 bashcompinit를 다시 호출하면 다음 위치에 두 번째 .zcompdump가 생성됩니다. $HOME/.zcompdump
내가 설정 한 완성을 사용할 수 있기 때문에 모든 것이 잘되는 것 같습니다./path/to/bash_completion
. 두 .zcompdump 파일을 몇 번 삭제하여 파일이 재생성되고 작동하는지 확인했습니다.
탭 완료를 시도 할 때 발생하는 오류로 인해 컴퓨터 재부팅 후 .zcompdump 파일을 몇 번 RM해야했지만 이것이이 설정 때문인지 다른 이유인지 확실하지 않습니다. rm ~/.zcompdump && rm $ANTIGEN_COMPDUMP
새로운 셸이이를 수정합니다.
작성 당시 사용 된 버전 :
Antigen = v2.2.3 = d3d4ee0
Oh-my-zsh = c3b072e
Zsh = 5.3
JatinKumar의 대답 @ 바른 길에 저를 가지고,하지만 난 사용했다 complete
대신 source
. 따라서 모두 함께 :
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