Tab-завершение шаблонов оболочки

На моих серверах Debian я привык нажимать на Tab, чтобы "просмотреть" расширение шаблонов оболочки:

$ cp *some*<Tab>
something  somewhat  have-some-cake
$ cp *some*_

Когда шаблон расширяется до одной записи, Tab заменяет шаблон реальной записью; в противном случае отображается список подходящих записей. Это интуитивно понятно и полезно, потому что оно согласуется с обычным завершением табуляции "префикс".

Но мои серверы и рабочие столы Ubuntu ведут себя по-разному: даже если он расширится до более чем одной записи, Tab заменяет шаблон первой записью.

Я проверил обычных подозреваемых (/etc/bash.bashrc, /etc/inputrc и локальные версии) и не смог найти никакой разницы.

Кто-нибудь знает, какие настройки контролируют это поведение?

2 ответа

Решение

Вопреки другому ответу, эта конкретная проблема, вероятно, является прямым результатом использования bash-complete. В пакете bash-complete есть несколько ошибок (как отмечалось в этом ответе U&L о похожей проблеме, например).

Если я закомментирую этот раздел в моем .bashrc:

# enable programmable completion features (you don't need to enable
# this, if it's already enabled in /etc/bash.bashrc and /etc/profile
# sources /etc/bash.bashrc).
if ! shopt -oq posix; then
  if [ -f /usr/share/bash-completion/bash_completion ]; then
    . /usr/share/bash-completion/bash_completion
  elif [ -f /etc/bash_completion ]; then
    . /etc/bash_completion
  fi
fi

и начать новый экземпляр Bash, то я получаю:

$ echo *o*<tab><tab>
foo     food    foo.sh  
$ echo *o*

И тогда, если я источник /usr/share/bash-completion/bash_completion Сценарий, как это было в .bashrc:

$ . /usr/share/bash-completion/bash_completion
$ echo foo

*o* был немедленно заполнен до foo без показа других матчей.

Я использую 16.04, кстати. Я не знаю, было ли это исправлено в новых версиях.

$ dpkg-query --show --showformat='${Package} ${version}\n' bash bash-completion
bash 4.3-14ubuntu1.2
bash-completion 1:2.1-4.2ubuntu1.1

Более разумное завершение вкладки в Bash требует bash-completion пакет.

sudo apt install bash-completion

Завершение Bash фактически написано и поддерживается Debian напрямую.
(Смотрите также его пакет Debian и страницы пакета Ubuntu.)

После установки он либо загружается автоматически (например, через /etc/bash.bashrc) или вам нужно будет поручить Bash загрузить его в ваш ~/.bashrc с такой строфой:

if [[ -z "$BASH_COMPLETION" ]] && [[ -r /etc/bash_completion ]]; then
  . /etc/bash_completion
fi

До того, как Red Hat и другие включили этот пакет, я использовал ручное копирование /etc/bash_completion* между системами. Это будет работать довольно хорошо, но я не предлагаю это; это также исключает возможность для вашего менеджера пакетов обновить существующие дополнения и установить новые (которые теперь идут в /usr/share/bash-completion/completions/ хотя они изначально жили с вашими пользовательскими дополнениями в /etc/bash_completion.d/).

Другие вопросы по тегам