Durante a conclusão, você está no editor de linhas zsh, portanto, o próprio editor de linhas da disciplina de linha de terminal está desativado como se você tivesse executado:
stty -icanon -echo
Nesse modo, cat
não pode sair porque não há como significar o fim da entrada ( ^D
faz parte do comportamento do editor de linhas da disciplina icanon
) e você não verá o eco de o que você digita.
Você poderia fazer:
_foo() {
_values 'foo' "$(
{
s=$(stty -g)
stty sane
cat
stty $s
} < /dev/tty)"
zle -I
}
Ou seja, coloque o dispositivo terminal no estado esperado por cat
(onde você pode pressionar ^D
em uma linha vazia ou duas vezes para finalizar a entrada) antes de executar cat
e restaurá-lo depois. E nós dizemos que ele tem que redesenhar seu prompt e armazenar em buffer, pois o eco do que você digitaria dentro do editor de linha de linha de linha poderia atrapalhar as coisas ( zle -I
para invalidar ).