I use vim as my editor but never got on with "vi mode" in bash/readline or zsh/zle. However, when you have a complicated command line you can use vim (or your favorite $EDITOR) on it.
In bash type Ctrl-x-e
In zsh I press Ctrl-z, which does what I want because I have this in my .zshrc:
setopt hist_ignore_space # trick so that history doesn't get polluted
function edithist() {
local tmp=${TMPPREFIX}${$}hist
read -Erz >| "$tmp"
"$EDITOR" "$tmp"
print -Rz - "$(<$tmp)"
rm "$tmp"
}
bindkey -e '\M-q' push-input # replaces push-line in 3.0.x
bindkey -e -s '\C-z' '\M-q edithist\n'
The zsh version leaves you editing the command line after exiting the editor. The bash version executes the command after exiting the editor.