Você pode usar um widget zle personalizado para isso e chamá-lo por ligação de chave, por exemplo Alt + Tab (idêntico a Esc , Tab )
expand-to-output () {
BUFFER='$('$BUFFER')'
CURSOR=0
zle redisplay
zle expand-word
}
zle -N expand-to-output
bindkey "^[^I" expand-to-output
Agora, se você digitar qualquer comando seguido por Alt + Tab , o comando todo será substituído por sua saída, se o comando poderia ser executado com sucesso. Se o comando não puder ser executado com sucesso, a linha de comando digitada será apenas cercada por $(...) , mas não expandida. Se houver mensagens de erro, elas devem ser impressas acima do buffer de edição. Isso pode não funcionar de forma confiável com prompts de várias linhas.
Explicação:
-
expand-to-output () {...}define a função (nova)expand-to-output. -
BUFFERcontém a linha de comando atual -
BUFFER='$('$BUFFER')'coloca$(before e)após a linha de comando.$(...)é equivalente a'...', mas pode ser aninhado. -
CURSORé a posição do cursor na linha de comando -
CURSOR=0coloca o cursor no início da linha de comando (editada), que está em$. Sem mover o cursor para lá, pode acontecer quezshtente expandir uma palavra dentro de$(...)em vez de toda a substituição do processo. -
zle redisplayexibe novamente o buffer de edição. Isso evita erros de exibição, caso o comando expandido imprima algo para stderr . (Nota: pode haver alguns problemas com prompts de várias linhas) -
zle expand-wordchama o widgetexpand-word, que geralmente é chamado como parte da conclusão da tabulação. -
zle -N expand-to-outputregistra a função como widget com o mesmo nome. -
bindkey "^[^I" expand-to-outputliga o widgetexpand-to-outputa Alt + Guia .
