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
. -
BUFFER
conté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=0
coloca o cursor no início da linha de comando (editada), que está em$
. Sem mover o cursor para lá, pode acontecer quezsh
tente expandir uma palavra dentro de$(...)
em vez de toda a substituição do processo. -
zle redisplay
exibe 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-word
chama o widgetexpand-word
, que geralmente é chamado como parte da conclusão da tabulação. -
zle -N expand-to-output
registra a função como widget com o mesmo nome. -
bindkey "^[^I" expand-to-output
liga o widgetexpand-to-output
a Alt + Guia .