fish-shell/share/completions/aws.fish
Mahmoud Al-Qudsi 7ee675afcf Update aws and aws s3 completions
Improve handling of switches interjected between the commands, and
support for completing buckets automatically for secondary+ parameters
to `aws s3`.
2019-07-11 21:22:25 -05:00

274 lines
6.0 KiB
Fish

# These are very much incomplete completions for the aws-cli suite.
# In addition to a complete list of services, the `aws s3` completions are mostly complete
# (and are the primary reason this file exists). The automatically generated completions
# for `aws` via `fish_update_completions` are pretty useless due to non-standard formatting.
function __s3_is_maybe_bucket
commandline -ct | string match -qr -- '^(|s|s3|s3:?/?/?[^/]*)$'
end
function __s3_is_bucket
commandline -ct | string match -q -r -- '^s3:/?/?[^/]*$'
end
function __s3_is_remote_path
commandline -ct | string match -q -r -- "^s3://.+/.*"
end
function __s3_ls_buckets
aws s3 ls | string replace -rf '.* (\S+)$' 's3://$1/'
end
function __s3_ls_dir
set -l dir (commandline -ct | string replace -rf '(s3://.*/).*' '$1')
printf "$dir%s\n" (aws s3 ls $dir 2>/dev/null | string replace -fr '^(:?\S+ +\S+ +\S+ |^.*PRE )(.*)' '$2')
end
# Determines whether the first non-switch argument to `aws s3` was in $argv
# This accounts for things like `aws --debug s3 foo ... s3://...`
function __s3_cmd_in
set -l is_s3 0
set -l tokens (commandline -co)
for token in $tokens[2..-1]
# Ignore switches everywhere
if string match -qr -- "^--" $token
continue
end
# Check if `aws` command is `s3`
if test $is_s3 -eq 0
if string match -q -- "s3" $token
set is_s3 1
continue
else
return 1
end
end
# Check if `aws s3` sub-sub-command is in $argv
if contains $token $argv
return 0
else
return 1
end
end
return 1
end
# Determines whether the first non-switch argument to `aws` was in $argv
function __aws_cmd_in
set -l tokens (commandline -co)
for token in $tokens[2..-1]
if string match -qr "^--" -- $token
# Ignore switches everywhere
continue
else if contains $token $argv
return 0
else
return 1
end
end
return 1
end
# S3 completions
complete -c 'aws' -n "__fish_prev_arg_in s3" -xa "cp mv rm help sync ls mb mv presign rb website"
# When completing a remote path, complete the bucket name first, then based off
# the bucket name, we can complete the path itself.
# Commands that take only remote parameters (cannot operate on local files).
complete -c 'aws' -n "__s3_is_maybe_bucket && __s3_cmd_in ls rb rm" -xa "(__s3_ls_buckets)"
# Commands that can operate on local or remote files. To prevent the shell
# locking up unnecessarily, only complete if no argument was specified or if the
# argument being specified could be an S3 path.
complete -c 'aws' -n "__s3_is_maybe_bucket && __s3_cmd_in mv cp presign mb sync" -a "(__s3_ls_buckets)"
# Complete the paths themselves
complete -c 'aws' -n "__s3_is_remote_path" -xa "(__s3_ls_dir)"
complete -c 'aws' -n "__s3_is_bucket" -xa "(__s3_ls_buckets)"
# This list is extracted from the output of `aws help`, which can't be ingested directly,
# as it emits considerable ANSI output and other terminal control characters.
set -l aws_services \
acm \
acm-pca \
alexaforbusiness \
amplify \
apigateway \
apigatewaymanagementapi \
apigatewayv2 \
application-autoscaling \
appmesh \
appstream \
appsync \
athena \
autoscaling \
autoscaling-plans \
backup \
batch \
budgets \
ce \
chime \
cloud9 \
clouddirectory \
cloudformation \
cloudfront \
cloudhsm \
cloudhsmv2 \
cloudsearch \
cloudsearchdomain \
cloudtrail \
cloudwatch \
codebuild \
codecommit \
codepipeline \
codestar \
cognito-identity \
cognito-idp \
cognito-sync \
comprehend \
comprehendmedical \
configservice \
configure \
connect \
cur \
datapipeline \
datasync \
dax \
deploy \
devicefarm \
directconnect \
discovery \
dlm \
dms \
docdb \
ds \
dynamodb \
dynamodbstreams \
ec2 \
ecr \
ecs \
efs \
eks \
elasticache \
elasticbeanstalk \
elastictranscoder \
elb \
elbv2 \
emr \
es \
events \
firehose \
fms \
fsx \
gamelift \
glacier \
globalaccelerator \
glue \
greengrass \
guardduty \
health \
help \
history \
iam \
importexport \
inspector \
iot \
iot-data \
iot-jobs-data \
iot1click-devices \
iot1click-projects \
iotanalytics \
kafka \
kinesis \
kinesis-video-archived-media \
kinesis-video-media \
kinesisanalytics \
kinesisanalyticsv2 \
kinesisvideo \
kms \
lambda \
lex-models \
lex-runtime \
license-manager \
lightsail \
logs \
machinelearning \
macie \
marketplace-entitlement \
marketplacecommerceanalytics \
mediaconnect \
mediaconvert \
medialive \
mediapackage \
mediastore \
mediastore-data \
mediatailor \
meteringmarketplace \
mgh \
mobile \
mq \
mturk \
neptune \
opsworks \
opsworks-cm \
organizations \
pi \
pinpoint \
pinpoint-email \
pinpoint-sms-voice \
polly \
pricing \
quicksight \
ram \
rds \
rds-data \
redshift \
rekognition \
resource-groups \
resourcegroupstaggingapi \
robomaker \
route53 \
route53domains \
route53resolver \
s3 \
s3api \
s3control \
sagemaker \
sagemaker-runtime \
sdb \
secretsmanager \
securityhub \
serverlessrepo \
servicecatalog \
servicediscovery \
ses \
shield \
signer \
sms \
snowball \
sns \
sqs \
ssm \
stepfunctions \
storagegateway \
sts \
support \
swf \
textract \
transcribe \
transfer \
translate \
waf \
waf-regional \
workdocs \
worklink \
workmail \
workspaces \
xray
complete -c aws -n '__fish_is_first_token' -xa "$aws_services"