Zsh auto complete предлагает полные функции (_git _vim и т. Д.)

У меня есть небольшое раздражение от того, как zsh делает полные предложения для моих команд.

Если я наберу начало команды, которую я не установил, и нажмите tab она предложит установленную функцию завершения.

Допустим, я хочу выполнить vim но он не установлен, он предложит _vim .

Есть ли способ отключить это? Или я сделал что-то не так в моей настройке?

Все мои dotfiles публикуются в github.com/henrikbjorn/castle .

По умолчанию механизм завершения zsh только пытается добавить что-то к типу. Вы настроили его, чтобы попробовать добавить префикс. Простой механизм конфигурации интерактивного завершения ( compinstall ) предлагает это в разделе « compinstall → завершение подстроки». Это вставляет такую ​​строку в ваш .zshrc :

 zstyle ':completion:*' matcher-list '' 'l:|=* r:|=*' 

В zstyle настройки (в основном) завершения. Стиль завершения matcher-list – это список способов попробовать последовательно, останавливаясь, когда есть хотя бы одно совпадение. Пустая строка означает завершение по умолчанию (только суффиксы). Соответствующее контрольное заклинание l:|=* r:|=* означает попытку сопоставления префикса * и соответствия суффикса * , то есть любого префикса и суффикса.

Вы можете запретить префиксы, начинающиеся с _ целом. Это все еще позволяет завершить слова, начинающиеся с _ , и завершить, добавив префикс, но префикс может не начинаться с _ .

 zstyle ':completion:*' matcher-list '' 'l:|=[^_]* r:|=*' 

Это относится ко всем завершениям, а не к завершению имен команд. Я не знаю, как ограничить это именами команд.

Должен быть способ более точно исключить имена команд, начинающиеся с _ , но я не знаю, как это сделать. Первый запуск начинается с стиля завершения ignored-patterns .

 zstyle ':completion:*:*:-command-:*:*' ignored-patterns '_*' 

Это исключает совпадения, начинающиеся с _ ; однако, если совпадений нет, тогда zsh снова пытается без правил игнорирования. Хорошо, что если команда начиналась с подчеркивания в первую очередь, она будет завершена в этом втором проходе. Плохая часть состоит в том, что zsh, таким образом, попытается добавить подчеркивание в любом случае, если совпадений нет, поэтому, если у вас есть vi и view но не vim то нажатие Tab после vi предложит vi и view но не _vim , но если вы _vim vim то завершение предложит _vim .