我希望它能够工作(它需要extendedglob
和histsubstpattern
):
alias ri='^(#b)E(?)^E${(l:2::0:)$((match[1]+1))}'
但它没有:
$ alias sss='^(#b)E(?)^E${(l:2::0:)$((match[1]+1))}'
$ echo /Users/evar/Downloads/Video/Teenage_Mutant_Ninja_Turtles_2003_S02E01_DVDRip_30NAMA.mkv
/Users/evar/Downloads/Video/Teenage_Mutant_Ninja_Turtles_2003_S02E01_DVDRip_30NAMA.mkv
$ sss
zsh: command not found: Pocket
我不介意使用函数而不是别名,但结果是相同的。
我什至尝试过export ss='^(#b)E(?)^E${(l:2::0:)$((match[1]+1))}'
然后做$ss
,但失败了zsh: command not found: ^(#b)E(?)^E${(l:2::0:)$((match[1]+1))}
。
使用eval '^(#b)E(?)^E${(l:2::0:)$((match[1]+1))}'
也失败zsh: command not found: Pocket
。
更新:发现相关(可能重复)问题:
zsh 中 bash 的 `history -p` 的替代品?
https://stackoverflow.com/questions/27494753/how-to-get-last-command-run-without-using
https://stackoverflow.com/questions/48696876/using-history-expansion-in-a-bash-alias-or-function
答案1
不能,历史扩展发生在别名或参数扩展之前。
我个人讨厌历史扩展,因此这是我首先禁用的东西。
在这里,我建议创建一个增加E<n>
光标左侧数字的小部件,而不是使用历史扩展别名:
increment-episode() {
emulate -L zsh
setopt extendedglob
LBUFFER=${LBUFFER/(#b)(*E)(<->)/$match[1]${(l:${#match[2]}::0:)$((match[2]+1))}}
}
zle -N increment-episode
bindkey '\e+' increment-episode
然后,你只需按+Up然后你就会得到每个阶段发生的情况的视觉反馈,并且可以随意撤消/重做/适应,而不是像 csh 历史扩展那样盲目工作(IMO 70 年代的一个功能)当时有这种感觉,但现在就不那么明显了,因为我们拥有更快、更强大的终端和行编辑器)。Alt+
但如果你真的想用递增后的数字来盲目地评估历史记录中前一个命令中的代码E
,你可以这样做:
rerun-with-next-episode() {
emulate -L zsh
setopt extendedglob
local new
new=${${history:0:1}/(#b)E(<->)/E${(l:${#match[1]}::0:)$((match[1]+1))}}
# display it
print -ru2 -- $new
# put it on the history
print -rs -- $new
# evaluate it
eval -- $new
}