Автозаполнение Bash командой vim

13

В bash автозаполнение путей недавно перестало работать при выдаче vimкоманд, где путь глубже двух каталогов (он продолжает работать, как и ожидалось, с другими командами, такими как lsи cd).

Например, если я печатаю, ls .config/btsync/btа затем нажимаю TAB, он расширяется до ls .config/btsync/btsync.conf.

Если я наберу, vim .config/btа затем нажмите клавишу TAB, он расширится до vim .config/btsync/.

Однако, если я наберу, vim .config/btsync/btа затем нажму TAB, ничего не произойдет (я ожидаю, что он расширится до vim .config/btsync/btsync.conf, как в lsпримере выше.

У меня возникает та же проблема, когда я работаю как мой собственный пользователь и как su.

Я прочитал этот пост, в котором упоминалась проблема со старыми версиями bash-complete, но я использую 2.1-5.

ОБНОВЛЕНИЕ: После некоторого дополнительного тестирования я обнаружил, что основная проблема заключается в том, что bash будет заполнять только имена каталогов, а не имена файлов.

ОБНОВЛЕНИЕ: Оказывается, это bash-completionбыла общая причина. Смотрите мой второй комментарий о принятом ответе.

Любые предложения относительно потенциальной причины такого поведения будут с благодарностью приняты!

TheRogueWolf
источник
Опубликуйте свой .bashrc!
Жиль "ТАК - перестань быть злым"
Ссылка на мой .bashrcразмещена, как того требует.
TheRogueWolf
Удалены ссылки на .bashrc, .aliases и .functions как не относящиеся к проблеме теперь, когда причина была обнаружена.
TheRogueWolf
та же проблема в Debian 9, некоторые установки, но не все: $
Филипп Гашуд

Ответы:

10

Я провел еще несколько исследований для вас, и вот что я нашел - ключ к автозаполнению - это bashкоманда complete. Вы можете распечатать правила vimиспользования:

complete -p vim

Также вы можете удалить эти конкретные правила с помощью:

complete -r vim

Эта команда сбрасывает его до значений по умолчанию - обычные пути и имена файлов без дополнительной логики. Это, вероятно, то, что вы хотите.

Для получения дополнительной информации проверьте help completeили man bashи найдите раздел о completeкоманде (это встроенный bash, поэтому он задокументирован на man-странице bash).

Один последний пункт - вышеуказанные изменения затрагивают только текущий bashсеанс, если вы хотите удалить правила VIM после каждого Логин поставить complete -r vimк вашему ~/.bashrc.

Надеюсь, это поможет :)

мМЕ
источник
Это сделал это. Огромное спасибо. Возвращенная complete -p vimкоманда, complete -F _filedir_xspec vimкоторая была удалена complete -r vimкомандой, решает проблему. Я собираюсь немного почитать completeкоманду и информацию, возвращаемую ключом -p. Немного озадачен тем, почему это поведение изменилось, поэтому тоже исследую это.
TheRogueWolf
3
Кажется, что в конце концов виновником было завершение bash. _filedir_xspecФункция /usr/share/bash-completion/bash_completionтолько завершает каталоги. Я удалил bash-completion, удалил complete -r vimстроку из моего .bashrcи перезагрузил и vimтеперь ведет себя как ожидалось.
TheRogueWolf
3

Bash по умолчанию автоматически заполняет только пути и имена файлов. Однако механизм является расширяемым, и bash можно научить выполнять разное автодополнение для разных программ. Например, gitон может автоматически заполнять имена подкоманд (clone, commit) и ревизии вместо просто путей. Иногда это удобно, иногда довольно раздражает - например, когда gzip -dотказывается от автозаполнения имен файлов, которые не имеют .gzрасширения.

Завершение Bash обычно настраивается в /etc/bash_completion.d- вы, вероятно, найдете там файл с именем vim. Это файл, который содержит правила автозаполнения для vimкомандной строки.

Теперь у вас есть два варианта:

  1. Либо зафиксируйте файл в автозаполнении путей, как пользователи, вероятно, ожидают в любом случае.
  2. Удалите файл, чтобы отключить специальные vimправила и выполнять только автозаполнение пути по умолчанию.

И, конечно же, подайте отчет об ошибке, в котором изложена проблема, чтобы она была исправлена ​​в будущих версиях :)

мМЕ
источник
Большое спасибо за отличное объяснение :) Я заглянул /etc/bash_completion.dи там только hgфайл присутствует (для Mercurial). Очень странный.
TheRogueWolf
1
Тогда это должно быть в другом месте. Попробуйте /usr/share/bash-completion/или список все файлы из vimпакета или из bashили bash-completionпакетов (не знаю , как это называется на ArchLinux). Это будет где-то там.
MLu
1
Вывод списка файлов из bash-completionпакетов показывает /usr/share/bash-completion/completionsправила для многих программ, но это не так vim. В списке файлов, установленных вместе с vimпакетом, не отображаются файлы, связанные с завершением, а при поиске по всей системе find / -name vimтакже не отображаются файлы, связанные с завершением.
TheRogueWolf
2

Возможно, вы могли бы переустановить bash-complete: apt-get install --reinstall bash-completion

И посмотрите на файл /etc/bash.bashrc: nano /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

Затем перезапустите сеанс терминала

Djidiouf
источник
Я попытался удалить bash-completion, протестировать vimповедение, а затем переустановить bash-completionи протестировать, но у меня все еще возникала одна и та же проблема в обоих случаях. Линии, которые вы перечислили, отсутствуют в /etc/bash.bashrc. Эта строка, однако,[ -r /usr/share/bash-completion/bash_completion ] && . /usr/share/bash-completion/bash_completion
TheRogueWolf