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