A razão pela qual isso não funciona é porque zle -U "mc"
envia "mc" para a pilha de entrada, ele não substitui o buffer de comando atual.
O que seu widget realmente faz é:
- linha vazia
- coloque "mc" na pilha de entrada
- aceite a linha vazia
Após a linha ser aceita, zsh puxa "mc" da pilha de entrada e coloca o buffer atual. É por isso que parece que o widget só imprime "mc" sem fazer mais nada.
O resultado pretendido pode ser alcançado com
function _midnight {
BUFFER="mc"
zle accept-line
}
Mas você também pode fazer apenas:
function _midnight {
mc
zle reset-prompt
}
A principal diferença é que a primeira solução emula o que você estaria fazendo, por exemplo, digitando o comando e aceitando-o (isso inclui mc
sendo gravado no histórico de comandos). Enquanto o segundo apenas inicia mc
. zle reset-prompt
é opcional, mas mc
pode deixar seu cursor em posições ímpares ao sair.