LINUX.ORG.RU

поясните про bash completion

 , ,


0

2

Есть питонопрограмма. И я хочу для нее сделать чтобы в ней работал bash completion по табу.

Написание отдельного скрипта для bash - единственный вариант, или же есть возможность встроить это в саму программу, чтобы при нажатии таба она вызывалась с специальной переменной окружения, и возвращала возможные автодополнения?

Я гуглил-гуглил, но как то не нашел второго варианта(

★★★★★

Последнее исправление: cvs-255 (всего исправлений: 1)

не нужно. ты для своего инструмента autocompletion сделаешь, а тысячи других разработчиков нет.

в итоге твоим autocompletion'ом никто не пользуется, чтобы не расслабляться и не привыкать к хорошему.

Ъ-консольщики используют Ctrl + R для поиска по истории команд, когда они хотят повторить ту или иную команду, с изменёнными параметрами.

лучше напиши --help к инструменту, а на рюшечки вроде автодополнения забей.

Spoofing ★★★★★
()

или же есть возможность встроить это в саму программу, чтобы при нажатии таба она вызывалась с специальной переменной окружения, и возвращала возможные автодополнения?

Можно написать отдельный скрипт, который будет вызывать программу, которая уже будет делать автодополнение. Пример (::cursor:: добавляется чтобы можно было учесть пробелы перед курсором, с этим были какие-то проблемы).

xaizek ★★★★★
()

Тут всякие ретрограды со стокгольмским синдромом говорят

в итоге твоим autocompletion’ом никто не пользуется, чтобы не расслабляться и не привыкать к хорошему

но ты не верь старым пердунам, они так привыкли, тут так принято. На данный момент, самое нормальное, что я знаю - это кодогенерация на основе построения грамматики. При этом я не знаю аналогов для других языков, кроме хаскелла[1], потому что почти нигде кроме него народ не создаёт декларативное описание грамматики, по которому происходит и разбор аргументов, и кодоген автокомплита. Обычно все фигачат однообразные велосипеды в духе if(argv[i]=='--help'){ или case arg of ..., так что лишь отдельные энтузиасты пишут портянки на баше для автокомплита для самых популярных тулзов типа гита.

В виндовом типизированном powershell есть движение в правильную сторону, но там свои заморочки, и как это портировать - не ясно.

[1] https://github.com/pcapriotti/optparse-applicative/wiki/Bash-Completion

anonymous
()

А что bash знает про питон, чтобы автодополнять параметры? Вот если бы у питона был свой командный шелл, не консольный отладчик, а именно шелл. Тогда он смог бы считывать скрипт до того, как нажмешь ввод, по табу или при совпадении введенной строки с названием, проверять валидность параметров и автодополнять их.

anonymous
()
Ответ на: комментарий от Spoofing

Тысячи уже сделали, а твой один будет без автодополнения…

kardapoltsev ★★★★★
()
Ответ на: комментарий от Zubok

Есть программа. Она принимает аргументы. Хочется чтобы было автодополнение этих аргументов.

Т.е. например python3 process.py image-fix remove-sky infile.npz outfile.npz

И чтобы image-fix и remove-sky не надо было вводить руками до конца

По аналогии с apt i<TAB> bash дополняет до apt install

cvs-255 ★★★★★
() автор топика
Последнее исправление: cvs-255 (всего исправлений: 1)
Ответ на: комментарий от Spoofing

help есть. Просто лениво вводить аргументы вручную

cvs-255 ★★★★★
() автор топика
Ответ на: комментарий от cvs-255

Внутри питона я это костылял через readline. ЕМНИП именно оно за такие вещи отвечает, его и надо гуглить.

AntonI ★★★★
()
Ответ на: комментарий от AntonI

Кажется readline это если ты делаешь программу, которая сама содержит внутри себя командную строку, не?

cvs-255 ★★★★★
() автор топика
Ответ на: комментарий от Spoofing

в итоге твоим autocompletion’ом никто не пользуется

автокомплешином по табу пользуются кажется все пользователи bash

cvs-255 ★★★★★
() автор топика
Ответ на: комментарий от xaizek

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

2021 год на дворе, а для работы автодополнений нужно городить сторонние скрипты…

cvs-255 ★★★★★
() автор топика
Ответ на: комментарий от cvs-255

Это именно CLI.

В баше емнип именно readline отвечает за автокомплит

AntonI ★★★★
()
Ответ на: комментарий от AntonI

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

cvs-255 ★★★★★
() автор топика
Последнее исправление: cvs-255 (всего исправлений: 1)
Ответ на: комментарий от cvs-255

Выше же дали ссылку на argcomplete - будет автокомплит для питон скриптов автоматически. Ещё есть всякие штуки типа compleat которые облегчают генерацию/написание сценариев автодополнения.

pawnhearts ★★★★★
()
Ответ на: комментарий от cvs-255

Есть программа. Она принимает аргументы. Хочется чтобы было автодополнение этих аргументов.

Ну так и надо было в самом начале писать. Поэтому и говорю, что ты не объяснил, что ты хочешь. Все, что здесь советуют - это работа c cli изнутри твоей программы, а не снаружи. Да нет вроде никаких вариантов, только через скрипты в /usr/share/bash-completion/ (или /etc/bash-completion.d/). А как ты себе представляешь твой процесс? Ну вот ты поставил программу и ты ее ни разу не запускал. Откуда bash может узнать, что тебе хочется дополнять и как? По-умолчанию readline только filename дополняет вроде, а остальное надо рассказывать, так как bash телепатией не обладает. Все равно тебе пришлось бы какое-то описание аргументов командной строки с собой еще тянуть, даже если бы такой универсальный механизм был.

Zubok ★★★★★
()

Нужен какой-нибудь питоно-ориентированный шелл, который в реальном времени (условно, каждое нажатие) будет отслеживать клавиатурный ввод, автодополнение параметров и их значений, обрабатывать сочетания клавишь, раскрашивать синтаксис и вести логирование ввода, а-ля PSReadline-модуль из pwsh.

anonymous
()
Ответ на: комментарий от cvs-255

2021 год на дворе, а для работы автодополнений нужно городить сторонние скрипты…

Понятное дело. Оболочка знание о параметрах и правильном синтаксисе из эфира не возьмёт.

xaizek ★★★★★
()
Ответ на: комментарий от cvs-255

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

Не исключаю что это можно сделать и в виде скрипта на питоне. В принципе башу пофик чего запускать если оно должно как то переменные окружения среды настроить или че то на stdout выкинуть

AntonI ★★★★
()
Ответ на: комментарий от cvs-255

Может. Для этого даже есть команда complete

AntonI ★★★★
()
Ответ на: комментарий от cvs-255

Сама по себе не может, так как интерфейс автодополнения построен на переменных окружения. Входные не экпортируются, а выходные невозможно установить извне. Нужен какой-то враппер.

xaizek ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.