Como posso alias uma expansão de histórico no zsh?

3

Eu quero que isso funcione (ele precisa de extendedglob e histsubstpattern ):

alias ri='^(#b)E(?)^E${(l:2::0:)$((match[1]+1))}'

Mas isso não acontece:

$ 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

Eu não me importaria em usar uma função em vez de um alias, mas o resultado foi o mesmo.

Eu até tentei export ss='^(#b)E(?)^E${(l:2::0:)$((match[1]+1))}' e, em seguida, fiz $ss , mas isso falhou com zsh: command not found: ^(#b)E(?)^E${(l:2::0:)$((match[1]+1))} .

Usar eval '^(#b)E(?)^E${(l:2::0:)$((match[1]+1))}' também falha com zsh: command not found: Pocket .

Atualização: perguntas relacionadas (possivelmente duplicadas) encontradas:

Alternativa da história de bash '-p' em zsh?

link

link

    
por HappyFace 03.09.2018 / 12:24

1 resposta

2

Você não pode expandir o histórico antes do alias ou da expansão de parâmetros.

Pessoalmente, eu odeio a expansão do histórico e é a primeira coisa que desabilito.

Aqui, em vez de fazer o alias de uma expansão de histórico, sugerimos a criação de um widget que aumente um número E<n> restante do cursor:

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

E então, você apenas pressiona Acima e depois Alt + + e você tem um feedback visual do que está acontecendo em cada estágio e pode desfazer / refazer / adaptar à vontade, e não trabalhar cegamente como na expansão do histórico do csh (um recurso dos anos 70 que a IMO fazia sentido, mas não tanto agora que temos terminais e editores de linha mais rápidos e mais capazes). p>

Mas se você realmente quisesse avaliar cegamente o código no comando anterior no histórico com o número após E incrementado, você poderia:

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
}
    
por 03.09.2018 / 13:04