Como expandir uma subcadeia de um comando?

3

Gostaria de saber como seria um comando se eu inserisse uma substring desse comando. Eu não estou interessado no resultado, mas na expansão da história.

O propósito disto é mostrar de forma interativa como a expansão funciona em zsh.

Por exemplo, digamos que eu queira ilustrar o uso de modificadores de histórico do zsh:

mv /Volumes/hdd1/path/to/a/file.foo !#$:r:s/foo/bar/ # moves and renames at the same time
....................................0123456789abcdef

(A linha acima é uma regra para referenciar substrings nesta questão)

Algumas substrings são válidas, outras não.

Eu gostaria que cada subseqüente final em [0..f] executasse a expansão do histórico, como se eu digitasse TAB após cada caractere em [0..f].

    
por alecail 16.10.2012 / 21:38

1 resposta

1

Eu não acho que você possa ativar uma expansão de histórico e recuperar o resultado de dentro do zsh.

Veja uma prova de conceito para usar o módulo zpty interagir com um processo zsh inferior, expandir as sequências de histórico e estudar o resultado (que pode ser para relatar um erro ou executar um comando). Coloque o histórico inicial que você deseja antes de cada tentativa de expansão em um arquivo chamado prior_history .

#!/usr/bin/zsh
setopt extended_glob
zmodload zsh/zpty
zpty -b inferior_zsh 'PS1=%% PS2=\> TERM=dumb strace -eread,write -o zsh.strace zsh -f'
zpty -r inferior_zsh out $'*\r%'
zpty -w inferior_zsh 'stty -echo'
zpty -r inferior_zsh out $'*\r%'
start='mv /Volumes/hdd1/path/to/a/file.foo'
history_string='!#$:r:s/foo/bar/'
for ((i=1; i <= $#history_string; i++)) {
  zpty -w inferior_zsh "fc -R prior_history"
  zpty -r inferior_zsh out $'*\r%'
  zpty -w inferior_zsh "print -r expansion: ${(q)start} ${history_string[1,$i]}"
  zpty -r inferior_zsh out $'*\r[%>]'
  out=${${out#*$'\r\r\n'}%$'\r\n'% ##$'\r\r%'}
  print -r "$i ${(qqqq)out}"
}
    
por 17.10.2012 / 02:42

Tags