내가 가진 사용자 정의 zsh을 기능g :
function g() {
  # Handle arguments [...]
}
그 안에서 Git 명령을 실행하는 짧은 인수를 처리합니다. 예를 들면 다음과 같습니다.
g ls # Executes git ls-files ...
g g  # Executes git grep ...
짧은 인수에 대해 자동 완성 규칙을 Git의 규칙으로 설정할 수 있어야하지만이 작업을 수행하는 방법을 잘 모르겠습니다.
예를 들어, 다음과 같은 인수를 제공 g ls <TAB>하는 규칙을 탭 완성 해야 합니다 .git ls-files <TAB>git ls-files
$ g ls --<TAB>
--abbrev                 -- set minimum SHA1 display-length
--cached                 -- show cached files in output
--deleted                -- show deleted files in output
# Etc...
내 사용자 지정 짧은 명령을 Git 명령에 매핑 g하기 git때문에 단순히 자동 완성으로 설정되지 않습니다 .
답변
나는 /usr/share/zsh/functions/Completion/Unix/_git이것과 같은 별칭에 대한 몇 가지 팁을 발견 하고 별칭에 대해 이러한 함수를 정의하게되었습니다.
_git-ls () {
  # Just return the _git-ls-files autocomplete function
  _git-ls-files
}
그런 다음 똑바로했다 compdef g=git. 예를 들어, 자동 완성 시스템은 실행 중임을 확인 g ls하고 _git-ls자동 완성 기능을 사용합니다 .
올바른 방향으로 나를 조종 해 준 user67060에게 감사합니다.
답변
나는 매우 비슷한 일을해야했기 때문에 이것이 문제를 해결 해야하는 대략적인 것입니다.
_g () {
    case "${words[2]}" in
      ls) words[1,2]=(git ls-files);;
      g) words[1,2]=(git grep);;
      *) return 1;;
    esac
    _git # Delegate to completion
}
compdef _g g
한 가지 주목할 점은 인수 수를 변경하면 $CURRENT변수 를 조정해야한다는 것 입니다.
답변
이것이 내가 할 일입니다.
_tg () {
    local _ret=1
    local cur cword prev
    cur=${words[CURRENT]}
    prev=${words[CURRENT-1]}
    cmd=${words[2]}
    let cword=CURRENT-1
    case "$cmd" in
    ls)
        emulate ksh -c _git_ls_files
        ;;
    g)
        emulate ksh -c _git_grep
        ;;
    esac
    let _ret && _default && _ret=0
    return _ret
}
compdef _tg tg
그러나 이것은 zsh의 완료가 아닌 Git의 완료를 사용합니다.
https://git.kernel.org/cgit/git/git.git/tree/contrib/completion/git-completion.zsh