사용 방법! ! zsh 별칭에서

사용 방법! ! zsh 별칭에서

이전 명령을 기반으로 별칭을 만들려고 합니다.

내가 달린다고 해

ag foo

목록을 보니 그 결과를 vim에서 활용하고 싶어서 그렇게 했습니다.

vim -q<(!! --vimgrep)

내가 원하는 별칭은

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

!!하지만 내 별칭으로는 작동 하지 않는 것 같습니다 . !!기본 제공 별칭에 대한 정보를 찾는 데 문제가 있습니다.

답변1

!!역사적 확장. !역사 확장을 시작하는 첫 번째 것은 !!다음과 같습니다 .이벤트 표시기이전 명령을 의미합니다.

다음을 통해 명령 기록에 액세스할 수 있습니다.fc그리고history내장 함수 및 전달됨history바꾸다.

--vimgrep에 대해서만 의미가 있으므로 마지막 명령 ag에 별칭을 적용하면 ag더 유용합니다 . ag다음과 같이 이전 명령을 찾을 수 있습니다 .

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

--vimgrep또한 명령에 삽입해야 합니다 .

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

현재 디렉터리를 변경하면 마지막 ag명령은 더 이상 의미가 없습니다. 이는 감지하기 어렵습니다. 허용되는 명령을 화이트리스트에 추가할 수도 있습니다. 물론 이것은 완벽한 테스트는 아닙니다.

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
}

관련 정보