별칭을 감지하기 위해 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'})
    ...

어느 시점에서는 특정 요구 사항을 충족하기 위해 모든 기록 저장 및 기록 검색 코드를 다시 작성해야 할 수도 있습니다.

관련 정보