Во-первых, вам нужно определить функцию для завершения следующим образом:
_children_dirs() {
find . -type d -name "${words[CURRENT]}*" -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).
Вы можете персонализировать фильтр имен в find для поиска шаблона в любом месте имени файла с помощью: "*${words[CURRENT]}*"
.
Изменить: я создал плагин для Zsh с этим.