Como posso usar !! no alias do zsh

2

Estou tentando criar um alias que se baseia no meu comando anterior.

Digamos que eu corra

ag foo

Depois de olhar para a lista, eu quero poder usar esses resultados no vim, então eu faço

vim -q<(!! --vimgrep)

O alias que eu quero é

alias edit-last='vim -q<(!! --vimgrep)'

Mas não consigo usar !! no meu alias. Estou com dificuldades para encontrar informações sobre o que é o !! , um interno, um alias

    
por chrisortman 08.04.2015 / 19:17

1 resposta

2

!! é expansão do histórico . O primeiro ! inicia uma expansão de histórico; !! tem o designador de evento que significa o comando anterior.

Você pode acessar o histórico de comandos por meio do fc e history incorporados e através do history variável.

Como --vimgrep só faz sentido com ag , seu alias seria mais útil se aplicado ao último comando ag . Você pode localizar o comando anterior ag da seguinte forma:

${${(M)history:#ag *}[1]}

Além disso, você precisará injetar --vimgrep no comando.

alias edit-last='vim -q<(eval "${${(M)history:#ag *}[1]} --vimgrep")'

O último comando ag não fará mais sentido se você tiver alterado o diretório atual. Isso é difícil de detectar. Você pode querer colocar na lista de permissões comandos aceitáveis. Este não é um teste perfeito, claro.

edit-last () {
  local cmd
  setopt local_options extended_glob
  for cmd in $history; do
    case $cmd in
      ((ls|(cvs|git|hg|svn) status)(| *)) :;;
      ("ag "*) vim -q<(eval "$cmd --vimgrep"); return;;
      (edit-last) :;;
      (*) echo >&2 "The previous ag command is too old."; return 125;;
    esac
  done
}
    
por 09.04.2015 / 01:13