Bash автозаповнюється командою vim


13

В основному, автозавершення шляхів нещодавно припинило роботу при видачі 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, але я працюю на 2.1-5.

ОНОВЛЕННЯ: Після деяких додаткових тестувань я виявив, що корінь полягає в тому, що bash заповнює лише імена каталогів, а не імена файлів.

ОНОВЛЕННЯ: Виявляється, це bash-completionбуло загальною причиною. Дивіться мій другий коментар до прийнятої відповіді.

Будь-які пропозиції щодо потенційної причини такої поведінки були б вдячні!


Опублікуйте своє .bashrc!
Жил 'ТАК - перестань бути злим'

Посилання на мій .bashrcрозміщений, як вимагали.
TheRogueWolf

Видалені посилання на .bashrc, .aliases та .functions не пов'язані з проблемою тепер, коли причина виявлена.
TheRogueWolf

той самий випуск на Debian 9, деякі установки, але не всі: $
Philippe Gachoud

Відповіді:


10

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

complete -p vim

Так само ви можете видалити ці конкретні правила за допомогою:

complete -r vim

Ця команда скидає її за замовчуванням - звичайні шляхи та імена файлів завершуються без зайвої логіки. Це, мабуть, те, що ти хочеш.

Для отримання додаткової інформації ознайомтесь help completeабо man bashшукайте розділ про completeкоманду (це вбудований bash, отже, це задокументовано на сторінці bash).

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

Сподіваюся, що це допомагає :)


Це і вдалося. Багато, велике спасибі complete -p vimКоманда повернулася , complete -F _filedir_xspec vimякий був вилучений з допомогою complete -r vimкоманди, вирішення питання. Я збираюсь прочитати completeкоманду та інформацію, повернуту перемикачем -p. Злегка спантеличений, чому така поведінка змінилася, буде досліджуватися і те.
TheRogueWolf

3
Здається, винуватцем того, що довершення було виправданим. _filedir_xspecФункція /usr/share/bash-completion/bash_completionтільки завершує каталоги. Я видалив bash-completion, вилучив complete -r vimрядок із мого .bashrcта перезавантажився і vimзараз веде себе так, як очікувалося.
TheRogueWolf

3

Bash за замовчуванням автоматично заповнює лише імена шляху та файлів. Однак механізм розширюється, і баш можна навчити виконувати різні автозавершення для різних програм. Наприклад, gitвін може автоматично заповнити імена підкоманд (клонувати, здійснити) та зміни, а не просто імена. Іноді це зручно, іноді досить дратує - наприклад, коли 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-завершення: 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

Потім перезапустіть термінальний сеанс


Я спробував видалити bash-completion, протестувати vimповедінку, а потім перевстановити bash-completionта протестувати, але я все-таки відчув ту ж проблему в обох обставинах. Рядки, які ви перераховували, немає у /etc/bash.bashrc. Однак ця лінія є[ -r /usr/share/bash-completion/bash_completion ] && . /usr/share/bash-completion/bash_completion
TheRogueWolf
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.