각 매개변수를 다르게 자동 완성하려면 어떻게 해야 합니까?

각 매개변수를 다르게 자동 완성하려면 어떻게 해야 합니까?

다음과 같이 정의된 load_pg라는 함수가 있습니다.

load_pg () {
    pg_restore --verbose --clean --no-acl --no-owner -h localhost -U $1 -d $2 $3
}

다음 코드를 사용하여 각 매개변수를 자동 완성하려고 합니다.

#compdef load_pg
_arguments -s \
  "1::_ldpguser" \
  "2::_ldpgdb" \
  "3::_ldpgfile"

_ldpguser () {
  compadd $USER
}

_ldpgdb () {
  compadd $(cat config/database.yml | grep -i database | awk '{print $2}')
}

_ldpgfile () {
  compadd $(ls *.dump*)
}

불행히도 TAB을 눌러도 아무 일도 일어나지 않습니다. 내가 뭘 잘못했나요? 나는 사용해 보았다.아래 답변

답변1

_arguments첫 번째 장애물: 의 매개변수 구문은 null을 허용하지 않습니다. 메시지를 추가하면 다음과 같은 진행 상황을 볼 수 있습니다.n:message:actionmessage

_arguments -s \
  "1:username:_ldpguser" \
  "2:database:_ldpgdb" \
  "3:dump file:_ldpgfile"

다음 장애물은 도우미 함수가 _arguments실행 후에 정의된다는 점입니다. 따라서 처음 매개 변수가 완료되면 함수 중 하나가 존재하지 않는다는 오류 메시지가 표시됩니다. 기능을 사용하기 전에 정의하세요. 더 나은 방법은 함수 정의를 명시적으로 만들고 _load_pg자동 로드 파일 끝에서 호출하는 것입니다. 이것은 서투른 것처럼 보일 수 있지만 zsh와 함께 제공되는 대부분의 다목적 완성 기능이 작성되는 방식입니다.

#compdef load_pg

_ldpguser () {
  compadd $USER
}

_ldpgdb () {
  compadd $(cat config/database.yml | grep -i database | awk '{print $2}')
}

_ldpgfile () {
  compadd $(ls *.dump*)
}

_load_pg () {
  _arguments -s \
    "1:user:_ldpguser" \
    "2:database:_ldpgdb" \
    "3:dump file:_ldpgfile"
}

_load_pg "$@"

이는 기능의 핵심을 제공합니다. 그런 다음 개별 기능을 정리해야 합니다. 최저 한도에서:

  • compadd $USER무의미해 보입니다. 사용자 이름으로 함수를 호출하고 싶다면 그냥 빌드해 보는 것이 어떨까요? 사용자 이름을 완성하려면 을 호출하세요 _users.
  • 명령 대체는 모든 공백을 대체합니다. 선을 분할하려면 @다음을 사용하세요.f 매개변수 확장 플래그. 또한 명령을 더 정확하게 만들어야 하며 grep와 결합할 수도 있습니다 grep.
  • compadd에서 작업을 호출 할 때 _arguments의 컨텍스트 옵션을 전달합니다 $expl.
  • 완료에 대한 설명을 제공해야 할 수도 있습니다._describe.
  • $(ls *.dump*)*.dump*" 일치하는 항목이 없으면 현재 쉘 설정에 따라 작업을 수행하십시오"라고 작성하는 복잡한 방법입니다 .출력을 구문 분석하지 않습니다.ls,어 허? 당신이 사용할 수있는N 글로벌 예선일치하는 항목이 없으면 빈 완료 목록이 있습니다. 그러나 전화를 하셔야 합니다._files다른 세부 사항 중에서도 하위 디렉터리의 파일을 완성하는 일을 담당합니다.
#compdef load_pg

_ldpgdb () {
  compadd $expl[@] -- "${(@f)$(<config/database.yml grep -i database | awk '{print $2}')}"
}

_load_pg () {
  _arguments -s \
    '1:user:_users' \
    '2:database:_ldpgdb' \
    '3:dump file:_files -g "*.dump*"'
}

_load_pg "$@"

관련 정보