Colocando as duas respostas fornecidas na pergunta [1 , 2] juntos, eu acabo com isso:
function zle-line-init zle-keymap-select {
if [[ $KEYMAP == vicmd ]]; then
gconftool-2 --type string --set /apps/gnome-terminal/profiles/Default/cursor_shape block
elif [[ $KEYMAP == (main|viins) ]]; then
gconftool-2 --type string --set /apps/gnome-terminal/profiles/Default/cursor_shape ibeam
fi
}
zle -N zle-line-init
zle -N zle-keymap-select
A diferença é que eu verifico o parâmetro $KEYMAP
diretamente com uma cláusula if..fi
e executo o comando gconftool-2
em vez de alterar o prompt.