O problema é que curl
espera algumas configurações normais do terminal e zle
não espera que você altere as configurações do terminal. Então você pode escrever:
_check-gmail() {
zle -I
(
s=$(stty -g) # safe zle's terminal setting
stty sane # sane settings for curl
curl -u username --silent "https://mail.google.com/mail/feed/atom" |
tr -d '\n' | awk -F '<entry>' '{for (i=2; i<=NF; i++) {print $i}}' |
sed -n "s/<title>\(.*\)<\/title.*name>\(.*\)<\/name>.*/ - /p"
stty $s # restore zle's terminal settings
) < /dev/tty
}