function set_title () {
    printf '%s%s%s' $'\e]0;' "$@" $'\a'
}

case $TERM in
  (xterm*|rxvt*)
    precmd () {
      set_title ${(%):-"%n@%m: %~"}
    }
    preexec () {
      set_title "${(%):-"%n@%m: "}" "$1"
    }
    ;;
esac