Завершение команды AWS CLI с помощью fish shell

Кто-нибудь смог настроить автозаполнение для интерфейса командной строки AWS с помощью fish shell? Документация AWS предлагает руководство только для bash, tcsh и zsh.

Bash экспортирует переменные COMP_LINE и COMP_POINT, используемые скриптом aws_completer, предоставленным Amazon. Есть ли аналог для рыбы? Я новичок в рыбных панцирях, и я попробую.


person Osi    schedule 17.11.2014    source источник
comment
Fish поддерживает завершение с помощью собственного complete. Подробнее об этом читайте в разделе Написание собственных дополнений. Я не настраивал AWS CLI для Fish, но для внешний вид вам нужно будет написать свой собственный файл завершения. См. здесь для примера того, как писать дополнения.   -  person Jorge Bucaran    schedule 06.01.2015


Ответы (6)


Опираясь на ответы Дэвида Русселя, я приготовил следующее:

function __fish_complete_aws
    env COMP_LINE=(commandline -pc) aws_completer | tr -d ' '
end

complete -c aws -f -a "(__fish_complete_aws)"

Поместите это в файл $HOME/.config/fish/completions/aws.fish, чтобы рыба могла автоматически загружать его при необходимости.

aws_completer добавляет пробел после каждого параметра, который он печатает, и он экранируется как \, поэтому его обрезка решает обратную косую черту.

Теперь мы можем проверить завершение следующим образом:

> complete -C'aws co'
codebuild
codecommit
codepipeline
codestar
cognito-identity
cognito-idp
cognito-sync
comprehend
comprehendmedical
connect
configure
configservice

Использование commandline -c помогает, если вы перемещаете курсор назад, поскольку он обрезает командную строку в месте курсора, поэтому aws_completer может предлагать правильные завершения.

person tmichel    schedule 21.11.2019

Я также хочу заставить его работать, и я добился некоторого прогресса, но он не идеален.

Сначала я смотрю некоторые советы от здесь, который помогает понять, как эмулировать переменные среды bash, которые ожидает as_completer.

Собирая это, я получаю следующее:

complete -c aws -f -a '(begin; set -lx COMP_SHELL fish; set -lx COMP_LINE (commandline); /usr/local/bin/aws_completer; end)'

В основном это работает, но я получаю ложные дополнительные косые черты, поэтому, если я попытаюсь выполнить «aws ec2 description-instances --», я получаю:

dave@retino ~> aws ec2 describe-instances --
--ca-bundle\             --color\          --filters\               --no-dry-run\        --output\      --region\
--cli-connect-timeout\   --debug\          --generate-cli-skeleton  --no-paginate\       --page-size\   --starting-token\
--cli-input-json\        --dry-run\        --instance-ids\          --no-sign-request\   --profile\     --version\
--cli-read-timeout\      --endpoint-url\   --max-items\             --no-verify-ssl\     --query\

Мне кажется, что есть завершающий пробельный символ, но я попытался удалить его с помощью sed:

complete -c aws -f -a '(begin; set -lx COMP_SHELL fish; set -lx COMP_LINE (commandline); echo (/usr/local/bin/aws_completer | sed -e \'s/[ ]*//\') ; end)'

Но это, похоже, не помогает. Кажется, что fish ожидает другой формат вывода, чем bash, поскольку он более полный. И действительно, прореживание рыбы для полной встроенной функции говорит, что она ожидает разделения пробелами список.

Итак, я попытался соединить строки с помощью xargs:

complete -c aws -f -a '(begin; set -lx COMP_SHELL fish; set -lx COMP_LINE (commandline); echo (/usr/local/bin/aws_completer | sed -e \'s/[ ]*//\') | xargs echo ; end)'

Но и это не работает. Я получаю только одно завершение

Это раздражает, я так близко, но это не работает!

person David Roussel    schedule 07.01.2016
comment
@ridiculous_fish у тебя есть идеи по этому поводу? - person David Roussel; 07.01.2016
comment
Новый вопрос? Насколько мне известно, пингование кого-либо под вашим ответом, как указано выше, делает их слепыми к этому факту. - person Drew; 07.01.2016
comment
Использование sed для удаления завершающего пробельного символа сработало для меня, но вы не хотите использовать вспомогательную оболочку fish при этом, поскольку это приводит к объединению вывода в один гигантский аргумент. Это сработало для меня: complete --command aws --no-files --arguments '(begin; set --local --export COMP_SHELL fish; set --local --export COMP_LINE (commandline); /usr/local/bin/aws_completer | sed \'s/ $//\'; end)' - person scooter-dangle; 05.04.2016

Хотя предоставленный ответ не дает прямого ответа на вопрос об использовании fish; Я намерен дать ответ, чтобы помочь в контексте auto-completion и shell.

Amazon запустил новый инструмент на основе командной строки, основанный на AWSCLI.

aws-shell — это программа оболочки командной строки, которая обеспечивает удобство и производительность, помогая как новым, так и опытным пользователям интерфейса командной строки AWS. Ключевые особенности включают следующее.

Нечеткое автозаполнение

  • Команды (например, ec2, description-instances, sms, create-queue)
  • Опции (например, --instance-ids, --queue-url)
  • Идентификаторы ресурсов (например, идентификаторы инстансов Amazon EC2, URL-адреса очередей Amazon SQS, названия тем Amazon SNS) введите здесь описание изображения

Динамическая встроенная документация

  • Документация по командам и параметрам отображается по мере ввода введите здесь описание изображения

Выполнение команд оболочки ОС

введите здесь описание изображения

person Naveen Vijay    schedule 05.01.2016

Добавьте эту строку в свой .config/fish/config.fish

complete --command aws --no-files --arguments '(begin; set --local --export COMP_SHELL fish; set --local --export COMP_LINE (commandline); aws_completer | sed \'s/ $//\'; end)'

Если вы хотите убедиться, что aws-cli установлен:

test -x (which aws_completer); and complete --command aws --no-files --arguments '(begin; set --local --export COMP_SHELL fish; set --local --export COMP_LINE (commandline); aws_completer | sed \'s/ $//\'; end)'

Все кредиты принадлежат этой теме проблем и комментарию замечательного участника SO @ скутер-мотаться.

person aitchkhan    schedule 15.05.2020
comment
Могу подтвердить, это работает. - person BeepDog; 15.03.2021

На самом деле можно сопоставить завершение bash с завершением fish.

См. дополнения npm.

Однако, наверное, все же лучше написать настоящий рыбный скрипт (это несложно!).

person faho    schedule 29.09.2015

Команда, которую я использую в своем virtualenv/bin/activate, такова:

complete -C aws_completer aws

Похоже, aws-cli тоже поддерживает рыбу. Существует встроенный установщик, поставляемый с aws-cli, который, возможно, стоит проверить: activate.fish. Я нашел его в том же каталоге bin, что и команда aws.

Например:

ubuntu@ip-xxx-xx-x-xx:/data/src$ tail -n1 ~/venv/bin/activate
complete -C aws_completer aws
ubuntu@ip-xxx-xx-x-xx:/data/src$ source ~/venv/bin/activate
(venv) ubuntu@ip-xxx-xx-x-xx:/data/src$ aws s3         <- hitting TAB here
cp        ls        mb        mv        presign   rb        rm        sync      website
(venv) ubuntu@ip-xxx-xx-x-xx:/data/src$ aws s3
person systemjack    schedule 29.03.2016
comment
@cig0 отлично работает для меня. Добавлен пример вывода, показывающий нажатие табуляции в строке 4 после aws s3. Может быть, что-то с вашим окружением. - person systemjack; 03.05.2019