Tôi đang cố gắng viết các chức năng hoàn thành cho một số chức năng tùy chỉnh mà tôi đã viết, nhưng dường như đang thực sự vật lộn với ngay cả những chức năng cơ bản nhất.
Một chức năng ví dụ là:
function eb_instances() {
if [ "$#" -ne 2 ]; then
echo "Usage eb_instances <aws profile name> <environment name>"
echo "e.g.:"
echo " eb_instances production kraken-prod-api"
return 1
fi
aws ec2 describe-instances --filters "Name=instance-state-name,Values=running" "Name=tag:Name,Values=$2" --profile=$1 --output=json | jq -r ".Reservations[].Instances[].PrivateIpAddress"
}
Điều này có hai đối số vị trí, <aws profile name>
và<environment name>
Tôi muốn các tùy chọn hoàn thành <aws profile name>
sẵn sàng tự động bằng cách chạy
sed -n -E 's/\[([a-zA-Z0-9_\-]+)\]/\1/p' ~/.aws/credentials | tr \\n ' '
và các hoàn thành <environment name>
sẽ có sẵn bằng cách chạy một chức năng khác mà tôi đã gọi eb_names
.
Tôi đang tìm tài liệu khá thưa thớt và khó theo dõi. Tôi cũng đã thấy repo zsh-hoàn thành cho các lệnh tương tự nhưng dường như không thể tìm thấy thứ gì đó tương tự với những gì tôi cần.
Bất kỳ trợ giúp bắt đầu sẽ được nhiều đánh giá cao!
Cập nhật
Dựa trên câu trả lời của @ cuonglm , tôi đã sử dụng:
#compdef ebinstances
_ebinstances() {
local state
_arguments \
'1: :->aws_profile'\
'*: :->eb_name'
case $state in
(aws_profile) _arguments '1:profiles:($(sed -n -E "s/\[([a-zA-Z0-9_\-]+)\]/\1/p" ~/.aws/credentials | tr \\n " "))' ;;
(*) compadd "$@" foo bar
esac
}
_ebinstances "$@"
Điều tôi quên đề cập đến trong câu hỏi ban đầu là, tôi cũng muốn việc hoàn thành đối số thứ hai phụ thuộc vào đối số thứ nhất (cả hai đều dựa trên mã thực thi một số mã), ví dụ:
$ eb_instances <cursor>TAB
cuonglm test
được hoàn thành tôi muốn. Khi tôi chọn nói câu đầu tiên và cố gắng tự động hoàn thành:
$ eb_instances cuonglm <cursor>TAB
Tôi muốn tạo các tùy chọn hoàn thành bằng cách thực thi eb_names cuonglm
, và nếu có thể, cũng vậy, hãy đi sâu vào các phần hoàn thành, ví dụ nếu ứng viên chính xác là foo-bar
,
$ eb_instances cuonglm foo<cursor>TAB
Tôi muốn tạo các tùy chọn hoàn thành bằng cách thực hiện eb_names cuonglm foo
cuonglm test
đến từsed -n -E 's/\[([a-zA-Z0-9_\-]+)\]/\1/p' ~/.aws/credentials | tr \\n ' '