Принудительное завершение Bash с помощью обычного табулятора, если интеллектуальное завершение не удается

Принудительное завершение Bash с помощью обычного табулятора, если интеллектуальное завершение не удается

С тех пор, как автодополнение по табуляции стало стандартной функцией в оболочках, я был очень счастливым ее пользователем. Мне даже нравится интеллектуальное автодополнение Bash (где оно ищет только файлы PDF, если я ввожу evince foo<TAB>) — до тех пор, пока оно угадывает правильно.

Счастливый день рушится, когда Bash использует интеллектуальное завершение, чтобы отказаться от завершения.

Сегодня я хотел:

tar xvf centos5.8_x86_1.ova

Итак, я ввел:

tar xvf cent<TAB>

и Bash отказывается завершать путь, потому что .ova-files — это не то, что вы обычно используете с tar.

Я знаю, что я могу удалить пакет bash-completion, чтобы удалить интеллектуальное завершение. Но могу ли я одновременно и съесть свой пирог, и съесть его?

Могу ли я попросить bash сначала использовать интеллектуальное завершение, а если это не поможет, то использовать неинтеллектуальное завершение?

решение1

Следующее должно включить нормальное завершение bash после того, как все «интеллектуальные» завершения не увенчались успехом для программ tar, vim и emacs:

compopt -o bashdefault tar vim emacs

см. такжесоответствующая страницав онлайн-руководстве по bash.

Предупреждение: вы получаете нормальное поведение для типа завершения (команды/имена файлов/имена пользователей и т. д.), определенного интеллектуальным завершением для текущей команды, например, завершение for serviceне будет завершать имена файлов, даже если вы вызовете complete -o bashdefault service.

В этом и других случаях, когда интеллектуальное автодополнение не срабатывает, вы всегда можете нажать Alt-/(или M-/в нотации руководства по bash), чтобы завершитьимена файловпочти так же, как работает TAB, если отключено интеллектуальное завершение (почти так же в том смысле, что M-/не завершает шаблоны вроде *.txt). Смотритездесьдля последовательностей клавиш для других типов завершения, таких как команды и имена пользователей.

решение2

Привет, Оле :-),

Иметь свой пирог и одновременно его есть:

<tab>даст вам лучшее предположение bash о завершении. Как вы знаете, иногда оно бывает неправильным.

Однако M-/( ALT+ SHIFT+ 7(и это слева ALT, а не справа AltGr) на наших датских клавиатурах) принудительно завершит как файл, когда завершение bash не идеально. Поэтому я использую его, M-/когда знаю, что хочу принудительно завершить как файл.

Для меня это лучшее из обоих миров.

решение3

Автодополнение bash — это расширение стандартного автодополнения bash, и само по себе является программой bash. Так что если вы хотите изменить работу программы, просто измените ее. Это бесплатное программное обеспечение, вы можете это сделать. Для конкретного случая команды tarфайл — /usr/share/bash-completion/completions/tar. Для tarавтодополнения файла с расширением ovaпросто добавьте его в строку

local tars='@(@(tar|gem|spkg)?(.@(Z|[gx]z|bz?(2)|lzma))|t@([glx]z|bz?(2)))'

так он говорит

local tars='@(@(tar|gem|spkg|ova)?(.@(Z|[gx]z|bz?(2)|lzma))|t@([glx]z|bz?(2)))'

Обратите внимание, что это путь и код, существующие для Debian Wheezy (текущая стабильная версия). Другой дистрибутив или версия могут иметь другой код, но идея та же. Откройте код и настройте его так, чтобы он делал то, что вы хотите.

Редактировать: Я только что заметил, что вопрос был о каждом случае, когда не находит совпадений, а не только о конкретном случае добавления ovaк tar. Возможно, это все еще может быть полезно кому-то, чтобы знать, где можно поискать источник.

Связанный контент