다음과 같이 정의된 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:action
message
_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 "$@"