기존 zsh 완성 기능을 확장하는 방법은 무엇입니까?

기존 zsh 완성 기능을 확장하는 방법은 무엇입니까?

일부 사용자 정의 개미 매개변수에 대해 자동 완성을 추가하려고 합니다. 그러나 이는 내가 유지하려는 기존 oh my zsh ant 플러그인 자동 완성 기능을 재정의하는 것 같습니다. 내 zsh 플러그인이 내 사용자 정의 개미 자동 완성 기능과 조화롭게 작동하도록 하는 쉬운 방법이 있습니까?

기존 플러그인입니다~/.oh-my-zsh/plugins/ant/ant.plugin.zsh

_ant_does_target_list_need_generating () {
  [ ! -f .ant_targets ] && return 0;
  [ build.xml -nt .ant_targets ] && return 0;
  return 1;
}

_ant () {
  if [ -f build.xml ]; then
    if _ant_does_target_list_need_generating; then
        ant -p | awk -F " " 'NR > 5 { print lastTarget }{lastTarget = $1}' > .ant_targets
    fi
    compadd -- `cat .ant_targets`
  fi
}

compdef _ant ant

내 자동완성 시간은~/my_completions/_ant

#compdef ant

_arguments '-Dprop=-[properties file]:filename:->files' '-Dsrc=-[build directory]:directory:_files -/'
case "$state" in
    files)
        local -a property_files
        property_files=( *.properties )
        _multi_parts / property_files
        ;;
esac

이것은 내 것입니다 $fpath. 내 완료 경로가 목록의 앞에 있으므로 내 스크립트가 우선순위를 갖는 것 같습니다.

/Users/myusername/my_completions /Users/myusername/.oh-my-zsh/plugins/git /Users/myusername/.oh-my-zsh/functions /Users/myusername/.oh-my-zsh/completions /usr/local/share/zsh/site-functions /usr/share/zsh/site-functions /usr/share/zsh/5.0.8/functions

답변1

가장 좋은 방법은 완성 기능을 확장하는 것이라고 생각합니다. 다음을 수행할 수 있습니다. https://unix.stackexchange.com/a/450133

먼저 기존 함수의 이름을 찾아야 합니다. 이를 위해 _complete_helpCTRL-h(또는 다른 단축키)를 바인딩한 다음 명령을 입력하고 완성 함수를 찾을 수 있습니다. 다음은 git에서 실행하는 예입니다.

% bindkey '^h' _complete_help  
% git [press ctrl-h]
tags in context :completion::complete:git::
    argument-1 options  (_arguments _git)
tags in context :completion::complete:git:argument-1:
    aliases main-porcelain-commands user-commands third-party-commands ancillary-manipulator-commands ancillary-interrogator-commands interaction-commands plumbing-manipulator-commands plumbing-interrogator-commands plumbing-sync-commands plumbing-sync-helper-commands plumbing-internal-helper-commands  (_git_commands _git)

이 경우 완성 함수는 입니다 _git. 다음으로 .zshrc다음과 같이 재정의 할 수 있습니다 .

# Call the function to make sure that it is loaded.
_git 2>/dev/null
# Save the original function.
functions[_git-orig]=$functions[_git]
# Redefine your completion function referencing the original.
_git() {
    _git-orig "$@"
    ...
}

compdef이미 함수에 바인딩되어 있고 함수 정의만 변경했으므로 다시 호출할 필요가 없습니다 .

관련 정보