エイリアスを検出するためにzsh上向き矢印履歴検索を実行できますか?

エイリアスを検出するためにzsh上向き矢印履歴検索を実行できますか?

私はgitそれをエイリアスとして指定しましたg。時には使用gし、時には使用しません。

git add file1後でまた走ってまた走ることもできますねg add file2

file1を再度追加したい場合は、g addzshプロンプトに入力して上矢印を数回押すこともできます。私は行かないgit add file1。だから私は努力し、矢印を上げる必要がありますgit add

繰り返しますが、見つかりませgit addんでしたg add file2

この感じは解決可能でなければなりません。 Arrow History検索でエイリアスを検出する方法はありますか?

答え1

これは、リバース検索フェーズで実装するのが複雑になる可能性があります。

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

逆検索を行うにはエイリアスが変更されたことを知る必要があるため、プロファイル編集やシェルの再起動(履歴検索機能のため)などを通じて目に見えないようにエイリアスが変更された場合には、上記の例と他の情報は提供されません。

代わりに、標準情報をシェル履歴に書き込むことがより適切かもしれませんが(まだ少し複雑になる可能性があるため)、上記のシェル履歴はコマンドの実行時にサポートされるエイリアスに応じてgitまたはgrepに拡張されます。欠点:履歴を直接管理し、エイリアスではなくコマンド名で検索する必要があります。

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'

ロード後:

% 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

これは、行の先頭または行の後に表示される可能性があるグローバルエイリアスをサポートしません;。コードに異なる監督がある可能性があります。

より多くのコードを使用すると、元のコードをコメントとして含めることができます(おそらくオプションINTERACTIVE_COMMENTSセットを含む)。ただし、これを行うには、コメントを削除するために履歴検索の面でより多くのコードを追加する必要があるかもしれません。

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

ある時点で、特定の要件を満たすために、すべての履歴保存および履歴検索コードを再構築する必要がある場合があります。

関連情報