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

10

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

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

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

tar xvf centos5.8_x86_1.ova

Итак, я вошел:

tar xvf cent<TAB>

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

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

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

Оле Танге
источник
1
<спам> Zsh может это сделать. </ spam>
Жиль "ТАК - перестань быть злым"

Ответы:

9

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

compopt -o bashdefault tar vim emacs

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

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

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

Матье
источник
2
Спасибо за Alt- / упоминание, я понятия не имел, что там было
Майкл Шпеер
1

Завершение 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. Может быть, кому-то еще будет полезно узнать, где они могут искать источник.

carandraug
источник
4
Изменение файлов в / usr, которые принадлежат менеджеру пакетов, является хорошим способом вызвать неприятный шок при обновлении. Лучше: переопределить упакованную конфигурацию.
Крис Даун
1
@ChrisDown и как ты это сделаешь? Я все еще ищу чистое решение .bashrc.
Клейтон Стэнли,