Primeiro, você precisa definir uma função para a conclusão assim:
_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
}
Esta função pode agora ser usada como um complemento para cd
com:
compdef _children_dirs cd
No entanto, não acho que seja uma boa ideia usar o último comando. De fato, tente fazer isso a partir do seu diretório home e você irá congelar seu shell por um tempo ( Ctrl + c para parar). Uma solução melhor seria atribuir uma sequência de chaves a essa conclusão e usá-la somente quando for necessária e segura:
zstyle ':completion:children-dirs:*' completer _children_dirs
zle -C children-dirs menu-complete _generic
bindkey '^Y' children-dirs
Com isso, Ctrl + y acionará a conclusão de children_dirs .
Existe outra solução que acho melhor, se você estiver pronto para usar outro comando.
function ccd { cd $1 }
compdef _children_dirs ccd
Este bloco define um novo comando ccd que usa _ \ children_dirs_ como completer (assim acionado com TAB).
Você pode personalizar o filtro de nomes em encontrar para procurar o padrão em qualquer lugar no nome do arquivo com: "*${words[CURRENT]}*"
.
Edit: Eu criei um plugin para zsh com isso.