Во-первых, вам нужно определить функцию для завершения следующим образом:
_children_dirs() { find . -type d -name "$*" -printf "%P\n" \ | while read -r line; do compadd -U -X "Subdirectories: " "$line" done compstate[insert]=menu # no expand }
Теперь эту функцию можно использовать как завершитель для cd
:
compdef _children_dirs cd
Тем не менее, я не думаю, что это хорошая идея использовать последнюю команду. В самом деле, попробуйте сделать это из вашего домашнего каталога, и вы на некоторое время заморозите свою оболочку ( Ctrl + c, чтобы остановить). Лучшим решением может быть назначение последовательности ключей для этого завершения и использование ее только тогда, когда это необходимо и безопасно:
zstyle ':completion:children-dirs:*' completer _children_dirs zle -C children-dirs menu-complete _generic bindkey '^Y' children-dirs
При этом Ctrl + y запустит завершение children_dirs .
Есть другое решение, которое я считаю лучше, если вы готовы использовать другую команду.
function ccd { cd $1 } compdef _children_dirs ccd
Этот блок определяет новую команду ccd, которая использует _ \ children_dirs_ в качестве завершителя (запускается с помощью TAB).
Вы можете настроить фильтр в находке для поиска шаблона в любом месте в имени файла: "*$*"
.
Изменить: я создал плагин для Zsh с этим.