
С тех пор, как автодополнение по табуляции стало стандартной функцией в оболочках, я был очень счастливым ее пользователем. Мне даже нравится интеллектуальное автодополнение 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
. Возможно, это все еще может быть полезно кому-то, чтобы знать, где можно поискать источник.