Bash 탭 완성 스크립트를 zsh에서 사용할 수 있습니까?


87

Apache의 Hadoop에 대한 Bash 탭 완성 스크립트가 있습니다. 일반적으로 zsh를 일상적인 셸로 사용합니다. 내가 필요로 할 때 꽤 bash 같은 경향이 있지만 탭 완성 시스템이 근본적으로 다른 것처럼 보입니다. zsh에서 작동하도록 기존 bash-tab-completion 정의를 "변환"하는 간단한 방법이 있습니까? 나는 이것에 많은 시간을 투자하고 싶지 않지만 그것이 쉽다면 적당량의 노력을 절약 할 것입니다.

답변:


39

에서 이 페이지 (2010/01/05 일자) :

Zsh는 bash 완료 기능을 처리 할 수 ​​있습니다. zsh의 최신 개발 버전에는 bashcompinit 함수가 있으며 실행시 zsh가 bash 완료 사양 및 함수를 읽을 수 있습니다. 이것은 zshcompsys 매뉴얼 페이지에 설명되어 있습니다. 이를 사용하려면 compinit 후 언제든지 bashcompinit를 실행하면됩니다. bash 내장에 해당하는 complete 및 compgen 함수를 정의합니다.


좋은 소식 :이게 효과가있을 것 같아서 정말 감사합니다. 나쁜 소식 : 어떤 이유로이 작업을 수행하려는 시스템이 SSH를 통해 로그인 할 때 / etc / zshrc를로드하지 않는 것 같습니다. 나는 이것이 왜 그런지 말할 수있는 로그인 과정에 대해 충분히 알지 못한다. 다른 질문을 할 시간이 될 수도 있습니다.
Coderer

1
@Coderer : 우선 "/ etc / zshrc"라고 말합니다. 내 시스템에서는 /etc/zsh/zshrc. 또한, (그들은 zsh을 시작하는 동안 공급되는 순서대로 나열) 역순으로 다음 파일을 확인하십시오 /etc/zsh/zshenv, $ZDOTDIR/.zshenv, /etc/zsh/zprofile그리고 $ZDOTDIR/.zprofile(아마도이 ~/.zprofile경우 생성)를 참조하는 RCS변수가 설정이다. 그럴 경우 설정되지 않은 파일 이후의 후속 파일이 소싱되지 않습니다. 마지막으로 사용자의 쉘을 확인 /etc/passwd하고 확실히 그것의 확인 zsh있는지 그것이없는하게 -f인수를.
추후 공지가있을 때까지 일시 중지되었습니다.

모든 피드백에 감사드립니다. 저는 1 위의 고전적인 프로그래머 해킹 인 "stdout 디버깅"(각 시작 스크립트의 에코 문)을 사용하여 문제를 발견했습니다. 어떤 이유로 우리의 / etc / zprofile은 다양한 /etc/profile.d 스크립트를 소싱하고 있었는데, 그 스크립트 는 / etc / zshrc 에서 다시 소싱 되었습니다 . autoload 문을 / etc / zprofile의 맨 위로 이동하기 만하면 문제가 해결되었습니다.
Coderer 2010

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

10
이것은 bashcompinit을 사용 하는 방법 을 알려 주기 때문에 더 나은 대답 입니다. 좋은 작업.
pyrospade

5
감사합니다. 좋은 답변입니다. 불행히도 스크립트가 _init_completion bash 명령을 사용하는 경우 작동하지 않습니다.
0fnt

6
이것은 나를 위해 작동하지 않았습니다. 여전히 complete:13: command not found: compdef오류 가 발생했습니다.
Jatin Kumar 2015 년

작동하지 않으면 스크립트를 확인하십시오 (doh :))- if is-bash상단에 확인 표시 가있을 수 있습니다 .
olejorgenb

_get_comp_words_by_ref의해 정의되지 않은 일부 스크립트에서는 작동하지 않습니다 bashcompinit. 대부분의 완성은이 기능을 사용하지 않습니다.
Franklin Yu

39
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모두 compinitbashcompinit에서 확인할 수 있습니다/usr/share/zsh/5.0.5/functions .

또한 대부분의 사람들은 autoload -U +X bashcompinit && bashcompinitgit autocomplete와 같은 다른 스크립트 또는 자신의 스크립트 ~/.zshrc가 수행 할 수 있기 때문에 필요할 수 autoload -U +X compinit && compinit있지만 둘 다 실행하는 것이 안전합니다.


무엇 -U+X하시나요?
jmk

자세한 내용으로 답변을 업데이트했습니다.
Jatin 쿠마

6
이것은 여전히 ​​의미가 없습니다. 맨 페이지는 +X foo단지 호출하는 것과 동일한 자동 로딩을 수행 하는 요점을 설명 foo하지만 즉시 실행하지 않고… autoload +X foo && foo완전히 중복 된 것처럼 보입니다. 이 패턴을 선택한 이유를 설명해 주시겠습니까?
ELLIOTTCABLE

2
@ELLIOTTCABLE 요점은 autoload -U +X bashcompinit && bashcompinit(때문에 &&) bashcompinit모듈이 실제로 발견되는 IFF 를 실행한다는 것 입니다. Normal은 autoload foo항상 true를 반환합니다. 당신이 실행하려고하면 나중에 foo, 다음 zsh을 마침내 "을 (를) 찾을 수 없습니다 함수 정의 파일"을 알려줍니다. 함께 autoload +X하면 즉시 오류가 발생합니다.
FeRD

1
남자 페이지가 그 시점에 여전히 다소 명확하지 않다, 그것은 나에게 보인다 autoload +X부하를 실행하지 않고 기능 -이다 이상 autoload하지 않고, 수행을 +X. 없이는 +X자동 로드가 함수를로드 하지도 않습니다 . 나중에로드 할 함수를 참조하는 것으로 이름을 표시 할뿐입니다. 실제 로딩은 함수가 처음 호출 될 때까지 시도되지 않습니다. 명명 된 함수가 성공적으로 로드 되었는지 확인 하려면를 사용 +X하여 즉시로드 단계를 수행 해야 합니다.
FeRD

4

에 대한 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


1
링크 된 bashx 프레임 워크의 작성자임을 공개해야합니다.
Ben

4

저는 Antigen 을 Oh-My-Zsh 플러그인 관리자로 실행하고 있습니다. 동료가 작성한 몇 가지 bash 완료 스크립트가있어서 간단한 source /path/to/completion.

나는 Antigen 또는 OMZ (말하기 어려운)가 플러그인에서 완료 스크립트 만로드하는 것에 관심이있는 것처럼 보이기 때문에 약간의 문제가있었습니다. 나는 마지막으로 자동 로딩에 의해이 문제를 가지고 bashcompinit compinitantigen 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

0

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.