Como Stéphane Chazelas observou, o problema está na sua função preexec
. Quando você define o título do terminal, usa o comando sem proteger seus caracteres especiais. A primeira nova linha no comando termina a sequência de escape para definir o título e as outras linhas são impressas.
Você também teria um problema com barras invertidas e caracteres de porcentagem no comando, pois print
executa a expansão de barra invertida e também está executando a expansão percentual de prompt no comando.
A solução é remover ou codificar caracteres de controle e executar a expansão de barra invertida para obter caracteres de controle separadamente dos caracteres no prompt. Por exemplo:
set_title () { print -rn $'\e]0;'${${:-${(%):-$1}$2}//[^[:print:]]/_}$'\a' }
precmd () { set_title '[%n@%M:%~]' '' }
preexec () { set_title '[%n@%M:%~]' " ($1)" }