コマンドのサブストリングを入力すると、コマンドがどのように表示されるかを知りたいです。私は結果ではなく、歴史の拡大に興味があります。
これの目的は、zshの拡張がどのように機能するかを対話的に示すことです。
たとえば、zsh履歴修飾子の使用を説明したいとします。
mv /Volumes/hdd1/path/to/a/file.foo !#$:r:s/foo/bar/ # moves and renames at the same time
....................................0123456789abcdef
(上記の行は、この質問で部分文字列を引用する規則です)
一部の部分文字列は有効であり、一部は無効です。
[0..f]のすべての文字の後に入力したように、[0..f]で終わるすべての部分文字列に対して履歴拡張を実行したいと思いますTAB。
答え1
私は履歴拡張を実行し、zshから結果を取り戻すことができるとは思わない。
これは概念証明を使用したものです。zpty
基準寸法誤ったzshプロセスと対話するには、履歴文字列を展開して結果を調べます(エラー報告やコマンドの実行など)。各拡張試行前に必要な初期記録を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}"
}