Завершение Bash для разделенных от запятой значений

Это говорит что, потому что это - одно из общих названий для того типа таблицы разделов (основанное на MBR разделение), который все еще широко используется на ПК.
Эта схема относится ко времени 1983 и IBM PC DOS согласно Википедии, и имя "Разделы DOS" придерживалось с тех пор.

16
14.04.2014, 20:10
1 ответ

Исправить описанные проблемы практически невозможно, потому что bash использует значения в COMPREPLY непосредственно на дисплее, а затем для замены пользовательского текста - в то время как для того, чтобы получить то, что вы хотите, вам нужно сначала сгенерировать возможные завершения (только дополнительные имена серверов, без префикса) для отображения bash, затем, когда bash собирается заменить пользовательский текст на самую длинную не конфликтующую строку, вам нужно, чтобы он снова вызвал ваш скрипт для генерации текста с префиксом - и bash не имеет подсказки для этого.

Лучшее, что я смог придумать, это чтобы COMPREPLY генерировалось только с первым словом, имеющим весь префикс (COMPREPLY=("${prefix},"$(compgen -W "${servers[@]}" -- ${realcur}))), так что если есть только одно возможное завершение, то оно завершается автоматически корректно, в то время как если есть более одного возможного завершения, тогда bash не удалит то, что было набрано до сих пор (потому что первое слово в COMPREPLY имеет весь префикс и, таким образом, совпадает с текущим набранным текстом и будет выбрано bash для замены пользовательского текста) и отобразит опции без префикса - за исключением одного слова, которое уже содержит префикс, так что вывод будет выглядеть следующим образом:

$ command -s banana,a
ananas     apricot    banana,apple

"apple" как отсортированное последним в опциях завершения, потому что оно несет префикс, который начинается с "b" - очень запутанно. Поэтому я не рекомендую это делать.

Что касается дубликатов - чтобы не показывать дубликаты, нужно просто разбить $prefix на его часть (просто: IFS="," prefix_parts=($prefix)), а затем провести над ними итерацию и оставить в $servers только те имена, которые еще не перечислены. Это утомительно для ввода, поэтому я не буду показывать это здесь, но относительно тривиально, так что я уверен, что вы можете управлять :-).

Подводя итог, я не думаю, что вы должны использовать значения, разделенные запятыми для входных опций, по крайней мере, если вы ожидаете, что bash поможет вам с завершением.

Вы можете поддерживать такой формат опций: команда -s [ [...] ]], а затем для завершения записей, отличных от той, что сразу после опции -s, просто просканируйте обратно через массив $COMP_WORDS из $COMP_CWORD, пока не найдете опцию (строка, которая совпадает с -*), а если ее "-s", то нужно будет выполнить завершение имени сервера.

.
6
27.01.2020, 19:49

Теги

Похожие вопросы