答案1
这不是可以对任意 shell 代码执行的操作,因为 zsh 无法知道代码中的哪些单词实际上是命令将视为文件路径的参数,更不用说作为相对于当前工作目录的路径了。代码存储到历史记录中的时间。
对于最简单的 shell 代码,例如cmd with its literal arguments
和 对于有限的预定义命令集,您可以执行以下操作:
commands_with_expanded_paths=(evince okular)
zshaddhistory() {
local words=( ${(z)1%$'\n'} )
if (( $commands_with_expanded_paths[(Ie)$words[1]] )); then
local replaced_words=($words[1]) word
for word in $words[2,-1]; do
local decoded_word=${(Q)word}
if [[ $decoded_word = [^/]* && -e $decoded_word ]]; then
word=${(q+)decoded_word:P}
fi
replaced_words+=($word)
done
print -rs -- $replaced_words
fc -p
fi
}
如果第一个单词是给定列表中命令的名称,则如果发现其余参数是保存到历史记录中的文本中现有文件的相对路径,则将其替换为绝对路径。