zsh에서 vi​m으로 `파일 이름 열기', 어쩌면 실행 전 후크일까요?

zsh에서 vi​m으로 `파일 이름 열기', 어쩌면 실행 전 후크일까요?

단편:

다음 작품은...

function default_open_in_vim () {
    filename=$(echo -e "$1" | tr -d '[:space:]')
    if [[ -f $filename ]]; then
        vim $filename
    fi
}

autoload -Uz  add-zsh-hook
add-zsh-hook preexec default_open_in_vim

...하지만 vim을 닫으면 다음과 같은 결과가 나타납니다.

zsh: permission denied: src/findPathBFS.js

긴 버전:

나는 같은 일을 계속해서 반복하고 있음을 발견했습니다.

현재 디렉터리에서 파일을 찾으려면 CTRL-t를 입력합니다. 그런 다음 Enter 키를 누르면 fzf가 커서 위치에 파일 이름을 삽입합니다. 훌륭해요. 때로는 파일을 grep하거나 catting 또는 git-checkouting 등을 수행합니다. 때로는 vim에서 열지만 vim CTRL-t를 통해 시작하지 않을 수도 있습니다. 이제 해야 할 일은 CTRL-a를 눌러 터미널의 줄 시작 부분으로 이동하고 vim <cr>을 입력하는 것입니다.

문제는 vim에서 CTRL-t를 누르기 전에 이것을 입력하지 않았다는 사실조차 인식하지 못하는 경우가 많다는 것입니다... 문제를 볼 수 있습니다.

앞에 cd 없이 디렉토리 이름을 입력하면 AUTO_CD가 있는 zsh가 해당 디렉토리로 CD를 입력하고 비슷한 작업을 수행하기를 원합니다. 앞에 CD 없이 파일 이름을 입력하면 그냥 열어야 합니다. vim에서.

Preexec 후크는 작동하지만 오류 메시지가 마음에 들지 않습니다.

명령을 취소할 수 있다면 좋겠지만 zsh는 preexec 후크에서 명령을 취소하는 것을 허용하지 않는 것 같습니다. (아마도 취소할 수 있지만 어떻게 해야 할지 모르겠습니다.)

man zshmisc에 문서화된 내용을 사용해 보았지만 command_not_found_handler"명령"이 유효한 파일 이름인 경우에는 도움이 되지 않습니다.

답변1

이것은 작동합니다:

command_not_found_handler () {
    if [[ $# -eq 1 && -f $1 ]]; then
      vim "$1"
    else
      exit 127
    fi
}

하지만 나는 그것이 매우 위험하다는 것을 알았습니다. 당신이 뭔가 잘못할 수도 있습니다. 예를 들어 현재 디렉터리에서 path에 있는 명령과 이름이 같은 파일을 편집하려고 하면 path에 있는 명령이 실행됩니다. 그것은 당신의 문제가 아니라 command_not_found_handler당신의 요청입니다. 또 다른 문제는 이와 같은 내용을 입력하면 foo/bar파일이 실행 가능하지 않으면 편집하고 실행 가능하면 실행한다는 의미입니다.

현재 디렉터리의 파일이 PATH의 명령보다 우선하도록 하려면 다음을 사용할 수 있습니다.DEBUG또는accept-line편집 명령 오버로드. 그러나 이것은 두 번째 문제를 해결하지 못합니다.

다른 사용자 인터페이스를 권장합니다. 명령 실행을 방해하지 마십시오. 편집하기 위해 Return 키를 누르는 대신 다른 키를 누르고 해당 키가 vim행 앞에 삽입되도록 구성하십시오. 이는 vim쉘 기록에 명령 호출을 유지하는 것을 포함하여 몇 가지 좋은 이점이 있습니다.

zle -N edit-file
edit-file () {
  BUFFER="vim $BUFFER"
  zle accept-line "$@"
}

관련 정보