Get rid of that `_gd` function and just add the following to your `.zshrc` file:
```shell
autoload -Uz compinit
compinit
zstyle ':completion:*' matcher-list 'r:|?=**'
```
This tells the completion code to allow any number of additional between and around what you’ve types. With this, Zsh can now fuzzy complete *anything*.

In more detail:

* `?=` matches any one character.
* `r:|?` matches any substring that ends (`r`) in `?` (any one character).
* `r:|?=*` says, in your input, from left to right, find a substring that ends in `?` (any one character), insert a `*` (wildcard, which matches any number of characters) into the position indicated by the `|` and try to find completion matches with that. If that fails, find the next such input substring, until you either find one or more completion matches or you run out of substrings.
* `r:|?=**` says, in your input, find _every_ substring that ends in `?` (any one character), insert a wildcard (`*`) into _every_ position indicated by the `|` and try to find completion matches with that.
* Finally, by default, Zsh already adds a wildcard to the end of your input, thus completing the circle for full fuzzy matching.

You can find the documentation over here: http://zsh.sourceforge.net/Doc/Release/Completion-Widgets.html#Completion-Matching-Control