Завершение вкладки не работает для команд

50

Я пытаюсь использовать завершение табуляции для команд в Ubuntu 11.04 Beta 1, где запущены все последние обновления, но, похоже, это не работает. (Хотя пакет bash-complete установлен)

Заполнение вкладок работает корректно только для каталогов или файлов.

Есть идеи куда копать?

Screatch
источник
Я решил эту проблему, используя решение, данное на askubuntu.com/questions/325807/…
DB

Ответы:

67

Проверьте, есть ли у вас следующий фрагмент в вашем .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 [ -f /etc/bash_completion ] && ! shopt -oq posix; then
    . /etc/bash_completion
fi
Адам Быртек
источник
Спасибо! Я заменил .bashrc своим собственным и поэтому не мог понять, в чем проблема. Теперь работает отлично.
Screatch
Это исправило мои автозаполнения в git bash на xubuntu 12.04, большое спасибо.
Пальма
Как насчет автозаполнения для переключения и опции командной строки apt-get? то есть, когда вы вводите apt-get ins, а затем нажимаете вкладку, чтобы завершить его автоматически.
Реза Годси
3
Я хотел бы добавить, что пакет bash-completionнеобходим для этого, чтобы работать. Странно, стандартная установка моей компании не имеет этого пакета.
Эдгар
13

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

Даже если у вас есть соответствующая строка в вашем .bashrc(как в ответе выше) и bash-completionустановленный пакет, завершение bash все равно может работать некорректно, если у вас есть либо shopt -s nullglobили shopt -s failglobв вашем, .bashrcили .bash_aliases.

Следующие сценарии были протестированы со всеми пользовательскими настройками .bashrcи .bash_aliasesудалены, чтобы дать честный тест, с соответствующей линией завершения bash в .bashrcнастоящее время и с bash-completionустановленной.

1) Первый сценарий, когда у вас есть shopt -s failglobв вашем .bashrcили .bash_aliases.

При попытке добавить полные каталоги и файлы соответственно, эти ошибки произойдут:

cd Dbash: no match: "${COMP_WORDS[@]}"  
cat pabash: no match: words[0]=${!ref}${COMP_WORDS[i]}

Тем не менее, команды все равно будут успешно выполнены.

2) Если shopt -s nullglobвключено, попытка дополнить каталог каталогом или файлом приведет к тому, что все будет в списке без завершения:

cd Do
.adobe/                  .gimp-2.6/               Podcasts/
.aptitude/               .gnome2/                 Public/
.audacity-data/          .gnome2_private/         .pulse/
............

Я сократил список здесь, так как он был очень длинным и не нужно воспроизводить все это.

Опять же, завершение команды все равно будет работать.

Таким образом, просто устранение shopt -s failglobили shopt -s nullglobтакже может решить проблему ошибок с завершением bash, при условии, что у вас есть соответствующая линия в вашем .bashrcи bash-completionустановлен.


источник
1
Хорошее объяснение, это решило мою проблему, когда я пытаюсь завершить табуляцию и произошла ошибка >> words [0] = $ {! Ref} $ {COMP_WORDS [i]}
bagustris
Хотя это работает как обходной путь, для любого программиста-завершителя не стоит полагаться на него. Так как можно установить nullglob (который номинально лучше для многих) и kin, любой завершающий код, который требует старой семантики (подстановочные знаки без совпадений приводят к самому подстановочному знаку), должен сохранить текущий параметр glob, установить тот, который им нужен, и восстановить старые настройки glob впоследствии, как обычно используется IFS.
Алекс Норт-Киз
10

В дополнение к изменению /etc/bash.bashrcфайла (см. Другие ответы) вам может потребоваться установить bash-completionпакет.

Проверьте, существует ли /etc/bash_completionфайл. Если нет:

sudo apt-get install bash-completion

(В моем дистрибутиве Debian 7 он изначально не был установлен)

Сержант
источник
7

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

echo $SHELL

Я только что обновился до Ubuntu 14.04.1 LTS и у меня не было автозаполнения вкладок, даже после того, как я следовал совету в этом посте, только чтобы понять, что моя оболочка установлена /bin/shи не установлена /bin/bash.

nocdib
источник
2

Обновление до Ubuntu 14.04.01

Проверьте, есть ли у вас следующий фрагмент в вашем .bashrc (должен быть там по умолчанию)

sudo vim /etc/bash.bashrc (введите «i» для редактирования файла)

    # enable bash completion in interactive shells
    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

Раскомментируйте 7 строк выше

Сохранить файл "esc + w + q + enter"

Перезапустите Bash

Exec Bash

Диего Арриола
источник
1
Что это будет делать? Разве это не так по умолчанию?
Тим
Как говорит @Tim, эта конфигурация обеспечивается конфигурацией по умолчанию.
Ssoto
Это сработало для меня
Thamaraiselvam
Этот ответ работал как очарование, и у него есть отрицательные голоса ???
greuze