Crie comandos expansíveis

4

Eu uso ZSH via Oh-my-zsh, e uma característica interessante que vejo é que o shell expande meus comandos quando eles estão em backticks.

Por exemplo, 'pwd' + guia substitui 'pwd' pelo meu caminho atual:

Euestouquerendosaberseháumamaneirarelativamentefácildefazeromesmoparaalgunscomandossemterqueusarosbackticks.Gostariadeaplicarissoaalgunsaliases(oufunções).

Paraserclaro,nãoestoufalandosobreexpandirargumentosparaumcomando,masocomandoemsi.

Esteéumrecursorealmenteincrível,masnãoéexatamenteoqueeuestavaprocurando.Amenosqueeutenhafeitoalgoerrado,issoexpandemeualiasparaoqueoaliasfoidefinido,masnãoparaqualéoresultado.Porexemploaqui:

Eu gostaria de ver o resultado desse comando em vez do comando completo.

    
por midu 15.10.2015 / 18:24

1 resposta

2

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 que zsh 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 widget expand-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 widget expand-to-output a Alt + Guia .
por 22.10.2015 / 08:43