É possível fazer com que a pesquisa de histórico de seta para zsh detecte aliases?

2

Eu tenho git aliased para g . Às vezes eu uso g e às vezes não.

Eu posso executar git add file1 e mais tarde g add file2 .

Quando eu quiser adicionar o arquivo 1 novamente, posso digitar g add no prompt zsh e, em seguida, pressionar a seta para cima algumas vezes. Eu não vou chegar a git add file1 . Então tenho que tentar git add e depois a seta para cima.

Da mesma forma, git add nunca vai encontrar g add file2 .

Parece que isso deveria ser solucionável. Existe uma maneira de criar aliases de detecção de pesquisa de histórico de flechas?

    
por Riley Martine 19.06.2018 / 15:11

1 resposta

2

Isso seria complicado de implementar na fase de pesquisa inversa

alias g=grep
g foo /etc/passwd
alias g=git
g status

como a busca inversa precisaria saber que o alias havia mudado, informações que, ao contrário do exemplo acima, não estarão disponíveis se o alias for invisível (para a função de busca do histórico) alterado através de edição de arquivo de configuração e reinicialização do shell. / p>

Em vez disso, pode ser mais adequado (mas ainda um pouco complicado) gravar informações canônicas no histórico do shell, portanto, o histórico do shell acima seria expandido para git ou grep, dependendo do pseudônimo em favor no momento o comando foi executado. Desvantagem: você precisa gerenciar o histórico por conta própria e precisa procurar pelo nome do comando, não pelo alias:

function zshaddhistory() {
  local -a cmd
  local i
  # split using shell parse, see zshexpn(1)
  cmd=(${(z)1})
  if (( $#cmd )); then
    # alias expand or failing that the command
    # NOTE zsh is 1-indexed, not 0-indexed
    cmd[1]=${aliases[$cmd[1]]:-$cmd[1]}
    for (( i = 2 ; i < $#cmd ; i++ )); do
      # look for ; and try to alias expand word following
      if [[ $cmd[$((i-1))] == \; ]]; then
        cmd[$i]=${aliases[$cmd[$i]]:-$cmd[$i]}
      fi
    done
    # (z) adds a trailing ; remove that
    cmd[$#cmd]=()
    # write to usual history location
    print -sr -- $cmd
  fi
  # disable the usual history handling
  return 1
}
alias g='echo wait for godot'

Com isso carregado:

% exec zsh -l
% ls
...
% uptime
...
% g ; g
wait for godot
wait for godot
% history
    1  ls
    2  uptime
    3  echo wait for godot ; echo wait for godot
    4  history

Isso não suporta aliases globais, que podem aparecer não apenas no início da linha ou após ; . Este código pode ter outros descuidos.

Com mais código, você pode incluir o original como um comentário (provavelmente com a opção INTERACTIVE_COMMENTS definida), embora isso possa exigir mais código no lado da pesquisa de histórico para talvez remover esses comentários:

    ...
    # (z) adds a trailing ; remove that
    cmd[$#cmd]=()
    cmd+=(\# ${1%%$'\n'})
    ...

que, em algum momento, pode exigir que você reescreva todo o código de histórico e de busca de histórico para atender às suas necessidades específicas.

    
por 19.06.2018 / 21:05