Apache의 Hadoop에 대한 Bash 탭 완성 스크립트가 있습니다. 일반적으로 zsh를 일상적인 셸로 사용합니다. 내가 필요로 할 때 꽤 bash 같은 경향이 있지만 탭 완성 시스템이 근본적으로 다른 것처럼 보입니다. zsh에서 작동하도록 기존 bash-tab-completion 정의를 “변환”하는 간단한 방법이 있습니까? 나는 이것에 많은 시간을 투자하고 싶지 않지만 그것이 쉽다면 적당량의 노력을 절약 할 것입니다.
답변
에서 이 페이지 (2010/01/05 일자) :
Zsh는 bash 완료 기능을 처리 할 수 있습니다. zsh의 최신 개발 버전에는 bashcompinit 함수가 있으며 실행시 zsh가 bash 완료 사양 및 함수를 읽을 수 있습니다. 이것은 zshcompsys 매뉴얼 페이지에 설명되어 있습니다. 이를 사용하려면 compinit 후 언제든지 bashcompinit를 실행하면됩니다. bash 내장에 해당하는 complete 및 compgen 함수를 정의합니다.
답변
autoload bashcompinit
bashcompinit
source /path/to/your/bash_completion_file
답변
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
위의 3 줄에 대한 자세한 내용은 다음을 참조하세요.
Bash는 내장 된 자동 완성 지원 기능이 훌륭하지만 bash 자동 완성 스크립트는 zsh 환경에 compgen
, 같은 필수 bash 자동 완성 도우미 기능이 없기 때문에 zsh에서 직접 작동하지 않습니다 complete
. zsh 세션을 빠르게 유지하기 위해 그렇게합니다.
요즘 zsh에는 bash 자동 완성 스크립트를 지원하는 데 필요한 기능이있는 compinit
및 같은 적절한 완료 스크립트가 함께 제공됩니다 bashcompinit
.
autoload <func_name>
: 자동로드는 bash가 아닌 zsh에 정의되어 있습니다. 명령에 autoload
의해 반환 된 디렉토리 경로에서 이름이 지정된 파일을 찾고 fpath
처음 호출 될 때 동일하게로드 할 함수를 표시합니다.
- -U : compinit 또는 bashcompinit와 같은 함수를로드 할 때 별칭을 무시합니다 .
- + X : 명명 된 함수 fow를 지금로드하고 실행하지 마십시오.
내 시스템에 예를 들어 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
있지만 둘 다 실행하는 것이 안전합니다.
답변
에 대한 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