如何在 zsh 中为历史扩展添加别名?

如何在 zsh 中为历史扩展添加别名?

我希望它能够工作(它需要extendedglobhistsubstpattern):

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
}

相关内容