각 매개변수를 다른 방식으로 자동 완성하려면 어떻게 해야 합니까?

각 매개변수를 다른 방식으로 자동 완성하려면 어떻게 해야 합니까?

다음과 같이 정의된 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입니다 . 메시지를 추가하면 다음과 같은 진행 상황을 볼 수 있습니다.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 "$@"

관련 정보